{ "id": "tier2_no_appdata_20260618", "name": "Tier 2 Sandbox - Move State/Failures Off AppData", "date": "2026-06-18", "type": "fix", "priority": "A", "spec": "conductor/tracks/tier2_no_appdata_20260618/spec.md", "plan": "conductor/tracks/tier2_no_appdata_20260618/plan.md", "status": "active", "blocked_by": {}, "blocks": {}, "scope": { "new_files": [], "modified_files": [ "scripts/tier2/failcount.py", "scripts/tier2/write_report.py", "scripts/tier2/run_track.py", "scripts/tier2/setup_tier2_clone.ps1", "scripts/tier2/run_tier2_sandboxed.ps1", "scripts/tier2/write_track_completion_report.py", "conductor/tier2/opencode.json.fragment", "conductor/tier2/agents/tier2-autonomous.md", "conductor/tier2/commands/tier-2-auto-execute.md", "docs/guide_tier2_autonomous.md", "conductor/workflow.md", ".gitignore", "tests/test_tier2_slash_command_spec.py", "tests/test_no_temp_writes.py" ], "deleted_files": [] }, "verification_criteria": [ "scripts/tier2/failcount.py default state dir is scripts/tier2/state// (Path.cwd()-relative)", "scripts/tier2/write_report.py default failures dir is scripts/tier2/failures/ (Path.cwd()-relative)", "scripts/tier2/run_track.py chdirs to repo_path before state/report calls", "conductor/tier2/opencode.json.fragment has NO AppData allow rules in read/write", "conductor/tier2/opencode.json.fragment has *AppData\\* bash deny rule (in addition to *AppData\\Local\\Temp\\*)", "conductor/tier2/agents/tier2-autonomous.md contains 'NEVER USE APPDATA' or equivalent phrasing; no AppData path strings", "conductor/tier2/commands/tier-2-auto-execute.md contains no AppData path strings", "scripts/tier2/setup_tier2_clone.ps1 has no AppData variable declarations or New-Item/Set-Acl calls", "scripts/tier2/run_tier2_sandboxed.ps1 has no AppData variable declarations", "docs/guide_tier2_autonomous.md has no AppData path strings", "conductor/workflow.md hard-bans table row says 'File access outside Tier 2 clone (AppData denied)'", ".gitignore has scripts/tier2/state/ and scripts/tier2/failures/", "tests/test_tier2_slash_command_spec.py asserts NO AppData refs in agent prompt and command", "uv run python scripts/run_tests_batched.py passes for test_failcount.py + test_tier2_report_writer.py + test_tier2_slash_command_spec.py + test_no_temp_writes.py", "uv run python scripts/audit_no_temp_writes.py --strict exits 0" ], "regressions_and_pre_existing_failures": [], "pre_existing_failures_remaining": [], "deferred_to_followup_tracks": [ { "title": "Re-bootstrap the live Tier 2 clone", "description": "The user re-runs pwsh -File scripts/tier2/setup_tier2_clone.ps1 after this track merges so the clone picks up the new inside-clone conventions and the AppData-denied permissions.", "track_status": "manual user action" } ], "estimated_effort": { "method": "scope (per workflow.md §Tier 1 Track Initialization Rules). NO day estimates.", "scope": "11 source files + 3 test files + 1 doc + 1 workflow.md section + 1 .gitignore; ~15 atomic commits across 6 phases." }, "risk_register": [ { "risk": "An existing Tier 2 run is using the old AppData config and its state cannot be migrated automatically", "likelihood": "high", "mitigation": "Document in the spec that the user's existing live_gui_test_fixes_20260618 run is unaffected by this change until re-bootstrap. State on AppData is discarded on next bootstrap." }, { "risk": "The AppData path strings are hard-coded in a downstream script we missed", "likelihood": "medium", "mitigation": "Run scripts/audit_no_temp_writes.py --strict after the changes. Run a grep for 'AppData' across scripts/ and conductor/ and docs/ as the final verification." }, { "risk": "The TIER2_STATE_DIR / TIER2_FAILURES_DIR env-var escape hatch is removed by mistake", "likelihood": "low", "mitigation": "The existing tests (tests/test_failcount.py:176,190,198 and tests/test_tier2_report_writer.py:25,33,40,71) monkeypatch the env var. They must still pass after the change." } ] }