Skip to content

Turn roadmaps into a video ladder with an 80/20 core per level - #19

Merged
screen-gd merged 2 commits into
mainfrom
feat/video-ladder
Oct 27, 2026
Merged

screen-gd merged 2 commits into
mainfrom
feat/video-ladder

Conversation

@screen-gd

@screen-gd screen-gd commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner

Summary

Syllo's roadmap is now a video ladder: levels go from Basics to Intermediate to Advanced, each level has a small core set of videos (80/20), and everything else is marked "go deeper". The first commit is the Read/Check/Apply lesson view that was already uncommitted on main. This PR builds on it.

Scout
  discover   pickVideoFirst: videos first, articles/docs capped at 25% once there are 3+ videos
  extract    extract.v2 adds a per-resource level (stored in a new nullable resources.level column)
  review     PickList grouped by level with Core / Go deeper / Reading badges (keep/skip unchanged)
  plan       plan.v2: each module has a level, each task has core + coreReason (v1 kept)
             normalizeModules enforces the rules no matter what the model returns:
               sorted by level, max 3 modules per level, books moved to a "Reading track"
               only videos can be core when the level has a video, max 5 distinct core videos
               a level with no core gets up to 3 promoted picks
  draft      draft roadmap grouped by level, each task badged Core / Go deeper, with the reason

Learner
  lib/ladder.ts  getLadder / nextCoreItem / levelUpReady (pure functions, nothing stored)
  Home           one card only: the next core video in the current level, with its resume point
  Learn          Ladder card: current level open, finished levels closed, later levels openable
                 Level up button once a level's core is watched
                 after a core video is marked done: optional "Explain it back" note (Skip = one click),
                 saved as a lesson annotation at the current timestamp

Storage and migration:

  • New optional fields: ModuleSection.level, ModuleSection.track, Task.core and Task.coreReason. They are also added to the personal zod schema so sync keeps them.
  • zns:v2:workspace-state is unchanged. A roadmap without levels is read as one level with every task core. Nothing is rewritten in storage.
  • Convex stores the payload as an opaque string, so convex/ is unchanged. Older clients drop the new fields when they parse a roadmap, so on those devices a roadmap reads as one level.
  • The recall note uses the existing annotation kind. A new personal entry kind would break the discriminated union on older clients.

Evidence

  • pnpm typecheck passes (app and convex).
  • pnpm test: 17 files, 83 tests pass. New tests:
    • plan-levels.test.ts: level sort, reading track, video-only core, 5-video cap counted by distinct video, promotion, clearing reasons, missing resources
    • ladder.test.ts: reading legacy roadmaps, grouping, level inheritance, nextCoreItem (video first, skips go-deeper and reading items, excludeTaskId, moves to the next level), levelUpReady
    • discovery-order.test.ts, picks.test.ts, extract-level.test.ts, and a schema round-trip case in personal-learning.test.ts
  • pnpm lint: 0 errors. The 32 warnings were already there, in files this PR doesn't touch.
  • pnpm build: client and SSR builds pass.
  • I didn't do any browser testing.

Merge Danger

Door: two-way. The new fields are optional, and the SQLite column is nullable and added by an idempotent ALTER TABLE.

Blast Radius: studio-wide. Home, Learn and the Scout review/draft screens all change. Plans built after this ship use the new prompt versions (packVersion becomes scout-extract.v2+plan.v2+quiz.v1). Resources extracted before this have no level, so they appear under "Level set when the plan is built".

Summary by CodeRabbit

  • New Features
    • Learning roadmaps now organize lessons by difficulty, highlight core resources, and provide a separate reading track.
    • The learning workspace adds video chapters, notes, practice prompts, lesson tabs, subtasks, and progress-based lesson navigation.
    • Home and roadmap views show learning-level progress and offer a clearer path to resume studying or explore deeper material.
    • Resource discovery and planning now prioritize video lessons and group materials by learning level.
  • Bug Fixes
    • Video playback resumes only when saved progress matches the active resource.Failed saves now display an error.

screen-gd and others added 2 commits October 27, 2026 18:42
Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Zaid learns by watching videos, basics first. Scout now plans levels (Basics, Intermediate, Advanced) with at most five core videos each, ranks videos above articles, and keeps books as a reading track. Home shows one next core video, Learn shows the ladder with level-up and an optional explain-it-back note. Old roadmaps read as one all-core level.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 1538a192-3cc3-4038-a00c-9c9c46bfb4dd
Commits

Reviewing files that changed from the base of the PR and between 2696d81 and 7bef5e1.

