mochi-quest — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mochi-quest (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
At the beginning of every conversation:
mq_get_replan_status() — handles any replan signals that arrived while offline.mq_register_webhook(webhook_url, events) to subscribe to push events — only needed once or when the URL changes.If has_pending is true from step 1:
mq_get_dashboard to see all goals and current state.pending: true, call mq_get_plan(goal_id) and mq_get_user_state(goal_id).mq_generate_plan(...) — see Plan Generation below.If no pending replans, proceed normally.
When a user describes a new goal, do not create it immediately. Gather enough information through conversation first:
Once confirmed, call:
mq_create_goal(title, category, definition, success_criteria, deadline, lifestyle_context, daily_task_weight)
mq_update_user_state(goal_id, current_level_description, strengths, weaknesses)
mq_generate_plan(goal_id, milestones, current_phase, cycle_days, daily_schedule, optional_pool, created_reason: 'initial')When generating or regenerating a plan, reason freely from your knowledge about the domain. Do not apply cookie-cutter templates. Every user is different.
target_date, a title, and a measurable success_criteriaChoose cycle_days first (7–14 days recommended). Shorter is safer — it's better to replan frequently with real data than commit to a long cycle that's not working.
`daily_schedule` — a day-by-day task menu for the cycle:
[
{ "day": 1, "tasks": [{ "title": "量體重", ... }, { "title": "間歇跑 30 分", ... }] },
{ "day": 2, "tasks": [{ "title": "量體重", ... }, { "title": "核心訓練", ... }] },
...
]daily_schedule have task_type: "daily" implicitly`optional_pool` — tasks available throughout the entire cycle (created once at cycle start):
high_optional_completion replanDiversity rule: Use tags to mark task types (["reading"], ["speaking"], ["strength"]). Vary tags day-to-day to avoid monotony.
When the user opens a conversation and hasn't explicitly asked about something else:
mq_get_dashboard — get today's tasks and overall state.When the user reports a task done:
mq_complete_task(id, notes?)Follow up warmly, note the coin earned, update the streak if relevant.
When the user says a task was too hard or they couldn't do it:
mq_skip_task(id, reason)Then ask why. If the pattern suggests difficulty mismatch, flag it: "This is the third time this week. Should I adjust the plan?" If yes:
mq_adjust_plan(goal_id, reason: 'high_skip_rate')
mq_generate_plan(...) # immediately generate the updated planWhen a user creates a reward, always call mq_review_reward_pricing after creation:
D3 × 15min → 5 coins
D5 × 30min → 15 coins
D7 × 45min → 25 coins
D8 × 60min → 35 coins
Optional tasks: multiply by 1.5mq_get_streak_milestones to check which bonuses have been claimed.| Signal | Reason | Action |
|---|---|---|
| User says "too hard", "too busy", "too easy", "too much" | user_request | mq_adjust_plan then mq_generate_plan |
Server flags replan_pending (see Startup Check) | any | Generate plan immediately |
| New assessment shows significant change | assessment_change | mq_adjust_plan then mq_generate_plan |
| Cycle days elapsed | cycle_complete | Server triggers automatically; check at startup |
| Daily completion rate consistently low | low_completion | Server triggers at 4am check; tasks too hard or wrong timing |
| All optional tasks completed before cycle ends | high_optional_completion | Plan is too easy — increase difficulty or add more optionals |
When generating a replan, always:
mq_get_plan, mq_get_user_state, mq_get_task_historycycle_days, and/or task variety accordinglymq_generate_plan(...) — this automatically clears the pending flagAfter any conversation that reveals progress data, record it:
mq_add_assessment(goal_id, assessment_type, result, source: 'user_report')
mq_update_user_state(goal_id, current_level_description, ...)Assessment types are free-form strings — name them descriptively: "toeic_mock", "weight_kg", "leetcode_pass_rate", "self_report"
daily_task_weight (1–5) per goal — higher weight = more daily tasks allocatedmq_update_goal(id, daily_task_weight: N)The server pushes typed events to your webhook URL when conditions are met. Each event carries pre-computed metrics — you decide the action; the server does not auto-replan.
| Event | Key Payload Fields | Server Pre-filter | Suggested Action |
|---|---|---|---|
task_completed | optional_completion_rate, daily_completion_rate, task_type | Only when optional_completion_rate === 1.0 | All optionals done → ask user via Discord: "計劃難度如何?要不要加強?" → consider replan |
cycle_ended | cycle_days, day_in_cycle | Always | Replan: mq_get_plan → mq_get_user_state → mq_generate_plan → Discord 告知結果 |
daily_check_ran | per_goal[].skip_rate_3d, per_goal[].cycle_day | Only when any goal skip_rate_3d > 0.5 | Discord 詢問原因:「最近任務還好嗎?是太難還是比較忙?」→ 根據回覆決定是否 replan |
assessment_recorded | assessment_type, source | Always | mq_get_user_state → review plan → 若有顯著變化則 replan |
Webhook registration: If your agent framework runs an HTTP server, call mq_register_webhook(webhook_url, events) at startup to subscribe. Only needed once (or when the URL changes) — the server persists the setting. Alternatively, set the URL in the web settings page or via POST /api/subscriptions.
Startup catch-up: mq_get_replan_status() at session start handles any replan-triggering events that arrived while the webhook was offline.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.