| 6 Oct 01:00 | F# port | phase 5 | First whole-app run: the F# port boots and serves all five workloads | 0.76× | kept |
|---|
| 6 Oct 03:16 | F# port | baseline | Whole-app baseline: bench/run, Rails vs Rust vs F#, 3 reps | 0.79× | kept |
|---|
| 6 Oct 10:25 | F# port | phase 7 start | Phase 7 starting point: the trustworthy harness, before any tuning | 0.76× | kept |
|---|
| 6 Oct 11:58 | F# port | database | statements through SQLitePCLRaw (prepare once, bind by index, columns by ordinal) instead of Microsoft.Data.Sqlite commands | 0.81× | kept |
|---|
| 6 Oct 12:18 | F# port | database | no per-connection or memstatus mutex, direct C-API calls for rows and binds, timestamps parsed from UTF-8 bytes | 0.94× | kept |
|---|
| 6 Oct 12:24 | F# port | database | a read that found a free connection returns without Task.Yield (no cross-thread hand-off per read) | 0.96× | kept |
|---|
| 6 Oct 13:17 | F# port | database | unit 7.1 database path: image rebuilt from HEAD, five workloads at c=1 and c=16, 3 reps | 1.00× | kept |
|---|
| 6 Oct 15:18 | F# port | runtime | allocation cuts: gzip written into the pipe, to_i fast path, key buffer reuse, assetPath and preload-link memo (room 146 to 113 KB per request) | 0.98× | kept |
|---|
| 6 Oct 16:11 | F# port | runtime | A/B: default spin limit on the new image, run B | 1.03× | kept |
|---|
| 6 Oct 16:50 | F# port | runtime | unit 7.2 runtime: image rebuilt from HEAD with the 64MB gen0 budget and the allocation cuts, five workloads at c=1 and c=16, 3 reps | 1.05× | kept |
|---|
| 6 Oct 17:54 | F# port | crypto-logging | keyed HMAC and AES state per thread, hand parsers for the expiry and the cookie envelope, remembered avatar tokens and stream names (crypto half, c=16) | 1.11× | kept |
|---|
| 6 Oct 17:55 | F# port | crypto-logging | both halves at one connection (c=1) | 1.20× | kept |
|---|
| 6 Oct 18:42 | F# port | crypto-logging | unit 7.3 crypto-logging: image rebuilt from HEAD with keyed HMAC/AES state, hand parsers, token memo and the batched request log, five workloads at c=1 and c=16, 3 reps | 1.26× | kept |
|---|
| 6 Oct 18:51 | F# port | post | default host no longer watches the content root for appsettings changes (File Watch thread and lstat), post c=16 and c=1, 1 rep | 1.28× | kept |
|---|
| 6 Oct 19:14 | F# port | post | gzip a post answer (9 KB of HTML) and splice pieces through the zlib shim with a window that fits, no dictionary for a short tail: no gain beyond noise, reverted | 1.28× | reverted |
|---|
| 6 Oct 19:17 | F# port | post | control for the identity body work: the 416 KB room page with Accept-Encoding: identity at c=16 on the unchanged build (identity numbers are logged under room_show_identity; the chart does not show them) | 1.28× | kept |
|---|
| 6 Oct 19:40 | F# port | post | A/B in one build: Kestrel's own 4 KB blocks (CAMPFIRE_NO_CONN_POOL, mean of 2), identity room page c=16 | 1.28× | kept |
|---|
| 6 Oct 20:02 | F# port | post | control for the post path A/B: file watching off, nothing else (mean of 3 alternating runs, c=16) | 1.28× | kept |
|---|
| 6 Oct 20:02 | F# port | post | message partial broadcast as UTF-8 (no string), unread ping encoded once, no body parse for mentions when there is no attachment (mean of 3 alternating runs, c=16; allocation 183.6 to 154.1 KB per post) | 1.28× | kept |
|---|
| 6 Oct 20:49 | F# port | post | unit 7.4 post and remaining paths: image rebuilt from HEAD with file watching off and the post-path cuts (UTF-8 message broadcast, one unread ping encoding, no mention parse without attachments), five workloads at c=1 and c=16, 3 reps | 1.28× | kept |
|---|
| 6 Oct 21:52 | F# port | post | verifier fixes: long binds keep the GC transition, mention parse skipped only for bodies of <=800 units, console never coloured (mean of 2 alternating runs; control below) | 1.28× | kept |
|---|
| 7 Oct 02:37 | F# port | port final | The F# port's final result: onCrack's starting point | 1.30× | kept |
|---|
| 7 Oct 04:46 | F# port | threadpool | DOTNET_HillClimbing_Disable=1 in the image (59ee9ae), 3 reps, F# only | 1.32× | kept |
|---|
| 7 Oct 08:14 | onCrack, cached | c0 | The fork, unchanged: campfire-oncrack:app rebuilt from HEAD, no source change | 1.31× | kept |
|---|
| 7 Oct 09:24 | onCrack, cached | C1 | versioned read cache: version counters through TEMP triggers, frozen page bodies per user and request shape, sessions and users for authentication | 2.75× | kept |
|---|
| 7 Oct 09:45 | onCrack, cached | groupcommit | group commit: queued writes in one transaction, savepoint each, one COMMIT, after-commit work in one more | 2.94× | kept |
|---|
| 7 Oct 10:13 | onCrack, cached | groupcommit | post: broadcast, webhook candidates and answer from one read | 2.96× | kept |
|---|
| 7 Oct 10:16 | onCrack, cached | groupcommit | broadcast of a message encoded only when its stream has a subscriber (bench post has none) | 2.99× | kept |
|---|
| 7 Oct 11:05 | onCrack, cached | groupcommit | C2 image: group commit, one read after a post, broadcast encoded only for subscribers | 2.95× | kept |
|---|
| 7 Oct 12:34 | onCrack, cached | search | C3: gzipped buffers and frozen pages sent with Content-Length instead of chunked | 3.80× | kept |
|---|
| 7 Oct 13:10 | onCrack, cached | search | C3 image: gzipped buffers and frozen pages sent with Content-Length instead of chunked | 3.84× | kept |
|---|
| 7 Oct 15:34 | onCrack, cached | runtime | C4 Native AOT image (campfire-oncrack:aot, NATIVE_AOT=true), opt-in: c=1 +14%, c=16 -10% against the C3 JIT image; cold start and idle memory about halved | 3.47× | reverted |
|---|
| 7 Oct 17:32 | onCrack, cached | verifier-fixes | before the verifier fixes (C4 head), same session as the A/B | 3.75× | reverted |
|---|
| 7 Oct 17:32 | onCrack, cached | verifier-fixes | verifier fixes: page deps on the user read-at version, striped room counters, posts broadcast in commit order | 3.77× | kept |
|---|
| 7 Oct 18:04 | onCrack, cached | verifier-fixes | image with the verifier fixes: page deps on the user read-at version, striped room counters, posts broadcast in commit order, kit HTTP differential accepts the gzip length | 3.80× | kept |
|---|
| 8 Oct 07:18 | onCrack, cached | round1-final | four-way re-baseline: Rails, Rust, the F# port and onCrack measured in one session (bench/run, all suites, 3 reps); onCrack image da1e92f (src as 1598c5e) | 3.82× | kept |
|---|
| 8 Oct 09:22 | onCrack, cached | r2-cable | tier 2: direct writes + WakeBatch + line hold + compact Turbo Stream JSON (before the thread-static hoist) | 3.82× | kept |
|---|
| 8 Oct 11:51 | onCrack, cached | r2-post | 564a162 with CAMPFIRE_WRITE_INLINE=off, c=1 and c=64 | 3.95× | reverted |
|---|
| 8 Oct 11:51 | onCrack, cached | r2-post | mixed and spread_mixed on the gated build: spread_mixed posts 343 -> 733/s; mixed posts +26%, reads -21% (more posts, more invalidations) | 3.90× | kept |
|---|
| 8 Oct 11:51 | onCrack, cached | r2-post | gzip with libdeflate, a compressor per thread | 3.72× | kept |
|---|
| 8 Oct 12:03 | onCrack, cached | r2-post | push job's read on its own thread when a connection is free | 3.75× | kept |
|---|
| 8 Oct 12:50 | onCrack, cached | r2-post | a non-GET answer skips the gzip cache and is gzipped once at libdeflate level 1 | 3.63× | kept |
|---|
| 8 Oct 12:51 | onCrack, cached | r2-post | R2.2 baseline in session: mixed and spread_mixed on the R2.1 image | 3.79× | kept |
|---|
| 8 Oct 12:51 | onCrack, cached | r2-post | the same, logs: restarts 0.3-2.4 s | 3.75× | reverted |
|---|
| 8 Oct 13:29 | onCrack, cached | r2-post | R2.2 image: room page and sidebar c=16, 1 rep (regression check) | 3.76× | kept |
|---|
| 8 Oct 16:02 | onCrack, cached | r2-front | R2.3: front server fast path (replays before routing, kit and cookies), replays answered on the socket event thread, request ids without a syscall | 4.89× | kept |
|---|
| 8 Oct 16:02 | onCrack, cached | r2-front | R2.3 realistic workloads on the rebuilt image | 3.77× | kept |
|---|
| 8 Oct 19:42 | onCrack, cached | r2-c1 | R2.4: app requests on a solo event thread run in place, idle pool workers do not spin, /up runs in place | 5.08× | kept |
|---|
| 8 Oct 19:42 | onCrack, cached | r2-c1 | R2.4 realistic workloads on the rebuilt image (spread -6% against R2.3: pool workers do not spin) | 5.28× | kept |
|---|
| 9 Oct 00:21 | onCrack, cached | r2-mem | R2.5 guard: the rebuilt image, the five classic workloads at c=16 (2 reps), level with R2.4 | 5.31× | kept |
|---|
| 9 Oct 04:08 | onCrack, cached | r2-verifier | R2 verifier fixes: rebuilt image 7e56d81cc90f (2ea9ae9), 3 reps; post c=16 reps stalled on the WAL restart (warm-up did not settle) | 4.96× | kept |
|---|
| 9 Oct 05:49 | onCrack, cached | r2-final | Round 2 final: rebuilt image 155ea5d0e559 (f5352d0), 3 reps; the current-upstream review (verification harness) is in oncrack-r2-final.md | 4.98× | kept |
|---|
| 9 Oct 22:28 | onCrack, cached | r3-final-cached | Round 3 final image (37c5988), cached decision (CAMPFIRE_FRESH_AUTH=0), project suite, 3 reps, logged in round 5 | 4.64× | kept |
|---|
| 9 Oct 22:28 | onCrack, fresh | r3-final-fresh | Round 3 final image (37c5988), fresh authorization (the default), project suite, 3 reps, logged in round 5 | 4.32× | kept |
|---|
| 13 Oct 04:43 | onCrack, cached | r5-final-cached | Round 5 HEAD image (3e6a300), cached decision (CAMPFIRE_FRESH_AUTH=0), project suite, 3 reps | 4.90× | kept |
|---|
| 13 Oct 04:43 | onCrack, fresh | r5-final-fresh | Round 5 HEAD image (3e6a300), fresh authorization (the default), project suite, 3 reps | 4.63× | kept |
|---|