[hostile] target: abyss dogfood (82 files, 530 symbols, 4626 refs, 50 commits)
[hostile] parallelism=4 bursts=10 100 500
[hostile] index built in 81ms (cold)

BEFORE merging W1 fixes (v0.3.6: sync run_structural in hook + N+1 caller lookup)
  BURST=10  | p50=138.55ms p95=171.65ms p99= 171.65ms | card body p50=    0 p95=  129 p99=  129
  BURST=100 | p50= 77.23ms p95=372.60ms p99=1072.43ms | card body p50=    0 p95=  187 p99=  188
  BURST=500 | p50=103.78ms p95=473.33ms p99= 901.21ms | card body p50=    0 p95=  187 p99=  188

AFTER W1 (read-only hook + JOIN-flattened context.rs + rendered <abyss-card>)
  BURST=10  | p50=  4.36ms p95=  8.34ms p99=   8.34ms | card body p50=  612 p95=  865 p99=  865
  BURST=100 | p50=  5.19ms p95=  8.52ms p99=  11.13ms | card body p50=  566 p95= 1319 p99= 2187
  BURST=500 | p50=  5.31ms p95=  9.34ms p99=  11.13ms | card body p50=  589 p95= 1077 p99= 2187

  hook p50  : 138.55ms → 4.36ms   ~32x
  hook p95  : 171.65ms → 8.34ms   ~21x
  hook p99  : 1072.43ms → 11.13ms ~96x  (burst=100, the silent-killer case)
  card body : 0 bytes → 566-2187 bytes (rendered <abyss-card> with all 6 sections)

All percentiles well under the 250ms third-edit-in-burst p99 target set by
the adversarial KPI review. Tested only on the dogfood corpus — replays on
larger polyglot monorepos (Linux kernel, etc.) are the next gate.

AFTER W3/L0 (+ arch_facts populated via dir+name+entry+PageRank+SCC+Louvain)
  BURST=10  | p50=  5.30ms p95=  7.09ms p99=   7.09ms | card body p50=  672 p95= 1263 p99= 1263
  BURST=100 | p50=  5.51ms p95= 10.39ms p99=  16.38ms | card body p50=  655 p95= 1263 p99= 1454
  BURST=500 | p50=  5.36ms p95=  8.24ms p99=  10.35ms | card body p50=  674 p95= 1140 p99= 2853

  Adding the L0 layer/module/role lookup to render_card cost the hook
  ~5ms p99 on burst=100 (11→16ms) and grew the card body p99 by ~700B
  (depth/centrality/in/out is one extra line). Both well inside budget.

  abyss arch step itself: 4ms on 91 files / 10 modules at the tail of
  IndexPipeline::run_structural — 3% of total cold-index time.

Big repos (2026-06-17)
==================================================================

SQLAlchemy (687 .py files, 37210 symbols, 212634 refs, cold-index 8.4s)
runs the same BURST=10/100/500 envelope as the abyss self-bench. p99
at BURST=500 lands at 32.5ms — still ~7x under the 250ms third-edit-
in-burst KPI. Card bodies grow 2-3x vs the self-index (90-3000 bytes
→ 900-5200 bytes), reflecting the larger ref/symbol counts the
renderer surfaces; well inside any reasonable token budget.

Django (~250K LOC) — not present at /tmp/abyss-dogfood-django on
this run, skipped. Re-run hostile-bench-repos.sh when the corpus is
local; the wrapper auto-discovers.

[sqlalchemy]  (/tmp/abyss-dogfood-sqlalchemy/sqlalchemy)
  BURST=10   | p50=6.01    ms p95=9.71    ms p99=9.71    ms | card p50=905 p95=2254 p99=2254
  BURST=100  | p50=5.72    ms p95=16.22   ms p99=29.28   ms | card p50=975 p95=2288 p99=3583
  BURST=500  | p50=5.44    ms p95=20.53   ms p99=32.52   ms | card p50=938 p95=2602 p99=5195

Concurrent (2026-06-17)
==================================================================

WAL reader+writer race on the abyss self-repo (162 files, 1052 symbols,
8169 refs). 50 concurrent `abyss hook pre-edit` calls (parallelism=8)
racing 5 background `abyss index --force` writer rounds. SQLite WAL is
supposed to handle N readers + 1 writer cleanly; this run measures the
actual behaviour under operator-grade contention.

  hooks      total=50 ok=50 fail=0
  writer     planned=5 completed=5
  latency    p50=3.73ms p95=81.36ms p99=82.46ms max=83.21ms
  race wall  131.02ms

  ZERO hook failures under sustained writer contention. The p99 tail
  (~82ms) is dominated by the brief windows where xargs schedules a
  hook against a freshly-rotated WAL — well inside the 250ms
  third-edit-in-burst KPI even at p99/max.
