You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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:125max-w-2xl · PostDrillConfig.jsx:178max-w-2xl · MemoryBuilder.jsx:117max-w-2xl · MemoryPractice.jsxmax-w-2xl · PostSessionResults.jsx:18max-w-2xl · PostHistory.jsx:44max-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.
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:125max-w-2xl·PostDrillConfig.jsx:178max-w-2xl·MemoryBuilder.jsx:117max-w-2xl·MemoryPractice.jsxmax-w-2xl·PostSessionResults.jsx:18max-w-2xl·PostHistory.jsx:44max-w-3xl. Live drill runners use the narrowermax-w-lg(intentional focus view — leave those).MorseTrainer.jsx:354is 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.pages/Post.jsx) already gives full width viaflex-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,computePostStreaksinmeatspacePost.js), per-drill accuracy + practice streaks (getTrainingStatsinmeatspacePostTraining.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 dashboardDailyPostWidget.3. Missing training mechanics.
nextReview/interval/Leitner scheduling; nothing tells you what is due today.steps/count/timeLimitSec, never adjusting to performance.4. Config gap.
PostDrillConfig.jsxexposes only 5 of the 14 LLM drill types defined inconstants.js/meatspacePostLlm.js(theimaginationset andcompound-chain/bridge-word/double-meaning/idiom-twistare 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.