The single-screen brief an attorney reads on the walk into the WCAB. Client phone, language, interpreter status, the case summary you wrote, all parties with contact info, upcoming events, open tasks, days since last client contact, and the gap flags that have to be closed before the gavel.
At the prompt:
aaicase> prep for Doe hearing
About thirty seconds later you have a one-screen brief shaped for exactly the moment you’ll use it — standing outside the hearing room, reading the case top to bottom before walking in. It is the most-rerun skill the morning of a hearing day, and the structure reflects the reality that you don’t have time to scroll. Everything that matters is above the fold.
The skill resolves the case, then fires six parallel fetches:
/caseFiles/view/[CASE-ID] → header, applicant, comments, attorney
/parties/view/[CASE-ID] → every party with phone/role
/activities/index/[CASE-ID] → activity history (the spine of hearing prep)
/tasks/index → open tasks for the case
/injuries/view/[CASE-ID] → DOI, body parts, ADJ#
merus-events --case [CASE-ID] → upcoming events on the calendar
Required: case + activities. Optional: parties, tasks, injuries, events. If a non-required endpoint fails, the brief still runs and notes which section is missing data — you never get a half-rendered brief that silently dropped sections.
All data lands in a per-run mktemp -d temp directory locked to chmod 700. The directory is deleted at the end of the run.
If “Doe” matches three open cases at the firm, the skill behaves differently depending on how it was invoked:
aaicase -p or a script): the skill fetches events for each matching case and picks the one that actually has an upcoming hearing. If exactly one match has a hearing, that’s the case. If none or multiple have hearings, the skill stops and tells you to re-run with a specific case ID.The one-shot heuristic is the right one: when an attorney scripts “prep me for tomorrow,” they almost always mean “the Doe case with the hearing tomorrow,” not “any case named Doe.” The skill picks the obvious answer; it does not invent one.
| Section | What it shows |
|---|---|
| Case header | Name, file number, status, venue, attorney of record, paralegal handling. |
| Client | Name, phone, language, interpreter flag. |
| Case summary | The first portion of CaseFile.comments — the attorney’s own note about the case. If empty, this is a flag. |
| Injuries | Body parts, DOI, claim number, ADJ#. |
| Key parties | Defense counsel, carrier, adjuster, QME/AME, treating providers — each with phone and role. |
| Upcoming events | Every event on the calendar in chronological order, formatted by merus-events. |
| Open tasks | Real tasks only (autogenerated noise filtered), sorted by priority and due date. |
Followed by:
The most-used flag is “days since last client contact,” and getting it right depends on knowing which activities count as client contact. The skill does this in two passes:
RECENT_NOTE_CANDIDATES lines (id + date + first 300 chars). The model running the skill reads the candidate list and picks the most recent that describes communication WITH THE APPLICANT (e.g. “Applicant called,” “Spoke with applicant,” Spanish equivalents) — not a provider call (“Called Dr. Sample”) or defense call. Pure data classification, no separate subprocess.The notes pass uses model classification, not regex pattern matching. A regex of /call(ed)?\s+(?:the\s+)?client/i would miss “spoke with Jane,” “LM for applicant,” “CC w/ client per attny request,” and a dozen other variations. The model handles all of them. No additional cost — the classification happens inside the conversation already running the skill, not a separate API call.
Every brief ends with a checkbox list of what to fix before the hearing. The flags are deliberately written as actions, not observations — what the attorney has to do, not what is wrong:
| Trigger | Flag text |
|---|---|
CaseFile.comments is empty or very short | “No case summary — WRITE ONE” |
| No client contact found, or last contact > 30 days | “Client not contacted in X days — CALL TODAY” |
| No open tasks on the case | “No prep tasks — add at least one before hearing day” |
| No phone number on the applicant contact | “No phone on file — can’t reach client if hearing is continued” |
| Language not English and interpreter flag not set | “No interpreter requested — language is [X], file the WCAB interpreter request” |
| No defense counsel party on case | “No defense attorney on file — check who’s appearing for defense” |
| No carrier party on case | “No carrier on file — needed for any benefits discussion” |
Flags an attorney has already addressed get an unchecked box (the data is there); flags that still need work get a checked box (a thing-to-do). The format is intentional — you walk past the brief and your eye catches the checked boxes first.
8 CCR 9795.1 requires Workers’ Comp interpreter requests be filed in advance. The judge will not provide one ad-hoc. The interpreter check is a hard-edged gate — if the applicant’s language is anything other than English and the interpreter flag on the contact is not set, the brief flags it loudly.
The skill also flags subtler cases: language is set to English but the contact has notes mentioning “limited English” or the family communicates via a relative who interprets. Those don’t auto-flag, but they surface in the case summary so the attorney can decide.
HEARING PREP: Doe, Jane v. Sample County Agency (File# [NUMBER])
Venue: Anaheim WCAB | Status: Open
CLIENT
Jane Doe | (555) 555-0142 | Language: Spanish | Interpreter: NO
CASE SUMMARY
Specific injury 2026-04-12. Low back + right knee. Disputed AOE/COE.
MSC set 2026-06-04. PTP Dr. Sample, QME pending — panel struck twice.
INJURIES
Low back, right knee | DOI 2026-04-12 | Claim# [#] | ADJ# [#]
KEY PARTIES
Role Name Phone Notes
Defense Counsel Sample & Sample LLP (555) 555-0199 Coleman
Carrier Sample Insurance Co. (555) 555-0188 TPA
Adjuster Sample Adjuster (555) 555-0177 ext. 3214
PTP Dr. Sample (555) 555-0166 Anaheim
QME (panel struck) pending replacement
Interpreter NOT REQUESTED — see flag
UPCOMING EVENTS
2026-06-04 09:30 MSC Anaheim WCAB, Dept. 4
2026-06-11 13:00 Status Conf same
OPEN TASKS (real only — 4)
HIGH due 2026-06-03 File interpreter request — Spanish (8 CCR 9795.1)
HIGH due 2026-06-03 Confirm client transport / interpreter coordination
NORM due 2026-06-04 Bring claim log + benefits log for MSC
NORM due 2026-06-04 Confirm Dr. Sample report addresses AOE/COE
LAST CLIENT CONTACT: 2026-04-29 (38 days ago)
FLAGS — fix before hearing
[x] Client not contacted in 38 days — CALL TODAY
[x] No interpreter requested — language is Spanish, file the WCAB request
[x] QME panel struck twice — confirm replacement strategy
[ ] Case summary written
[ ] Defense counsel on file
[ ] Carrier on file
| Prep for hearing | Health check | |
|---|---|---|
| Time | ~3 minutes | ~2 minutes |
| Output shape | Single-screen courthouse brief | Diagnostic with exposure flags + pre-computed SOL/5410 deadlines |
| Emphasizes | Parties, events, tasks, contact age, interpreter, gap-flags-as-actions | Ethics gaps, milestone misses, missing QME/UR data, statute-window status |
| Run when | You have a specific hearing coming up | Any case touchpoint (client call, reassignment, quarterly review) |
They overlap. Both fetch the same six core endpoints. The difference is shape: health check is a diagnostic, prep-hearing is a roadmap. You run the diagnostic when you want to understand a case. You run the prep when you’re about to walk in the room.
The CaseFile.comments field is empty. Add a summary via the Merus UI or run audit [case] — the audit writes a comprehensive summary into comments (asking before overwriting if one exists). Re-run prep-hearing after.
The call wasn’t logged as an activity, or it was logged with a tag the skill doesn’t recognize as client contact. Add an activity with one of the firm’s client-contact tags, or just log the call as a Note (tag 101) — the notes-pass classifier will pick it up on next run.
The contact’s interpreter field in Merus isn’t set to 1. Update the contact (Merus UI or /contacts/edit/[ID]); the brief uses the field, not the existence of a filed request.
Multiple Doe matches. In interactive mode the skill should have asked — if it didn’t, you’re in one-shot mode and the disambiguation heuristic picked the wrong one. Re-run with the specific case ID (prep for case [ID] hearing) and the right one will load.
Most likely no events on the calendar for this case, but possibly the merus-events sub-script failed. The case header still loads either way; check the upcoming event in the Merus UI directly to confirm.
The tasks endpoint may be cached briefly after a write. Re-run; if it still shows, the task wasn’t actually closed — check process my tasks on the case.
Part of AAI for MerusCase — code-guarded AI case intelligence for California Workers’ Comp attorneys.