{
  "captured_at": "2026-10-31T12:23:57Z",
  "host": {
    "uname": "Linux showcase.party 6.8.0-147-generic #147-Ubuntu SMP PREEMPT_DYNAMIC Thu Sep 24 11:33:16 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux",
    "platform": "linux",
    "arch": "x86_64",
    "hostname": "showcase.party"
  },
  "os": {
    "pretty_name": "Ubuntu 24.04.5 LTS",
    "name": "Ubuntu",
    "version_id": "24.04",
    "version": "24.04.5 LTS (Noble Numbat)",
    "version_codename": "noble",
    "id": "ubuntu",
    "id_like": "debian",
    "home_url": "https://www.ubuntu.com/",
    "support_url": "https://help.ubuntu.com/",
    "bug_report_url": "https://bugs.launchpad.net/ubuntu/",
    "privacy_policy_url": "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy",
    "ubuntu_codename": "noble",
    "logo": "ubuntu-logo"
  },
  "cpu": {
    "lscpu": {
      "lscpu": [
        {
          "field": "Architecture:",
          "data": "x86_64"
        },
        {
          "field": "CPU op-mode(s):",
          "data": "32-bit, 64-bit"
        },
        {
          "field": "Address sizes:",
          "data": "43 bits physical, 48 bits virtual"
        },
        {
          "field": "Byte Order:",
          "data": "Little Endian"
        },
        {
          "field": "CPU(s):",
          "data": "12"
        },
        {
          "field": "On-line CPU(s) list:",
          "data": "0-11"
        },
        {
          "field": "Vendor ID:",
          "data": "AuthenticAMD"
        },
        {
          "field": "Model name:",
          "data": "AMD Ryzen 5 3600 6-Core Processor"
        },
        {
          "field": "CPU family:",
          "data": "23"
        },
        {
          "field": "Model:",
          "data": "113"
        },
        {
          "field": "Thread(s) per core:",
          "data": "2"
        },
        {
          "field": "Core(s) per socket:",
          "data": "6"
        },
        {
          "field": "Socket(s):",
          "data": "1"
        },
        {
          "field": "Stepping:",
          "data": "0"
        },
        {
          "field": "Frequency boost:",
          "data": "disabled"
        },
        {
          "field": "CPU(s) scaling MHz:",
          "data": "86%"
        },
        {
          "field": "CPU max MHz:",
          "data": "4208.2031"
        },
        {
          "field": "CPU min MHz:",
          "data": "2200.0000"
        },
        {
          "field": "BogoMIPS:",
          "data": "7200.11"
        },
        {
          "field": "Flags:",
          "data": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate ssbd mba ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr rdpru wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif v_spec_ctrl umip rdpid overflow_recov succor smca sev sev_es ibpb_exit_to_user"
        },
        {
          "field": "Virtualization:",
          "data": "AMD-V"
        },
        {
          "field": "L1d cache:",
          "data": "192 KiB (6 instances)"
        },
        {
          "field": "L1i cache:",
          "data": "192 KiB (6 instances)"
        },
        {
          "field": "L2 cache:",
          "data": "3 MiB (6 instances)"
        },
        {
          "field": "L3 cache:",
          "data": "32 MiB (2 instances)"
        },
        {
          "field": "NUMA node(s):",
          "data": "1"
        },
        {
          "field": "NUMA node0 CPU(s):",
          "data": "0-11"
        },
        {
          "field": "Vulnerability Gather data sampling:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Indirect target selection:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Itlb multihit:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability L1tf:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Mds:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Meltdown:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Mmio stale data:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Reg file data sampling:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Retbleed:",
          "data": "Mitigation; untrained return thunk; SMT enabled with STIBP protection"
        },
        {
          "field": "Vulnerability Spec rstack overflow:",
          "data": "Mitigation; Safe RET"
        },
        {
          "field": "Vulnerability Spec store bypass:",
          "data": "Mitigation; Speculative Store Bypass disabled via prctl"
        },
        {
          "field": "Vulnerability Spectre v1:",
          "data": "Mitigation; usercopy/swapgs barriers and __user pointer sanitization"
        },
        {
          "field": "Vulnerability Spectre v2:",
          "data": "Mitigation; Retpolines; IBPB conditional; STIBP always-on; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected"
        },
        {
          "field": "Vulnerability Srbds:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Tsa:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Tsx async abort:",
          "data": "Not affected"
        },
        {
          "field": "Vulnerability Vmscape:",
          "data": "Mitigation; IBPB before exit to userspace"
        }
      ]
    },
    "board_name": "B450 Pro4 R2.0",
    "board_vendor": "ASRock",
    "product_name": ""
  },
  "memory_mb": 64228,
  "clock": {
    "governor": "performance",
    "boost": "0",
    "cur_khz": 3599217,
    "min_khz": 2200000,
    "max_khz": 3600000
  },
  "toolchains": {
    "ruby": "ruby 4.1.0dev (2026-10-31T04:35:19Z master 3c6a1c7a86) +PRISM [x86_64-linux]",
    "jruby": "jruby 10.1.1.0 (4.0.0) 2026-07-22 aaa95d57e1 OpenJDK 64-Bit Server VM 25.0.3+9-LTS on 25.0.3+9-LTS +indy +jit [x86_64-linux]",
    "truffleruby": "truffleruby 40.0.0 (2026-09-17), like ruby 4.0.2, Oracle GraalVM Native [x86_64-linux]",
    "spinel": "spinel 2026.10.25+1469 (b513f72fb) [gcc 13.3.0 (cc)]",
    "rustc": "rustc 1.98.1 (48a229cea 2026-09-01)",
    "cargo": "cargo 1.98.1 (797e8a9bc 2026-08-05)",
    "go": "go version go1.26.4 linux/amd64",
    "node": "v26.3.0",
    "crystal": "Crystal 1.20.2 [2482c62c1] (2026-05-15)",
    "shards": "Shards 0.20.0 [b2b98ca] (2025-12-19)",
    "python3": "Python 3.14.6",
    "uv": "uv 0.11.22 (x86_64-unknown-linux-musl)",
    "dotnet": "10.0.301",
    "wrk": "wrk debian/4.1.0-4build2 [epoll] Copyright (C) 2012 Will Glozer",
    "curl": "curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 (+libidn2/2.3.7) libssh/0.10.6/openssl/zlib nghttp2/1.59.0 librtmp/2.3 OpenLDAP/2.6.10",
    "mise": "2026.5.15 linux-x64 (2026-05-23)",
    "sqlite3": "3.45.1 2024-01-30 16:01:20 e876e51a0ed5c5b3126f52e532044363a014bc594cfefa87ffb5b82257ccalt1 (64-bit)",
    "redis-server": "Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=d064f9f48c901a92"
  },
  "toolchain_paths": {
    "ruby": "/home/rubys/.rubies/ruby-head-3c6a1c7a86/bin/ruby",
    "jruby": "/home/rubys/.local/share/mise/shims/jruby",
    "truffleruby": "/home/rubys/.local/share/mise/shims/truffleruby",
    "spinel": "/home/rubys/spinel/bin/spinel",
    "rustc": "/home/rubys/.local/share/mise/shims/rustc",
    "cargo": "/home/rubys/.local/share/mise/shims/cargo",
    "go": "/home/rubys/.local/share/mise/installs/go/1.26.4/bin/go",
    "node": "/home/rubys/.local/share/mise/shims/node",
    "crystal": "/home/rubys/.local/share/mise/shims/crystal",
    "shards": "/home/rubys/.local/share/mise/shims/shards",
    "python3": "/home/rubys/.local/share/mise/shims/python3",
    "uv": "/home/rubys/.local/share/mise/shims/uv",
    "dotnet": "/home/rubys/.local/share/mise/shims/dotnet",
    "wrk": "/usr/bin/wrk",
    "curl": "/usr/bin/curl",
    "mise": "/home/rubys/.local/bin/mise",
    "sqlite3": "/usr/bin/sqlite3",
    "redis-server": "/usr/bin/redis-server"
  },
  "mise_current": {
    "crystal": [
      {
        "version": "1.20.2",
        "requested_version": "1.20.2",
        "install_path": "/home/rubys/.local/share/mise/installs/crystal/1.20.2",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "dotnet": [
      {
        "version": "10.0.301",
        "requested_version": "10",
        "install_path": "/home/rubys/.local/share/mise/installs/dotnet/10.0.301",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "symlinked_to": "/home/rubys/.local/share/mise/installs/dotnet/10.0.301",
        "installed": true,
        "active": true
      }
    ],
    "elixir": [
      {
        "version": "1.18.4-otp-28",
        "requested_version": "1.18.4-otp-28",
        "install_path": "/home/rubys/.local/share/mise/installs/elixir/1.18.4-otp-28",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "erlang": [
      {
        "version": "28.5",
        "requested_version": "28",
        "install_path": "/home/rubys/.local/share/mise/installs/erlang/28.5",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "go": [
      {
        "version": "1.26.4",
        "requested_version": "1.26.4",
        "install_path": "/home/rubys/.local/share/mise/installs/go/1.26.4",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "gradle": [
      {
        "version": "9.5.1",
        "requested_version": "9.5.1",
        "install_path": "/home/rubys/.local/share/mise/installs/gradle/9.5.1",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "java": [
      {
        "version": "temurin-25.0.3+9.0.LTS",
        "requested_version": "temurin-25",
        "install_path": "/home/rubys/.local/share/mise/installs/java/temurin-25.0.3+9.0.LTS",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "node": [
      {
        "version": "26.3.0",
        "requested_version": "26.3.0",
        "install_path": "/home/rubys/.local/share/mise/installs/node/26.3.0",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "python": [
      {
        "version": "3.14.6",
        "requested_version": "3.14",
        "install_path": "/home/rubys/.local/share/mise/installs/python/3.14.6",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "ruby": [
      {
        "version": "jruby-10.1.1.0",
        "requested_version": "jruby-10.1.1.0",
        "install_path": "/home/rubys/.local/share/mise/installs/ruby/jruby-10.1.1.0",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      },
      {
        "version": "truffleruby-40.0.0",
        "requested_version": "truffleruby-40.0.0",
        "install_path": "/home/rubys/.local/share/mise/installs/ruby/truffleruby-40.0.0",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      },
      {
        "version": "4.0.5",
        "requested_version": "4.0.5",
        "install_path": "/home/rubys/.local/share/mise/installs/ruby/4.0.5",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "rust": [
      {
        "version": "1.98.1",
        "requested_version": "1.98.1",
        "install_path": "/home/rubys/.local/share/mise/installs/rust/1.98.1",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "symlinked_to": "/home/rubys/.local/share/mise/installs/rust/1.98.1",
        "installed": true,
        "active": true
      }
    ],
    "swift": [
      {
        "version": "6.3.2",
        "requested_version": "6.3.2",
        "install_path": "/home/rubys/.local/share/mise/installs/swift/6.3.2",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ],
    "uv": [
      {
        "version": "0.11.22",
        "requested_version": "latest",
        "install_path": "/home/rubys/.local/share/mise/installs/uv/0.11.22",
        "source": {
          "type": "mise.toml",
          "path": "/home/rubys/.config/mise/config.toml"
        },
        "installed": true,
        "active": true
      }
    ]
  },
  "git": {
    "sha": "544377934c32b5623ce820c8bd86f4d47aa89cf7",
    "branch": "main",
    "subject": "Merge pull request #1598 from eddygarcas/own-url-method-20261031",
    "dirty": false
  },
  "conditions": {
    "loadavg_1_5_15": [
      0.39,
      3.78,
      6.01
    ],
    "uptime": "13:23:58 up 16 days,  1:08,  0 user,  load average: 0.39, 3.78, 6.01",
    "date_utc": "2026-10-31T12:23:58Z"
  },
  "harness": {
    "workers": [
      1
    ],
    "concurrency": 16,
    "runs": 3,
    "duration_sec": 20,
    "warmup_sec": 20,
    "threads": 5,
    "wrk_threads": 2,
    "endpoints": [
      "/rooms/1",
      "/rooms/1/messages?before=50",
      "/users/me/sidebar",
      "/searches?q=coffee",
      "/users/{avatar}/avatar",
      "{css}",
      "/up",
      "POST:/rooms/2/messages"
    ],
    "targets": [
      "rails",
      "ruby",
      "ruby-1p",
      "ruby-falcon",
      "spinel",
      "tobi"
    ],
    "command": "scripts/bench-campfire --app /home/rubys/once-campfire --port 19100 --ruby /home/rubys/.rubies/ruby-head-3c6a1c7a86 --out bench/results/campfire/20261031-113543 rails ruby ruby-1p ruby-falcon spinel tobi"
  },
  "benchmark": "campfire",
  "oracle": {
    "campfire_sha": "c8f74a0b0e1e93146c4d7c1d6ac80c9079682216",
    "rails_revision": "e3d5c569d217c56c022b04acb127a8c24dbe9685",
    "rails_version": "8.2.0.alpha",
    "ruby_version": "4.1.0",
    "serve_env": "production",
    "fragment_cache_default": true,
    "seed": {
      "users": 50,
      "rooms": 5,
      "messages_per_room": 100
    }
  },
  "servers": {
    "rails lanes": "puma 8.0.2",
    "emit lanes": "puma 8.0.2"
  },
  "notes": [
    "<code>rails</code> and the emit lanes BOTH serve campfire's message fragments from a cache — Rails from Redis (<code>cached: true</code>), the emitted tree from its own process-local store — so the deployed lanes compare like with like. Until 2026-09-07 the emit had no fragment cache and this page carried a <code>rails-nocache</code> column so the comparison was renderer against renderer rather than emit against Redis; that column is now a diagnostic, requested by name, and is not published here.",
    "The deployed lanes are what each project would run on this box. <code>rails</code> is once-campfire AS ITS OWN DOCKERFILE RUNS IT: Thruster in front of Puma, <code>(processor_count * 0.666).ceil</code> workers x 5 threads from its own <code>config/puma.rb</code>, jemalloc preloaded, resque-pool alongside. <code>ruby</code> is the CRuby emit in the same Puma shape with the same allocator; <code>spinel</code> is the binary with its workers autodetected.",
    "<code>ruby</code> IS A MATCHED-SHAPE RUNTIME COMPARISON, NOT A DEPLOYMENT CLAIM. It runs Rails' worker count so the number is not a core count, but the emitted tree's Action Cable registry and its job queue are both in-process: at more than one worker a broadcast reaches only the subscribers sharing a process with the poster, so campfire could not actually run this shape. Its deployable CRuby shape today is one worker — the <code>ruby-1p</code> row, read it against <code>tobi</code> for the deployable comparison; one process serving every core (Falcon on Ractors, the shape <code>spinel</code> already has) is the planned replacement. <code>spinel</code> needs none of this: one process, green threads, one shared registry — which is why it is the emit lane the WebSocket tier can measure at its full worker count.",
    "<code>ruby-falcon</code> is the SAME emitted tree and <code>config.ru</code> as <code>ruby</code>, served by Falcon (the emit's <code>falcon.rb</code>: forked workers, the same count and allocator, cache hits answered ahead of Falcon's Rack adapter) instead of Puma: the server <code>tobi</code> runs. It isolates what the app server costs. Falcon is added to the emit's bundle by this harness, at the version tobi's lock pins; the emitted Gemfile names only Puma, and the WebSocket phase still runs Puma.",
    "The <code>-1p</code> lanes are the diagnostic, and what they pin is ONE CPU rather than one process — CRuby needs a process per core because of the GVL, while the binary is a single process either way and varies its OS worker count instead (<code>SPINEL_WORKERS=1</code>). They exist because a deployed number cannot say WHY it landed where it did, so these rows separate \"their runtime is slower\" from \"we gave them fewer cores\". Read them per lane-family: <code>ruby</code> and <code>spinel</code> differ from their <code>-1p</code> twins in worker count and NOTHING else, but <code>rails-1p</code> also sheds Thruster and resque-pool, so its delta is not attributable to cores alone. <code>ruby-1p</code> is ALSO the emit's deployable CRuby shape: one Puma worker, so one cable registry and one job queue, the shape the WebSocket tier runs it in.",
    "Known omissions, stated rather than discovered: the WebSocket phase's rails lane runs Puma with campfire's worker count and its allocator but WITHOUT Thruster and resque-pool, and no lane terminates TLS.",
    "MEMORY IS THE SERVER PROCESS TREE, and the rails lanes keep part of themselves outside it. Their fragment cache, their Action Cable adapter and Resque's queue all live in a system Redis (~16 MB RSS here) that is nobody's descendant and so is in no lane's number — while the emit lanes hold their equivalent inside the measured process. Throughput is unaffected: the rails lanes pay for every Redis round trip in their req/s. Counted for rails: Thruster, the Puma master and its workers, resque-pool and its workers.",
    "<code>tobi</code> is <a href=\"https://github.com/tobi/campfire-once-ruby-ractor\">tobi/campfire-once-ruby-ractor</a>: campfire ported BY HAND to plain Ruby, no Rails, served by Falcon from worker Ractors in one process, with in-process job and cable Ractors. It is the measured answer to \"how fast can careful Ruby serve this app\", and the target for the emitted <code>ruby</code> lane. It reads the same seeded database. Its deliberate differences from Rails (header-only CSRF, so its pages carry no tokens; part-hashed ETags; fewer cookie writes) are listed in its README.",
    "The CRuby fragment store is PER PROCESS, so the <code>ruby</code> lane holds one cache per worker where <code>spinel</code> holds one for the whole binary."
  ],
  "lane_shapes": {
    "rails": [
      "jemalloc=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2",
      "resque-pool=pid 3133397",
      "thruster=front on :19100 -> puma :20100",
      "workers=campfire's own formula (WEB_CONCURRENCY unset)"
    ],
    "ruby-1p": [
      "jemalloc=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2",
      "workers=1"
    ],
    "ruby-falcon": [
      "server=falcon 0.57.0 via falcon.rb (forked)",
      "jemalloc=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2",
      "workers=8"
    ],
    "ruby": [
      "jemalloc=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2",
      "workers=8"
    ],
    "spinel": [
      "workers=autodetected"
    ],
    "tobi": [
      "root=/home/rubys/git/campfire-once-ruby-ractor",
      "revision=353e899",
      "ruby=4.1.0",
      "jemalloc=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2",
      "workers=8 ractors (one process)"
    ]
  }
}