Files selected for processing: 27
  • apps/web/prompts/scout/extract.v2.md
  • apps/web/prompts/scout/plan.v2.md
  • apps/web/src/components/scout/PickList.tsx
  • apps/web/src/lib/__tests__/ladder.test.ts
  • apps/web/src/lib/__tests__/personal-learning.test.ts
  • apps/web/src/lib/ladder.ts
  • apps/web/src/lib/learning.ts
  • apps/web/src/lib/personal/schema.ts
  • apps/web/src/lib/scout/__tests__/discovery-order.test.ts
  • apps/web/src/lib/scout/__tests__/extract-level.test.ts
  • apps/web/src/lib/scout/__tests__/picks.test.ts
  • apps/web/src/lib/scout/__tests__/plan-levels.test.ts
  • apps/web/src/lib/scout/db.ts
  • apps/web/src/lib/scout/discovery/combine.ts
  • apps/web/src/lib/scout/extract.ts
  • apps/web/src/lib/scout/pack.ts
  • apps/web/src/lib/scout/picks.ts
  • apps/web/src/lib/scout/pipeline.ts
  • apps/web/src/lib/scout/plan.ts
  • apps/web/src/lib/scout/prompts.ts
  • apps/web/src/lib/scout/schema.sql
  • apps/web/src/lib/scout/types.ts
  • apps/web/src/styles/learning.css
  • apps/web/src/types/index.ts
  • apps/web/src/views/studio/home.tsx
  • apps/web/src/views/studio/learn.tsx
  • apps/web/src/views/studio/scout.tsx

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Walkthrough

Scout now assigns learning levels to resources and roadmap modules, separates books into a reading track, and marks core tasks. Studio views use ladder progress to select and display lessons, record task and subtask completion, and present a redesigned learning workspace.

Changes: Level-based learning flow

Layer / File(s) Summary
Extract and persist resource levels
apps/web/prompts/scout/extract.v2.md, apps/web/src/types/index.ts, apps/web/src/lib/scout/{extract.ts,pack.ts,pipeline.ts,db.ts,schema.sql}, apps/web/src/lib/scout/prompts.ts, apps/web/src/lib/scout/__tests__/extract-level.test.ts
Extraction classifies resource levels and merges chunk results. Scout carries the level into resource records and persists it in a nullable database column.
Select and group resources
apps/web/src/lib/scout/discovery/combine.ts, apps/web/src/lib/scout/picks.ts, apps/web/src/components/scout/PickList.tsx, apps/web/src/lib/scout/__tests__/{discovery-order.test.ts,picks.test.ts}
Discovery selects videos before web resources. Pick groups assign resource roles and display resources by learning level, unsorted picks, and reading track.
Normalize plans into leveled roadmaps
apps/web/prompts/scout/plan.v2.md, apps/web/src/lib/scout/plan.ts, apps/web/src/lib/scout/prompts.ts, apps/web/src/lib/personal/schema.ts, apps/web/src/lib/scout/__tests__/plan-levels.test.ts
Plan normalization orders level modules, settles core tasks, and moves books into a reading track. Roadmap fields carry level, track, and core-task metadata.
Derive ladder progress and update tasks
apps/web/src/lib/ladder.ts, apps/web/src/lib/learning.ts, apps/web/src/lib/__tests__/{ladder.test.ts,personal-learning.test.ts}
Ladder helpers group tasks, select the next core item, and determine level-up readiness. Learning helpers save task and subtask updates and resolve videos by URL.
Use ladder data in studio views
apps/web/src/views/studio/{scout.tsx,home.tsx,learn.tsx}, apps/web/src/styles/learning.css
Studio views group draft modules, show ladder-based resume and progress details, and provide a learning workspace with lesson navigation, notes, subtasks, and Read/Check/Apply tabs.

Priority: Normal

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant buildRoadmap
  participant LearnPage
  participant getLadder
  participant setLearningTaskDone
  buildRoadmap-->>LearnPage: Roadmap with levels and core-task metadata
  LearnPage->>getLadder: Roadmap
  getLadder-->>LearnPage: Levels and next core item
  LearnPage->>setLearningTaskDone: Roadmap and task completion
  setLearningTaskDone-->>LearnPage: Updated roadmap
Loading
Merge Risk: Minimal · up to 7bef5

The change adds level-based roadmaps and a core-video ladder across Scout, Home and Learn. No concrete merge-blocking defect was established in review. The author reports typecheck, tests, lint and build passing, but no browser testing.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 29.41% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Documentation-only edits and deletions within surv… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title accurately summarizes the main change: converting roadmaps into level-based video ladders with a core subset per level.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 29.41% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 51 functions across 23 files. (4 skipped: 4 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

Finishing Touches: 💡 1
📝 Generate docstrings: 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

I’m a rabbit with a roadmap to explore,
Basics first, then levels more.
Core tasks hop into the queue,
Reading has its own track, too.
I check my notes and mark tasks done,
Then bound ahead to learning fun!

Comment @coderabbitai help to get the list of available commands.

@screen-gd
screen-gd merged commit a0351e7 into main Oct 27, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant