npx skills add ...
npx skills add aikarjal/wilmai --skill wilma-triage
Daily triage of Wilma school notifications for Finnish parents. Fetches exams, messages, news, schedules, homework, and lesson notes (merkinnät) — filters for actionable items, downloads and reads important bulletin attachments, syncs exams to the family calendar, and reports via chat. Requires the `wilma` skill (WilmAI MCP tools or wilma CLI); calendar sync uses whatever calendar tool the agent has (e.g. the `gog` CLI on OpenClaw, or a calendar connector).
npx skills add aikarjal/wilmai --skill wilma-triage
Automated daily triage of Wilma school data for parents. Filters noise, surfaces actionable items, and syncs exams/events to the family calendar.
wilma_*) or the wilma skill and CLI (clawhub install wilma; this skill's commands need wilma-cli 2.0+). The wilma skill maps each MCP tool to its CLI command; use whichever is available.gog skill on OpenClaw (clawhub install gog), or the assistant's own calendar connector. Without one, list new dates in the report instead of syncing.On first use, collect and store configuration:
wilma_account or run wilma students to get student names and numbersgog calendar calendars). Ask the user which calendar to use for school events. Store the calendar ID in TOOLS.md under a ## Wilma Triage section along with naming conventions for events. Skip this step if no calendar tool is available.Over time, the user will give feedback on what to report and what to skip — store these preferences in MEMORY.md. The triage gets smarter with use.
Fetch data — one call covers what's new for every child: wilma_summary with since, or the CLI below. Use the date of the last run (stored in MEMORY.md), or yesterday. It returns today's and the next school day's lessons, upcoming exams (with start times when given), homework, lesson notes (teachers' feedback and absences), bulletins and messages from that day on, plus every unread message.
The CLI prints JSON when an agent runs it; results come per child (students[].student), and times are Finnish time. With the MCP tools, wilma_read_message, wilma_read_news, wilma_upcoming_exams, wilma_schedule and wilma_lesson_notes are the equivalents. Every tool and command covers all children by default.
Download and read important attachments — many bulletins are link-only: the content field is empty (or just defers to an attachment), and the actionable information — dates, deadlines, forms, required materials, schedule details — lives inside the attached document. Skipping these means missing exactly the items triage exists to catch.
After reading a bulletin or message, inspect the resources array in the JSON. Attempt a download when all of these hold:
fileName hint, a document-like URL, or otherwise clearly a file rather than a web page), andWith the MCP tools, call wilma_get_news_attachment instead; it returns the file content directly.
Handle the returned status:
downloaded (CLI) or fetched (MCP) — read the file (use the PDF reader for PDFs) and extract actionable items into the report.not_a_file — the link is a web page or requires external sign-in. Report the URL so the parent can open it themselves. Do not retry in a loop.error — report the message.What NOT to download:
resources array; target only genuine document attachments on high-value, actionable bulletins.Sandbox note: image/PDF reader tools may reject files in certain temp paths (e.g. system temp dirs). Download attachments into a workspace-relative directory (e.g. ./attachments/) before reading, and clean up afterward if desired.
Filter — apply triage rules below plus any kid-specific rules from MEMORY.md. Bulletin lists always include pinned bulletins (pinned: true, e.g. the school-year bulletin), so they reappear every day: report a bulletin only when its date is within the triage period. A message whose replyCount has grown since the last run (keep the counts in MEMORY.md) has a new reply — read the thread.
Calendar sync — add missing exams and actionable events with the calendar tool noted in TOOLS.md (skip if there is none). An exam with a time gets a timed event; others are all-day events.
Report — if actionable items found, send details. If nothing actionable, stay silent or send a brief confirmation. Check MEMORY.md for the user's notification preference. Then store today's date in MEMORY.md as the last run (the next run's --since).
Refer to TOOLS.md for the calendar ID, naming conventions, and the exact calendar commands or tools to use.
NO DUPLICATES rule:
Wilma messages come from different sources and have very different signal-to-noise ratios. Knowing the difference is critical for good triage:
Rule of thumb: If a message is from a teacher (class teacher or subject teacher), always read it. If it's from the school office or city, skim the subject and skip unless it's clearly actionable.
If a high-value message or bulletin references or attaches a document, download and read it per workflow step 2 — the actionable details are often only in the attachment.
Lesson notes are short per-lesson remarks teachers leave in Wilma. They fall into a few categories — signal varies a lot:
note, e.g. "Lähti 13.00" = "left at 13:00", or what exactly was missing) — often the most useful part. Surface it.typeLabel is the Finnish label, note the teacher's words (or null), and subject the course code (e.g. MA_8LV; empty for notes not tied to a lesson). Group consecutive same-subject same-type notes when reporting (one absence often spans multiple periods). For a term overview, wilma notes summary (wilma_lesson_notes_summary) counts notes by type.
Weekly letters from class teachers often contain actionable items buried in the text: exams, materials to bring, schedule changes, field trips. Always read the full content of viikkoviesti messages — do not skip based on subject line alone. If the letter references or attaches a document (info sheet, schedule, form), download and read it too per workflow step 2.
Viikkoviestit and teacher messages often contain operational details for upcoming days that don't map to calendar events but are essential for parents the day/evening before:
These details are just as important as exams and schedule changes. A parent who knows there's a field trip but doesn't know school starts at 9:30 instead of 8:30 has incomplete information.
Workflow:
Example of what gets missed without this: Calendar shows "Activity park trip" and "History exam" on Friday. But the viikkoviesti says school starts at 9:30 (not 8:30), history exam is first, bring water bottle + snacks, no ET or electives, return around 15:00. All of that is critical for the parent to know the evening before.
Check MEMORY.md for additional skip/report rules the user has provided over time (e.g., subject overrides, school-specific filtering).
Run daily at 07:00 local time. On OpenClaw, as an isolated agentTurn job; in other assistants, use their scheduled-task feature if they have one:
Stagger with other morning jobs (e.g., email check at 07:05) to avoid API rate limits.
Keep it brief. One line per item. Silence is better than noise.
When you write dates for the user, follow the language you answer in: Finnish ke 7.10. (with the final period), English Wed 7 Oct. Wilma's own texts use the Finnish style; convert it instead of mixing the two (not Wed 7.10).