Daily Strava Roast
Use this skill to turn recent Strava activity into a short roast-style summary.
Default workflow
- 1. Use the deterministic implementation first to fetch and summarize activity.
- If you are inside OpenClaw and want the V2 path, use the structured context/prompt output as model input for the final paragraph only.
- If connected-model generation is unavailable or weak, fall back to the deterministic roast output.
- Do not pretend the standalone Python package has a built-in OpenClaw connected-model API if it does not.
What this skill does
This skill provides:
- - deterministic Strava fetch + summary tooling
- adjustable tones and spice levels
- V1 roast fallback that is stable and testable
- V2 context/prompt building for better final-paragraph generation in the OpenClaw runtime
Preferred commands
Use the packaged CLI for deterministic preparation and fallback:
CODEBLOCK0
Do not rely on the removed legacy script path. Use the packaged CLI commands only.
Runtime guidance
When invoked inside OpenClaw for an actual roast reply:
- - run deterministic preparation first
- use the connected/default runtime model only to write the final roast paragraph
- keep that paragraph to one short paragraph
- do not invent stats
- if generation fails, return the deterministic roast instead of erroring
Runtime recipe
Use this sequence:
- 1. Build context JSON:
CODEBLOCK1
- 2. Build the constrained prompt:
CODEBLOCK2
- 3. Ask the connected/default OpenClaw runtime model to write the final paragraph from that prompt.
- Before replying, sanity-check the generated paragraph:
- exactly one paragraph
- one or two sentences max unless unusually short
- no bullet points
- no invented stats
- no stat dump; usually no more than two concrete metrics unless a third really earns its place
- not generic AI filler
- avoids banned phrases, stale identity/relationship jokes, pet phrases, and over-clever wording
- avoids poetic or cosmic phrasing
- tone matches requested spice/tone closely enough
- 5. If the paragraph fails those checks or generation is unavailable, fall back to:
CODEBLOCK3
Fallback triggers
Fall back immediately if any of these happen:
- - no connected/default runtime model is available
- generated output is empty
- generated output invents numbers, activities, or claims not present in the prompt/context
- generated output is multiple paragraphs or list-like
- generated output crams in too many stats without real comedic payoff
- generated output uses banned phrases or obvious close variants
- generated output leans on stale identity, relationship, or defining-trait jokes
- generated output leans on polished LLM-clever wording instead of dry mockery
- generated output drifts into poetic, cosmic, or overly ornate phrasing
- generated output is obviously generic, repetitive, or less readable than the deterministic roast
When falling back:
- - do not apologize unless the user needs to know
- just return the deterministic roast text
When working purely from the repo/CLI:
- - treat connected-model generation as a runtime concern, not a packaged-CLI feature
- keep the deterministic path working without extra runtime dependencies
Inputs
By default the skill reads Strava app config from:
CODEBLOCK4
And by default the token file is:
CODEBLOCK5
Normal auth behaviour:
- - treat
~/.openclaw/secure/strava_app.json as the canonical app-credentials source - if setup already exists, expired access tokens should refresh automatically using the refresh token
- if Strava still returns 401, retry once after a forced refresh
- if the token file is missing, invalid, or missing required fields, treat that as initial setup required and tell the user clearly
- if the token file exists but app credentials are missing or incomplete, return config_incomplete clearly
- if setup exists but refresh/reauthorisation is needed, return the reauth-required path instead of pretending it is a rest day
- avoid depending on sourced shell profiles for routine auth
Use this to inspect auth readiness:
CODEBLOCK6
Use JSON mode when another agent needs machine-readable status:
CODEBLOCK7
Tones
Supported tones:
- - INLINECODE1
- INLINECODE2
- INLINECODE3
- INLINECODE4
Spice
Spice controls roast intensity:
- -
0 — gentle - INLINECODE6 — light tease
- INLINECODE7 — proper roast
- INLINECODE8 — scorched earth
References
Read as needed:
- -
references/design.md for roast heuristics and failure cases - INLINECODE10 for the V2 architecture and package/runtime boundary
每日Strava吐槽
使用此技能将最近的Strava活动转化为简短的吐槽式摘要。
默认工作流程
- 1. 首先使用确定性实现来获取和总结活动。
- 如果你在OpenClaw内部并希望使用V2路径,请使用结构化上下文/提示输出作为仅最后一段的模型输入。
- 如果连接模型生成不可用或较弱,则回退到确定性吐槽输出。
- 如果独立的Python包没有内置的OpenClaw连接模型API,不要假装它有。
此技能的功能
此技能提供:
- - 确定性Strava获取+摘要工具
- 可调节的语气和辛辣程度
- 稳定且可测试的V1吐槽回退
- 用于在OpenClaw运行时中生成更好最后一段的V2上下文/提示构建
推荐命令
使用打包的CLI进行确定性准备和回退:
bash
uv run --project {baseDir} daily-strava-roast summary --json --pretty
uv run --project {baseDir} daily-strava-roast context --pretty
uv run --project {baseDir} daily-strava-roast prompt
uv run --project {baseDir} daily-strava-roast roast
不要依赖已移除的旧脚本路径。仅使用打包的CLI命令。
运行时指南
在OpenClaw内部调用以生成实际吐槽回复时:
- - 首先运行确定性准备
- 仅使用连接/默认运行时模型来编写最后的吐槽段落
- 将该段落保持在一个短段落内
- 不要编造统计数据
- 如果生成失败,返回确定性吐槽而不是报错
运行时配方
使用以下顺序:
- 1. 构建上下文JSON:
bash
uv run --project {baseDir} daily-strava-roast context --pretty
- 2. 构建受限提示:
bash
uv run --project {baseDir} daily-strava-roast prompt
- 3. 要求连接/默认的OpenClaw运行时模型根据该提示编写最后一段。
- 在回复之前,对生成的段落进行合理性检查:
- 恰好一个段落
- 最多一到两句话,除非异常简短
- 没有项目符号
- 没有编造的统计数据
- 没有数据倾倒;通常不超过两个具体指标,除非第三个确实有必要
- 不是通用的AI填充内容
- 避免禁用短语、陈旧的身份/关系笑话、口头禅和过于聪明的措辞
- 避免诗意或宇宙般的措辞
- 语气与要求的辛辣程度/语气足够匹配
- 5. 如果该段落未通过检查或生成不可用,则回退到:
bash
uv run --project {baseDir} daily-strava-roast roast
回退触发条件
如果出现以下任何情况,立即回退:
- - 没有可用的连接/默认运行时模型
- 生成的输出为空
- 生成的输出编造了提示/上下文中不存在的数字、活动或声明
- 生成的输出为多个段落或列表形式
- 生成的输出塞入过多统计数据而没有真正的喜剧效果
- 生成的输出使用了禁用短语或明显的近似变体
- 生成的输出依赖于陈旧的身份、关系或特征笑话
- 生成的输出依赖于精炼的LLM聪明措辞而非干巴巴的嘲讽
- 生成的输出偏向诗意、宇宙或过于华丽的措辞
- 生成的输出明显是通用的、重复的或不如确定性吐槽可读
回退时:
- - 除非用户需要知道,否则不要道歉
- 直接返回确定性吐槽文本
当纯粹从仓库/CLI工作时:
- - 将连接模型生成视为运行时问题,而非打包CLI功能
- 保持确定性路径正常工作,无需额外的运行时依赖
输入
默认情况下,此技能从以下位置读取Strava应用配置:
bash
~/.openclaw/secure/strava_app.json
默认令牌文件为:
bash
~/.openclaw/workspace/agents/tars-fit/strava_tokens.json
正常认证行为:
- - 将~/.openclaw/secure/strava_app.json视为规范的应用凭证来源
- 如果设置已存在,过期的访问令牌应使用刷新令牌自动刷新
- 如果Strava仍返回401,在强制刷新后重试一次
- 如果令牌文件缺失、无效或缺少必填字段,则视为需要初始设置并清晰告知用户
- 如果令牌文件存在但应用凭证缺失或不完整,则清晰返回配置不完整
- 如果设置存在但需要刷新/重新授权,则返回需要重新授权的路径,而不是假装是休息日
- 避免依赖来源化的shell配置文件进行常规认证
使用以下命令检查认证就绪状态:
bash
uv run --project {baseDir} daily-strava-roast auth-url
当其他代理需要机器可读状态时,使用JSON模式:
bash
uv run --project {baseDir} daily-strava-roast roast --json --pretty
语气
支持的语气:
- - dry(干巴巴)
- playful(俏皮)
- savage(犀利)
- coach(教练风)
辛辣程度
辛辣程度控制吐槽强度:
- - 0 — 温和
- 1 — 轻度调侃
- 2 — 适当吐槽
- 3 — 焦土政策
参考资料
根据需要阅读:
- - references/design.md 了解吐槽启发式和失败案例
- docs/V2.md 了解V2架构和包/运行时边界