Getting it into your agent
This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.
/plugin marketplace add Itsokay-co/bio-vibing/plugin install bio-vibingWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/itsokay-co/bio-vibing/gut)<a href="https://agentmods.dev/skills/itsokay-co/bio-vibing/gut"><img src="https://agentmods.dev/badge/skills/itsokay-co/bio-vibing/gut/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/itsokay-co/bio-vibing/gut"><img src="https://agentmods.dev/badge/skills/itsokay-co/bio-vibing/gut.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00045 | $0.02708 |
| Opus 5.5 | $0.00018 | $0.01083 |
| Sonnet 5.5 | $0.00009 | $0.00542 |
| Haiku 4.5 | $0.00005 | $0.00271 |
Grade A, and why
gut scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 231 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Gut Analysis — Digestive health meets biometrics
Combines Suna scores (if connected) with open analytics from wearable + meal data.
Steps
Pull 30 days and run digestive analysis:
python3 << 'PYEOF'
import sys, os, json
sys.path.insert(0, os.path.join(os.environ.get('CLAUDE_PLUGIN_ROOT', '.'), 'lib'))
from fetch import fetch_biometrics
from dataclasses import asdict
from statistics import mean
from metrics import (compute_postmeal_hr_response, compute_caffeine_sleep_coupling,
compute_food_item_effects, compute_bdi_meal_coupling,
compute_meal_sleep_effects, compute_meal_circadian_alignment,
compute_gut_score_correlations, compute_digestive_state_biometrics,
compute_food_hr_sensitivity, compute_glucose_variability,
compute_glucose_clinical, compute_postmeal_glucose)
data = fetch_biometrics(days=30)
d = asdict(data)
sleep = d.get('sleep', [])
readiness = d.get('readiness', [])
meals = d.get('meals', [])
heartrate = d.get('heartrate', [])
spo2 = d.get('spo2', [])
gut_scores = d.get('gut_scores', [])
digestive_states = d.get('digestive_states', [])
daily_windows = d.get('daily_windows', [])
suna_insights = d.get('suna_insights', [])
print("GUT ANALYSIS — 30 days")
print()
# --- SUNA GUT SCORES (if connected) ---
if gut_scores:
scores = [g.get('score', 0) for g in gut_scores if g.get('score') is not None]
if scores:
print("GUT SCORE TREND")
print(f" Avg: {round(mean(scores))} | Best: {max(scores)} | Worst: {min(scores)}")
# Trend: first half vs second half
if len(scores) >= 6:
mid = len(scores) // 2
first = mean(scores[:mid])
second = mean(scores[mid:])
diff = second - first
trend = "improving" if diff > 2 else "declining" if diff < -2 else "stable"
print(f" Trend: {trend} ({'+' if diff > 0 else ''}{round(diff, 1)}/period)")
# Components (latest)
latest = sorted(gut_scores, key=lambda x: x.get('day', ''))[-1]
components = []
for k, v in (latest.get('components') or {}).items():
if v is not None:
components.append(f"{k} {round(v*100) if isinstance(v, (int, float)) else v}")
if components:
print(f" Components: {' | '.join(components)}")
print()
# --- DIGESTIVE STATES (if connected) ---
if digestive_states:
proc_times = [ds.get('duration_min') for ds in digestive_states
if ds.get('duration_min') is not None]
if proc_times:
print("PROCESSING TIMES")
print(f" Avg: {round(mean(proc_times)/60, 1)}h | Range: {round(min(proc_times)/60, 1)}h - {round(max(proc_times)/60, 1)}h")
# By meal type
by_type = {}
for ds in digestive_states:
mt = ds.get('meal_type', 'unknown')
pt = ds.get('duration_min')
if pt is not None:
by_type.setdefault(mt, []).append(pt)
for mt, pts in sorted(by_type.items()):
if len(pts) >= 2:
print(f" {mt}: {round(mean(pts)/60, 1)}h avg (n={len(pts)})")
print()
# --- SUNA INSIGHTS (if connected) ---
if suna_insights:
print("SUNA INSIGHTS")
for ins in suna_insights[:5]:
print(f" {ins.get('headline', ins.get('type', '?'))}")
print()
# --- POST-MEAL HR RESPONSE (open analytics) ---
if meals and heartrate:
pmhr = compute_postmeal_hr_response(meals, heartrate)
if pmhr.get('n_meals_analyzed', 0) > 0:
print(f"POST-MEAL HR RESPONSE ({pmhr['n_meals_analyzed']} meals)")
for mt, summary in pmhr.get('by_meal_type', {}).items():
print(f" {mt}: +{summary['avg_peak_delta']} bpm peak at {summary['avg_time_to_peak']}min (n={summary['n']})")
by_prof = pmhr.get('by_macro_profile', {})
if by_prof:
best_prof = min(by_prof.items(), key=lambda x: x[1]['avg_peak_delta'])
print(f" Best response: {best_prof[0]} meals (+{best_prof[1]['avg_peak_delta']} bpm)")
if pmhr.get('trend') != 'insufficient_data':
print(f" Trend: {pmhr['trend']}")
print()
# --- CAFFEINE → SLEEP (open analytics) ---
if meals:
caf = compute_caffeine_sleep_coupling(meals, sleep)
if caf.get('n_days_with_caffeine', 0) >= 3:
print(f"CAFFEINE → SLEEP ({caf['n_days_with_caffeine']} caffeine days)")
print(f" Avg daily: {caf.get('daily_avg_mg', 0)}mg")
corr = caf.get('correlations', {})
for label, r in corr.items():
if abs(r) >= 0.15:
print(f" Caffeine × {label}: r={r}")
print()
# --- FOOD EFFECTS (open analytics) ---
if meals:
fe = compute_food_item_effects(meals, sleep)
if fe.get('n_foods_analyzed', 0) > 0:
print(f"FOOD EFFECTS ({fe['n_foods_analyzed']} foods)")
if fe.get('best_foods'):
print(f" Best for sleep: {', '.join(fe['best_foods'][:3])}")
if fe.get('worst_foods'):
print(f" Worst for sleep: {', '.join(fe['worst_foods'][:3])}")
print()
# --- MEAL TIMING (existing metrics) ---
if meals and sleep:
mca = compute_meal_circadian_alignment(meals, sleep)
if mca and mca.get('avg_gap_hours') is not None:
print("MEAL TIMING")
print(f" Last meal → bed gap: {mca['avg_gap_hours']}h avg")
if mca.get('late_meal_pct') is not None:
print(f" Late meals (<2h before bed): {mca['late_meal_pct']}%")
if mca.get('alignment_score') is not None:
print(f" Alignment score: {mca['alignment_score']}/100")
print()
# --- BDI × DINNER (open analytics) ---
if spo2 and meals and sleep:
bdi = compute_bdi_meal_coupling(spo2, meals, sleep)
if bdi.get('n_nights', 0) >= 5:
corr = bdi.get('correlations', {})
significant = {k: v for k, v in corr.items() if abs(v) >= 0.2}
if significant:
print("DINNER × BREATHING DISTURBANCE")
for k, v in significant.items():
print(f" {k} × BDI: r={v}")
print()
# --- GUT SCORE × WEARABLE (if Suna connected) ---
if gut_scores and sleep:
gc = compute_gut_score_correlations(gut_scores, sleep)
corr = gc.get('correlations', {})
significant = {k: v for k, v in corr.items() if abs(v) >= 0.15}
if significant:
print("GUT SCORE × WEARABLE PATTERNS")
for k, v in significant.items():
print(f" {k}: r={v}")
print()
# --- WINDOWS (if Suna connected) ---
if daily_windows:
latest_w = sorted(daily_windows, key=lambda x: x.get('day', ''))[-1]
print("TODAY'S WINDOWS")
if latest_w.get('eat_start') and latest_w.get('eat_end'):
print(f" Eat: {latest_w['eat_start']} – {latest_w['eat_end']}")
if latest_w.get('train_start'):
print(f" Train: {latest_w['train_start']}" + (f" – {latest_w.get('train_end', '')}" if latest_w.get('train_end') else ""))
if latest_w.get('sleep_start'):
print(f" Sleep: {latest_w['sleep_start']}")
if latest_w.get('recovery_level'):
print(f" Recovery: {latest_w['recovery_level']}")
# --- FOOD HR SENSITIVITY ---
if meals and heartrate:
fhs = compute_food_hr_sensitivity(meals, heartrate)
if fhs.get('n_foods_analyzed', 0) > 0:
print(f"\n--- FOOD HR SENSITIVITY ({fhs['n_foods_analyzed']} foods) ---")
print(f" Overall avg recovery: {fhs['overall_avg_recovery_min']}min")
if fhs.get('flagged_foods'):
print(f" Slow recovery: {', '.join(fhs['flagged_foods'])}")
for name, stats in sorted(fhs.get('foods', {}).items(), key=lambda x: -x[1]['avg_recovery_min'])[:5]:
flag = " !" if stats['flag'] == 'slow_recovery' else ""
print(f" {name}: {stats['avg_recovery_min']}min (n={stats['n_meals']}){flag}")
# --- GLUCOSE (if CGM connected) ---
glucose = d.get('glucose', [])
if glucose:
gv = compute_glucose_variability(glucose)
gc = compute_glucose_clinical(glucose)
if gv.get('mean'):
print(f"\n--- GLUCOSE ---")
print(f" Mean: {gv['mean']} | CV: {gv['cv']}% | TIR: {gv['time_in_range_pct']}%")
if gc.get('gmi'):
print(f" GMI: {gc['gmi']}% | MAGE: {gc.get('mage', 'N/A')} | MODD: {gc.get('modd', 'N/A')}")
if meals:
pmg = compute_postmeal_glucose(glucose, meals)
if pmg.get('avg_peak_delta'):
print(f" Post-meal: avg peak +{pmg['avg_peak_delta']}mg/dL at {pmg.get('avg_time_to_peak_min', '?')}min")
if not meals:
print("No meal data available. Connect Suna for nutrition-biometric insights.")
PYEOF
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2mo ago First seen · 231 lines · 45 tokens per session scan A e3501aa22d94
gut is a skill published in the GitHub repository Itsokay-co/bio-vibing (17 stars, last pushed 3mo ago), licensed Apache-2.0. It adds 45 tokens to every session and 2,708 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
gut compared with skills from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| gutItsokay-co/bio-vibing | Skill | 17 | 3mo ago | Apache-2.0 | A | 45 | Claude Code |
| instrument-data-to-allotropeanthropics/knowledge-work-plugins | Skill | 35k | 2d ago | Apache-2.0 | A | 123 | Claude Code |
| exploratory-data-analysisK-Dense-AI/scientific-agent-skills | Skill | 56k | 4d ago | MIT | A | 83 | Claude Code |
| matlabK-Dense-AI/scientific-agent-skills | Skill | 56k | 4d ago | MIT | A | 44 | Claude Code |
| phylogeneticsK-Dense-AI/scientific-agent-skills | Skill | 56k | 4d ago | MIT | A | 71 | Claude Code, Codex |
| research-engineerdavila7/claude-code-templates | Skill | 33k | yesterday | MIT | A | 43 | Claude Code, Codex |
| mapping-to-snomedmaziyarpanahi/openmed | Skill | 5.8k | yesterday | Apache-2.0 | A | 205 | Claude Code |