Tasks with multiple skills
A problem is a skill bundle
Section titled “A problem is a skill bundle”Real textbook items rarely test one micro-skill. Example:
needs simultaneously:
linear_eq.expand_brackets,arith.signs,linear_eq.move_to_one_side,linear_eq.divide_by_coefficient.
If Ivan has zero mastery on any one — the task fails even if others sit at 0.95.
Combining across skills
Section titled “Combining P(solve)P(\text{solve})P(solve) across skills”We have per-skill . What’s joint for the whole task?
Option A: arithmetic mean (bad)
Section titled “Option A: arithmetic mean (bad)”Three skills: , , .
Looks perfect — selector screams ZPD. Yet Ivan will almost certainly fail — skill 3 sits at 0.20.
Arithmetic mean hides the weak link.
Option B: geometric mean (right)
Section titled “Option B: geometric mean (right)”Same example:
GM 0.565 — much lower than AM. Selector sees it’s not really in ZPD (|| still sizable) and may pick something better.
Why GM punishes weak links harder
Section titled “Why GM punishes weak links harder”If any factor is tiny, the whole product shrinks. Geometric mean inherits that — chain analogy: one weak link snaps the chain.
Comparison table
Section titled “Comparison table”| AM | GM | |||
|---|---|---|---|---|
| 0.5 | 0.5 | 0.5 | 0.500 | 0.500 |
| 0.7 | 0.7 | 0.7 | 0.700 | 0.700 |
| 0.9 | 0.9 | 0.3 | 0.700 | 0.624 |
| 0.95 | 0.95 | 0.2 | 0.700 | 0.503 |
| 0.99 | 0.99 | 0.1 | 0.693 | 0.461 |
| 0.5 | 0.5 | 0.05 | 0.350 | 0.171 |
The wider the gap between strong and weak skills, the further GM drops below AM — exactly what we want.
Try it: AM vs GM vs min
Section titled “Try it: AM vs GM vs min”Slide three sliders side by side. Especially fun: keep P₁=P₂=0.95 and sweep P₃ from 0.05 to 1.0 — GM exposes the weak skill; AM hides it.
When even one P is low, GM drops sharply but AM doesn’t. min is too harsh. GM is the «weakest-link» compromise we need.
Implementation
Section titled “Implementation”In web/lib/bkt.ts we compute GM via sum of logs for numerical stability (tiny products underflow):
const perSkillPL: Record<MicroSkillId, number> = {}; let logSum = 0; for (const skillId of task.microskills) { const pL = state.mastery[skillId] ?? params.pInit; perSkillPL[skillId] = pL; logSum += Math.log(Math.max(1e-6, pSolve(pL, params))); } const pSolveJoint = Math.exp(logSum / task.microskills.length);Note: Math.max(1e-6, ...) guards . In practice stays > 0 thanks to , but the clamp is cheap insurance.
Alternatives we skipped
Section titled “Alternatives we skipped”| Method | Idea | Why not |
|---|---|---|
| Minimum | failure follows weakest skill | Too harsh; strong skills slightly cushion weak ones in reality |
| Product | independence story | Same as GM raised to th power; incomparable across different |
| Harmonic mean | also suppresses weak links | Harder to pitch; similar effect to GM |
| Multidimensional logistic | regress on skill pairs | Needs pairwise parameters — heavy data appetite |
GM — simple, interpretable, mathematically motivated compromise.
Tasks with 5+ skills
Section titled “Tasks with 5+ skills”More skills ⇒ stronger “scatter penalty.” Fine for elementary items; for long multi-step problems (10+ skills) GM can get overly pessimistic.
Hackathon plan: cap tasks at 2–4 micro-skills. If an item needs 7+ — split into steps (one micro-skill each) or admit it’s too large for adaptive modeling.
Talking points: multi-skill tasks
Section titled “Talking points: multi-skill tasks”“We aggregate with geometric mean across micro-skills — so the task fails if any required skill fails. That matches reality better than plain averaging, and corresponds to treating failures as independent events.”
Live example
Section titled “Live example”The same calculation runs against the real matrix on the Progression matrix → Selector simulator page — 9 micro-skills and 20 tasks from the «Defineerimine» topic (curated by Andri Suga). Click “Strong +/−, weak ×/÷” and watch the geometric mean drag down exactly the tasks where the weakened skill is one of the core ones.
And where to practise the solving itself?
Section titled “And where to practise the solving itself?”Companion project — Tom Kabel’s MATx. Once a student has the modeling down (our 9-microskill defining-skills matrix), equations like still need to be solved — that’s a different domain, and Tom has already built a tool for it. The 9↔9 mapping is on the Bridge to MATx page.