Skip to content

Epic: POST feature overhaul — responsive layout, analytics, spaced repetition, adaptive difficulty & Morse improvements #1985

Description

@atomantic

POST ("Power On Self Test" / Physical Observation & Screening Tests) is one of PortOS's richest single-user features — 5 cognitive domains (Mental Math, Memory, Wordplay, Verbal Agility, Imagination), plus standalone Wordplay, Morse, and Memory (Elements Song) trainers. But the UI under-uses desktop width, hides most of the data it already computes, and lacks the adaptive/scheduling mechanics that make a daily-practice tool actually stick.

This epic tracks a coordinated pass across three fronts.

Audit findings

1. Responsive design (core complaint). Almost every POST surface hard-caps its own width and stacks a single column:

  • PostSessionLauncher.jsx:125 max-w-2xl · PostDrillConfig.jsx:178 max-w-2xl · MemoryBuilder.jsx:117 max-w-2xl · MemoryPractice.jsx max-w-2xl · PostSessionResults.jsx:18 max-w-2xl · PostHistory.jsx:44 max-w-3xl. Live drill runners use the narrower max-w-lg (intentional focus view — leave those).
  • MorseTrainer.jsx:354 is the only surface with a real responsive multi-column layout (grid xl:grid-cols-[minmax(0,1fr)_24rem] + sticky sidebar). Use it as the pattern to replicate.
  • The page shell (pages/Post.jsx) already gives full width via flex-1 overflow-auto p-6; every child re-caps itself, leaving large empty gutters on desktop.

2. Under-surfaced data (actionability gap). The server already computes per-domain averages, per-drill averages, current/longest streaks (getPostStats, computePostStreaks in meatspacePost.js), per-drill accuracy + practice streaks (getTrainingStats in meatspacePostTraining.js), and chunk/element-level memory mastery (meatspacePostMemory.js). None of it reaches the launcher — which shows only "Today's Status" + the last 3 raw scores. The analytics only appear on the dashboard DailyPostWidget.

3. Missing training mechanics.

  • No spaced repetition — memory items track mastery but there is no nextReview/interval/Leitner scheduling; nothing tells you what is due today.
  • No adaptive difficulty — drill configs are fixed steps/count/timeLimitSec, never adjusting to performance.
  • No reminders/scheduling for the daily habit.

4. Config gap. PostDrillConfig.jsx exposes only 5 of the 14 LLM drill types defined in constants.js / meatspacePostLlm.js (the imagination set and compound-chain/bridge-word/double-meaning/idiom-twist are generatable server-side but have no config UI).

5. Morse is under-built vs siblings. It has no deep-linkable sub-pages (modes/reference tabs live in local state, not the URL — violates the repo's "URL is the source of truth for what's open" rule), and its Tree reference view renders confusingly / appears incomplete — the depth-aligned flex layout makes the DIT (E) subtree render sparse and misplaces the start node under the "DIT" header, so it reads as missing letters even though all 41 chars are in the data.

Child issues

Responsive (per-surface):

Actionability & training mechanics:

Morse:

Close this epic when all children are done.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestepicParent/umbrella tracking issue — close when all child issues are done

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions