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 (
18edge 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:5stress clusters (7input-boundary fixes) in Round 1 and11concurrency 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 (0failures). - Go-to-Rust node telemetry collector verification (
15rounds across6container and Kubernetes topologies). We ported our node telemetry collector from Go (25.05to52.57MB binary) to Rust (4.20to6.55MB static binary). Across 1,500 synthetic test secrets (0false positives), Rust redacted logs 9.1x to 13.5x faster (580to850MB/s vs61to93MB/s). We then ran a 15-round topology harness across 6 Docker and Kubernetes configurations (0.013to0.087CPU cores per node,+8.98%p99 database latency within our10.0%gate). That harness isolated and eliminated a 14.4x collection latency stall (24.5s reduced to1.7s) before customer deployment (0customer production impact).
Four design rules for model-driven fault injection
- 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,
flocklocks, DuckDB Parquet reads, orstatement_timeoutcounters. - Test process lifecycle and
SIGKILLrecovery 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-memorySIGKILLduring shard merge can leave a0-byte file behind (Alvaro et al., 2015). - 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.parquetextension at 255 bytes and passed a naive unit test vacuously. ThePRE/POSTbinary harness caught that 0 files matched**/*.parquet, forcing a 247-byte cap that reserves space for.parquetand temporary staging suffixes. - 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
/tmpmounts (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.
- Bounding parser recursion on
30,000chainedkey=tokens to maximum depth16(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 chainedkey=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 (0panics across all5clusters). - Enforcing a
64xgzip 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.gzstream 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. - Adding advisory output-directory file locking to prevent races between concurrent writers (
Round 2, S1). When two parser processes targeted the same--output-dirsimultaneously, both exited 0 while interleavingdata_N.parquetshards. Downstream DuckDBread_parquet('**/*.parquet')queries then failed withTProtocolException: Invalid data. Acquiring an exclusive advisoryflockon the output lockfile rejected the racing writer immediately and preserved all 3,001 rows in the primary output. - Quarantining
0-byte truncated Parquet files left behind afterSIGKILL(Round 2, S2). Killing a process mid-merge viaSIGKILLor hitting a 100 KiBRLIMIT_FSIZElimit (S3) left a0-bytedata_999.parquetstub on disk. That0-byte file permanently broke wildcard Parquet queries on subsequent runs. Writing to hidden temporary staging files before an atomicrename()and quarantining0-byte stubs to.corrupton startup restored queryability across all 72,145 rows.

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).

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.

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/POSTbinary verification (Round 2,11scenarios). 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.parquetextensions (S6) before merge. - Downstream 28-step pipeline completeness gate (
8topology bundles). Every bundle produced across the 6 topologies (8sub-cases) had to passverify --check-redaction(0leaks across243to501audited 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 5audit). Injecting multi-byte UTF-8 characters (µsand typographic quotes) at exact 320-byte and 512-byte truncation boundaries caught panics prior tois_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 externalISO/IEC 42001audits by an accredited certification body.
Testing antipatterns rejected by our gates
- Relying on healthy-node golden benchmarks to certify parsers and collectors (missed
18input-boundary andSIGKILLedge cases in our log engine and7topology bugs). - Allowing concurrent processes to write Parquet shards without an advisory lock (caused shard interleaving and
TProtocolExceptionread failures until advisory output locking was added). - Writing Parquet output directly to final filenames instead of atomic temporary staging files (left
0-bytedata_N.parquetfiles afterSIGKILLthat permanently brokeread_parquet('**/*.parquet')until startup.corruptquarantine was added). - Querying
pg_stat_replicationinstead ofpg_stat_activityfrom a diagnostic collector. On healthyRF=3production clusterssystem.cdc_stateis created once in milliseconds, but on our2-TServer (< RF=3) harness tablet placement stalled24.5s per TServer. Queryingpg_stat_activity WHERE backend_type = 'walsender'finishes in1.7s (14.4xfaster) even on degraded or under-replicated clusters. - Scraping
/prometheus-metricswithoutreset_histograms=falseor usingkubectl get -Aunder 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.