Skip to content
← AI in operationsStudy 15L3 (pre-registered differential fault-injection harnesses, controlled Go-vs-Rust benchmarks, and live container topology verification)

Running local models inside fault-injection and chaos harnesses

Published
Data
2 fault-injection rounds (18 pre-release fixes, 496 regression tests), 15 collector verification rounds across 6 container and Kubernetes topologies
Figures
3

The claim

How can local models uncover operational failure modes that standard unit tests and golden benchmarks miss? Standard test suites verify expected inputs on healthy nodes. In production distributed systems, incidents usually stem from malformed inputs, process races, or cross-component interactions (Basiri et al., 2016; Yuan et al., 2014).

Uncovering those failure modes requires synthesizing hundreds of adversarial inputs, kill schedules, and container topologies (Kingsbury, 2019; Meng et al., 2023; Pan et al., 2024). Under metered cloud APIs, running multi-agent chaos loops across every pre-release build is costly because most generated probes pass without failing.

Our local 128 GB VRAM GPU stack (report 13) has 0 per-token surcharge. That cost structure lets us run role-specialized local agents (38B code-analysis model at 1,305 to 3,184 tokens/s prefill) inside deterministic fault-injection harnesses. The local agents read source code and synthesize malformed archives, truncated streams, concurrent writers, and container topologies (Vikram et al., 2023; Kikuta et al., 2025). Every synthesized fault executes against a compiled binary and a deterministic pass/fail oracle, complementing our sanitizer-gated security workflow (report 14).

We applied this pre-release verification workflow across two core infrastructure systems before deployment, achieving 0 customer production impact.

  • Pre-release fault injection on our Rust log-to-Parquet engine (18 edge cases isolated prior to open-source release). Our Rust log-to-Parquet engine (report 06, report 08) is currently being prepared for open-source release under the Apache 2.0 license. We ran two fault-injection rounds: 5 stress clusters (7 input-boundary fixes) in Round 1 and 11 concurrency and file-lifecycle scenarios in Round 2. Together, the harness isolated and verified fixes for 18 edge cases before release. All 18 invariants are locked into 496 automated workspace regression tests (0 failures).
  • Go-to-Rust node telemetry collector verification (15 rounds across 6 container and Kubernetes topologies). We ported our node telemetry collector from Go (25.05 to 52.57 MB binary) to Rust (4.20 to 6.55 MB static binary). Across 1,500 synthetic test secrets (0 false positives), Rust redacted logs 9.1x to 13.5x faster (580 to 850 MB/s vs 61 to 93 MB/s). We then ran a 15-round topology harness across 6 Docker and Kubernetes configurations (0.013 to 0.087 CPU cores per node, +8.98% p99 database latency within our 10.0% gate). That harness isolated and eliminated a 14.4x collection latency stall (24.5 s reduced to 1.7 s) before customer deployment (0 customer production impact).

Four design rules for model-driven fault injection

  1. Use the local model to synthesize adversarial inputs, never to judge pass or fail. Language models are effective at reading parser or collector source code and proposing boundary-breaking inputs (Vikram et al., 2023; Claessen & Hughes, 2000). The pass/fail oracle remains a deterministic binary check: process exit codes, flock locks, DuckDB Parquet reads, or statement_timeout counters.
  2. Test process lifecycle and SIGKILL recovery alongside input parsing. File parsers that pass 100% of unit tests can still corrupt output directories when two processes write concurrently. Likewise, an out-of-memory SIGKILL during shard merge can leave a 0-byte file behind (Alvaro et al., 2015).
  3. Verify every fix with a paired pre-remediation vs post-remediation (PRE/POST) binary harness. In Round 2, our first filename-cap patch truncated the .parquet extension at 255 bytes and passed a naive unit test vacuously. The PRE/POST binary harness caught that 0 files matched **/*.parquet, forcing a 247-byte cap that reserves space for .parquet and temporary staging suffixes.
  4. Replace single-container smoke tests with multi-version, degraded cluster topologies. Distributed collectors fail on split master and tserver roles, unreachable seed nodes, read-only /tmp mounts (0555), or disabled features like change-data-capture (CDC).

Pre-release fault injection on our Rust log-to-Parquet engine (18 edge cases)

Before releasing our Rust log-to-Parquet engine under the Apache 2.0 license, we ran role-specialized local agents (38B code-analysis model) across its workspace. Each agent role audited a distinct failure surface: stream truncation, parser recursion, timestamp arithmetic, concurrent file I/O, and filesystem path limits.

Across two fault-injection rounds, the harness isolated and verified fixes for 18 pre-release edge cases (7 in Round 1 and 11 in Round 2).

campaign round and fault category stress clusters or scenarios pre-release fixes verified representative adversarial input or fault injected deterministic pre-release engineering fix
Round 1: Parser recursion & numeric bounds 3 clusters 3 fixes 30,000 chained key= tokens; 400-digit latency float; out-of-range timestamp Bounded recursion to maximum depth 16; rejected Inf/NaN floats; clamped i64::MIN/i64::MAX to prevent 1970 epoch collapse
Round 1: Archive & stream boundary guards 2 clusters 4 fixes High-ratio .gz bomb; symlink outside root; >16 MiB line; failed file exit code Enforced 64x gzip decompression ratio cap; blocked external symlinks; snapshotted 16 MiB truncation flag; returned non-zero exit code on failed files
Round 2: Concurrency & SIGKILL file lifecycle 4 scenarios (S1-S3, S10) 4 fixes Concurrent writers to one directory; SIGKILL leaving 0-byte file; 100 KiB RLIMIT_FSIZE; mid-read file shrink (75% to 77% loss) Added advisory output-directory flock; staged temporary files for atomic rename() after fsync; quarantined 0-byte files as .corrupt; added EOF size re-stat warnings
Round 2: Path, BOM & double-gzip guards 4 scenarios (S6-S9) 4 fixes 250-byte source filename (os error 63); empty --bundle-id ""; 3-byte UTF-8 BOM; .gz.gz double-gzip Capped filenames at 247 bytes with 8-hex SHA-256 suffix; rejected empty bundle IDs; stripped leading UTF-8 BOM; warned on double-gzip streams
Round 2: Redaction & format boundaries 3 scenarios (S4-S5, S11) 3 fixes 4 ANSI-prefixed and glued access keys; strict redaction environment override; parent-directory log_type path traversal Dropped leading \b with 16 to 35 char greedy tails (0 leaked rows vs 5 pre-fix); fixed flag > env > default precedence; enforced [a-z0-9_-]{1,128} across 30 formats
Total across both rounds 5 clusters + 11 scenarios 18 fixes Evaluated across 2 paired binary arms (PRE vs POST) Locked into 496 automated workspace regression tests (0 failures)

Four of the 18 pre-release fixes illustrate how model-synthesized faults catch edge cases that golden benchmarks miss.

  1. Bounding parser recursion on 30,000 chained key= tokens to maximum depth 16 (Round 1, F1). On normal logs, key-value decomposition recurses 1 to 3 levels deep. The local agent synthesized a single log line containing 30,000 chained key= tokens, which overflowed the thread stack via $O(N)$ recursion. Capping token recursion at depth 16 converted stack usage to $O(1)$ and processed all 30,000 tokens in milliseconds (0 panics across all 5 clusters).
  2. Enforcing a 64x gzip decompression ratio cap to block archive-expansion bombs (Round 1, F3). As shown in report 06, legitimate compressed log files expand by 5x to 41x. Reading an adversarial .gz stream without a ratio bound risks host memory exhaustion or silent stream truncation. Wrapping decompression in a budgeted reader with a 64x expansion ratio cap (GZIP_EXPANSION_RATIO_CAP = 64) blocked decompression bombs deterministically.
  3. Adding advisory output-directory file locking to prevent races between concurrent writers (Round 2, S1). When two parser processes targeted the same --output-dir simultaneously, both exited 0 while interleaving data_N.parquet shards. Downstream DuckDB read_parquet('**/*.parquet') queries then failed with TProtocolException: Invalid data. Acquiring an exclusive advisory flock on the output lockfile rejected the racing writer immediately and preserved all 3,001 rows in the primary output.
  4. Quarantining 0-byte truncated Parquet files left behind after SIGKILL (Round 2, S2). Killing a process mid-merge via SIGKILL or hitting a 100 KiB RLIMIT_FSIZE limit (S3) left a 0-byte data_999.parquet stub on disk. That 0-byte file permanently broke wildcard Parquet queries on subsequent runs. Writing to hidden temporary staging files before an atomic rename() and quarantining 0-byte stubs to .corrupt on startup restored queryability across all 72,145 rows.

