Inspiration
International and F-1 students live under rules nobody explains to them: which taxes they actually owe, which forms they must file every year, how many hours they're allowed to work, and what just changed in immigration policy. Get one wrong and it costs them money or puts their visa status at risk. Most don't know these rules exist, so they never think to ask.
We didn't want to guess, so before building we surveyed 65+ students at the hackathon itself! Among those we found:
- 74% didn't know about the exemption, or weren't sure.
- 81.5% had never checked a paystub for Social Security or Medicare.
- Only 15.4% had filed Form 8843, which every F-1 student must file, even with no income.
- 8 had already had Social Security or Medicare wrongly withheld.
- 25 didn't know they had to file Form 8843.
- Others named CPT/OPT problems (12), trouble opening a bank account (10), missed tax-treaty benefits (9) and scam calls (8).
The problem isn't that students can't find answers. It's that you can't search for a problem you don't know you have. A chatbot answers the question you ask. We wanted a caseworker: something that notices the problem first, proves it, acts only with your permission, and remembers to follow up.
What it does
Priya is our synthetic demo student: F-1, year 3 of 5 in the US, $18 an hour at University Dining Services. She types "check my pay" into ASI:One. Docket finds $440.64 of Social Security and Medicare withheld across 8 paychecks ($357.12 + $83.52), and gets it back.
- Notice. The Ledger agent reads her paystub PDFs and her bank account. Claude copies the numbers off each PDF; code then checks every one: Social Security is 6.2% of gross, Medicare is 1.45%, hours × rate = gross, and net pay matches a real deposit.
- Prove. The Tax agent runs the IRS rules in code. It counts her calendar years in the US and attaches the exact sentence from IRS Publication 519. A quote checker confirms that sentence appears word for word on the stored IRS page, or the finding is never shown.
- Argue. Before Priya sees anything, the Auditor agent argues payroll's side in the Hearing: Is this contractor work? Is she past five years? Can Medicare actually be recovered? The Tax agent answers each objection from her file, and code decides the verdict. In our run: three objections overruled, Medicare sustained, so the claim stands with a condition and Priya decides.
- Ask. She gets ASI:One Interactive Cards: the finding, the proof, the verdict, and an Approve button. Nothing goes out without her yes.
- Act. On approval, a Cartesia voice agent calls payroll for real. It says it's an AI calling with her permission, asks for the refund and for withholding to stop, and logs what payroll promised. It never mentions her work hours: payroll's slice of her file doesn't contain them.
- Remember. The case stays open. When the refund lands in her Capital One account, the Ledger matches it, the case closes, and Docket messages her without being asked. If payroll stalls or refuses, Docket writes a formal request, then prepares the IRS Form 843 and 8316 checklist.
And it's not just one refund. Docket also:
- Flags a week she worked 24 hours, over the 20-hour on-campus limit. That's a visa-status risk, not a money one.
- Reminds her that Form 8843 is due, which most students we surveyed had never filed.
- Has its Researcher agent, Athena, watch for rule changes, keeping only sources that code fetched and found the claim on. It caught a DHS rule that was published, then blocked in court.
- Spots that 4 students at the same employer have the same problem ($908.88 in total) and offers a group request, counting nobody until they say yes.
- Fills in her forms from her own records, showing where every value came from, and waits for her approval.
- Keeps one message thread across chat, phone and text. Docket can call her, and she can call back and ask anything.
How we built it
Docket is 8 Fetch.ai uAgents that send each other typed messages and share one student file on Convex. The student only ever talks to one of them, through ASI:One.
[Architecture diagram: Docket architecture · 8 agents, 1 shared file]
The Coordinator hands work to the agents; the Tax agent and the Auditor argue every finding before it reaches the student. Every agent reads and writes the Convex file, and Docket Pocket shows it to the student.
| Agent | Job |
|---|---|
| Coordinator | Talks to the student in ASI:One over the Agent Chat Protocol. Understands intent, narrates the Hearing, sends Interactive Cards, messages her when something happens. |
| Ledger | Reads paystub PDFs and the Capital One Nessie bank feed; checks every number in code; matches the refund deposit. |
| Tax (the Advocate) | Runs the rules in code and argues the student's side in the Hearing. |
| Auditor | Argues the employer's side and issues the verdict in code. |
| Caseworker | The case state machine: approval, the Cartesia payroll call, the written request, follow-ups. |
| Researcher (Athena) | Answers what the file can't; watches the rules that fired; keeps a source only if code fetched the page and found the claim on it. |
| Organizer | Finds employers where several students share a finding and runs a combined request for those who opt in. |
| Filer | Fills in forms from stored records, showing where each value came from, and submits only what she approves. |
| Layer | What we used | Why |
|---|---|---|
| Agents | Fetch.ai uAgents, Agentverse mailboxes, ASI:One, Interactive Cards | 8 agents, 22 typed message types, all published on Agentverse with their own readmes |
| Shared file | Convex: schema, mutations, live queries, HTTP actions, file storage | Every agent writes there, so no agent has to tell another what to do. The case state machine runs in Convex mutations, so an invalid transition is rejected at the database. Receipts and letter PDFs live in Convex file storage. |
| Reading and writing | Claude, with structured outputs | Transcribes paystubs, sorts what the student asked for, phrases findings for each channel. It never does math or decides anything. |
| The guard | agents/guard.py | Each audience gets an allow-list of facts. Claude writes from that slice, then code rejects the result unless every amount, every quote and every phone number checks out. If it fails, a sentence written in code goes out instead. |
| Rules | Python + rules.yaml | FICA exemption, 20-hour limit, Form 8843, wrong tax form, OPT unemployment days. Pure functions, money in integer cents. |
| Sources | Apify + a quote checker | Fetches IRS Pub 519, the Form 843, 8316 and 8843 pages, and 8 CFR 214.2, each stored with a SHA-256 hash. If a page changes, Docket rechecks the quote and holds the finding back. |
| Voice | Cartesia voice agents + webhook tools on Convex | The payroll call, plus a two-way student line. The agent can only use the facts its tools return. |
| Bank | Capital One Nessie | Payroll deposits, purchases, family transfers from India, and the refund deposit that closes the case. |
| The app | Docket Pocket, built in Mana | The student's view of her case: findings, the Hearing, approvals, the call, the refund and her forms. |
The rule we never broke: the model can explain a rule but never create one. Amounts, year counts, verdicts and state changes all come from code. Every agent logs every action, including the ones it decided not to take.
Challenges we ran into
- A dropped paystub silently changed what the student was owed. Claude copied one hourly rate as "$18.00 per hour". Our code refused it and threw away the whole paystub, so the refund total moved from $440.64 to $385.56 between runs. Two of us found and fixed it independently. Now the rate only feeds one cross-check, and an unreadable rate skips that check instead of losing the paycheck.
- A payroll promise lost to a broken webhook. The voice agent reports outcomes through a webhook. Ours was misconfigured: payroll made a real promise on the phone, and the case sat untouched. The Caseworker now reads Cartesia's own call records every 45 seconds and recovers the outcome. It refuses any promised date that doesn't parse or is in the past, and anything uncertain becomes "stalled" rather than an invented promise.
- Making a debate actually decide something. Our first Hearing sent every case to a human. We gave each objection a severity and each answer an outcome (rebutted, conceded or unresolved), so code can rule, and we judge Social Security and Medicare separately because they're recovered differently.
- Agents that looked connected but weren't. Our mailbox check trusted the Almanac listing and reported "connected" when ASI:One couldn't reach the agent. We switched to a signed request to each agent's own mailbox.
- Four people, one shared file. Mid-hackathon the rules changed shape and "check my pay" crashed. We added a small translation layer instead of rewriting a teammate's rules, and merged every branch with the tests passing.
Accomplishments that we're proud of
- We asked students first. 65 survey responses and 11 waitlist sign-ups (Penn State, Villanova, SFBU) before the demo.
- 25 of 25 on our eval, 0 false alarms, 16 of 16 quotes verified word for word. Given the same 25 synthetic students, plain Claude scored 24 of 25, and its one miss told a sixth-year student he was owed a refund he wasn't. It cited no clause anyone could check.
- A real phone call that knows its limits. Docket calls payroll, says it's an AI acting with the student's permission, and never shares more than payroll needs.
- The whole loop runs: paystub → finding → Hearing → approval → call → refund deposit → case closed → message to the student.
- Agents that disagree on purpose. Two agents with separate state argue every finding, and code rules on it.
- Nothing is sent without the student's yes, and every action is logged, including the ones an agent chose not to take.
- 248 automated tests passing.
What we learned
- Splitting work between the model and code is the product. Claude is excellent at reading a messy PDF and explaining a rule plainly. It's the wrong place for a dollar amount or a yes/no.
- Proof beats confidence. A quote checked word for word is what makes a student, or a payroll office, take a finding seriously.
- Failures should get plainer, not quieter. Every bug that worried us was silent: a dropped paystub, a lost promise. We now design each failure to show up as a warning, never as a smaller number.
- Talk to users before building. The survey showed Form 8843 is an even bigger blind spot than FICA: 25 students didn't know they had to file it. It's now our next priority.
What's next for Docket
- A pilot with the students on our waitlist, with real paystubs and consent built in from the start.
- International student offices. One advisor could watch every student's case instead of answering the same FICA question a hundred times.
- More of the money side of student-visa life: tax-treaty benefits, CPT/OPT paperwork and Social Security number applications, the problems our survey surfaced most after Form 8843.
- Real payroll systems and bank links in place of sandbox data.
Built With
- agentverse
- anthropic
- apify
- asi-one
- capital-one-nessie
- cartesia
- claude
- convex
- fetch.ai
- mana
- pydantic
- python
- react
- reportlab
- typescript
- uagents
Log in or sign up for Devpost to join the conversation.