async-app-result-removal-tracker.json

  1{
  2  "project": "async-app-result-removal",
  3  "description": "Remove Result from AsyncApp return types by moving app-alive checks to executor",
  4  "phases": [
  5    {
  6      "id": 1,
  7      "name": "Add Trampoline Check Infrastructure",
  8      "status": "not_started",
  9      "tasks": [
 10        {
 11          "id": "1.1",
 12          "description": "Add Option<Weak<AppCell>> field to RunnableMeta struct",
 13          "file": "crates/gpui/src/executor.rs",
 14          "status": "not_started"
 15        },
 16        {
 17          "id": "1.2",
 18          "description": "Update trampoline function in Mac dispatcher to check app status before run()",
 19          "file": "crates/gpui/src/platform/mac/dispatcher.rs",
 20          "status": "not_started"
 21        },
 22        {
 23          "id": "1.3",
 24          "description": "Update trampoline function in Linux dispatcher to check app status before run()",
 25          "file": "crates/gpui/src/platform/linux/dispatcher.rs",
 26          "status": "not_started"
 27        },
 28        {
 29          "id": "1.4",
 30          "description": "Update trampoline function in Windows dispatcher to check app status before run()",
 31          "file": "crates/gpui/src/platform/windows/dispatcher.rs",
 32          "status": "not_started"
 33        },
 34        {
 35          "id": "1.5",
 36          "description": "Update trampoline function in Test dispatcher to check app status before run()",
 37          "file": "crates/gpui/src/platform/test/dispatcher.rs",
 38          "status": "not_started"
 39        },
 40        {
 41          "id": "1.6",
 42          "description": "Modify ForegroundExecutor::spawn_with_priority to accept optional app weak pointer",
 43          "file": "crates/gpui/src/executor.rs",
 44          "status": "not_started"
 45        },
 46        {
 47          "id": "1.7",
 48          "description": "Update AsyncApp::spawn to pass app weak pointer to executor",
 49          "file": "crates/gpui/src/app/async_context.rs",
 50          "status": "not_started"
 51        },
 52        {
 53          "id": "1.8",
 54          "description": "Write unit test verifying task cancellation when app is dropped",
 55          "file": "crates/gpui/src/executor.rs",
 56          "status": "not_started"
 57        },
 58        {
 59          "id": "1.9",
 60          "description": "Write unit test for nested tasks both cancelling cleanly",
 61          "file": "crates/gpui/src/executor.rs",
 62          "status": "not_started"
 63        },
 64        {
 65          "id": "1.10",
 66          "description": "Create async_cancellation.rs example demonstrating behavior",
 67          "file": "crates/gpui/examples/async_cancellation.rs",
 68          "status": "not_started"
 69        }
 70      ]
 71    },
 72    {
 73      "id": 2,
 74      "name": "Update AsyncApp API",
 75      "status": "not_started",
 76      "tasks": [
 77        {
 78          "id": "2.1",
 79          "description": "Rename update() -> Result<R> to try_update() -> Option<R>",
 80          "file": "crates/gpui/src/app/async_context.rs",
 81          "status": "not_started"
 82        },
 83        {
 84          "id": "2.2",
 85          "description": "Add new update() -> R that panics if app is gone",
 86          "file": "crates/gpui/src/app/async_context.rs",
 87          "status": "not_started"
 88        },
 89        {
 90          "id": "2.3",
 91          "description": "Apply try_/non-try pattern to read_entity and update_entity",
 92          "file": "crates/gpui/src/app/async_context.rs",
 93          "status": "not_started"
 94        },
 95        {
 96          "id": "2.4",
 97          "description": "Apply try_/non-try pattern to read_global and update_global",
 98          "file": "crates/gpui/src/app/async_context.rs",
 99          "status": "not_started"
100        },
101        {
102          "id": "2.5",
103          "description": "Apply try_/non-try pattern to read_window and update_window",
104          "file": "crates/gpui/src/app/async_context.rs",
105          "status": "not_started"
106        },
107        {
108          "id": "2.6",
109          "description": "Apply try_/non-try pattern to new, reserve_entity, insert_entity",
110          "file": "crates/gpui/src/app/async_context.rs",
111          "status": "not_started"
112        },
113        {
114          "id": "2.7",
115          "description": "Apply try_/non-try pattern to refresh, open_window, subscribe, has_global",
116          "file": "crates/gpui/src/app/async_context.rs",
117          "status": "not_started"
118        },
119        {
120          "id": "2.8",
121          "description": "Update AppContext trait Result associated type for AsyncApp",
122          "file": "crates/gpui/src/app/async_context.rs",
123          "status": "not_started"
124        },
125        {
126          "id": "2.9",
127          "description": "Apply same changes to AsyncWindowContext",
128          "file": "crates/gpui/src/app/async_context.rs",
129          "status": "not_started"
130        }
131      ]
132    },
133    {
134      "id": 3,
135      "name": "Audit Cross-Boundary Awaits",
136      "status": "not_started",
137      "tasks": [
138        {
139          "id": "3.1",
140          "description": "Search for background tasks awaiting foreground tasks",
141          "file": null,
142          "status": "not_started",
143          "notes": "grep for patterns like background_executor().spawn(...).await"
144        },
145        {
146          "id": "3.2",
147          "description": "Identify all Task<T> values passed across thread boundaries",
148          "file": null,
149          "status": "not_started"
150        },
151        {
152          "id": "3.3",
153          "description": "Migrate identified cases to use try_update or handle Option",
154          "file": null,
155          "status": "not_started"
156        }
157      ]
158    },
159    {
160      "id": 4,
161      "name": "Codebase Migration",
162      "status": "not_started",
163      "tasks": [
164        {
165          "id": "4.1",
166          "description": "Update callsites in crates/gpui",
167          "file": null,
168          "status": "not_started"
169        },
170        {
171          "id": "4.2",
172          "description": "Update callsites in crates/editor",
173          "file": null,
174          "status": "not_started"
175        },
176        {
177          "id": "4.3",
178          "description": "Update callsites in crates/workspace",
179          "file": null,
180          "status": "not_started"
181        },
182        {
183          "id": "4.4",
184          "description": "Update callsites in crates/project",
185          "file": null,
186          "status": "not_started"
187        },
188        {
189          "id": "4.5",
190          "description": "Update callsites in crates/language",
191          "file": null,
192          "status": "not_started"
193        },
194        {
195          "id": "4.6",
196          "description": "Update callsites in crates/agent and crates/agent_ui",
197          "file": null,
198          "status": "not_started"
199        },
200        {
201          "id": "4.7",
202          "description": "Update callsites in remaining crates",
203          "file": null,
204          "status": "not_started"
205        },
206        {
207          "id": "4.8",
208          "description": "Fix all compilation errors",
209          "file": null,
210          "status": "not_started"
211        }
212      ]
213    },
214    {
215      "id": 5,
216      "name": "Testing and Cleanup",
217      "status": "not_started",
218      "tasks": [
219        {
220          "id": "5.1",
221          "description": "Remove dead error handling code",
222          "file": null,
223          "status": "not_started"
224        },
225        {
226          "id": "5.2",
227          "description": "Update AsyncApp documentation",
228          "file": "crates/gpui/src/app/async_context.rs",
229          "status": "not_started"
230        },
231        {
232          "id": "5.3",
233          "description": "Add test: try_update returns None when app gone",
234          "file": "crates/gpui/src/app/async_context.rs",
235          "status": "not_started"
236        },
237        {
238          "id": "5.4",
239          "description": "Add test: update works normally when app alive",
240          "file": "crates/gpui/src/app/async_context.rs",
241          "status": "not_started"
242        },
243        {
244          "id": "5.5",
245          "description": "Add test: spawn_executes_when_app_alive",
246          "file": "crates/gpui/src/app/async_context.rs",
247          "status": "not_started"
248        },
249        {
250          "id": "5.6",
251          "description": "Add test: update_entity works via AsyncApp",
252          "file": "crates/gpui/src/app/async_context.rs",
253          "status": "not_started"
254        },
255        {
256          "id": "5.7",
257          "description": "Verify async_cancellation example runs without panics",
258          "file": "crates/gpui/examples/async_cancellation.rs",
259          "status": "not_started"
260        },
261        {
262          "id": "5.8",
263          "description": "Run cargo test -p gpui",
264          "file": null,
265          "status": "not_started"
266        },
267        {
268          "id": "5.9",
269          "description": "Run ./script/clippy",
270          "file": null,
271          "status": "not_started"
272        },
273        {
274          "id": "5.10",
275          "description": "Run full test suite and fix any regressions",
276          "file": null,
277          "status": "not_started"
278        },
279        {
280          "id": "5.11",
281          "description": "Manual test: close windows with pending tasks, verify no panics",
282          "file": null,
283          "status": "not_started"
284        }
285      ]
286    }
287  ]
288}