Panel A: fault-injection categories and verified pre-release fixes across Round 1 (7 input-boundary and recursion fixes) and Round 2 (11 concurrency and SIGKILL file-lifecycle fixes, 18 total). Panel B: growth of the automated workspace regression test suite locking all 18 invariants into 496 tests.

Every fault scenario was converted into a permanent regression test before merge. The workspace suite started at 459 baseline tests and reached 470 tests after our 30-format declarative and 301-case Lean 4 FFI checks (report 08). Adding 15 tests in Round 1 and 11 differential tests in Round 2 brought the suite to 496 automated workspace tests (0 failures).

Porting our node telemetry collector from Go to Rust (15 rounds across 6 topologies)

Diagnostic engines only see what the node collector captures. To eliminate garbage-collection heap overhead and regex bottlenecks, we ported our collector from Go to safe Rust (forbid(unsafe_code), Jung et al., 2021). Compiled systems languages also avoid garbage-collection runtime overhead (Pereira et al., 2017).

Before evaluating cluster topologies, we benchmarked the Go and Rust implementations head to head on identical hardware.

collector evaluation dimension Go collector (parquet-go / arrow-go) Rust collector (arrow-rs + aho-corasick + libzstd) measured improvement and operational impact
Static binary size (node agent / full stack) 25.05 to 52.57 MB (25.1 to 52.6 MB) 4.20 to 6.55 MB (4.2 to 6.6 MB, incl. 2.38 MiB catalog) 3.8x to 8.0x smaller full binary (12.5x smaller 4.20 MB musl node agent)
Secret redaction throughput (no-hit log lines) 61 to 93 MB/s (62.0 MB/s benchmark median) 580 to 850 MB/s (38-literal SIMD AhoCorasick prefilter) 9.1x to 9.5x faster (100.0% recall on 1,500 secrets across 15 classes, 0 FPs on 20,000 benign lines)
Secret redaction throughput (hint-heavy mixed lines) 11.1 MB/s (uncached PikeVM submatch tracking) 150 to 177 MB/s (21-rule lazy DFA + AhoCorasick bitmask) 13.5x to 15.9x faster on hint-heavy mixed lines (9.1x to 15.9x overall across workloads)
Long-distance zstd (--long=27, 128 MiB window) 11.55 MB (3.83x ratio on 44.23 MB rotated logs) 2.06 MB (21.47x ratio via libzstd long-distance matcher) 5.61x smaller compressed log archive across rotated segments
Under-replicated (< RF=3) SQL collection latency 24.5 s (pg_stat_replication system.cdc_state wait on 2-TServer harness) 1.7 s (pg_stat_activity walsender shared-memory query) 14.4x faster SQL collection on degraded/under-replicated topologies (0 catalog writes or 20.0 s timeouts)

In Rust, compile-time monomorphization and link-time dead-code elimination shrunk the full collector binary from 52.57 MB (25.05 MB with parquet-go) down to 6.55 MB. That 6.55 MB binary embeds Arrow, Parquet, Zstandard, and our 2.38 MiB (2.49 MB) template catalog. The standalone musl node agent is 4.20 MB (5.00 MB on linux/amd64).

For source-side redaction, a 38-literal SIMD AhoCorasick prefilter (Aho & Corasick, 1975; Wang et al., 2019) runs before 21 regex-automata lazy DFA rules (Cox, 2007). Throughput reached 580 to 850 MB/s on no-hit lines (61 to 93 MB/s in Go) and 150 to 177 MB/s on hint-heavy lines (11.1 MB/s in Go). Across 1,500 synthetic test secrets (15 secret classes) and 20,000 benign trap lines, Rust matched 100.0% of secrets with 0 false positives (9.1x to 15.9x speedup).

Panel A: Go vs Rust node telemetry collector redaction throughput across no-hit (61-93 MB/s vs 580-850 MB/s, 9.1x-9.5x) and hint-heavy mixed lines (11.1 MB/s vs 150-177 MB/s, 13.5x-15.9x). Panel B: normalized reduction in static binary size (52.6 MB to 6.6 MB full, 25.1 MB to 4.2 MB agent) and SQL collection cycle latency (24.5 s down to 1.7 s, 14.4x faster).

How the 15-round topology harness isolated the 24.5 s (14.4x) catalog stall

Unit benchmarks and single-container smoke tests did not expose how the collector behaved across diverse cluster deployments. We therefore ran 15 verification rounds (8 pre-registered benchmark gates, 2 live container, Kubernetes, and 3-region cloud fault matrices, and 5 multi-agent audit rounds). Those 15 rounds tested 6 container and Kubernetes topologies (8 live sub-cases).

topology ID and deployment archetype container or K8s targets collector CPU overhead collection wall time pre-release edge case isolated and fixed before customer deployment downstream analyzer verification
Topology 1 (1A & 1B): Split Master-only & TServer-only StatefulSet 3 split containers (tserver-0..1, master-0) 0.038 cores/node 1.9 to 3.0 s 24.5 s to 1.7 s (14.4x) pg_stat_replication wait on 2-TServer (< RF=3) harness (ms on RF=3 prod); yb_lock_status(null, null) 2-arg call; :13000 bind; :9000/api/v1/varz discovery 28 / 28 steps (100.0%), 0 leaks (371 to 380 files audited)
Topology 2: Multi-namespace stretched Kubernetes (kubectl) 3 AZ namespaces (yb-az1..3) 0.045 cores/node 2.9 s Scoped per-namespace K8s API queries (avoiding -A RBAC failures); <ns>/<pod> topology matching; OOMKilled (exitCode 137) event surfacing 28 / 28 steps (100.0%), 0 leaks (380 files audited)
Topology 3: CIS-hardened container (/tmp 0555, strict redaction) 1 hardened node (read-only /tmp) 0.013 cores/node 1.4 s Unwritable /tmp fallback; wire-length-preserving binary Protobuf IPv4 scrubbing (consensus-meta); custom --redact-pattern & UTF-8 boundary slicing before .truncate(320) / .truncate(512) 28 / 28 steps (100.0%), 0 leaks (258 files audited)
Topology 4: Degraded chaos cluster (unreachable seed node) 4 nodes (1 dead seed + 3 live) 0.052 cores/node 2.8 s Automatic cluster_scope failover when nodes[0] is dead; numeric ticket-ID extraction for downstream schema validation 28 / 28 steps (100.0%), 0 leaks (488 files audited)
Topology 5: External Prometheus TSDB + connection poolers 3 DB nodes + 1 Prometheus TSDB 0.064 cores/node 2.2 s Stripping scrape-target instance/job labels so 4,254 tserver and 4,684 master series merge cleanly instead of splitting into 8,503 single-point series 28 / 28 steps (100.0%), 0 leaks (491 files audited)
Topology 6 (6A & 6B): Multi-version rolling upgrade + X.509 certs 3 mixed-version nodes (PG11 + PG15) 0.087 cores/node 3.5 to 3.7 s Mixed PG11/PG15 pg_stat_statements column compatibility; X.509 certificate expiry inspection (0 .key files collected); excluding 9-column _unknowns.parquet from parquet_shards 28 / 28 steps (100.0%), 0 leaks (243 to 501 files audited)

