Daily cycle: review and tasks
How parents give feedback and how the next task set appears.
The unit is a set, not a day
There are no pre-built future sets. A working set becomes current for the child after generation and link check. No mandatory Review → Publish. Draft → Publish remains only for control work and diagnostics.
Who sees what
| Role | Screen |
|---|---|
| Child | Current tasks — current set; Past work — archive with feedback |
| Parent | Any issued set; generate and selective regenerate on the current set |
Reviewing a set
Two paths per task
| Path | When | Action |
|---|---|---|
| By photo | Child needs feedback | Photos → Check → feedback; compare in Recognized from photos |
| Myself | Clear without feedback | I verified it myself → verdict No errors / Had errors (errors require text) → Save |
After a photo check, the myself path is unavailable — only reshoot or text edit. Details: Photo check § A.
After a photo check
| Element | Purpose |
|---|---|
| Feedback | Verdict and explanation for the child |
| Recognized from photos | Compare with the notebook |
| Photograph again | New check |
Parent text from “myself” and other manual notes are not shown to the child (AI feedback after a photo check is shown).
Past sets
The parent can open a previous set and fix marks. Generate next set is only on the latest.
Next set
| Rule | |
|---|---|
| Incomplete review | Does not block generation |
| Knowledge map | Updates when generating the next set, not when checking a task |
| Map summary | If mastery_update changed anything — show once at the top of Tasks (no dismiss). None on the first set |
| Issuing | Child does not see the set until links are checked (or auto-retry is exhausted). No mandatory Review → Publish |
| Links before issue | Broken URLs → auto-regenerate_tasks for those tasks only (≤2 tries, no quota charge). After limit — issue + soft parent banner |
| Manual regenerate | Empty comment = keep; text = redo. Only marked tasks change; current check / parent_report reset |
| Child on manual regen | Quiet text swap; old feedback gone. No “updated” banner in MVP |
| Attempts after regen | Clear current; keep raw old attempts in DB (history UI is a separate backlog) |
| Already started | Manual regenerate is not blocked — parent/child responsibility |
| Quota | Manual regenerate_tasks counts like a set generation (when freemium is on); hint on the button. Link auto-regen is not billed |
| Control / diagnostic | Still draft → Publish (+ link check with confirm) |
Value points (funnel)
Three distinct “ahas”, not one metric:
| # | Point | Role | Meaning |
|---|---|---|---|
| 1 | Plan accepted | Onboarding milestone | “The system understood the path” |
| 2 | First set issued | Stepper close / onboarding aha; trial billable | “There is something to do today” |
| 3 | First task checked | Activation (“the loop is alive”) | “Feedback and the cycle work” |
Onboarding and the stepper close on (2). (3) is the activation north-star, not “setup done”. Trial / billable sets count issued working sets. Manual regenerate right after issue is a generation-quality signal (observability), not a value point.
Past work (child)
After the second issued set — Past work link on Current tasks.
| Shown | Not shown |
|---|---|
| Task text, feedback | Parent notes, photos, recognized text |
The current set is not in the archive.
Decision: “Current tasks”
There is no mandatory “feedback first, then new tasks” gate.
- The child sees one current set on Current tasks.
- After review — feedback in context, or move on after the next set is generated.
- Past work is a reference archive, not a gate before a new set.
Decision: task list in a set (2026-08-05)
| Rule | |
|---|---|
| Parent | Always the full list (current and past set, control work); no remaining/all toggle |
| Child (Current tasks) | Default — only is_done=False; full list via “Show all” (?tasks=all) |
| Boundary (child) | Strictly is_done: accepted with minor errors / tips is hidden in the default mode |
| Preference (child) | No cookie/localStorage: without the param = remaining, ?tasks=all = all |
| After accept (child) | On a full page load the card leaves “remaining”. While the page stays open, soft-update keeps the card: badge and feedback update in place so reading is not disrupted |
| Out of scope | Draft; child Past work |
| All accepted (child) | Empty list + “Show all” |
Decision: default expanded card (2026-08-05)
| Audience | Rule |
|---|---|
| Parent (current/past set, control work) | All cards collapsed; parent opens what they need |
| Child (Current tasks) | Expand the first is_done=False among tasks visible in the current filter mode |
| Parent diagnostic | Unchanged: still the first task without a filled part result |
| Out of scope | Child Past work archive |
For the child the criterion is is_done=False (including major_gaps, needs_parent). In “remaining” the first card in the list opens; in “all” — the first not-accepted in set order. No not-accepted tasks → nothing expanded.
Not doing: an inverted filter on child Past work (default “all”, click for “remaining”). Archive is reference, not a queue.