Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Set up Juicebox monitoring. Trigger: "juicebox monitoring", "juicebox metrics".
.claude/skills/jeremylongshore-juicebox-observability/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -21% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -28% | 0% |
Juicebox provides AI-powered people search and analysis where query performance, dataset ingestion rates, and quota consumption are the primary observability concerns. Monitor analysis completion times to ensure interactive UX, track ingestion pipeline health for data freshness, and watch quota usage to prevent mid-workflow cutoffs. Slow queries or failed ingestions degrade recruiter productivity and data accuracy.
| Metric | Type | Target | Alert Threshold | |--------|------|--------|-----------------| | Search latency p95 | Histogram | < 2s | > 5s | | Analysis completion time | Histogram | < 10s | > 30s | | Dataset ingestion rate | Gauge | > 100 records/s | < 50 records/s | | API error rate | Gauge | < 1% | > 5% | | Quota usage (daily) | Gauge | < 70% | > 85% | | Query result relevance | Gauge | > 80% precision | < 60% |
typescriptasync function trackJuiceboxCall(operation: string, fn: () => Promise<any>) { const start = Date.now(); try { const result = await fn(); metrics.histogram('juicebox.api.latency', Date.now() - start, { operation }); metrics.increment('juicebox.api.calls', { operation, status: 'ok' }); return result; } catch (err) { metrics.increment('juicebox.api.errors', { operation, error: err.code }); throw err; } }
typescriptasync function juiceboxHealth(): Promise<Record<string, string>> { const searchP95 = await metrics.query('juicebox.api.latency', 'p95', '5m'); const errorRate = await metrics.query('juicebox.api.error_rate', 'avg', '5m'); const quota = await juiceboxAdmin.getQuotaUsage(); return { search_latency: searchP95 < 2000 ? 'healthy' : 'slow', error_rate: errorRate < 0.01 ? 'healthy' : 'degraded', quota: quota.pct < 0.7 ? 'healthy' : 'at_risk', }; }
typescriptconst alerts = [ { metric: 'juicebox.search.latency_p95', condition: '> 5s', window: '10m', severity: 'warning' }, { metric: 'juicebox.api.error_rate', condition: '> 0.05', window: '5m', severity: 'critical' }, { metric: 'juicebox.quota.daily_pct', condition: '> 0.85', window: '1h', severity: 'warning' }, { metric: 'juicebox.ingestion.rate', condition: '< 50/s', window: '15m', severity: 'critical' }, ];
typescriptfunction logJuiceboxEvent(event: string, data: Record<string, any>) { console.log(JSON.stringify({ service: 'juicebox', event, operation: data.operation, duration_ms: data.latency, result_count: data.resultCount, query_length: data.queryLen, // Redact candidate PII — log only aggregate counts timestamp: new Date().toISOString(), })); }
| Signal | Meaning | Action | |--------|---------|--------| | 429 rate limit | Quota exhausted for period | Pause queries, check daily allocation | | Search timeout > 5s | Complex query or service load | Simplify filters, retry with narrower scope | | Ingestion stall | Dataset too large or format error | Check upload logs, validate schema | | Empty result set | Index gap or query mismatch | Verify dataset freshness, adjust search params |
See juicebox-incident-runbook.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | fail→pass | 18,738 | 6,035 | -68% | 1 | 1 | 0% | 1,774 | 1,853 | +4% | 0 | 0 | — |
case-01 | fail→pass | 47,837 | 18,005 | -62% | 1 | 1 | 0% | 3,770 | 3,766 | -0% | 0 | 0 | — |
case-02 | fail→pass | 24,229 | 16,911 | -30% | 1 | 1 | 0% | 3,449 | 3,496 | +1% | 0 | 0 | — |
case-03 | fail→pass | 28,515 | 20,026 | -30% | 1 | 1 | 0% | 5,041 | 3,992 | -21% | 0 | 0 | — |
case-04 | pass→pass | 21,272 | 19,245 | -10% | 1 | 1 | 0% | 2,611 | 3,381 | +29% | 0 | 0 | — |
case-05 | pass→fail | 17,516 | 14,464 | -17% | 1 | 1 | 0% | 2,240 | 2,664 | +19% | 0 | 0 | — |
case-10 | pass→pass | 17,265 | 8,880 | -49% | 1 | 1 | 0% | 2,634 | 1,477 | -44% | 0 | 0 | — |
case-06 | pass→pass | 24,112 | 22,981 | -5% | 1 | 1 | 0% | 3,841 | 4,522 | +18% | 0 | 0 | — |
case-07 | pass→pass | 17,917 | 8,156 | -54% | 1 | 1 | 0% | 2,133 | 1,537 | -28% | 0 | 0 | — |
case-08 | fail→pass | 21,196 | 9,988 | -53% | 1 | 1 | 0% | 2,288 | 1,655 | -28% | 0 | 0 | — |
case-09 | fail→fail | 19,944 | 6,041 | -70% | 1 | 1 | 0% | 2,900 | 2,050 | -29% | 0 | 0 | — |
case-11 | pass→pass | 15,851 | 9,255 | -42% | 1 | 1 | 0% | 1,987 | 1,585 | -20% | 0 | 0 | — |
case-13 | pass→pass | 13,190 | 17,816 | +35% | 1 | 1 | 0% | 2,076 | 2,969 | +43% | 0 | 0 | — |
case-14 | pass→pass | 22,634 | 16,055 | -29% | 1 | 1 | 0% | 2,353 | 2,587 | +10% | 0 | 0 | — |
case-15 | fail→pass | 29,363 | 9,855 | -66% | 1 | 1 | 0% | 1,346 | 1,674 | +24% | 0 | 0 | — |
case-16 | fail→pass | 20,723 | 6,585 | -68% | 1 | 1 | 0% | 2,183 | 1,924 | -12% | 0 | 0 | — |
case-17 | fail→pass | 16,664 | 4,263 | -74% | 1 | 1 | 0% | 1,648 | 1,664 | +1% | 0 | 0 | — |
case-18 | pass→pass | 21,887 | 8,567 | -61% | 1 | 1 | 0% | 1,855 | 1,566 | -16% | 0 | 0 | — |
case-19 | fail→pass | 21,013 | 8,190 | -61% | 1 | 1 | 0% | 2,343 | 1,549 | -34% | 0 | 0 | — |
case-20 | fail→pass | 31,410 | 8,910 | -72% | 1 | 1 | 0% | 1,185 | 1,687 | +42% | 0 | 0 | — |
case-21 | fail→pass | 23,816 | 6,733 | -72% | 1 | 1 | 0% | 2,694 | 1,294 | -52% | 0 | 0 | — |
case-22 | fail→pass | 32,355 | 2,850 | -91% | 1 | 1 | 0% | 1,850 | 1,514 | -18% | 0 | 0 | — |
case-23 | fail→pass | 11,353 | 7,137 | -37% | 1 | 1 | 0% | 925 | 1,171 | +27% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 20 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +52 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.