The standout finding emerged in Topology 1A, a synthetic 2-TServer (tserver-0..1) container harness running below the RF=3 replication factor required to place new system tablets. Collecting SQL views with --enable ysql on that under-replicated harness stalled for 24.5 s per TServer instead of finishing in under 2.0 s.

Inspecting the tablet-server logs revealed why. Querying pg_stat_replication or pg_replication_slots invoked PgClientService.ListSlotEntries, which calls CreateCDCStateTableIfNotFound (CreateTable system.cdc_state). On standard RF=3 production clusters, system.cdc_state is created once in milliseconds. In Topology 1A, however, only 2 TServers were present (below RF=3), so tablet placement waited and polled IsCreateTableDone every 2.0 s until the 20.0 s statement_timeout fired (leaving a 120.0 s master RPC).

Switching the collector to query pg_stat_activity WHERE backend_type = 'walsender' reads WAL sender state directly from backend shared memory (0 catalog writes). That change guarantees sub-2-second collection (24.5 s down to 1.7 s, 14.4x faster, 14.41x exact) even on degraded or under-replicated clusters.

Panel A: collector CPU overhead across the 6 container and Kubernetes test topologies (0.013 to 0.087 effective cores per node vs the 1.0 core ceiling). Panel B: database SQL latency impact during active 3-node RF=3 collection (+3.0% p50 and +8.98% p99 vs the 10.0% pre-registered gate).

Across all 6 topologies, collector resource usage stayed well inside our pre-registered production safety budgets (H4 and H5). Per-node CPU overhead ranged from 0.013 to 0.087 effective cores (0.013 to 0.045 cores in getrusage self-telemetry and 0.032 to 0.087 cores in Linux cgroup cpu.stat accounting). The collector runs pinned to <= 1.0 core with nice 19, ionice -c 3, and a 50 MiB/s disk read cap. Resident memory peaked at 44.3 to 46.2 MiB (<= 256.0 MiB ceiling) with 0 bytes written to node disks.

We also measured live database query overhead across 3 alternating 26 s paired trials (1,600 point queries per trial on a 3-node RF=3 cluster). That cluster held 14 tablets and 42 replicas. Median p50 SQL latency moved from 0.865 ms to 0.891 ms (+3.0%). Median p99 SQL latency moved from 1.893 ms to 2.063 ms (+8.98%), passing our pre-registered <= 10.0% gate.

Verification gates and methodology checks

  • Paired PRE/POST binary verification (Round 2, 11 scenarios). Every Round 2 fault scenario ran against both the pre-remediation binary and the post-remediation binary. That gate caught our initial 255-byte filename cap truncating .parquet extensions (S6) before merge.
  • Downstream 28-step pipeline completeness gate (8 topology bundles). Every bundle produced across the 6 topologies (8 sub-cases) had to pass verify --check-redaction (0 leaks across 243 to 501 audited files). Each bundle also had to complete all 28 of 28 (100.0%) deterministic downstream analyzer steps.
  • Multi-byte UTF-8 boundary and 43-vector redaction torture gate (Round 5 audit). Injecting multi-byte UTF-8 characters (µs and typographic quotes) at exact 320-byte and 512-byte truncation boundaries caught panics prior to is_char_boundary() checks. A 43-vector torture suite also verified JSON-escaped password and file-pointer (aws_access_key_id) redaction.
  • Independent external ISO/IEC 42001 (2023) audit readiness. Under our governance controls (report 09, report 11), pre-registered fault-injection ledgers are retained for independent external ISO/IEC 42001 audits by an accredited certification body.

