[object Object]

← back to Domain Sniper

brand-typo-watcher: per-log breakdown in minute summary

f8c440dc19c4d49a18fdc44cb024b72d877553ab · 2026-05-12 17:02:28 -0700 · steve

Taps 'tick' status events from ct-source-ctlog to maintain a perLog map
of emitted/x509/precert counts per log. First minute confirms all 6 logs
producing — argon 135 emitted (was the 'silent' one), sphinx 154,
wyvern 155, xenon 112, tiger 9, elephant pending. Removes guesswork
about whether the fan-out is healthy or one log is wedged.

Files touched

Diff

commit f8c440dc19c4d49a18fdc44cb024b72d877553ab
Author: steve <steve@designerwallcoverings.com>
Date:   Tue May 12 17:02:28 2026 -0700

    brand-typo-watcher: per-log breakdown in minute summary
    
    Taps 'tick' status events from ct-source-ctlog to maintain a perLog map
    of emitted/x509/precert counts per log. First minute confirms all 6 logs
    producing — argon 135 emitted (was the 'silent' one), sphinx 154,
    wyvern 155, xenon 112, tiger 9, elephant pending. Removes guesswork
    about whether the fan-out is healthy or one log is wedged.
---
 brand-typo-watcher.js | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/brand-typo-watcher.js b/brand-typo-watcher.js
index 47aac24..774282c 100644
--- a/brand-typo-watcher.js
+++ b/brand-typo-watcher.js
@@ -119,6 +119,7 @@ function notify(title, msg) {
 }
 
 let count = { seen: 0, hits: 0, substring: 0, typo: 0, puny: 0 };
+const perLog = {}; // log_name -> { fetched, x509, precert, emitted }
 function ts() { return new Date().toISOString(); }
 
 function logHit(rec) {
@@ -185,6 +186,12 @@ function connectCtLog() {
         console.error(`[${ts()}] seeded ${st.log} at tree_size=${st.position}`);
       } else if (st.type === 'resumed') {
         console.error(`[${ts()}] resumed ${st.log} at cursor=${st.position}`);
+      } else if (st.type === 'tick' && st.log) {
+        const p = (perLog[st.log] = perLog[st.log] || { fetched: 0, x509: 0, precert: 0, emitted: 0 });
+        p.fetched = st.stats ? st.stats.fetched : p.fetched;
+        p.x509    = st.stats ? st.stats.x509    : p.x509;
+        p.precert = st.stats ? st.stats.precert : p.precert;
+        p.emitted = st.stats ? st.stats.emitted : p.emitted;
       }
     },
   });
@@ -197,6 +204,15 @@ function connect() {
 
 setInterval(() => {
   console.error(`[${ts()}] seen=${count.seen} hits=${count.hits} (substring=${count.substring} typo=${count.typo}) puny=${count.puny}`);
+  const logs = Object.keys(perLog).sort();
+  if (logs.length) {
+    const parts = logs.map((l) => {
+      const p = perLog[l];
+      const short = l.replace(/2026h1$/, '').slice(0, 8);
+      return `${short}=${p.emitted}(${p.x509}x/${p.precert}p)`;
+    });
+    console.error(`[${ts()}]   per-log: ${parts.join('  ')}`);
+  }
 }, 60_000);
 
 process.on('SIGINT', () => process.exit(0));

← 9109f57 fingerprints: +5 aggressive operators (Key-Systems, Hexonet,  ·  back to Domain Sniper  ·  readme: snipe-curve 3.49h datapoint + per-log throughput cha 9d569c7 →