{
  "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/<track>/ (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."
    }
  ]
}