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": "spinel",
3 "Language": "Spinel",
4 "Status": "LIVE",
5 "URL": "https://todo-spinel-4.bfj.oncarlos.com",
6 "Version": "e344882",
7 "Stack": "",
8 "Source": "https://amadan.net/carlos/todomvc-bakeoff?ref=main\u0026path=apps/spinel",
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": 94.565,
22 "P95": 101.677,
23 "P99": 105.118,
24 "Min": 84.654,
25 "Max": 105.118
26 },
27 "TTFB50": {
28 "N": 30,
29 "P50": 92.83,
30 "P95": 103.283,
31 "P99": 108.763,
32 "Min": 82.851,
33 "Max": 108.763
34 },
35 "Wake": [
36 1248.33,
37 1353.544,
38 1285.352
39 ],
40 "Load": [
41 {
42 "Scenario": "read",
43 "Concurrency": 1,
44 "RPS": 25.594970301672053,
45 "P50Ms": 38.742631,
46 "P95Ms": 42.993732,
47 "P99Ms": 46.257200999999995,
48 "ErrorRate": 0,
49 "Status": {
50 "200": 255
51 }
52 },
53 {
54 "Scenario": "read",
55 "Concurrency": 2,
56 "RPS": 54.99317071708903,
57 "P50Ms": 35.90533,
58 "P95Ms": 41.97235,
59 "P99Ms": 62.428013,
60 "ErrorRate": 0,
61 "Status": {
62 "200": 548
63 }
64 },
65 {
66 "Scenario": "read",
67 "Concurrency": 4,
68 "RPS": 247.9686645966048,
69 "P50Ms": 15.490781,
70 "P95Ms": 21.757472,
71 "P99Ms": 29.339324,
72 "ErrorRate": 0,
73 "Status": {
74 "200": 2476
75 }
76 },
77 {
78 "Scenario": "read",
79 "Concurrency": 8,
80 "RPS": 445.1923600556087,
81 "P50Ms": 16.816647,
82 "P95Ms": 26.753986,
83 "P99Ms": 36.077849,
84 "ErrorRate": 0,
85 "Status": {
86 "200": 4445
87 }
88 },
89 {
90 "Scenario": "read",
91 "Concurrency": 16,
92 "RPS": 656.0083460563341,
93 "P50Ms": 20.694995000000002,
94 "P95Ms": 41.204227,
95 "P99Ms": 64.351545,
96 "ErrorRate": 0,
97 "Status": {
98 "200": 6545
99 }
100 },
101 {
102 "Scenario": "read",
103 "Concurrency": 32,
104 "RPS": 627.8284193984191,
105 "P50Ms": 45.189996,
106 "P95Ms": 77.537528,
107 "P99Ms": 170.328653,
108 "ErrorRate": 0,
109 "Status": {
110 "200": 6247
111 }
112 },
113 {
114 "Scenario": "read",
115 "Concurrency": 64,
116 "RPS": 721.7061662902305,
117 "P50Ms": 82.34214700000001,
118 "P95Ms": 128.715374,
119 "P99Ms": 230.934482,
120 "ErrorRate": 0,
121 "Status": {
122 "200": 7154
123 }
124 },
125 {
126 "Scenario": "read",
127 "Concurrency": 128,
128 "RPS": 2990.4632740577986,
129 "P50Ms": 21.819719000000003,
130 "P95Ms": 128.803908,
131 "P99Ms": 177.15046,
132 "ErrorRate": 0.8045324827933523,
133 "Status": {
134 "200": 5822,
135 "503": 23963
136 }
137 },
138 {
139 "Scenario": "toggle",
140 "Concurrency": 1,
141 "RPS": 83.88447238019424,
142 "P50Ms": 9.788593,
143 "P95Ms": 15.403773000000001,
144 "P99Ms": 21.303023,
145 "ErrorRate": 0,
146 "Status": {
147 "303": 838
148 }
149 },
150 {
151 "Scenario": "toggle",
152 "Concurrency": 2,
153 "RPS": 179.67660671670595,
154 "P50Ms": 10.722333,
155 "P95Ms": 15.036688,
156 "P99Ms": 17.771734000000002,
157 "ErrorRate": 0,
158 "Status": {
159 "303": 1795
160 }
161 },
162 {
163 "Scenario": "toggle",
164 "Concurrency": 4,
165 "RPS": 310.1625328622903,
166 "P50Ms": 12.498603000000001,
167 "P95Ms": 17.47861,
168 "P99Ms": 23.312796,
169 "ErrorRate": 0,
170 "Status": {
171 "303": 3098
172 }
173 },
174 {
175 "Scenario": "toggle",
176 "Concurrency": 8,
177 "RPS": 556.9101887089065,
178 "P50Ms": 14.2856,
179 "P95Ms": 18.779223,
180 "P99Ms": 23.257653,
181 "ErrorRate": 0,
182 "Status": {
183 "303": 5562
184 }
185 },
186 {
187 "Scenario": "toggle",
188 "Concurrency": 16,
189 "RPS": 3.299356197285095,
190 "P50Ms": 1399.654903,
191 "P95Ms": 1403.356961,
192 "P99Ms": 1403.356961,
193 "ErrorRate": 0,
194 "Status": {
195 "303": 17
196 }
197 },
198 {
199 "Scenario": "toggle",
200 "Concurrency": 32,
201 "RPS": 1532.8835689908904,
202 "P50Ms": 15.445893,
203 "P95Ms": 31.467546,
204 "P99Ms": 52.586470000000006,
205 "ErrorRate": 0,
206 "Status": {
207 "303": 15300
208 }
209 },
210 {
211 "Scenario": "toggle",
212 "Concurrency": 64,
213 "RPS": 2282.5118850616304,
214 "P50Ms": 20.323867,
215 "P95Ms": 47.209343000000004,
216 "P99Ms": 71.43903999999999,
217 "ErrorRate": 0,
218 "Status": {
219 "303": 22766
220 }
221 },
222 {
223 "Scenario": "toggle",
224 "Concurrency": 128,
225 "RPS": 2451.4011261368464,
226 "P50Ms": 38.70759,
227 "P95Ms": 92.036958,
228 "P99Ms": 161.91760299999999,
229 "ErrorRate": 0,
230 "Status": {
231 "303": 24392
232 }
233 },
234 {
235 "Scenario": "toggle",
236 "Concurrency": 256,
237 "RPS": 2892.398792397893,
238 "P50Ms": 74.994662,
239 "P95Ms": 152.24756,
240 "P99Ms": 246.057975,
241 "ErrorRate": 0.24245065904177418,
242 "Status": {
243 "303": 21725,
244 "502": 6953
245 }
246 },
247 {
248 "Scenario": "read-after",
249 "Concurrency": 1,
250 "RPS": 66.49173397370429,
251 "P50Ms": 12.198212999999999,
252 "P95Ms": 17.754181,
253 "P99Ms": 22.703056,
254 "ErrorRate": 0,
255 "Status": {
256 "200": 664
257 }
258 },
259 {
260 "Scenario": "read-after",
261 "Concurrency": 2,
262 "RPS": 139.3728286956172,
263 "P50Ms": 13.792565,
264 "P95Ms": 19.511307,
265 "P99Ms": 24.752534,
266 "ErrorRate": 0,
267 "Status": {
268 "200": 1392
269 }
270 },
271 {
272 "Scenario": "read-after",
273 "Concurrency": 4,
274 "RPS": 251.77386594824677,
275 "P50Ms": 15.484064,
276 "P95Ms": 20.537094999999997,
277 "P99Ms": 26.231531999999998,
278 "ErrorRate": 0,
279 "Status": {
280 "200": 2514
281 }
282 },
283 {
284 "Scenario": "read-after",
285 "Concurrency": 8,
286 "RPS": 386.1619525826817,
287 "P50Ms": 16.855828,
288 "P95Ms": 26.412496,
289 "P99Ms": 38.507045,
290 "ErrorRate": 0,
291 "Status": {
292 "200": 3854
293 }
294 },
295 {
296 "Scenario": "read-after",
297 "Concurrency": 16,
298 "RPS": 584.8175879733568,
299 "P50Ms": 20.718797000000002,
300 "P95Ms": 44.462733,
301 "P99Ms": 63.458346999999996,
302 "ErrorRate": 0,
303 "Status": {
304 "200": 5833
305 }
306 },
307 {
308 "Scenario": "read-after",
309 "Concurrency": 32,
310 "RPS": 3.199286737897577,
311 "P50Ms": 0,
312 "P95Ms": 0,
313 "P99Ms": 0,
314 "ErrorRate": 0
315 },
316 {
317 "Scenario": "read-after",
318 "Concurrency": 64,
319 "RPS": 662.0611944347767,
320 "P50Ms": 78.303783,
321 "P95Ms": 137.770103,
322 "P99Ms": 247.53055600000002,
323 "ErrorRate": 0,
324 "Status": {
325 "200": 6558
326 }
327 },
328 {
329 "Scenario": "read-after",
330 "Concurrency": 128,
331 "RPS": 705.8385464581186,
332 "P50Ms": 148.717762,
333 "P95Ms": 262.54161799999997,
334 "P99Ms": 1461.214874,
335 "ErrorRate": 0,
336 "Status": {
337 "200": 6938
338 }
339 },
340 {
341 "Scenario": "read-after",
342 "Concurrency": 256,
343 "RPS": 888.065025131621,
344 "P50Ms": 272.531186,
345 "P95Ms": 438.97776,
346 "P99Ms": 1592.9036810000002,
347 "ErrorRate": 0.20815003473026164,
348 "Status": {
349 "200": 6840,
350 "502": 1798
351 }
352 }
353 ],
354 "Weight": {
355 "HTMLBytes": 41526,
356 "JSBytes": 2655
357 },
358 "Memory": {
359 "IdleKB": 8364,
360 "PeakKB": 13096,
361 "AfterKB": 12132
362 },
363 "Code": {
364 "Server": 495,
365 "Templates": 0,
366 "JS": 71,
367 "Tests": 0,
368 "Deps": 2
369 },
370 "Build": {
371 "ColdSeconds": 287.12381672,
372 "WarmSeconds": 101.340795406,
373 "EditSeconds": 103.978456017,
374 "Bytes": 8749592,
375 "Host": "DOCS-T1",
376 "ColdRuns": 1,
377 "Runs": 3
378 },
379 "TokensBuild": {
380 "Input": 258,
381 "Output": 99309,
382 "CacheRead": 22408692,
383 "CacheWrite": 276287,
384 "Turns": 132,
385 "Seconds": 4631.851,
386 "CostUSD": 8.679246399999998
387 },
388 "TokensFix": {
389 "Input": 44,
390 "Output": 20701,
391 "CacheRead": 6777148,
392 "CacheWrite": 31920,
393 "Turns": 22,
394 "Seconds": 565.253,
395 "CostUSD": 2.0249855999999955
396 },
397 "TokensSecurity": {
398 "Input": 0,
399 "Output": 0,
400 "CacheRead": 0,
401 "CacheWrite": 0,
402 "Turns": 0,
403 "Seconds": 0,
404 "CostUSD": 0
405 },
406 "TokensReview": {
407 "Input": 916819,
408 "Output": 4711,
409 "CacheRead": 797824,
410 "CacheWrite": 0,
411 "Turns": 2,
412 "Seconds": 0,
413 "CostUSD": 0
414 },
415 "Readability": {
416 "Naming": 4,
417 "Structure": 4,
418 "Traceability": 5,
419 "Errors": 3,
420 "Comments": 4,
421 "Overall": 7,
422 "Notes": "Strongest: traceability. Each route reads top to bottom: origin check, visitor, path_id, todo_exists, one inline SQL statement, finish_post, render_lists. Comments explain the non-obvious (Spinel subset, single-cursor shim, token-issuance check, BUILD_NOTE). Weakest: errors. Write paths (run_sql, add_todo, rename_todo, record_token) discard DB.step's result, so a failed INSERT or UPDATE silently returns a stale fragment; the JS catch-all reload hides failures too. Lesser points: parallel arrays with a `done` field of ints, generic run_sql with a magic `id \u003e 0` bind rule, layout/page/path_id filed under the Actions divider, and unexplained constants (18 and 19 character limits)."
423 },
424 "ReviewFindings": [
425 "[correctness] `apps/spinel/app.rb:475` and `:527` — `strip` only removes ASCII whitespace. A title containing only U+00A0 or U+2003 creates a blank-looking todo, and editing to that value does not delete it. Apply Unicode whitespace trimming before the empty-title check.",
426 "[correctness] `apps/spinel/patches/2-tep-bakeoff.patch:330` — URL decoding turns `%00` into a NUL inside a C string, which is then truncated when copied into Ruby. Posting `title=before%00after` silently stores `before`; editing with `title=%00after` deletes the todo. Preserve decoded string lengths so input cannot silently become a different title or action.",
427 "[spec] `apps/spinel/Makefile:130` — `clean-deps` deletes only the local SQLite and tep artifacts. The arm64 build still links precompiled OpenSSL, zlib and zstd libraries from the shared toolchain root (`scripts/arm64-cc:21`), so the next build does not compile every third-party library from scratch as required. Build those dependencies into the app’s own cache and include them in `clean-deps`."
428 ],
429 "Notes": [
430 "Its server process exited (status 0) 16 times during the load test, and Carloku restarted it each time; the edge answered 502 in between."
431 ]
432}
433