Testing antipatterns rejected by our gates

  1. Relying on healthy-node golden benchmarks to certify parsers and collectors (missed 18 input-boundary and SIGKILL edge cases in our log engine and 7 topology bugs).
  2. Allowing concurrent processes to write Parquet shards without an advisory lock (caused shard interleaving and TProtocolException read failures until advisory output locking was added).
  3. Writing Parquet output directly to final filenames instead of atomic temporary staging files (left 0-byte data_N.parquet files after SIGKILL that permanently broke read_parquet('**/*.parquet') until startup .corrupt quarantine was added).
  4. Querying pg_stat_replication instead of pg_stat_activity from a diagnostic collector. On healthy RF=3 production clusters system.cdc_state is created once in milliseconds, but on our 2-TServer (< RF=3) harness tablet placement stalled 24.5 s per TServer. Querying pg_stat_activity WHERE backend_type = 'walsender' finishes in 1.7 s (14.4x faster) even on degraded or under-replicated clusters.
  5. Scraping /prometheus-metrics without reset_histograms=false or using kubectl get -A under namespace-scoped RBAC (both rejected by our collector safety gates).

Pressure tests

Every finding was checked against the six standing fronts in Methods.

front what was tested result
Specification Unbounded recursive token parsing and unbudgeted .gz streaming vs explicit depth (<= 16) and expansion (<= 64x) bounds Prevented stack overflow on 30,000 chained key= tokens and blocked .gz decompression bombs across 5 chaos clusters
Aggregation Single-container yugabyted smoke test vs 6 container and Kubernetes deployment archetypes (8 live sub-cases) Single-container tests passed while hiding 7 topology bugs, including the 24.5 s (14.4x) pg_stat_replication wait on the 2-TServer (< RF=3) split harness
Adjustment coarseness Naive 255-byte filename truncation vs staged-write budget (247 bytes reserving .parquet and staging suffixes) PRE/POST binary gate caught 255-byte truncation dropping the .parquet extension (0 matched files); 247-byte cap preserved 100% of outputs
Prior work Chaos engineering (Basiri et al., 2016), LDFI (Alvaro et al., 2015), distributed fuzzing (Meng et al., 2023; Pan et al., 2024), and LLM chaos agents (Kikuta et al., 2025) Extended from runtime service-level fault injection to pre-release local-model synthesis gated by deterministic binary and DuckDB oracles
Baseline sufficiency Go telemetry collector (25.05 to 52.57 MB binary, 61 to 93 MB/s redaction) vs safe Rust port (4.20 to 6.55 MB, 580 to 850 MB/s) Rust port achieved 9.1x to 15.9x faster redaction (1,500 secrets, 0 FPs), 3.8x to 8.0x smaller binaries, and 5.61x better zstd LDM compression
Cross-sectional units Uncontended 3-node collection (0.013 to 0.087 cores/node) vs 3 alternating 26 s loaded SQL trials (1,600 queries/trial) and 3-region GCP WAN (30,000 files in 26.5 s) Verified +3.0% p50 (0.865 to 0.891 ms) and +8.98% p99 (1.893 to 2.063 ms) SQL latency overhead, passing our <= 10.0% gate

What this does not show

First, fault injection and chaos harnesses cannot prove the absence of bugs on unexplored code paths. We verify glog parser termination (10|s| + 50 steps) and burst conservation (sum(repetition_count) = N) in Lean 4 (1,368 lines). Those proofs link into cargo test across 301 FFI checks (report 08).

Second, two Round 2 timing scenarios required deterministic proxies for repeatable A/B gating. In S2 (SIGKILL mid-merge), an external timer-based kill can miss the sub-millisecond rename window. We therefore paired live kill tests with a deterministic planted 0-byte file test (72,145 rows recovered). In S3 (ENOSPC disk full), mounting a full RAM disk requires root privileges on macOS. We therefore enforced an unprivileged 100 KiB RLIMIT_FSIZE process limit alongside unit drop-cleanup tests.

