[object Object]

← back to Domain Sniper

honeypot-v2: check shows availability tally + readme baselines

89086bf904c3faeaaf824db31e4cc88506e28f3b · 2026-05-12 17:40:50 -0700 · steve

Check output now includes avail column (out of N) and cumulative
availability rate, so unlured batches give a useful sanity number not
just a 0/0 sniped header. Confirmed both cohorts are fresh enough for
experimentation:

  pronounceable  29/50 (58%) — .app 100% / .co 90% / .com 30-40%
  brand-adjacent 38/50 (76%) — .co 100% / .app 90% / .com 50-70%

.com is saturated for both cohorts (expected — short pronounceable .com
is gold). The .app and .co buckets carry most of the experimental signal.

Files touched

Diff

commit 89086bf904c3faeaaf824db31e4cc88506e28f3b
Author: steve <steve@designerwallcoverings.com>
Date:   Tue May 12 17:40:50 2026 -0700

    honeypot-v2: check shows availability tally + readme baselines
    
    Check output now includes avail column (out of N) and cumulative
    availability rate, so unlured batches give a useful sanity number not
    just a 0/0 sniped header. Confirmed both cohorts are fresh enough for
    experimentation:
    
      pronounceable  29/50 (58%) — .app 100% / .co 90% / .com 30-40%
      brand-adjacent 38/50 (76%) — .co 100% / .app 90% / .com 50-70%
    
    .com is saturated for both cohorts (expected — short pronounceable .com
    is gold). The .app and .co buckets carry most of the experimental signal.
---
 README.md      | 11 +++++++++++
 honeypot-v2.js | 14 +++++++++-----
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index 2085939..c65baa4 100644
--- a/README.md
+++ b/README.md
@@ -62,6 +62,17 @@ Spot-checks via DoH at increasing intervals to find where the snipe window close
 
 **Interpretation of the 3.87h flat result** — pure-random CVCVC bait names (`kuwavi`, `tahoz`, `fobahu`) across Verisign/Google-.app/nic.co/GoDaddy/control channels produced ZERO snipes despite deliberate leaks. The original callr.app / callr.co / butlr.app snipes hit pronounceable English-flavored names. Hypothesis: aggregators filter leak streams for desirability (English-likeness, brand-adjacency, prior-search signal) before paying registry fees. Next experimental iteration should use English-pronounceable / brand-adjacent baits to confirm.
 
+### Honeypot v2 — desirability-shaped baits (scaffold; lure NOT auto-fired)
+
+`honeypot-v2.js` ships two new bait cohorts to test the desirability hypothesis:
+
+| Cohort | Example baits | Baseline availability (DoH) | Notes |
+| --- | --- | --- | --- |
+| `pronounceable` | `noyl.com`, `swid.com`, `cayz.app`, `twelt.co`, `wheim.com` | 29/50 (58%) | .app 100% / .co 90% / .com saturated 30-40% |
+| `brand-adjacent` | `verturr.app`, `lawrr.app`, `qbutlr.co`, `florkr.co`, `flockro.com` | 38/50 (76%) | .co 100% / .app 90% / .com 50-70% |
+
+**Safety gates** — `generate` and `check` always allowed (no leaks). `lure` is **refused** unless `LURE_CONFIRM_LEAK_2026=yes` env is set as a one-shot Steve gesture; YOLO autonomous loops cannot trigger it. The lure body itself is currently a stub — wire-up before re-firing.
+
 ## Known issues — public CT-log infrastructure is fragile
 
 State of the world for **free** real-time CT-log access, as of 2026-05-12 ~23:05 UTC:
diff --git a/honeypot-v2.js b/honeypot-v2.js
index d04f7cc..88e6658 100755
--- a/honeypot-v2.js
+++ b/honeypot-v2.js
@@ -165,17 +165,21 @@ async function check(file) {
     const r = await dohNs(it.domain);
     const stillAvail = r.status === 3 || (r.status === 0 && !r.hasNs);
     const sniped = batch.lured && !stillAvail;
-    tally[it.bucket] = tally[it.bucket] || { total: 0, sniped: 0, names: [] };
+    tally[it.bucket] = tally[it.bucket] || { total: 0, available: 0, sniped: 0, names: [] };
     tally[it.bucket].total++;
+    if (stillAvail) tally[it.bucket].available++;
     if (sniped) { tally[it.bucket].sniped++; tally[it.bucket].names.push(it.domain); }
     await new Promise((rr) => setTimeout(rr, 200));
   }
-  console.log('  bucket  total  sniped  rate  sample');
+  console.log('  bucket  total  avail   sniped  rate  sample');
+  let cumT = 0, cumA = 0, cumS = 0;
   for (const [k, v] of Object.entries(tally)) {
-    const rate = v.total ? `${Math.round((100 * v.sniped) / v.total)}%` : 'n/a';
-    console.log(`  ${k}       ${String(v.total).padStart(2)}     ${String(v.sniped).padStart(2)}     ${rate.padStart(4)}  ${v.names.slice(0,3).join(', ')}`);
+    cumT += v.total; cumA += v.available; cumS += v.sniped;
+    const rate = batch.lured && v.available ? `${Math.round((100 * v.sniped) / v.available)}%` : 'n/a';
+    console.log(`  ${k}       ${String(v.total).padStart(2)}     ${String(v.available).padStart(2)}/${v.total}    ${String(v.sniped).padStart(2)}     ${rate.padStart(4)}  ${v.names.slice(0,3).join(', ')}`);
   }
-  console.log(batch.lured ? '\n  (batch was lured)\n' : '\n  (batch never lured — these are baseline availability counts only)\n');
+  console.log(`  total:  ${cumT}     ${cumA}/${cumT} (${Math.round(100*cumA/cumT)}% available)   ${cumS} sniped`);
+  console.log(batch.lured ? '\n  (batch was lured — sniped column meaningful)\n' : '\n  (batch never lured — these are baseline availability counts only; sniped column always 0)\n');
 }
 
 const cmd = process.argv[2] || 'help';

← 47a41bc honeypot-v2: scaffold with desirability-shaped baits (lure g  ·  back to Domain Sniper  ·  honeypot-v2: wire actual lure body (still env-gated) 4893045 →