Evidence ledger
One row per claim in Boundaries without a network hop: ten years of Shopify, read from its own artefacts: who published it, what grade it carries, when it was written, when the link was last checked, and the quote or figure it rests on. Nothing in the guide is cited from memory, so anything not in this table is not in the guide.
Guide: Boundaries without a network hop: ten years of Shopify, read from its own artefacts Research date: 2026-09-27. Every URL below was fetched during that session.
Environment limit, stated up front. The research environment's egress policy allowed
github.com, raw.githubusercontent.com and the package registries (rubygems.org, crates.io,
registry.npmjs.org), and refused shopify.engineering, arxiv.org, dl.acm.org, usenix.org,
youtube.com and aws.amazon.com. So this guide is built from repository artefacts and registry
timestamps only. No Shopify engineering-blog post, conference talk or peer-reviewed paper is
cited, which is why the evidence wall carries no blog, talk or paper tier. Where a claim
would have needed one of those, the ledger says so.
| # | Org | Title | Tier | Published | Checked | URL | Claim I take from it | Supporting quote or figure |
|---|---|---|---|---|---|---|---|---|
| 1 | Shopify | Shopify org repositories, archived filter | source | live | 2026-09-27 | https://github.com/orgs/Shopify/repositories?q=archived%3Atrue | The estate is big enough that its retirements are a record in themselves | Page reports "523" archived repositories; the unfiltered listing reports "1,200+" |
| 2 | Shopify | shopify-ruby-definitions | source | 2026-09-26 (repo activity) | 2026-09-27 | https://github.com/Shopify/ruby-definitions | Shopify builds and runs its own patched CRuby, versioned pshopify |
"This repository contains ruby-build definitions of Rubies we use at Shopify. These builds are API compliant with release Rubies, but with additional backports for bugfixes and performance." Versions listed run 3.0.0-pshopify9 to `3.2.2-pshopify4" |
| 3 | RubyGems | shopify-ruby-definitions versions API | source | 2023-10-11 (last) | 2026-09-27 | https://rubygems.org/api/v1/versions/shopify-ruby-definitions.json | The published gem is three years staler than the fork it describes | 5 versions, first 0.0.1 2023-06-01, last 1.4.0 2023-10-11 |
| 4 | Shopify | Shopify/ruby branches | source | 2026-09-21 (branch) | 2026-09-27 | https://github.com/Shopify/ruby/branches/all | The language fork is current and carries a patch line per upstream release | "forked from ruby/ruby"; branch v4.0.7-pshopify1 updated "Sep 21, 2026"; branches zjit-codegen/calls, zjit-block-params, force_encoding-HIR |
| 5 | Shopify | Shopify/ruby issues | source | 2026-09-22/24 | 2026-09-27 | https://github.com/Shopify/ruby/issues | Day-to-day work on a CRuby subsystem is tracked in Shopify's fork, not upstream | Open issues #1060-#1070 all prefixed "ZJIT:", e.g. #1067 "ZJIT: Internal compiler error when constant-folding LoadField", authors tekknolagi, k0kubun, dak2 |
| 6 | Ruby core | doc/jit/zjit.md | adr | master | 2026-09-27 | https://raw.githubusercontent.com/ruby/ruby/master/doc/jit/zjit.md | ZJIT is a method-based, profile-guided compiler, and its bug tracker is Shopify's fork | "ZJIT is a method-based just-in-time (JIT) compiler for Ruby. It uses profile information from the interpreter to guide optimization in the compiler."; "please open a ticket on [the official Ruby bug tracker] (or, if you don't want to make an account, [on Shopify/ruby])" |
| 7 | Ruby core | doc/jit/yjit.md | adr | master | 2026-09-27 | https://raw.githubusercontent.com/ruby/ruby/master/doc/jit/yjit.md | YJIT is a lazy basic-block-versioning compiler and trades memory for speed | "It lazily compiles code using a Basic Block Versioning (BBV) architecture."; "YJIT will use more memory than the Ruby interpreter because the JIT compiler needs to generate machine code in memory" |
| 8 | Ruby core | NEWS for Ruby 3.1.0 | source | 2021-12 | 2026-09-27 | https://raw.githubusercontent.com/ruby/ruby/master/doc/NEWS/NEWS-3.1.0.md | YJIT arrived as experimental, with Shopify's own template workload as a headline benchmark | "YJIT: New experimental in-process JIT compiler"; "Performance improvements on benchmarks based on real-world software, up to 22% on railsbench, 39% on liquid-render." |
| 9 | Ruby core | NEWS for Ruby 3.2.0 | source | 2022-12 | 2026-09-27 | https://raw.githubusercontent.com/ruby/ruby/master/doc/NEWS/NEWS-3.2.0.md | Production-readiness was declared on the strength of a year in production, and building Ruby now needs Rust | "YJIT is no longer experimental * Has been tested on production workloads for over a year and proven to be quite stable."; "Building YJIT now requires Rust 1.58.0+"; "The default --yjit-exec-mem-size is changed to 64 (MiB)." |
| 10 | Ruby core | NEWS for Ruby 3.3.0 | source | 2023-12 | 2026-09-27 | https://raw.githubusercontent.com/ruby/ruby/master/doc/NEWS/NEWS-3.3.0.md | The JIT's defaults are now application-size dependent, and are tuned against Shopify's process model | "--yjit-call-threshold is automatically raised from 30 to 120 when the application has more than 40,000 ISEQs."; "Better copy-on-write behavior on servers reforking with Pitchfork" |
| 11 | Ruby core | NEWS for Ruby 3.4.0 | source | 2024-12 | 2026-09-27 | https://raw.githubusercontent.com/ruby/ruby/master/doc/NEWS/NEWS-3.4.0.md | JIT memory became one budgeted number | "--yjit-mem-size introduces a unified memory limit (default 128MiB) to track total YJIT memory usage" |
| 12 | Ruby core | NEWS for Ruby 4.0.0 | source | 2025-12 | 2026-09-27 | https://raw.githubusercontent.com/ruby/ruby/master/doc/NEWS/NEWS-4.0.0.md | The second compiler shipped slower than the first, and upstream says so plainly | "As of Ruby 4.0.0, ZJIT is faster than the interpreter, but not yet as fast as YJIT. We encourage experimentation with ZJIT, but advise against deploying it in production for now."; "When building Ruby, Rust 1.85.0 or later is required to include ZJIT support." |
| 13 | Shopify | Shopify/zjit README (archived) | source | 2025-05-14 | 2026-09-27 | https://raw.githubusercontent.com/Shopify/zjit/master/README.md | The exit door for this kind of work is upstream, and the repository says so | "ZJIT development has moved. We have upstreamed the project into ruby/ruby in the zjit directory. This repository is mostly for historical interest." |
| 14 | Rails | PR #49947, enable YJIT by default | adr | 2023-11-07 | 2026-09-27 | https://github.com/rails/rails/pull/49947 | A framework default turned one company's compiler into the industry's default runtime | "Enable YJIT by default if running Ruby 3.3+"; "There was many public reports of 15-25% latency improvements for Rails apps that did enable Ruby 3.2 YJIT, and in 3.3 it's even better." |
| 15 | Shopify | packwerk README | source | 2026-08-26 (last release) | 2026-09-27 | https://raw.githubusercontent.com/Shopify/packwerk/main/README.md | The boundary check is deliberately incomplete, and names its blind spot | "Packwerk is designed to avoid false positives ... at any cost, and we pay the cost by accepting a small number of false negatives"; "Method calls and objects passed around the application are completely ignored." |
| 16 | Shopify | packwerk USAGE.md | adr | main | 2026-09-27 | https://raw.githubusercontent.com/Shopify/packwerk/main/USAGE.md | The mechanism that makes a boundary adoptable on existing code is a recorded-debt file | "Ruby does not provide a good solution to enforcing boundaries between code."; sections "Recording existing violations" and "Understanding the package todo file" |
| 17 | RubyGems | packwerk versions API | source | 2020-09-23 first | 2026-09-27 | https://rubygems.org/api/v1/versions/packwerk.json | Dates the build-time boundary decision and shows it is still maintained | 28 versions, first 1.0.0 2020-09-23, last 3.3.1 2026-08-26 |
| 18 | Shopify | packwerk issue #164 | source | 2021-12-09 | 2026-09-27 | https://github.com/Shopify/packwerk/issues/164 | An adopter, not the owner, found the CI cost of the boundary check | "[Bug Report] Max RSS is Significantly Higher in Version 2.0"; v1.4 "Maximum resident set size (kbytes): 83560" against v2.0 "334968"; "so much higher that we will need to increase the resource class of our CI nodes" |
| 19 | Shopify | tapioca README | source | 2026-09-15 (last release) | 2026-09-27 | https://raw.githubusercontent.com/Shopify/tapioca/main/README.md | Gradual typing in a dynamic language needs a generated-artefact pipeline | "It surfaces types and methods from many sources that Sorbet cannot otherwise see - such as gems, Rails and other DSLs - compiles them into RBI files"; feature list includes "Synchronization validation for your CI" |
| 20 | RubyGems | sorbet versions API | source | 2018-06-02 first | 2026-09-27 | https://rubygems.org/api/v1/versions/sorbet.json | The type checker ships continuously, which is the real cost profile of adopting it | 1,934 versions, first 0.0.1.pre.prealpha 2018-06-02, last 0.6.13508 2026-09-25 |
| 21 | Shopify | Shopify/sorbet | source | live | 2026-09-27 | https://github.com/Shopify/sorbet | The type checker is consumed as a fork | "forked from sorbet/sorbet" |
| 22 | Shopify | rubydex README | source | 2025-08-19 first release | 2026-09-27 | https://raw.githubusercontent.com/Shopify/rubydex/main/README.md | A third generation of Ruby analysis is being built, in Rust, as shared infrastructure | "This project is a high-performance static analysis toolkit for the Ruby language. The goal is to be a solid foundation to power a variety of tools, such as type checkers, linters, language servers and more." |
| 23 | RubyGems | rubydex versions API | source | 2025-08-19 first | 2026-09-27 | https://rubygems.org/api/v1/versions/rubydex.json | The pace of the new toolchain work | 124 versions, first 0.0.1 2025-08-19, last 0.4.1 2026-09-02 |
| 24 | Shopify | liquid-c README | source | 2024-01-24 (last release) | 2026-09-27 | https://raw.githubusercontent.com/Shopify/liquid-c/main/README.md | The C-extension answer to template speed was measured, then abandoned | "Warning: This project is no longer maintained."; benchmark in README: parse 29.527 i/s against 90.672 i/s, render 89.403 against 163.871, parse & render 20.474 against 50.165, on ruby-3.0.2 |
| 25 | RubyGems | liquid-c versions API | source | 2024-01-24 last | 2026-09-27 | https://rubygems.org/api/v1/versions/liquid-c.json | Dates the end of the C-extension line | 9 versions, first 0.0.1 2014-10-06, last 4.2.0 2024-01-24 |
| 26 | Rails | bootsnap README | source | main | 2026-09-27 | https://raw.githubusercontent.com/Shopify/bootsnap/main/README.md | The only first-party Shopify platform figure in this corpus, and the split of where the win comes from | "The core Shopify platform -- a rather large monolithic application -- boots about 75% faster, dropping from around 25s to 6.5s."; "about 25% of this gain can be attributed to compile_cache_* features; 75% to path caching" |
| 27 | Rails | bootsnap repository, formerly Shopify/bootsnap | source | live | 2026-09-27 | https://github.com/Shopify/bootsnap | The Shopify path now serves rails/bootsnap, which is how GitHub records a transfer | Page renders as "rails/bootsnap", description "Boot large Ruby/Rails apps faster", with no move notice |
| 28 | Rails | bootsnap issue #572 | source | 2026-09-04 | 2026-09-27 | https://github.com/rails/bootsnap/issues/572 | A build-time cache can return a plausible wrong value rather than failing | "precompile caches false instead of the document when a file is edited without changing its byte size"; "bs_precompile reads the source file twice from the same file descriptor without rewinding; the second read hits EOF and yields an empty string"; "bs_fetch already guards against this, bs_precompile doesn't" |
| 29 | Rails | bootsnap issue #529 | source | 2026-06 (listing date) | 2026-09-27 | https://github.com/rails/bootsnap/issues/529 | Compile caches are a memory-safety surface, and the failure is intermittent | "crash loading aws-sdk-s3"; reporter sees it "approximately 5% of the time" in CI after upgrading 1.20.1 to 1.21.1; crash reported as "corrupted double-linked list" inside load_from_binary |
| 30 | Shopify | pitchfork README | source | 2026-01-28 (last release) | 2026-09-27 | https://raw.githubusercontent.com/Shopify/pitchfork/master/README.md | The process model was rebuilt so JIT-warmed memory could be shared | "Reforking: pitchfork can be configured to periodically promote a warmed-up worker as the new template from which workers are forked. This dramatically improves the proportion of shared memory" |
| 31 | RubyGems | pitchfork versions API | source | 2022-10-05 first | 2026-09-27 | https://rubygems.org/api/v1/versions/pitchfork.json | Dates the reforking server | 24 versions, first 0.1.0 2022-10-05, last 0.18.2 2026-01-28 |
| 32 | Shopify | shopify-scripts, archived | source | archived 2024-09-03 | 2026-09-27 | https://github.com/Shopify/shopify-scripts | The first-generation extension point ran merchant Ruby on Shopify's servers, and was given a removal date | "This repository was archived by the owner on Sep 3, 2024."; "Shopify Scripts is deprecated and will be removed on August 28, 2025."; "Shopify Scripts are written in a stripped-down version of Ruby" |
| 33 | Shopify | ess, Enterprise Script Service | source | live | 2026-09-27 | https://github.com/Shopify/ess | The Scripts-era sandbox was a child process, seccomp and quotas | README: "a thin Ruby API layer that spawns a process, the enterprise_script_engine, to execute an untrusted Ruby script"; "spawns an mruby-engine with seccomp sandboxing"; parameters include "timeout, instruction quotas, and memory limits" |
| 34 | Shopify | mruby-engine | source | live | 2026-09-27 | https://github.com/Shopify/mruby-engine | The guest language was a second, smaller Ruby implementation | "MRuby engine is a sandboxed scripting engine. It wraps mruby into a gem that can be included in any Ruby application." |
| 35 | Bytecode Alliance | javy README, formerly Shopify/javy | source | live | 2026-09-27 | https://raw.githubusercontent.com/Shopify/javy/main/README.md | The JS-to-Wasm toolchain left Shopify for a foundation, and its module-size economics are published | "A Bytecode Alliance project"; "Javy can create very small Wasm modules in the 1 to 16 KB range with use of dynamic linking. The default static linking produces modules that are at least 869 KB in size." |
| 36 | crates.io | javy crate | source | 2023-05-17 first | 2026-09-27 | https://crates.io/api/v1/crates/javy | Dates the Wasm-guest toolchain | crate created 2023-05-17 |
| 37 | Shopify | function-runner | source | live | 2026-09-27 | https://raw.githubusercontent.com/Shopify/function-runner/main/README.md | The guest contract is a Wasm module with JSON in and JSON out | "This is a simple CLI (function-runner) which allows you to run Wasm Functions intended for the Shopify Functions infrastructure. Functions will run using the provided JSON input file" |
| 38 | Shopify | shopify-function-wasm-api | source | 2026-09-14 activity | 2026-09-27 | https://raw.githubusercontent.com/Shopify/shopify-function-wasm-api/main/README.md | The host/guest boundary is a generated shim, not a language binding | Components listed as "Provider", "Core", "API" and "Trampoline"; the trampoline "augments Wasm modules to interface with the provider" and "Handles memory sharing between guest and provider modules" |
| 39 | Shopify | deterministic-wasi-ctx | source | 2026-09-24 activity | 2026-09-27 | https://raw.githubusercontent.com/Shopify/deterministic-wasi-ctx/main/README.md | Determinism was engineered into the sandbox so guest results can be cached | "Determinism refers to the property that a provided WASI function will always return the same series of results for the same series of invocations."; "This can be useful in a variety of contexts. For example, caching the results of invoking a function in a Wasm module." |
| 40 | Bytecode Alliance | Wasmtime advisory GHSA-vqjp-4c8c-hfgg | postmortem | 2026-08-20 | 2026-09-27 | https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-vqjp-4c8c-hfgg | The rented isolation boundary failed, and the patch spans four release lines | "Filesystem sandbox escape when paths or symlinks contain trailing slashes", severity High; "contained a bug which allowed guests to escape their filesystem sandbox and read/write external files and directories"; "Wasmtime 24.0.13, 36.0.14, 46.0.3, and 47.0.4 are being released with this advisory" |
| 41 | Bytecode Alliance | Wasmtime security advisories index | postmortem | 2026-06 to 2026-09 | 2026-09-27 | https://github.com/bytecodealliance/wasmtime/security/advisories | The cadence of sandbox defects is the real operational cost of renting isolation | 10 advisories listed between 2026-06-15 and 2026-09-24, including "guest can panic host through filesystem datetime overflow", "outgoing HTTP body write allows guest-driven host memory exhaustion (DoS)" |
| 42 | Shopify | ghostferry README | source | live | 2026-09-27 | https://raw.githubusercontent.com/Shopify/ghostferry/main/README.md | Moving a tenant's data between instances is an owned tool with a formal specification | "Ghostferry is a library that enables you to selectively copy data from one mysql instance to another with minimal amount of downtime."; "An overview of Ghostferry's high-level design is expressed in the TLA+ specification" |
| 43 | Shopify | ghostferry technical overview | adr | main | 2026-09-27 | https://raw.githubusercontent.com/Shopify/ghostferry/main/docs/technicaloverview.md | The cutover is a deliberate write freeze, priced in seconds to minutes | "For data integrity reasons, Ghostferry mandates that you stop writes to the dataset you are copying at a stage of execution called cutover."; "This process has some downtime between step 5 and step 7 ... In most cases this should be on the order of seconds to minutes." |
| 44 | Shopify | ghostferry tags | source | 2026-09-24 latest | 2026-09-27 | https://github.com/Shopify/ghostferry/tags | The data-movement tool is still under active development eight years on | Tags include v1.3.1 (Apr 15, 2026) and canary/v1.4.0-gtids-rc-1 (Sep 21, 2026) |
| 45 | Vitess | ADOPTERS.md | source | main | 2026-09-27 | https://raw.githubusercontent.com/vitessio/vitess/main/ADOPTERS.md | Shopify partitions MySQL with an adopted system rather than a built one | Shopify is listed among "known adopters of Vitess" |
| 46 | Shopify | semian README | source | 2026-09-07 last release | 2026-09-27 | https://raw.githubusercontent.com/Shopify/semian/main/README.md | The failure boundary inside the process is a bulkhead plus a circuit breaker, coordinated by SysV semaphores | "Semian is a library for controlling access to slow or unresponsive external services to avoid cascading failures."; "Bulkheading. Controlling the concurrent access to a single resource, access is coordinated server-wide with SysV semaphores" |
| 47 | Shopify | krane README | source | 2026-01-08 last release | 2026-09-27 | https://raw.githubusercontent.com/Shopify/krane/main/README.md | The deploy boundary is a wrapper whose product is a verdict, not a rollout | "This project used to be called kubernetes-deploy."; "Especially in a CI/CD environment, we need a clear, actionable pass/fail result for each deploy. Providing this was the foundational goal of krane" |
| 48 | RubyGems | krane and kubernetes-deploy versions APIs | source | 2017-01-18 to 2026-01-08 | 2026-09-27 | https://rubygems.org/api/v1/versions/kubernetes-deploy.json | Dates the Kubernetes move and the rename | kubernetes-deploy: 101 versions, first 0.1.0 2017-01-18, last 1.0.0.pre.2 2020-07-28. krane: 60 versions, first 1.0.0 2019-11-18, last 3.9.1 2026-01-08 |
| 49 | npm | @shopify/hydrogen and @shopify/cli | source | 2021-08-16, 2022-01-14 first | 2026-09-27 | https://registry.npmjs.org/@shopify%2fhydrogen | Dates the storefront and tooling layer, where the churn is fastest | @shopify/hydrogen: 1,445 versions, first 1.0.0-alpha.11 2021-08-16, latest 2026.10.0-preview.3 2026-09-11. @shopify/cli: 2,796 versions, first 0.1.1 2022-01-14 |
| 50 | Shopify | hydrogen-v1, archived | source | archived, last activity 2025-03-19 | 2026-09-27 | https://github.com/Shopify/hydrogen-v1 | Even the newest layer retires whole generations | Listed as a public archive, "React framework for building Shopify-powered custom storefronts", updated Mar 19, 2025 |
Searches that returned nothing, which is itself evidence
| Query | Result | Reading |
|---|---|---|
org:Shopify postmortem (issues) |
0 results, 2026-09-27 | Shopify publishes no incident review inside its own repositories |
org:Shopify "caused an outage" (issues) |
0 results, 2026-09-27 | The company's failure record is not in this corpus; the substrate's is |
repo:Shopify/packwerk slow OR performance (issues) |
10 results, one with numbers (#164) | Scale limits of the boundary checker are reported by adopters, not measured in public by the owner |
Claims I wanted and could not source here
- Shopify's own traffic, shard count or peak-throughput figures. These are published on shopify.engineering, which the environment could not reach.
- The YJIT VMIL 2021 paper, referenced from
doc/jit/yjit.mdbut hosted on dl.acm.org, blocked. - Any statement of why liquid-c stopped being maintained. The repository says only that it is unmaintained; the correlation with YJIT's arrival is inference, and is labelled as such.
Rows added after the first pass
| # | Org | Title | Tier | Published | Checked | URL | Claim I take from it | Supporting quote or figure |
|---|---|---|---|---|---|---|---|---|
| 51 | Go module proxy | ghostferry module versions | source | live | 2026-09-27 | https://proxy.golang.org/github.com/!shopify/ghostferry/@v/list | The published module line is narrower than the release tags the team cuts | List returns v1.3.0, v1.3.1, v1.2.0 |
| 52 | PyPI | ShopifyAPI release history | source | 2024-11-04 last | 2026-09-27 | https://pypi.org/pypi/ShopifyAPI/json | Registry-against-repository drift repeats outside Ruby | 78 releases, first 0.1.0 2011-08-23, last 12.7.0 2024-11-04, while the repository listing shows activity "Updated Aug 25, 2026" |