prettyplay 0.0.2__tar.gz → 0.0.3__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.
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/Dockerfile +2 -0
- prettyplay-0.0.3/.goga/history/2026/fix-step-cache/acceptance.md +329 -0
- prettyplay-0.0.3/.goga/history/2026/fix-step-cache/adr.md +75 -0
- prettyplay-0.0.3/.goga/history/2026/fix-step-cache/arch.md +503 -0
- prettyplay-0.0.3/.goga/history/2026/fix-step-cache/bugs/step-code-context-reads.md +83 -0
- prettyplay-0.0.3/.goga/history/2026/fix-step-cache/bugs/step-code-unused-vars.md +74 -0
- prettyplay-0.0.3/.goga/history/2026/fix-step-cache/completed/plan.md +1575 -0
- prettyplay-0.0.3/.goga/history/2026/fix-step-cache/design.md +1484 -0
- prettyplay-0.0.3/.goga/history/2026/fix-step-cache/task.md +98 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/compatibility.md +48 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/drift-analysis.md +35 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/escalation.md +24 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/investigation.md +60 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/manifest-reconciliation.md +37 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/plan.md +77 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/scope-resolution.md +63 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/test-report.md +50 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/trace.md +67 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/usage-reconciliation.md +42 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-context/validation.md +72 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/compatibility.md +44 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/drift-analysis.md +33 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/escalation.md +26 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/investigation.md +62 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/manifest-reconciliation.md +31 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/plan.md +65 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/scope-resolution.md +62 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/test-report.md +45 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/trace.md +70 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/usage-reconciliation.md +38 -0
- prettyplay-0.0.3/.goga/history/2026/hotfix-step-unused-vars/validation.md +73 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/memory/architecture.md +17 -17
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/memory/code-design.md +19 -7
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/tools/mkdocs/traceability.yml +9 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/conventions.md +20 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/cooks/anthropic.md +5 -3
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/cooks/jinja.md +18 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/cooks/openai.md +5 -3
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/cooks/playwright.md +1 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/prompts/step_generation.md +5 -5
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/workflows/bugfix.yml +3 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/workflows/development.yml +4 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/workflows/epic.yml +4 -0
- prettyplay-0.0.3/.goga/workflows/review.yml +43 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/workflows/story.yml +4 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/workflows/sync.yml +3 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/workflows/task.yml +4 -0
- {prettyplay-0.0.2/prettyplay.egg-info → prettyplay-0.0.3}/PKG-INFO +13 -9
- {prettyplay-0.0.2 → prettyplay-0.0.3}/README.md +13 -9
- prettyplay-0.0.3/agents/manager.sh +7 -0
- prettyplay-0.0.2/agents/tester.sh → prettyplay-0.0.3/agents/planner.sh +1 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/agents/product.sh +1 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/agents/reviewer.sh +2 -1
- prettyplay-0.0.3/agents/tech-writer.sh +10 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/configuration.md +17 -7
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/getting-started.md +4 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/guides/writing-steps.md +36 -8
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/index.md +3 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/driver-facade.md +13 -9
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/failure-taxonomy.md +17 -25
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/hooks.md +38 -6
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/interactive-steering.md +15 -7
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/llm-providers.md +19 -12
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/self-healing.md +7 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/step-cache.md +87 -15
- {prettyplay-0.0.2 → prettyplay-0.0.3}/example/conftest.py +69 -3
- {prettyplay-0.0.2 → prettyplay-0.0.3}/example/tests/test_youtube.py +5 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/.usages/lifecycle.md +20 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/.usages/steps.md +18 -12
- prettyplay-0.0.3/prettyplay/cache/.usages/addressing.md +48 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/cache/.usages/budgets.md +1 -0
- prettyplay-0.0.3/prettyplay/cache/.usages/storage.md +62 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/cache/models.py +23 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/cache/store.py +82 -5
- prettyplay-0.0.3/prettyplay/cache/text.py +19 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/config/.usages/configuration.md +34 -2
- prettyplay-0.0.3/prettyplay/config/__init__.py +6 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/config/loader.py +9 -5
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/config/models.py +59 -5
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/driver/session.py +9 -3
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/.usages/generation.md +51 -14
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/.usages/healing.md +13 -5
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/__init__.py +2 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/attempts.py +4 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/classification.py +33 -3
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/compliance.py +47 -21
- prettyplay-0.0.3/prettyplay/engine/execution.py +78 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/generator.py +246 -135
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/groups/.usages/recovery.md +7 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/groups/diagnosis.py +2 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/groups/outcome.py +5 -3
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/groups/recovery.py +31 -23
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/healer.py +7 -4
- prettyplay-0.0.3/prettyplay/engine/preflight.py +278 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/renderer/.usages/rendering.md +22 -1
- prettyplay-0.0.3/prettyplay/engine/renderer/render.py +450 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/steering/.usages/steering.md +6 -5
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/steering/steering.py +26 -117
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/executor.py +62 -19
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/failures/.usages/taxonomy.md +17 -19
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/failures/errors.py +4 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/.usages/classification.md +9 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/.usages/providers.md +10 -8
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/.usages/transport.md +15 -7
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/_request.py +61 -27
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/anthropic_provider.py +18 -18
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/models.py +3 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/openai_provider.py +18 -18
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/provider.py +6 -5
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/reporting/.usages/hooks.md +43 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/reporting/reporter.py +13 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/runtime.py +3 -3
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/scenario.py +33 -5
- prettyplay-0.0.3/prettyplay/skills/.usages/playwright.md +60 -0
- prettyplay-0.0.3/prettyplay/skills/__init__.py +27 -0
- prettyplay-0.0.3/prettyplay/skills/playwright/SKILL.md +443 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3/prettyplay.egg-info}/PKG-INFO +13 -9
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay.egg-info/SOURCES.txt +44 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay.egg-info/scm_file_list.json +44 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/pyproject.toml +1 -1
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/cache/test_budgets.py +2 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/cache/test_models.py +59 -11
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/cache/test_store.py +330 -25
- prettyplay-0.0.3/tests/cache/test_text.py +71 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/config/test_loader.py +108 -11
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/config/test_models.py +116 -49
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/driver/test_session.py +84 -44
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/groups/test_diagnosis.py +13 -13
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/groups/test_recovery.py +152 -7
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/renderer/test_render.py +163 -2
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/steering/test_steering.py +128 -50
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/test_attempts.py +2 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/test_classification.py +67 -9
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/test_compliance.py +72 -4
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/test_execution.py +53 -9
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/test_generator.py +722 -84
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/test_healer.py +115 -13
- prettyplay-0.0.3/tests/engine/test_preflight.py +302 -0
- prettyplay-0.0.3/tests/example/__init__.py +1 -0
- prettyplay-0.0.3/tests/example/test_conftest.py +194 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/llm/test_anthropic_provider.py +90 -51
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/llm/test_openai_provider.py +62 -55
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/llm/test_provider.py +36 -34
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/llm/test_request.py +127 -30
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/reporting/test_reporter.py +32 -0
- prettyplay-0.0.3/tests/skills/__init__.py +1 -0
- prettyplay-0.0.3/tests/skills/test_init.py +20 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/test_executor.py +200 -59
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/test_groups_integration.py +20 -22
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/test_integration.py +207 -44
- prettyplay-0.0.3/tests/test_playwright_skill.py +393 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/test_runtime.py +12 -12
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/test_scenario.py +185 -26
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/test_transport_retries_integration.py +12 -6
- prettyplay-0.0.2/.goga/usages/prompts/step_cheatsheet.md +0 -87
- prettyplay-0.0.2/prettyplay/cache/.usages/addressing.md +0 -44
- prettyplay-0.0.2/prettyplay/cache/.usages/storage.md +0 -32
- prettyplay-0.0.2/prettyplay/cache/text.py +0 -36
- prettyplay-0.0.2/prettyplay/config/__init__.py +0 -6
- prettyplay-0.0.2/prettyplay/engine/execution.py +0 -48
- prettyplay-0.0.2/prettyplay/engine/renderer/render.py +0 -184
- prettyplay-0.0.2/tests/cache/test_text.py +0 -79
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.github/workflows/docs.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.github/workflows/lint.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.github/workflows/new_version.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.github/workflows/notify.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.github/workflows/publish.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.github/workflows/strictacode.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.github/workflows/tests.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.gitignore +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/config.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-actions/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-actions/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-actions/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-actions/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-actions/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-expect-count/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-expect-count/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-expect-count/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-expect-count/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/add-expect-count/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/additional-configuration/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/additional-configuration/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/additional-configuration/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/additional-configuration/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/additional-configuration/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/agent-context-window/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/agent-context-window/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/agent-context-window/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/agent-context-window/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/agent-context-window/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/backoff-for-llm-backend/acceptance.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/backoff-for-llm-backend/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/backoff-for-llm-backend/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/backoff-for-llm-backend/bugs/aria-snapshot-error-pollution.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/backoff-for-llm-backend/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/backoff-for-llm-backend/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/backoff-for-llm-backend/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt-2/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt-2/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt-2/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt-2/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/better-healt-2/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-interactive-loop/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-interactive-loop/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-interactive-loop/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-interactive-loop/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-interactive-loop/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-interactive-loop/todo.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-user-instructions/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-user-instructions/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-user-instructions/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-user-instructions/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/fix-user-instructions/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/more-usability/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/more-usability/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/more-usability/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/more-usability/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/more-usability/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-group-and-step-params/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-group-and-step-params/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-group-and-step-params/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-group-and-step-params/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-group-and-step-params/prd.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-group-and-step-params/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-memory/acceptance.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-memory/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-memory/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-memory/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-memory/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-memory/prd.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-memory/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/step-memory/todo.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/strict-and-fullscreen-mode/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/strict-and-fullscreen-mode/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/strict-and-fullscreen-mode/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/strict-and-fullscreen-mode/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/strict-and-fullscreen-mode/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/the-first-version/adr.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/the-first-version/arch.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/the-first-version/completed/plan.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/the-first-version/design.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/the-first-version/prd.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/history/2026/the-first-version/task.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/scaffold.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/cooks/json_repair.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/cooks/pydantic.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/prompts/group_diagnosis.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.goga/usages/prompts/group_framing.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/.strictacode.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/LICENSE +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/MANIFEST.in +0 -0
- /prettyplay-0.0.2/agents/architector.sh → /prettyplay-0.0.3/agents/analyst.sh +0 -0
- /prettyplay-0.0.2/agents/manager.sh → /prettyplay-0.0.3/agents/architector.sh +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/agents/developer.sh +0 -0
- /prettyplay-0.0.2/agents/analyst.sh → /prettyplay-0.0.3/agents/tester.sh +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/guides/browser-setup.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/overrides/main.html +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/groups.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/docs/reference/settle-polling.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/example/tests/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/example/tests/test_duckduckgo.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/example/tests/test_yandex.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/mkdocs.yml +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/cache/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/cache/budgets.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/driver/.usages/error_kinds.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/driver/.usages/plumbing.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/driver/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/driver/errors.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/driver/page.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/groups/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/polling/.usages/settle.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/polling/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/polling/settle.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/polling/window.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/renderer/.usages/memory.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/renderer/.usages/validation.md +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/renderer/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/renderer/memory.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/renderer/validation.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/steering/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/engine/text.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/failures/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/groups.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/llm/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/reporting/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay/reporting/hooks.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay.egg-info/dependency_links.txt +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay.egg-info/requires.txt +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/prettyplay.egg-info/top_level.txt +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/setup.cfg +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/cache/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/config/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/conftest.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/driver/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/driver/test_errors.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/driver/test_page.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/groups/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/groups/test_outcome.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/polling/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/polling/test_settle.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/polling/test_window.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/renderer/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/renderer/test_memory.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/renderer/test_validation.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/steering/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/engine/test_text.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/failures/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/failures/test_errors.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/llm/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/llm/test_models.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/reporting/__init__.py +0 -0
- {prettyplay-0.0.2 → prettyplay-0.0.3}/tests/reporting/test_hooks.py +0 -0
|
@@ -9,6 +9,8 @@ COPY agents/product.sh /home/goga/bin/product-as-claude.sh
|
|
|
9
9
|
COPY agents/manager.sh /home/goga/bin/manager-as-claude.sh
|
|
10
10
|
COPY agents/analyst.sh /home/goga/bin/analyst-as-claude.sh
|
|
11
11
|
COPY agents/tester.sh /home/goga/bin/tester-as-claude.sh
|
|
12
|
+
COPY agents/tech-writer.sh /home/goga/bin/tech-writer-as-claude.sh
|
|
13
|
+
COPY agents/planner.sh /home/goga/bin/planner-as-claude.sh
|
|
12
14
|
|
|
13
15
|
RUN chmod +x /home/goga/bin/*.sh
|
|
14
16
|
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
# Final Acceptance Report
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
Audited the fix-step-cache branch against 0.0.x across six cells. Verified contracts, runtime facade exports, cell usage examples and behavioral test coverage. Fixed the sweep directory-inspection exception leak, repaired four usage documents and added 13 parameterized regression/boundary cases. The final full suite passes: 1378 tests, no failures or skips.
|
|
5
|
+
|
|
6
|
+
## Acceptance Scope
|
|
7
|
+
| Cell | Change types |
|
|
8
|
+
|---|---|
|
|
9
|
+
| prettyplay | CODE / MANIFEST / USAGE / TEST |
|
|
10
|
+
| prettyplay/cache | CODE / MANIFEST / USAGE / TEST |
|
|
11
|
+
| prettyplay/engine | CODE / MANIFEST / USAGE / TEST |
|
|
12
|
+
| prettyplay/engine/groups | CODE / MANIFEST / USAGE / TEST |
|
|
13
|
+
| prettyplay/engine/renderer | CODE / MANIFEST / USAGE / TEST |
|
|
14
|
+
| prettyplay/engine/steering | CODE / MANIFEST / TEST |
|
|
15
|
+
|
|
16
|
+
Functionality: rendered-value addressing, NFC plus trim, verbatim capture-tag metadata, fresh group-recovery identities, touched working sets and guarded close-time cleanup. Scope was resolved from the branch diff and completed build history. The pre-existing completed-plan relocation is excluded from this acceptance commit.
|
|
17
|
+
|
|
18
|
+
## CODEMANIFEST Status
|
|
19
|
+
CONSISTENT for the scoped functionality. Zero manifest updates. `goga lint`: 12 cells, zero errors. All six `goga contract` comparisons were reviewed; runtime signature/member checks resolved the static extractor's Pydantic and embedding limitations. All declared locations and facade exports exist; baseline conventions and annotations are present.
|
|
20
|
+
|
|
21
|
+
## Usages Status
|
|
22
|
+
CONSISTENT after four cell-level updates. Generation/healing examples now carry a real render product with addressing_text; cache storage constructs a matching identity; recovery examples retain both texts. Stale casefold terminology was replaced by NFC plus trim. All Python usage snippets compile; core cache, engine and renderer examples execute with temporary storage and fake external boundaries. Shared project practices remain unchanged.
|
|
23
|
+
|
|
24
|
+
## Test Coverage Assessment
|
|
25
|
+
ADEQUATE. 1378 passed, zero failed/errors/skipped on Python 3.12.15. Statement coverage: 99.61% (2536/2546); branch coverage: 97.88% (599/612); combined: 99.27%. Renderer combined coverage improved from 88% to 96%. The cache store has 100% statement coverage; generator, healer, steering and executor have 100% combined coverage. Ruff lint and formatting pass for all 122 source/test files.
|
|
26
|
+
|
|
27
|
+
## Critical Findings
|
|
28
|
+
| Source | Finding | Status |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Manifest / implementation | sweep_untouched called Path.is_dir outside its OSError handler, allowing PermissionError to violate its never-raises guarantee | Fixed after q1 approval; inspection and enumeration errors now return an empty result, preserve files and log one contextual warning |
|
|
31
|
+
|
|
32
|
+
## Warnings
|
|
33
|
+
| Source | Finding | Recommendation |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| Test | Newly introduced scanner comment/quote/malformed-source boundaries lacked tests | Resolved after q2 approval: 11 parameterized public-API cases added |
|
|
36
|
+
| Usage | Generation/healing examples omitted addressing_text and still described casefold normalization | Resolved in four cell-level usage files |
|
|
37
|
+
| Tooling (INFO) | Static contract extraction does not fully represent Pydantic constructors and embedded members | Runtime signatures, model_fields and provider exports were verified |
|
|
38
|
+
|
|
39
|
+
## Applied Updates
|
|
40
|
+
- prettyplay/cache/store.py
|
|
41
|
+
- prettyplay/cache/.usages/storage.md
|
|
42
|
+
- prettyplay/engine/.usages/generation.md
|
|
43
|
+
- prettyplay/engine/.usages/healing.md
|
|
44
|
+
- prettyplay/engine/groups/.usages/recovery.md
|
|
45
|
+
- tests/cache/test_store.py
|
|
46
|
+
- tests/engine/renderer/test_render.py
|
|
47
|
+
- .goga/history/2026/fix-step-cache/acceptance.md
|
|
48
|
+
|
|
49
|
+
No CODEMANIFEST changes or shared-practice edits were required. q1 approved the code repair and regression test; q2 approved additional renderer boundary tests.
|
|
50
|
+
|
|
51
|
+
## Risks
|
|
52
|
+
| Risk | Severity | Mitigation |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| Tests fake external browser/provider boundaries | INFO | Existing wired integration coverage exercises real cache/engine/executor composition; no live service validation is claimed |
|
|
55
|
+
| Not every internal branch is covered | INFO | Remaining renderer lines are the overridden base parser; changed public paths and scanner boundaries are tested. Raw coverage artifacts retain the precise residual list |
|
|
56
|
+
| Cache addresses change on upgrade, and default cleanup removes untouched same-key entries | Expected behavior | Existing migration and cleanup=False guidance is preserved and audited |
|
|
57
|
+
|
|
58
|
+
## Verdict
|
|
59
|
+
ACCEPTED_WITH_NOTES. All five acceptance gates passed after the confirmed repairs. No open critical findings or warning coverage gaps remain. Notes concern measurement/tooling limitations and the absence of a live external-service run.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
# Acceptance Scope Report
|
|
64
|
+
|
|
65
|
+
## Data source
|
|
66
|
+
Branch fix-step-cache versus configured base 0.0.x (46 changed files); build history and completed implementation plan identify the functionality. The pre-existing worktree change moves the completed plan and is excluded from audit edits.
|
|
67
|
+
|
|
68
|
+
## Functionality
|
|
69
|
+
Rendered-sentence cache addressing, verbatim metadata, per-test touched set and guarded close-time cleanup.
|
|
70
|
+
|
|
71
|
+
## Cells for acceptance
|
|
72
|
+
| Cell | Path | Change types |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| prettyplay | prettyplay | CODE / MANIFEST / TEST / USAGE |
|
|
75
|
+
| prettyplay/cache | prettyplay/cache | CODE / MANIFEST / TEST / USAGE |
|
|
76
|
+
| prettyplay/engine | prettyplay/engine | CODE / MANIFEST / TEST |
|
|
77
|
+
| prettyplay/engine/groups | prettyplay/engine/groups | CODE / MANIFEST / TEST / USAGE |
|
|
78
|
+
| prettyplay/engine/renderer | prettyplay/engine/renderer | CODE / MANIFEST / TEST / USAGE |
|
|
79
|
+
| prettyplay/engine/steering | prettyplay/engine/steering | CODE / MANIFEST / TEST |
|
|
80
|
+
|
|
81
|
+
## Affected dependencies
|
|
82
|
+
| Dependent cell | Dependency type | Impact assessment |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| prettyplay | DIRECT | Consumes prettyplay/cache, prettyplay/engine, prettyplay/engine/groups, prettyplay/engine/renderer, prettyplay/engine/steering; included in scope. |
|
|
85
|
+
| prettyplay/engine | DIRECT | Consumes prettyplay/cache, prettyplay/engine/renderer; included in scope. |
|
|
86
|
+
| prettyplay/engine/groups | DIRECT | Consumes prettyplay/cache, prettyplay/engine, prettyplay/engine/renderer; included in scope. |
|
|
87
|
+
| prettyplay/engine/steering | DIRECT | Consumes prettyplay/cache, prettyplay/engine, prettyplay/engine/renderer; included in scope. |
|
|
88
|
+
|
|
89
|
+
Transitive paths converge on prettyplay through engine/groups/steering; no additional out-of-scope consumer cells.
|
|
90
|
+
|
|
91
|
+
## Scope summary
|
|
92
|
+
Six cells; 46 branch-changed files: CODE=10, MANIFEST=6, OTHER=10, TEST=13, USAGE=7. All six manifests and usage directories exist.
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
# Manifest Review Report
|
|
98
|
+
|
|
99
|
+
## Linter Results
|
|
100
|
+
All 12 cells PASS with zero errors. Six goga contract outputs retained in reports/.
|
|
101
|
+
|
|
102
|
+
## Analysis 1 — Code vs Requirements
|
|
103
|
+
| Cell | Signature Match | Method Coverage | Property Coverage | Facade | Status |
|
|
104
|
+
|---|---|---|---|---|---|
|
|
105
|
+
| prettyplay | Match | Complete | Complete | Present | PASS |
|
|
106
|
+
| prettyplay/cache | Match | Complete | Complete | Present | PASS |
|
|
107
|
+
| prettyplay/engine | Match | Complete | Complete | Present | PASS |
|
|
108
|
+
| prettyplay/engine/groups | Match | Complete | Complete | Present | PASS |
|
|
109
|
+
| prettyplay/engine/renderer | Match | Complete | Complete | Present | PASS |
|
|
110
|
+
| prettyplay/engine/steering | Match | Complete | Complete | Present | PASS |
|
|
111
|
+
|
|
112
|
+
Runtime inspect.signature, model_fields and provider facade checks resolve static extractor limitations for Pydantic constructors and embedded exports. Semantic return labels and Config/PrettyConfig aliases do not change the API.
|
|
113
|
+
|
|
114
|
+
## Analysis 2 — Requirements vs Code
|
|
115
|
+
| Cell | Undocumented Entities | Description Accuracy | Annotation Quality | Status |
|
|
116
|
+
|---|---|---|---|---|
|
|
117
|
+
| prettyplay | No missing facade declarations | Changed behavior matches | Actionable changed contracts | PASS |
|
|
118
|
+
| prettyplay/cache | No missing facade declarations | Changed behavior matches | Actionable changed contracts | PASS |
|
|
119
|
+
| prettyplay/engine | No missing facade declarations | Changed behavior matches | Actionable changed contracts | PASS |
|
|
120
|
+
| prettyplay/engine/groups | No missing facade declarations | Changed behavior matches | Actionable changed contracts | PASS |
|
|
121
|
+
| prettyplay/engine/renderer | No missing facade declarations | Changed behavior matches | Actionable changed contracts | PASS |
|
|
122
|
+
| prettyplay/engine/steering | No missing facade declarations | Changed behavior matches | Actionable changed contracts | PASS |
|
|
123
|
+
|
|
124
|
+
## Algorithm Consistency
|
|
125
|
+
- prettyplay: verified — render before cache lookup; identity from addressing_text; teardown before guarded cleanup; cleanup=False preserves entries.
|
|
126
|
+
- prettyplay/cache: verified — NFC then strip; construction invariant; successful loads/saves touch; ownership-filtered sweep now guards scope inspection.
|
|
127
|
+
- prettyplay/engine: verified — generation, regeneration and funded healing store current addressing_text after validation/compliance.
|
|
128
|
+
- prettyplay/engine/groups: verified — re-render each row; fresh identity and healing budget; preserve original trace records.
|
|
129
|
+
- prettyplay/engine/renderer: verified — single render and snapshot; original source spans restored; collision detection; inputs and memory separated.
|
|
130
|
+
- prettyplay/engine/steering: verified — engineer-approved successful turn validates and passes compliance before publication and addressing write-back.
|
|
131
|
+
|
|
132
|
+
## Operational Flow Consistency
|
|
133
|
+
- prettyplay: verified — render before cache lookup; identity from addressing_text; teardown before guarded cleanup; cleanup=False preserves entries.
|
|
134
|
+
- prettyplay/cache: verified — NFC then strip; construction invariant; successful loads/saves touch; ownership-filtered sweep now guards scope inspection.
|
|
135
|
+
- prettyplay/engine: verified — generation, regeneration and funded healing store current addressing_text after validation/compliance.
|
|
136
|
+
- prettyplay/engine/groups: verified — re-render each row; fresh identity and healing budget; preserve original trace records.
|
|
137
|
+
- prettyplay/engine/renderer: verified — single render and snapshot; original source spans restored; collision detection; inputs and memory separated.
|
|
138
|
+
- prettyplay/engine/steering: verified — engineer-approved successful turn validates and passes compliance before publication and addressing write-back.
|
|
139
|
+
|
|
140
|
+
## Guarantee Verification
|
|
141
|
+
- prettyplay: verified — render before cache lookup; identity from addressing_text; teardown before guarded cleanup; cleanup=False preserves entries.
|
|
142
|
+
- prettyplay/cache: verified — NFC then strip; construction invariant; successful loads/saves touch; ownership-filtered sweep now guards scope inspection.
|
|
143
|
+
- prettyplay/engine: verified — generation, regeneration and funded healing store current addressing_text after validation/compliance.
|
|
144
|
+
- prettyplay/engine/groups: verified — re-render each row; fresh identity and healing budget; preserve original trace records.
|
|
145
|
+
- prettyplay/engine/renderer: verified — single render and snapshot; original source spans restored; collision detection; inputs and memory separated.
|
|
146
|
+
- prettyplay/engine/steering: verified — engineer-approved successful turn validates and passes compliance before publication and addressing write-back.
|
|
147
|
+
|
|
148
|
+
## Practice Consistency
|
|
149
|
+
- prettyplay: verified — render before cache lookup; identity from addressing_text; teardown before guarded cleanup; cleanup=False preserves entries.
|
|
150
|
+
- prettyplay/cache: verified — NFC then strip; construction invariant; successful loads/saves touch; ownership-filtered sweep now guards scope inspection.
|
|
151
|
+
- prettyplay/engine: verified — generation, regeneration and funded healing store current addressing_text after validation/compliance.
|
|
152
|
+
- prettyplay/engine/groups: verified — re-render each row; fresh identity and healing budget; preserve original trace records.
|
|
153
|
+
- prettyplay/engine/renderer: verified — single render and snapshot; original source spans restored; collision detection; inputs and memory separated.
|
|
154
|
+
- prettyplay/engine/steering: verified — engineer-approved successful turn validates and passes compliance before publication and addressing write-back.
|
|
155
|
+
|
|
156
|
+
## Baseline Usages/Annotations Audit
|
|
157
|
+
| Cell | Baseline Usages present? | Baseline Annotations present? |
|
|
158
|
+
|---|---|---|
|
|
159
|
+
| prettyplay | Yes | Yes |
|
|
160
|
+
| prettyplay/cache | Yes | Yes |
|
|
161
|
+
| prettyplay/engine | Yes | Yes |
|
|
162
|
+
| prettyplay/engine/groups | Yes | Yes |
|
|
163
|
+
| prettyplay/engine/renderer | Yes | Yes |
|
|
164
|
+
| prettyplay/engine/steering | Yes | Yes |
|
|
165
|
+
|
|
166
|
+
## Findings
|
|
167
|
+
| Cell | Analysis | Finding | Severity | Proposed Action |
|
|
168
|
+
|---|---|---|---|---|
|
|
169
|
+
| prettyplay/cache | Guarantee | is_dir PermissionError escaped sweep_untouched | CRITICAL, FIXED | Move directory check inside handler and regress; approved q1 |
|
|
170
|
+
| Tooling | Extraction | Pydantic/embedding static extraction incomplete | INFO | Runtime checks passed |
|
|
171
|
+
|
|
172
|
+
## Applied Updates
|
|
173
|
+
| Cell | Updated Section | Previous Value | New Value | Reason |
|
|
174
|
+
|---|---|---|---|---|
|
|
175
|
+
| prettyplay/cache | store.py | is_dir outside try | is_dir inside OSError handler | Never-raises contract |
|
|
176
|
+
| prettyplay/cache | tests/cache/test_store.py | No scope access regression | is_dir/iterdir parameterized regression | Preserve files and log warning |
|
|
177
|
+
|
|
178
|
+
## Critical Discrepancies
|
|
179
|
+
None open. The reproduced issue was repaired after q1 approval and this gate was repeated. No CODEMANIFEST changes.
|
|
180
|
+
|
|
181
|
+
## Overall Status
|
|
182
|
+
CONSISTENT for the scoped functionality after repair. Store regression suite: 43 passed. Changed-file lint and format passed.
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
# Usage Review Report
|
|
188
|
+
|
|
189
|
+
## Cell-level usages
|
|
190
|
+
| Cell | Usage file | Examples valid? | Descriptions accurate? | Names aligned? | Updated? |
|
|
191
|
+
|---|---|---|---|---|---|
|
|
192
|
+
| prettyplay | prettyplay/.usages/lifecycle.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | No |
|
|
193
|
+
| prettyplay | prettyplay/.usages/steps.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | No |
|
|
194
|
+
| prettyplay/cache | prettyplay/cache/.usages/addressing.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | No |
|
|
195
|
+
| prettyplay/cache | prettyplay/cache/.usages/budgets.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | No |
|
|
196
|
+
| prettyplay/cache | prettyplay/cache/.usages/storage.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | Yes |
|
|
197
|
+
| prettyplay/engine | prettyplay/engine/.usages/generation.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | Yes |
|
|
198
|
+
| prettyplay/engine | prettyplay/engine/.usages/healing.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | Yes |
|
|
199
|
+
| prettyplay/engine/groups | prettyplay/engine/groups/.usages/recovery.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | Yes |
|
|
200
|
+
| prettyplay/engine/renderer | prettyplay/engine/renderer/.usages/memory.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | No |
|
|
201
|
+
| prettyplay/engine/renderer | prettyplay/engine/renderer/.usages/rendering.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | No |
|
|
202
|
+
| prettyplay/engine/renderer | prettyplay/engine/renderer/.usages/validation.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | No |
|
|
203
|
+
| prettyplay/engine/steering | prettyplay/engine/steering/.usages/steering.md | Yes, compile/API review; executable core examples exercised | Yes after updates | Yes | No |
|
|
204
|
+
|
|
205
|
+
Browser and interactive examples were checked against signatures/implementation rather than launched against an external site. Store/generation/healing examples were executed against a temporary cache and fake page/provider. Renderer/memory/validation examples ran directly.
|
|
206
|
+
|
|
207
|
+
## Project usages — remarks
|
|
208
|
+
| Usage file | Referenced by cells | Remark | Type |
|
|
209
|
+
|---|---|---|---|
|
|
210
|
+
| conventions.md | All six | Loaded and applied; no shared practice edits | None |
|
|
211
|
+
| cooks/jinja.md | renderer | Single-render/source-tag policy matches implementation | None |
|
|
212
|
+
| prompts/step_generation.md, step_cheatsheet.md, group_framing.md, group_diagnosis.md | engine, groups, steering | Read with implementation prompt mirrors; no scoped discrepancies identified | None |
|
|
213
|
+
|
|
214
|
+
## Integrity
|
|
215
|
+
| Cell | All Usages have files? | All imported usages exist? | All usages referenced in annotations? |
|
|
216
|
+
|---|---|---|---|
|
|
217
|
+
| prettyplay | Yes | Yes | Yes |
|
|
218
|
+
| prettyplay/cache | Yes | Yes | Yes |
|
|
219
|
+
| prettyplay/engine | Yes | Yes | Yes |
|
|
220
|
+
| prettyplay/engine/groups | Yes | Yes | Yes |
|
|
221
|
+
| prettyplay/engine/renderer | Yes | Yes | Yes |
|
|
222
|
+
| prettyplay/engine/steering | Yes | Yes | Yes |
|
|
223
|
+
|
|
224
|
+
## Applied updates
|
|
225
|
+
| Usage file | Change | Reason |
|
|
226
|
+
|---|---|---|
|
|
227
|
+
| cache/.usages/storage.md | Construct matching identity and addressing text; supply step code | Self-contained cache construction respecting invariant |
|
|
228
|
+
| engine/.usages/generation.md | render_step + matching identity; NFC/trim terminology | Previously empty addressing_text failed successful store |
|
|
229
|
+
| engine/.usages/healing.md | render_step and current addressing text; NFC/trim terminology | Correct healed write-back metadata |
|
|
230
|
+
| engine/groups/.usages/recovery.md | Actual render product | Keep both texts in caller example |
|
|
231
|
+
|
|
232
|
+
## Uncovered patterns
|
|
233
|
+
No undocumented key pattern identified for the changed addressing and cleanup surface.
|
|
234
|
+
|
|
235
|
+
## Overall consistency
|
|
236
|
+
CONSISTENT after four cell-level usage updates. Shared practices unchanged. goga lint passes all 12 cells with zero errors.
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
# Test Assessment Report
|
|
242
|
+
|
|
243
|
+
## Coverage Points
|
|
244
|
+
| Cell | Coverage Point | Type | Source |
|
|
245
|
+
|---|---|---|---|
|
|
246
|
+
| prettyplay/cache | NFC plus trim preserves case, internal spaces, template data; empty input | contract / boundary | CODEMANIFEST / code |
|
|
247
|
+
| prettyplay/cache | CachedStep addressing invariant and valid construction | contract / boundary | CODEMANIFEST / code |
|
|
248
|
+
| prettyplay/cache | Identity hash and budget accounting | contract / branch | CODEMANIFEST / code |
|
|
249
|
+
| prettyplay/cache | Verbatim STEP_TEXT round trip and normalized comparison | contract / integration | CODEMANIFEST / code |
|
|
250
|
+
| prettyplay/cache | Only successful load/save touches; skipped writes and misses do not | contract / branch | CODEMANIFEST / code |
|
|
251
|
+
| prettyplay/cache | Unreadable metadata preserves file and warns | boundary / integration | CODEMANIFEST / code |
|
|
252
|
+
| prettyplay/cache | Foreign and non-digest files survive; sweep idempotent | contract / boundary | CODEMANIFEST / code |
|
|
253
|
+
| prettyplay/cache | Scope inspection/enumeration permission errors preserve files and warn | contract / boundary | CODEMANIFEST / code |
|
|
254
|
+
| prettyplay/engine/renderer | Frozen PreparedStep, four fields and defaults | contract | CODEMANIFEST / code |
|
|
255
|
+
| prettyplay/engine/renderer | One snapshot, one evaluation, both outputs | contract / branch | CODEMANIFEST / code |
|
|
256
|
+
| prettyplay/engine/renderer | Capture source preservation and inactive branches | contract / boundary | CODEMANIFEST / code |
|
|
257
|
+
| prettyplay/engine/renderer | Substituted Jinja text remains literal | contract / boundary | CODEMANIFEST / code |
|
|
258
|
+
| prettyplay/engine/renderer | Marker collision raises loudly | contract / boundary | CODEMANIFEST / code |
|
|
259
|
+
| prettyplay/engine/renderer | Comments, escaped quotes/backslashes do not shift source spans | boundary | CODEMANIFEST / code |
|
|
260
|
+
| prettyplay/engine/renderer | Unterminated expressions, comments and raw blocks fail before execution | boundary | CODEMANIFEST / code |
|
|
261
|
+
| prettyplay/engine/renderer | Snapshot isolation and atomic accepted publication | contract | CODEMANIFEST / code |
|
|
262
|
+
| prettyplay/engine/renderer | Exact result keys, string/nonblank values; no fabricated captures | contract / boundary | CODEMANIFEST / code |
|
|
263
|
+
| prettyplay/engine | Generation stores current addressing_text | contract / integration | CODEMANIFEST / code |
|
|
264
|
+
| prettyplay/engine | Healing uses current render rather than old metadata | contract / integration | CODEMANIFEST / code |
|
|
265
|
+
| prettyplay/engine/groups | Fresh render identity and healing refresh; trace key retained | contract / integration | CODEMANIFEST / code |
|
|
266
|
+
| prettyplay/engine/groups | Re-render sees earlier row publication and keeps caller traces unchanged | integration / branch | CODEMANIFEST / code |
|
|
267
|
+
| prettyplay/engine/steering | Successful guided write-back preserves addressing text | contract / integration | CODEMANIFEST / code |
|
|
268
|
+
| prettyplay | Executor evaluates each step once | contract / integration | CODEMANIFEST / code |
|
|
269
|
+
| prettyplay | Rendered values produce distinct caches and prevent cross-value replay | integration | CODEMANIFEST / code |
|
|
270
|
+
| prettyplay | Plain and equivalent template share one cache address | integration | CODEMANIFEST / code |
|
|
271
|
+
| prettyplay | Close preserves working set, removes own untouched files, cleanup=False preserves all | integration | CODEMANIFEST / code |
|
|
272
|
+
| prettyplay | Teardown failure wins; unexpected sweep error is guarded | contract / branch | CODEMANIFEST / code |
|
|
273
|
+
| prettyplay | Strict template replay validates and publishes without generation | integration | CODEMANIFEST / code |
|
|
274
|
+
|
|
275
|
+
## Existing Tests
|
|
276
|
+
The complete executed test inventory is in test-inventory.md (1378 cases, including parameterizations, with file, classification and status). Named evidence for scoped guarantees follows.
|
|
277
|
+
|
|
278
|
+
## Coverage Assessment
|
|
279
|
+
| Coverage Point | Covered by Test? | Test | Test Type | Coverage Completeness |
|
|
280
|
+
|---|---|---|---|---|
|
|
281
|
+
| NFC plus trim preserves case, internal spaces, template data; empty input | Yes | tests.cache.test_text.TestNormalizeStepTextContract.test_normalize_step_text_is_importable_from_facade | CONTRACT | Adequate, including representative failure paths |
|
|
282
|
+
| CachedStep addressing invariant and valid construction | Yes | tests.cache.test_models.TestCachedStepContract.test_cached_step_holds_identity_addressing_code_and_created_at | CONTRACT | Adequate, including representative failure paths |
|
|
283
|
+
| Identity hash and budget accounting | Yes | tests.cache.test_budgets.TestRunBudgetsContract.test_run_budgets_is_importable_from_facade | CONTRACT | Adequate, including representative failure paths |
|
|
284
|
+
| Verbatim STEP_TEXT round trip and normalized comparison | Yes | tests.cache.test_store.TestStepCacheWorkingSet.test_save_serializes_step_text_from_addressing_text | INTEGRATION | Adequate, including representative failure paths |
|
|
285
|
+
| Only successful load/save touches; skipped writes and misses do not | Yes | tests.cache.test_store.TestStepCacheWorkingSet.test_touch_marks_only_successful_load_and_save | CONTRACT | Adequate, including representative failure paths |
|
|
286
|
+
| Unreadable metadata preserves file and warns | Yes | tests.cache.test_store.TestStepCacheWorkingSet.test_sweep_skips_unreadable_metadata_with_warning | INTEGRATION | Adequate, including representative failure paths |
|
|
287
|
+
| Foreign and non-digest files survive; sweep idempotent | Yes | tests.cache.test_store.TestStepCacheWorkingSet.test_sweep_is_idempotent_and_repeat_close_safe | CONTRACT | Adequate, including representative failure paths |
|
|
288
|
+
| Scope inspection/enumeration permission errors preserve files and warn | Yes | tests.cache.test_store.TestStepCacheWorkingSet.test_sweep_of_inaccessible_scope_returns_empty_with_warning[is_dir] | CONTRACT | Adequate, including representative failure paths |
|
|
289
|
+
| Frozen PreparedStep, four fields and defaults | Yes | tests.engine.renderer.test_render.TestPreparedStepContract.test_declares_exactly_four_fields | CONTRACT | Adequate, including representative failure paths |
|
|
290
|
+
| One snapshot, one evaluation, both outputs | Yes | tests.engine.renderer.test_render.TestAddressingRender.test_render_nondeterministic_filter_is_evaluated_once | CONTRACT | Adequate, including representative failure paths |
|
|
291
|
+
| Capture source preservation and inactive branches | Yes | tests.engine.renderer.test_render.TestAddressingRender.test_render_preserves_reached_capture_tag_source | CONTRACT | Adequate, including representative failure paths |
|
|
292
|
+
| Substituted Jinja text remains literal | Yes | tests.engine.renderer.test_render.TestAddressingRender.test_render_data_never_reparsed_in_addressing_text | CONTRACT | Adequate, including representative failure paths |
|
|
293
|
+
| Marker collision raises loudly | Yes | tests.engine.renderer.test_render.TestAddressingRender.test_render_marker_collision_with_data_fails_loudly | CONTRACT | Adequate, including representative failure paths |
|
|
294
|
+
| Comments, escaped quotes/backslashes do not shift source spans | Yes | tests.engine.renderer.test_render.TestAddressingRender.test_render_ignores_capture_syntax_in_comments_and_quoted_data[comment] | CONTRACT | Adequate, including representative failure paths |
|
|
295
|
+
| Unterminated expressions, comments and raw blocks fail before execution | Yes | tests.engine.renderer.test_render.TestAddressingRender.test_render_malformed_scanner_boundaries_raise_authoring_error[{{ "unterminated] | CONTRACT | Adequate, including representative failure paths |
|
|
296
|
+
| Snapshot isolation and atomic accepted publication | Yes | tests.engine.renderer.test_memory.TestStepMemoryContract.test_memory_is_importable_from_facade | CONTRACT | Adequate, including representative failure paths |
|
|
297
|
+
| Exact result keys, string/nonblank values; no fabricated captures | Yes | tests.engine.renderer.test_validation.TestValidateStepResultContract.test_is_importable_from_facade | CONTRACT | Adequate, including representative failure paths |
|
|
298
|
+
| Generation stores current addressing_text | Yes | tests.engine.test_generator.TestStepGeneratorLogic.test_generate_stores_addressing_text_of_prepared | INTEGRATION | Adequate, including representative failure paths |
|
|
299
|
+
| Healing uses current render rather than old metadata | Yes | tests.engine.test_healer.TestStepHealerLogic.test_heal_retains_render_addressing_text_not_old_metadata | INTEGRATION | Adequate, including representative failure paths |
|
|
300
|
+
| Fresh render identity and healing refresh; trace key retained | Yes | tests.engine.groups.test_recovery.TestGroupRecoveryRowReRender.test_row_identity_comes_from_fresh_render_addressing | INTEGRATION | Adequate, including representative failure paths |
|
|
301
|
+
| Re-render sees earlier row publication and keeps caller traces unchanged | Yes | tests.engine.groups.test_recovery.TestGroupRecoveryRowReRender.test_recovery_rerenders_row_step_against_current_memory | INTEGRATION | Adequate, including representative failure paths |
|
|
302
|
+
| Successful guided write-back preserves addressing text | Yes | tests.engine.steering.test_steering.TestStepSteeringLogic.test_write_back_carries_stuck_render_addressing_text | INTEGRATION | Adequate, including representative failure paths |
|
|
303
|
+
| Executor evaluates each step once | Yes | tests.test_executor.TestStepExecutorRenderAndMemory.test_executor_renders_exactly_once_per_step_execution | INTEGRATION | Adequate, including representative failure paths |
|
|
304
|
+
| Rendered values produce distinct caches and prevent cross-value replay | Yes | tests.test_integration.test_template_step_addresses_by_rendered_value_across_the_wired_cycle | INTEGRATION | Adequate, including representative failure paths |
|
|
305
|
+
| Plain and equivalent template share one cache address | Yes | tests.test_integration.test_plain_sentence_and_identical_render_share_one_address_across_the_wired_cycle | INTEGRATION | Adequate, including representative failure paths |
|
|
306
|
+
| Close preserves working set, removes own untouched files, cleanup=False preserves all | Yes | tests.test_integration.test_close_lifecycle_keeps_working_set_and_sweeps_untouched_entries | INTEGRATION | Adequate, including representative failure paths |
|
|
307
|
+
| Teardown failure wins; unexpected sweep error is guarded | Yes | tests.test_scenario.TestCacheLifecycleOnClose.test_close_sweep_never_masks_teardown_and_never_raises | CONTRACT | Adequate, including representative failure paths |
|
|
308
|
+
| Strict template replay validates and publishes without generation | Yes | tests.test_integration.test_strict_template_step_replay_validates_and_publishes_without_llm | INTEGRATION | Adequate, including representative failure paths |
|
|
309
|
+
|
|
310
|
+
## Test Run Results
|
|
311
|
+
1378 passed, 0 failed, 0 errors, 0 skipped, Python 3.12.15. Full suite with branch coverage completed in 9.06 seconds. Coverage: 2536/2546 statements (99.61%), 599/612 branches (97.88%), combined 99.27%. Ruff check passes; format check passes on 122 files.
|
|
312
|
+
|
|
313
|
+
## Coverage Gaps
|
|
314
|
+
| Coverage Point | Gap Type | Description |
|
|
315
|
+
|---|---|---|
|
|
316
|
+
| New renderer scanner boundaries | WARNING, RESOLVED | q2 approved automatic tests; 11 parameterized cases now pass |
|
|
317
|
+
| Inaccessible sweep scope | CRITICAL behavior, RESOLVED | q1 approved repair; 2 parameterized error cases now pass |
|
|
318
|
+
| Base VarExtension.parse | INFO | Six unexecuted lines belong to the non-facade base parser; render_step uses the overriding _MarkedVarExtension.parse. Runtime scanner branches are covered. |
|
|
319
|
+
| Pre-existing internal branches | INFO | Residual branches include metadata ignoring an unrelated assignment, recovery occurrence matching and finite-delay checks; no uncovered changed public API was identified. |
|
|
320
|
+
|
|
321
|
+
## Proposed Tests
|
|
322
|
+
| Test | Type | File | Coverage Point Addressed | Priority |
|
|
323
|
+
|---|---|---|---|---|
|
|
324
|
+
| test_sweep_of_inaccessible_scope_returns_empty_with_warning | CONTRACT | tests/cache/test_store.py | is_dir/iterdir permission errors | CRITICAL — implemented |
|
|
325
|
+
| test_render_ignores_capture_syntax_in_comments_and_quoted_data | CONTRACT | tests/engine/renderer/test_render.py | Comment/quote source span scanning | WARNING — implemented |
|
|
326
|
+
| test_render_malformed_scanner_boundaries_raise_authoring_error | CONTRACT | tests/engine/renderer/test_render.py | Malformed scanner boundaries | WARNING — implemented |
|
|
327
|
+
|
|
328
|
+
## Overall Coverage Assessment
|
|
329
|
+
ADEQUATE. Changed APIs, storage lifecycle and cross-cell addressing are covered by contract and integration tests. Full suite passes; no open critical or warning coverage gaps. External provider/page boundaries are faked; this is not a live browser/provider smoke test.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Step cache addresses by the rendered sentence and cleans its scope on close
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
status: accepted
|
|
5
|
+
date: 2026-10-11
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
The step cache addressed steps by their template source — "runtime values never enter the address" — so the same
|
|
9
|
+
template rendered with different values replayed code generated for the wrong value, sometimes succeeding silently
|
|
10
|
+
(the documented "accepted limitation" of the old addressing). We decided: the step address is now built from the
|
|
11
|
+
**addressing text** — the rendered sentence with `{{ }}` substitutions applied (vars + memory), capture tags
|
|
12
|
+
`{% var x %}` kept verbatim — and every `PrettyPlay` object, on `close()`, deletes the step files in its working
|
|
13
|
+
scope whose addresses it did not load or save during its lifetime, governed by a new `cleanup` setting
|
|
14
|
+
(`[tool.prettyplay] cleanup`, env `PRETTYPLAY_CLEANUP`, per-test override; default `True`).
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
1. **Address structure unchanged, text changed**: the identity stays the triple
|
|
19
|
+
`(cache_key, step_type, normalize(addressing_text))` hashed with sha256 into the file name.
|
|
20
|
+
2. **Addressing text**: a plain sentence addresses as itself; a template addresses by its render — `{{ }}`
|
|
21
|
+
substituted with actual values from vars and memory, `{% var x %}` capture tags remaining verbatim in the
|
|
22
|
+
addressing text. The LLM instruction keeps today's tag-stripped render — unchanged.
|
|
23
|
+
Keeping the capture tags makes templates differing only in capture names (`Read {% var a %}` vs
|
|
24
|
+
`Read {% var x %}`) address differently by construction.
|
|
25
|
+
3. **One normalization for all addressing texts**: Unicode NFC + trim, verbatim — case and internal whitespace
|
|
26
|
+
are significant because rendered values are data ("Sign in" and "sign In" are different buttons). Casefold
|
|
27
|
+
and whitespace collapse are dropped from addressing; the old documented merge
|
|
28
|
+
(«Click Sign in» == «click sign in ») is gone by decision.
|
|
29
|
+
4. **Cleanup flag**: a config field, layered like `strict`/`interactive` — pyproject, env, per-test override.
|
|
30
|
+
Default `True`: the cache is a per-test working set by default; persistence is opt-in (`cleanup = false`).
|
|
31
|
+
5. **Cleanup algorithm on `close()`**: during execution the object accumulates the set of addresses it loaded
|
|
32
|
+
(cache hits, strict replays) or saved (generation, healing, steering/recovery write-backs, recovery
|
|
33
|
+
re-renders). On close it reads every step file in its working scope — the `cache_root` + `cache_path`
|
|
34
|
+
directory, filtered to files whose metadata carries this object's `cache_key` — and deletes the files whose
|
|
35
|
+
address is outside the touched set. Best-effort: a per-file failure never fails `close()` and is logged;
|
|
36
|
+
`close()` stays idempotent. Deletions are visible as log records; a hook event is a contract question for a
|
|
37
|
+
later stage.
|
|
38
|
+
|
|
39
|
+
## Considered options
|
|
40
|
+
|
|
41
|
+
- **Unified casefold normalization** (merge case/whitespace of the whole rendered text): rejected — it
|
|
42
|
+
reintroduces silent wrong hits for values differing only in case or spacing, the exact bug class this change
|
|
43
|
+
fixes; it did buy template/plain unification when texts coincide exactly, judged not worth it.
|
|
44
|
+
- **Hybrid normalization** (plain sentences casefold, template renders verbatim): rejected — two addressing
|
|
45
|
+
regimes to document and explain; exact-text equality already unifies plain and rendered sentences without it.
|
|
46
|
+
- **Capture declarations excluded from the address**: superseded by keeping `{% var %}` tags in the addressing
|
|
47
|
+
text — cheaper than a separate declarations component and collision-free.
|
|
48
|
+
- **Cleanup scope = the whole `cache_path` directory regardless of `cache_key`**: rejected — with the default
|
|
49
|
+
shared root (`cache_path` unset) every test close would purge other tests' entries; the `cache_key` filter
|
|
50
|
+
(readable from file metadata) keeps the scope honest to "this object's working area".
|
|
51
|
+
- **Cleanup default `False`**: rejected — the owner wants value-bearing cache entries treated as a per-test
|
|
52
|
+
working set unless persistence is explicitly requested.
|
|
53
|
+
|
|
54
|
+
## Consequences
|
|
55
|
+
|
|
56
|
+
- The committed-cache team workflow (generate locally, commit the directory, strict replay in CI) now requires
|
|
57
|
+
an explicit `cleanup = false`; with the default, generated entries vanish at test close. Strict replays keep
|
|
58
|
+
the entries they use (they load them), so a committed strict run is self-preserving.
|
|
59
|
+
- Strict replay across processes requires the replay to render the exact same sentences as the generation run
|
|
60
|
+
(deterministic vars and application state).
|
|
61
|
+
- Every existing cache file becomes unreachable (addresses change for plain and template steps alike): no
|
|
62
|
+
migration; docs say to purge the cache directory after upgrading — and the first `cleanup = True` close
|
|
63
|
+
sweeps the legacy files out of each test's scope as a side effect.
|
|
64
|
+
- Attempt budgets keyed by `StepIdentity` follow the new addresses: the same template re-rendered against
|
|
65
|
+
changed memory is a different step with a fresh budget.
|
|
66
|
+
- `ScenarioStep` records (raw sentence + prepared instruction) are unchanged.
|
|
67
|
+
- Rendered values (vars, memory captures) now land in cache file metadata on disk — accepted knowingly;
|
|
68
|
+
see open questions.
|
|
69
|
+
|
|
70
|
+
## Open questions
|
|
71
|
+
|
|
72
|
+
- Security posture for value-bearing cache files (secrets in vars/captures reaching disk, logs and LLM
|
|
73
|
+
requests): deliberately deferred — no docs rule extended now, to be designed later.
|
|
74
|
+
- Whether cache cleanup deserves a hook event (e.g. on_cache_deleted) alongside the log record — a contract
|
|
75
|
+
decision for the contract-designing stage, intentionally not fixed here.
|