Learning Roadmap release
Learning Roadmap (LearningRoadmap, a free Store/Plugin with app: true) turns the project a
learner wants to build into a personal curriculum. Six project-first questions produce a saved plan of
real courses with a reason, the relevant lessons, a concrete outcome and an S/M/L capability size for
each stop. The plan lives at {viewer}/LearningRoadmap/Plan, reads the learner's existing course
progress, and reopens the exact lesson or exercise they last touched. Production target:
memex.meshweaver.cloud, public link /LearningRoadmap.
Built by Astra (Codex) on 9–11 September 2026 as Plugins #1625, finished and polished by Claude on 11 September at the maintainer's request. Course-owned learning metadata (topics, milestones, sizes) landed as Education #313 and Reinsurance #193 the same day.
What ships
| Piece | Where | Notes |
|---|---|---|
| The app root and cover | LearningRoadmap/index.json |
free, entryPoint and installPaths = LearningRoadmap/Plan, requires Edu@^1.9.0 |
| The plan template | LearningRoadmap/Plan.json |
nodeType: Edu/LearningJourney, workflowVersion: 1; the Store copies it into the learner's home |
| The questionnaire and plan page | Edu/LearningJourney/Source/LearningRoadmapViews.cs |
one question per screen; Step moves only on Continue/Back |
| The recommender | Edu/LearningJourney/Source/LearningJourneyContent.cs |
project-led matching against each course's content.learning |
| Progress projection | Edu/LearningJourney/Source/LearningRoadmapProgress.cs |
read-only over {viewer}/_Progress and _Install; never a second store |
| Catalog call-to-action and course sizes | Edu/CourseCatalog/Source/CourseCatalogLayoutAreas.cs |
replaces the withdrawn self-assessment link (#1643) |
| The onboarding step | src/MeshWeaver.Courses/LearningPath/LearningPathStep.cs |
see Onboarding below |
| Learner guide | LearningRoadmap/Guide.md |
public segment of the app |
Decisions
- The project leads. The first question is what the learner wants to build; every recommendation explains itself in terms of that project. Courses give vocabulary, the project gives judgement.
- One question per screen, explicit
Step. Answers bind live and save as you type, so the current question is never derived from which fields are filled — that would advance on the first keystroke. Continue validates and advances; Back and Refine are plain assignments. - S / M / L are capability, not effort. S starts with AI, M builds with agents, L designs complete workflows. The catalog, covers and plan share the one vocabulary; no course claims a duration.
- Progress is a projection. The plan shows visited lessons, completed exercises and certificates from the records the courses already keep. A resume link into a private copy survives only while a completed install still covers that page; a retained purchase alone is not enough. Uninstalling drops the link and keeps the progress; reinstalling restores it.
- Privacy is carried, not assumed. Every read of the learner's private records runs under the
learner's identity (
AccessService.RunAs), on the query and on the subscription. A refused read is an error, never "no plan". - Reconciled with #1607. A parallel five-question quiz landed on
Edu/SelfAssessmentwhile this was open; the six-step roadmap is the surviving assessment and #1607's shape tests were rewritten against it.
Onboarding
Onboarding is one flow (maintainer, 11 September): the Connections checklist a new chat opens with
(Microsoft 365, Teams, Gmail, WhatsApp, …) is the single onboarding surface, and the educational journey
is a step inside it. There is no standalone card in the portal. The step's rule ships in the Edu
module as LearningPathStep.ObserveDestination: the app cover while the learner has no plan, their own
unfinished plan while one exists, nothing once roadmapCreated is set or the portal does not carry the
app. LearningPathStepSource registers it as an IChatNudgeSource (MeshWeaver.AI.Nudges, landed with
Connections #1670) from CoursesExtensions.AddCourses: id step-learning-path, Order 20 after
"Connect your accounts", DoneWhenChosen = false, English with a German translation. Edu 1.10 requires
AI@^1.8.0 for it. The portal GUI deliberately does not reference the AI engine, so the source lives in
the Edu module.
Putting it on a mesh
Node content deploys through GitSync; the MeshWeaver.Courses assembly deploys through the modules
job on a main push. Never hand-create a Space.
Edu (existing,
content.version1.8 → 1.9):git_hub_sync updateonEdu, then confirmEdu/LearningJourneyandEdu/CourseCatalogare back atcompilationStatus: Okwith the new source versions.LearningRoadmap (new): create a
Store/Provisionrequest — the only field you write isrequestedAction:{ "id": "LearningRoadmap", "namespace": "Admin/Provision", "name": "Provision LearningRoadmap", "nodeType": "Store/Provision", "content": { "$type": "ProvisionContent", "packageId": "LearningRoadmap", "repositoryUrl": "https://github.com/Systemorph/MeshWeaver.Plugins", "branch": "main", "requestedAction": "Provision" } }Omit
subdirectory(SystemInstall appends the package id itself). Watchcontent.stategoRequested → Running → Donewith noerrorand a final Compile types: Completed log line.Course roots (Education and Reinsurance repos):
git_hub_sync updateon each course Space so its root carriescontent.learning; the recommender falls back to names and descriptions without it, with plainer stops.Access: the package is pre-installed (
preInstalled: true, since 1.1): the gate writes_Policy publicRead: true, the whole partition is readable by everyone, and the Store's standard-pack sweep copiesPlaninto every user's home WITHOUT minting a per-user entitlement or_Accessgrant.@LearningRoadmap/_Access/*therefore holds onlyAnonymous/PublicViewer and nothing else; a person appearing there is a defect, not an install. (1.0 was merely free, and a free-but-gated package makes the standard-pack sweep enrol every existing user — 60+Viewer + Commentergrants and entitlement records were minted on memex at 01:12 UTC on 12 September before this was corrected.)
Verifying a release
As an ordinary signed-in learner who owns no course:
/LearningRoadmapshows the cover; Open my roadmap → installs the free app and lands on/{viewer}/LearningRoadmap/Planwith the first question.- Typing the project enables Continue without a blur; a reload keeps the text and the step.
- Six questions, then Create my roadmap ✦ shows the plan hero with the project, hours and confidence. An FX / financial-reporting project yields Data Modelling (M) then Advanced Business Rules (L), each with a reason, a lesson sequence and a "build this along the way" outcome.
- Notes survive a reload and Refine my roadmap; the home tile returns to the same plan.
- A gated course's lesson still lands the learner on that course's
Subscribepage. - Anonymous: the cover renders; Open my roadmap → leads to
LearningRoadmap/Subscribeand sign-in.
The browser walk that automates this is e2e/learning-journey.spec.ts
(RUN_LEARNING_JOURNEY=1, a fresh learner session, E2E_USER_ID); see e2e/README.md.
History
- 9–10 Sept — Astra builds the app, the recommender, the progress projection and the browser walk; local acceptance on disposable meshes (ports 8338–8340), 37/37 Courses tests, 89/89 NodeTypes.
- 10 Sept — Store 1.10 coupon correction adopted; SAV talk and post reviewed anonymously.
- 11 Sept, morning — maintainer asks to test the app before it joins onboarding; the welcome card is held on a separate branch. #1643 withdraws the old self-assessment link; #1607 lands a quiz on it.
- 11 Sept, afternoon — maintainer asks to finish both and to make onboarding one flow. Main merged,
#1607 reconciled, the welcome moved into the Edu module as the Connections step, companions #313 and
#193 merged, visual polish (cover CTA, catalog banner, progress copy) done from screenshots on the
local 8340 mesh; a designed cover with a sample-roadmap hero and a share card. Deployed to memex
at 20:21 UTC and verified at
/LearningRoadmap. - 12 Sept — Connections #1670 lands the nudge contract; the learning-path step is registered from the Edu module (Edu 1.10, requires AI 1.8). The package becomes pre-installed (1.1) after the free-tier sweep enrolled every user: a public app needs no entitlements.