Third, the +8.98% median p99 database latency delta (1.893 ms without collector vs 2.063 ms with collector) was measured across 3 alternating 26 s runs. Those runs executed on 3 containers sharing a 6-vCPU host (~62 QPS, where Trial 1 reached 2.177 ms). On dedicated multi-core production VMs, the collector's single-thread pin (nice 19, ionice -c 3, 0.013 to 0.087 cores per node) contends with a smaller fraction of host CPU capacity.

Reproduce

Our Rust log-to-Parquet engine is currently being prepared for open-source release under the Apache 2.0 license. Every metric in this report and its three figures is stored in numbers.json and verified against MANIFEST.md.

References

  • Aho, A. V., & Corasick, M. J. (1975). Efficient String Matching: An Aid to Bibliographic Search. Communications of the ACM. DOI.
  • Alvaro, P., Rosen, J., & Hellerstein, J. M. (2015). Lineage-Driven Fault Injection. Proceedings of ACM SIGMOD 2015. DOI.
  • Basiri, A., Behnam, N., de Rooij, R., Hochstein, L., Kosewski, L., Reynolds, J., & Rosenthal, C. (2016). Chaos Engineering. IEEE Software. DOI.
  • Claessen, K., & Hughes, J. (2000). QuickCheck: A Lightweight Tool for Random Testing of Haskell Programs. Proceedings of ACM SIGPLAN ICFP 2000. DOI.
  • Cox, R. (2007). Regular Expression Matching Can Be Simple And Fast. Technical Note.
  • ISO/IEC. (2023). ISO/IEC 42001 (2023): Information Technology - Artificial Intelligence - Management System. International Organization for Standardization.
  • Jung, R., Jourdan, J.-H., Krebbers, R., & Dreyer, D. (2021). Safe Systems Programming in Rust. Communications of the ACM. DOI.
  • Kikuta, D., Ikeuchi, H., & Tajiri, K. (2025). LLM-Powered Fully Automated Chaos Engineering: Towards Enabling Anyone to Build Resilient Software Systems at Low Cost. Proceedings of IEEE/ACM ASE 2025. DOI. arXiv.
  • Kingsbury, K. (2019). Jepsen: YugaByte DB 1.3.1. Jepsen Technical Report.
  • Meng, R., Pîrlea, G., Roychoudhury, A., & Sergey, I. (2023). Greybox Fuzzing of Distributed Systems. Proceedings of ACM CCS 2023. DOI.
  • Pan, J., Wu, H., Leesatapornwongsa, T., Nath, S., & Huang, P. (2024). Efficient Reproduction of Fault-Induced Failures in Distributed Systems with Feedback-Driven Fault Injection. Proceedings of ACM SOSP 2024. DOI.
  • Pereira, R., Couto, M., Ribeiro, F., Rua, R., Cunha, J., Fernandes, J. P., & Saraiva, J. (2017). Energy Efficiency Across Programming Languages: How Do Energy, Time, and Memory Relate? Proceedings of ACM SIGPLAN SLE 2017. DOI.
  • Vikram, V., Lemieux, C., Sunshine, J., & Padhye, R. (2023). Can Large Language Models Write Good Property-Based Tests? arXiv preprint. arXiv.
  • Wang, X., Hong, Y., Chang, H., Park, K., Langdale, G., Hu, J., & Zhu, H. (2019). Hyperscan: A Fast Multi-Pattern Regex Matcher for Modern CPUs. Proceedings of USENIX NSDI 2019.
  • Yuan, D., Luo, Y., Zhuang, X., Rodrigues, G. R., Zhao, X., Zhang, Y., Jain, P. U., & Stumm, M. (2014). Simple Testing Can Prevent Most Critical Failures: An Analysis of Production Failures in Distributed Data-Intensive Systems. Proceedings of USENIX OSDI 2014.