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}