carlos / todomvc-bakeoff Public

Clone
git clone https://amadan.net/carlos/todomvc-bakeoff

Plain git — no account needed to clone.

Download

Download this file

1{
2 "Slug": "go-rastrillo",
3 "Language": "Go + Rastrillo",
4 "Status": "LIVE",
5 "URL": "https://todo-go-rastrillo-2.bfj.oncarlos.com",
6 "Version": "449d865",
7 "Stack": "",
8 "Source": "https://amadan.net/carlos/todomvc-bakeoff?ref=main\u0026path=apps/go-rastrillo",
9 "BehaviourJSOn": {
10 "Passed": 35,
11 "Failed": 0,
12 "Skipped": 0
13 },
14 "BehaviourJSOff": {
15 "Passed": 32,
16 "Failed": 0,
17 "Skipped": 3
18 },
19 "TTFBEmpty": {
20 "N": 30,
21 "P50": 56.635,
22 "P95": 67.487,
23 "P99": 67.932,
24 "Min": 46.233,
25 "Max": 67.932
26 },
27 "TTFB50": {
28 "N": 30,
29 "P50": 54.058,
30 "P95": 59.506,
31 "P99": 64.063,
32 "Min": 48.03,
33 "Max": 64.063
34 },
35 "Wake": [
36 1319.839,
37 1382.91,
38 1369.422
39 ],
40 "Load": [
41 {
42 "Scenario": "read",
43 "Concurrency": 1,
44 "RPS": 66.38935693629935,
45 "P50Ms": 13.830784000000001,
46 "P95Ms": 20.574993,
47 "P99Ms": 27.179045,
48 "ErrorRate": 0,
49 "Status": {
50 "200": 663
51 }
52 },
53 {
54 "Scenario": "read",
55 "Concurrency": 2,
56 "RPS": 118.69208552865248,
57 "P50Ms": 16.532695999999998,
58 "P95Ms": 22.722982,
59 "P99Ms": 29.551419999999997,
60 "ErrorRate": 0,
61 "Status": {
62 "200": 1185
63 }
64 },
65 {
66 "Scenario": "read",
67 "Concurrency": 4,
68 "RPS": 207.07157605092033,
69 "P50Ms": 17.678483,
70 "P95Ms": 29.174643,
71 "P99Ms": 46.391329,
72 "ErrorRate": 0,
73 "Status": {
74 "200": 2067
75 }
76 },
77 {
78 "Scenario": "read",
79 "Concurrency": 8,
80 "RPS": 303.45433901319063,
81 "P50Ms": 23.114886000000002,
82 "P95Ms": 45.537688,
83 "P99Ms": 65.524003,
84 "ErrorRate": 0,
85 "Status": {
86 "200": 3027
87 }
88 },
89 {
90 "Scenario": "read",
91 "Concurrency": 16,
92 "RPS": 336.0487035096041,
93 "P50Ms": 43.117768,
94 "P95Ms": 87.289749,
95 "P99Ms": 110.44098,
96 "ErrorRate": 0,
97 "Status": {
98 "200": 3345
99 }
100 },
101 {
102 "Scenario": "read",
103 "Concurrency": 32,
104 "RPS": 319.64425484106636,
105 "P50Ms": 86.06021799999999,
106 "P95Ms": 197.978067,
107 "P99Ms": 317.425744,
108 "ErrorRate": 0,
109 "Status": {
110 "200": 3165
111 }
112 },
113 {
114 "Scenario": "read",
115 "Concurrency": 64,
116 "RPS": 330.43588202319074,
117 "P50Ms": 161.60340100000002,
118 "P95Ms": 442.15261,
119 "P99Ms": 618.243098,
120 "ErrorRate": 0,
121 "Status": {
122 "200": 3241
123 }
124 },
125 {
126 "Scenario": "toggle",
127 "Concurrency": 1,
128 "RPS": 26.396701626544957,
129 "P50Ms": 37.087085,
130 "P95Ms": 42.778312,
131 "P99Ms": 50.690356,
132 "ErrorRate": 0,
133 "Status": {
134 "303": 263
135 }
136 },
137 {
138 "Scenario": "toggle",
139 "Concurrency": 2,
140 "RPS": 52.19211696006568,
141 "P50Ms": 36.490811,
142 "P95Ms": 42.466494,
143 "P99Ms": 97.711311,
144 "ErrorRate": 0,
145 "Status": {
146 "303": 520
147 }
148 },
149 {
150 "Scenario": "toggle",
151 "Concurrency": 4,
152 "RPS": 105.18763725491837,
153 "P50Ms": 36.513507000000004,
154 "P95Ms": 43.423343,
155 "P99Ms": 51.016984,
156 "ErrorRate": 0,
157 "Status": {
158 "303": 1048
159 }
160 },
161 {
162 "Scenario": "toggle",
163 "Concurrency": 8,
164 "RPS": 207.97931204825537,
165 "P50Ms": 37.776849,
166 "P95Ms": 44.322362999999996,
167 "P99Ms": 50.285772,
168 "ErrorRate": 0,
169 "Status": {
170 "303": 2072
171 }
172 },
173 {
174 "Scenario": "toggle",
175 "Concurrency": 16,
176 "RPS": 286.6553076283187,
177 "P50Ms": 47.789087,
178 "P95Ms": 116.326087,
179 "P99Ms": 182.763647,
180 "ErrorRate": 0,
181 "Status": {
182 "303": 2851
183 }
184 },
185 {
186 "Scenario": "toggle",
187 "Concurrency": 32,
188 "RPS": 292.5391596655851,
189 "P50Ms": 93.9515,
190 "P95Ms": 241.690162,
191 "P99Ms": 333.75972199999995,
192 "ErrorRate": 0,
193 "Status": {
194 "303": 2894
195 }
196 },
197 {
198 "Scenario": "toggle",
199 "Concurrency": 64,
200 "RPS": 308.55310187938557,
201 "P50Ms": 173.95269199999998,
202 "P95Ms": 479.980394,
203 "P99Ms": 663.634681,
204 "ErrorRate": 0,
205 "Status": {
206 "303": 3023
207 }
208 },
209 {
210 "Scenario": "read-after",
211 "Concurrency": 1,
212 "RPS": 60.492996852789645,
213 "P50Ms": 16.002378,
214 "P95Ms": 22.689337000000002,
215 "P99Ms": 34.779427,
216 "ErrorRate": 0,
217 "Status": {
218 "200": 604
219 }
220 },
221 {
222 "Scenario": "read-after",
223 "Concurrency": 2,
224 "RPS": 107.69357496900928,
225 "P50Ms": 18.159891000000002,
226 "P95Ms": 24.251697,
227 "P99Ms": 28.927315,
228 "ErrorRate": 0,
229 "Status": {
230 "200": 1075
231 }
232 },
233 {
234 "Scenario": "read-after",
235 "Concurrency": 4,
236 "RPS": 220.0566636934856,
237 "P50Ms": 17.181931000000002,
238 "P95Ms": 26.599655,
239 "P99Ms": 33.791053,
240 "ErrorRate": 0,
241 "Status": {
242 "200": 2198
243 }
244 },
245 {
246 "Scenario": "read-after",
247 "Concurrency": 8,
248 "RPS": 186.9655489240034,
249 "P50Ms": 40.270655000000005,
250 "P95Ms": 56.580746,
251 "P99Ms": 99.18809300000001,
252 "ErrorRate": 0,
253 "Status": {
254 "200": 1862
255 }
256 },
257 {
258 "Scenario": "read-after",
259 "Concurrency": 16,
260 "RPS": 310.5483192319197,
261 "P50Ms": 47.533324,
262 "P95Ms": 75.708775,
263 "P99Ms": 124.583215,
264 "ErrorRate": 0,
265 "Status": {
266 "200": 3090
267 }
268 },
269 {
270 "Scenario": "read-after",
271 "Concurrency": 32,
272 "RPS": 317.23836553449513,
273 "P50Ms": 87.680991,
274 "P95Ms": 204.584494,
275 "P99Ms": 281.92094099999997,
276 "ErrorRate": 0,
277 "Status": {
278 "200": 3141
279 }
280 },
281 {
282 "Scenario": "read-after",
283 "Concurrency": 64,
284 "RPS": 336.31082957134606,
285 "P50Ms": 142.530464,
286 "P95Ms": 506.24814799999996,
287 "P99Ms": 737.802824,
288 "ErrorRate": 0,
289 "Status": {
290 "200": 3300
291 }
292 }
293 ],
294 "Weight": {
295 "HTMLBytes": 43128,
296 "JSBytes": 3325
297 },
298 "Memory": {
299 "IdleKB": 19160,
300 "PeakKB": 64780,
301 "AfterKB": 36672
302 },
303 "Code": {
304 "Server": 609,
305 "Templates": 102,
306 "JS": 86,
307 "Tests": 503,
308 "Deps": 3
309 },
310 "Build": {
311 "ColdSeconds": 10.390341005,
312 "WarmSeconds": 0.272297767,
313 "EditSeconds": 0.139181192,
314 "Bytes": 14090402,
315 "Host": "DOCS-T1",
316 "ColdRuns": 1,
317 "Runs": 3
318 },
319 "TokensBuild": {
320 "Input": 124,
321 "Output": 53908,
322 "CacheRead": 7871388,
323 "CacheWrite": 166924,
324 "Turns": 65,
325 "Seconds": 756.874,
326 "CostUSD": 3.9883256
327 },
328 "TokensFix": {
329 "Input": 22,
330 "Output": 8277,
331 "CacheRead": 2045481,
332 "CacheWrite": 13112,
333 "Turns": 12,
334 "Seconds": 209.902,
335 "CostUSD": 0.6796201999999991
336 },
337 "TokensSecurity": {
338 "Input": 0,
339 "Output": 0,
340 "CacheRead": 0,
341 "CacheWrite": 0,
342 "Turns": 0,
343 "Seconds": 0,
344 "CostUSD": 0
345 },
346 "TokensReview": {
347 "Input": 684516,
348 "Output": 3432,
349 "CacheRead": 582400,
350 "CacheWrite": 0,
351 "Turns": 2,
352 "Seconds": 0,
353 "CostUSD": 0
354 },
355 "Readability": {
356 "Naming": 4,
357 "Structure": 4,
358 "Traceability": 5,
359 "Errors": 4,
360 "Comments": 5,
361 "Overall": 8,
362 "Notes": "Strongest: a toggle is traceable in seconds — Router lists every route, owned() is the single ownership seam, afterItemWrite maps error/no-row/success to 500/404/done, and done() explains the 303-vs-fragment split. Comments consistently explain why (Resolve not Run, why not csrf.Protect, parseForm's 1 MiB cap, toggleAll's single-statement race note). Weakest: renderStatus swallows template errors with a bare http.Error and no log or ref, unlike fail(); several `uid, _ := sessions.UserID(r)` rely on an invariant stated only in visitor.go; repeated 'the contract' references assume context the reader lacks; done() is a vague name for 'respond after success'. app.go mixes wiring with parseForm middleware."
363 },
364 "ReviewFindings": [
365 "[correctness] `apps/go-rastrillo/internal/todo/static/app.js:42` — Every action response replaces the entire app, preserving only the new-todo input. With a request pending, double-click another todo and start editing: when the earlier response arrives, the editor disappears and its unsaved text is lost. Preserve the active editor’s value and focus across replacement, or defer replacement until editing finishes."
366 ],
367 "Notes": null
368}
369