Spaces:
Sleeping
Schedule / time-tracking
Additive Habit Journal feature: iOS-like day plan, thick block feedback, learned duration priors, Cursor agent pull/push, and OpenRouter/rules reschedule.
P1 scope lock (hard)
Ship only: day timeline + thick feedback (<20s) + priors/duration learning + yesterday-trigger / last-hour capacity cut.
Do not implement as code:
- full PERMA
- ωEᵢ, δᵢ, or H=S+C+V
- hedonic δ as an explicit v1 term (learn later via would_repeat + falling fun)
- split feedback into Meaning vs Flow / “meaningful?” / “in the zone?”
- family/relationship tasks as a pillar to maximize
- schedule as a substitute for Daily or Log
EV stays owned (no rewrite)
EV = P(done)*U + γ*I + η*Fun − λt*d_hat − λm*cost − λf*FSE
Seligman = operators, not a new religion:
- trigger day → raise λ_f and η; only P0 overrides cuts
- escape (porn / court / rerun binge) ≠ fun/explore
- fun/explore should yield data or skill contact
Feedback fields (v1 — no extras)
did · actual_min · quality 1–5 · fun 1–5 · energy_after −2…+2 · would_repeat · skip_reason · money optional.
Later mapping from data only: quality+would_repeat ≈ meaning; fun+energy ≈ recovery. Do not ask PERMA questions in UI.
Premortems (fail the PR if present)
Planning-as-avoidance · no feedback · OR thrash · overfull FSE day · schedule theater · guilt / duty-maximizer copy.
P0 never silent-reschedule
Sleep, food, Spain/visa deadlines stay locked at their times.
Nav IA (chosen)
Home | Plan | (+) Log | Daily | Settings
- Center FAB stays Log (one tap from every main screen).
- History remains at
#/historyand is reachable from Home (“See all” / History chip).
Data
Under DATA_ROOT/schedule/:
| Path | Purpose |
|---|---|
plan-YYYY-MM-DD.json |
Versioned day plan |
feedback.jsonl |
Block feedback rows |
priors.json |
Per-kind d_hat, p_done, fun, slip |
meta.json |
Last reschedule timestamp |
Math (server-owned)
d_hat = (n/(n+m)) * mean_actual + (m/(n+m)) * prior_default
slip = actual_min - planned_min
p_done ≈ (N_done + α) / (N + α + β)
C_today cut if yesterday_trigger or last-hour urge/court/corn/rerun (P0 still allowed)
health = (strong_feedback / planned) * p0_done_rate * (1 if explore/fun done else 0)
Strong feedback = did in done|partial and actual_min, quality, fun present.
LLM must not invent p_helped, rank, or %.
Human API (session cookie)
GET/PUT /api/plan/{date}POST/PATCH/DELETE /api/plan/{date}/blocks[/{id}]POST /api/plan/{date}/blocks/{id}/feedbackPOST /api/plan/{date}/seed— empty day → template starter (P0 locked; capacity cuts)GET /api/schedule/priorsGET /api/schedule/templatesPOST /api/plan/{date}/reschedule{ "reason", "force" }GET /api/plan/{date}/health
GET /api/plan/{date} overlays live capacity_hint, operators, risk_1h, triggers_yesterday.
Agent API
Set Space secret AGENT_TOKEN.
# Pull context
curl -s -H "Authorization: Bearer $AGENT_TOKEN" \
"https://YOUR_SPACE/api/agent/context?day=2026-07-19"
# Push plan
curl -s -X PUT -H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"source":"cursor","blocks":[{"date":"2026-07-19","start":"09:00","end":"09:45","title":"Earn one ship","kind":"earn_ship","intent":"duty","priority":"P1","planned_min":45,"status":"planned","locked":false,"notes":"","version_added":1,"source":"cursor"}]}' \
"https://YOUR_SPACE/api/agent/plan/2026-07-19"
Agent contract (one line)
Implement thin schedule loop + thick feedback + trigger capacity cuts. Seligman validates recovery and anti-duty-only design; do not expand the equation or feedback fields.
Steps
GET /api/agent/context?day=- Build ≤
max_blocks, pad withd_hat, keep P0 locked, ≥1 explore/restore unless capacity very low PUT /api/agent/plan/{date}- User completes blocks on phone (thick feedback)
- Optional
POST /api/plan/{date}/reschedulewhen missed/risk
Context includes operators and capacity_hint.
Env
AGENT_TOKEN=...
OPENROUTER_API_KEY=... # optional; rules backup if missing
RESCHEDULE_MIN_GAP_MIN=90
SCHEDULE_DAY_START=06:00
SCHEDULE_DAY_END=23:00
TZ / SCHEDULE_TIMEZONE=Africa/Dar_es_Salaam
UI map
| Route | Role |
|---|---|
#/plan |
Day timeline 06:00–23:00, now line, colored blocks |
| Block sheet | Complete with did / minutes / quality / fun (no PERMA Qs) |
| Home | Next 1–2 blocks + overdue feedback banner; empty → Paste plan CTA |
| Plan | Paste ChatPlan / Export for chat / checklist check-off / day review |
ChatPlan loop (external AI)
POST /api/plan/{day}/import— ChatPlan JSON (or{plan, mode}) → timetableGET /api/plan/{day}/export— filled ChatPlan in envelopeGET /api/plan/{day}/export.txt— downloadable JSON attachmentPOST /api/plan/{day}/blocks/{id}/check— fast status without thick feedbackPATCH /api/plan/{day}/meta— title / intention / constraints / day_review- Feedback additive:
emotions[],fse_event,intensity
Reschedule
- OpenRouter returns JSON blocks; P0 times preserved.
- Without API key / parse fail →
rules_backup_reschedule. - Cooldown
RESCHEDULE_MIN_GAP_MINunlessforce.