Tasks is a read-only Möbius catalog mini-app for the agent's scheduled check-ins and installed apps' recurring cron jobs. It reads the shared self-reminder log, folds it into the latest task state, and routes completions, cancellations, reschedules, and discussion back to the agent through a new chat.
The app reads:
/data/shared/self-reminders.jsonl
GET /api/apps/schedules
Each non-empty line is a JSON object. Malformed lines are ignored so one bad append does not hide the rest of the task list.
Expected fields:
{
"id": "stable-task-id",
"note": "Human-readable task text",
"status": "pending",
"due_at": 1783420800,
"created_at": 1783334400
}idis required for display. Records withoutidare ignored.noteis shown as task text; missing notes render as "Untitled task".statusmay bepending,done, orcancelled. Unknown or missing statuses are treated as pending for display.due_atandcreated_atare Unix seconds. The app normalizes obvious millisecond values, but producers should write seconds.- The log is append-only. The last valid record for each
idwins.
Derived status:
pendingwithdue_at <= nowdisplays asNeeds Attention.pendingwith a future due time displays asScheduled.doneandcancelleddisplay directly and sort below active work.
Tasks does not write shared/self-reminders.jsonl or app cron schedules. Shared scheduling belongs to the Möbius agent, so task update actions emit an agent_handoff signal and open a chat draft:
rescheduledonecanceldiscuss
App cron rows from /api/apps/schedules are displayed read-only and have no reschedule, cancel, or discuss affordance in this app.
The app refreshes shared storage on mount, manual refresh, focus/visibility return, online return, and a visible 60 second interval. If refresh fails after data was already loaded, the last visible task list stays on screen with an inline Offline or refresh-failed pill.
The app emits guarded window.mobius?.signal?.() calls:
app_ready { item_count, attention_count, done_count, schedule_count }— once both reads resolve for a loadlist_state { state }— once per load;stateispopulated,empty, orload_faileditem_opened { type: "task", status }agent_handoff { action }refresh_tapped— the manual refresh / try-again button was pressed (not the auto refreshes)error { message, source }
Payloads are flat primitives and contain no task text.
mobius.json intentionally keeps:
"offline": {
"reads": false,
"writes": "none",
"execution": "none"
}The installer reads this object and stores it as App.offline_contract. It reflects that this viewer depends on online shared storage and performs no local writes.
index.jsx # React mini-app entry and UI
domain.js # Pure parsing, folding, sorting, status, and load helpers
test/domain.test.js # Node test runner regression tests
mobius.json # Catalog manifest
icon.png # Catalog icon
Run tests with:
npm test