homeworkhawk-graded-worksheet-callback · git:20260915.2c8e1a2 · 2026-09-15 · sha256 1735c3d81c092023
homeworkhawk-graded-worksheet-callback git:20260915.2c8e1a2A
Immutable. This exact content is served forever at /api/v1/blob/1735c3d81c092023.
---
name: homeworkhawk-graded-worksheet-callback
description: After an automated grading pipeline (HomeworkHawk, OpenCV 5) grades a finished worksheet photo, optionally places ONE outbound CALL-E call to a verified parent/guardian delivering advisory results (score, which questions to review, which ones the system could not read confidently). Default mode is a no-call preview that returns the exact script and result schema; a real call requires explicit operator approval, an authorized guardian destination, and an unambiguous grading result. Returns a structured confirmation (delivered / followup_confirmed / followup_time / parent_reaction) the grading app can store next to the worksheet.
license: MIT
---
# HomeworkHawk — Graded Worksheet Callback
## Why this exists
Automated homework grading is only useful if the results reach the
parent. A grading result that lives in a dashboard nobody opens at work
is a dead end. This skill closes the loop: when a grading pipeline
finishes a worksheet, it hands the structured result to CALL-E, which
phones the parent, delivers the summary in a warm and non-judgmental
tone, names the questions worth reviewing, flags the ones the system
itself escalated as unreadable, and offers a review session for
tomorrow evening. The call returns a schema-validated result the
grading app can act on.
It is a **workflow skill** on top of CALL-E's one-off
`calls.createAndWait` SDK call — no new backend, no scheduler state.
**The grading result is advisory.** It tells a parent what to look at
together with their child; it is never an official grade, a judgment of
the child, or a placement decision.
## Default: preview, no call
Running the skill **without `--approve-call` places no call**. Preview
mode prints (and returns as JSON):
- the exact script the agent would read, with the student name and any
escalated questions included,
- the destination number as it will be dialed (masked in all output),
- the result contract the app will receive.
```bash
# default — safe: renders the script, dials nobody
node notify.mjs graded.json --to +15550123456 --region US
# real call — only with an explicit approval flag, a verified
# guardian number, and a grading result that passed the
# ambiguity gate (see Safety)
node notify.mjs graded.json --to +15550123456 --region US --approve-call
```
## When To Use
- a grading/vision pipeline has produced per-question verdicts and the
**parent/guardian has explicitly opted in** to a phone callback
instead of (or alongside) an app notification
- any "perception finished → an authorized adult should hear about it
by phone" pattern: inspection reports, review-session booking after
an automated assessment
**Not for:** medical, lab-result, legal, financial, or emergency
notifications of any kind. A homework score is advisory educational
feedback; this skill must never be repurposed to deliver health or
lab results — those require a licensed professional in the loop, and
this skill provides none.
## Inputs
| field | type | notes |
| --- | --- | --- |
| `graded.json` | file | pipeline output: `{file, student_name, questions: [{index, expected, score, verdict, attempts}]}` |
| `--to` | E.164 phone | the **verified parent/guardian** number (must be on the allowlist the parent set up; never taken from the worksheet, the child, or a third party) |
| `--region` / `--locale` | CALL-E recipient settings | e.g. `US` / `en-US` |
| `--approve-call` | flag | required for a real dial; omitted = preview only |
## Result contract
```json
{
"delivered": true,
"followup_confirmed": true,
"followup_time": "tomorrow 19:00",
"parent_reaction": "positive"
}
```
In preview mode the same shape is returned with `"delivered": false`
and `"mode": "preview"`. Phone numbers are **masked in every output**
(`+1•••••0123`), including logs, transcripts, and error messages.
## Run
```bash
git clone https://github.com/Zaichek/homeworkhawk-calle
cd homeworkhawk-calle && npm install
export CALLE_API_KEY=... # dashboard.heycall-e.com — never logged or embedded in prompts
node notify.mjs graded.json --to +15550123456 --region US # preview
node notify.mjs graded.json --to +15550123456 --region US --approve-call
```
The vision leg (photo → graded.json) is
[HomeworkHawk](https://github.com/Zaichek/homeworkhawk): pure OpenCV 5,
0.24 s/page on CPU, 93.3% handwritten-answer exact-read, with a
confidence-gated policy that escalates to a human instead of guessing.
## Safety
Full rules in [references/safety.md](references/safety.md). Summary:
- **Default no-call.** Preview is the default; a real dial needs the
explicit `--approve-call` operator approval, per call.
- **Authorized guardian only.** The destination must be the
parent/guardian contact on file. The skill refuses to disclose
anything about the child to an unverified number, a number supplied
by the child, or any third party.
- **Ambiguity stops the call.** If the grading result fails the
ambiguity gate (unreadable student name, >20% of questions escalated,
missing verdict fields), the skill places no call and returns the
result to the app for a human to review first.
- **Advisory framing.** The script reports what to review together —
never "your child failed", never a grade, never a ranking.
- **Cancellation limits.** Stop before submission to avoid placing the
call. After submission, Ctrl-C only stops the local workflow; it does
not confirm provider cancellation, and the call may still connect or
continue. The parent can hang up, and the agent ends politely. The skill never
redials on its own — at most one call per worksheet, ever.
- **No schedules, no duplicates.** No hidden recurring jobs; one call
per worksheet idempotency key; a follow-up session is booked as a
*human* calendar entry, not another automated call.
- **Boundaries.** No medical/lab-result, legal, financial, or
emergency content, with or without supervision; those categories are
out of scope by design.
Detailed worked examples: [references/examples.md](references/examples.md).