# LCC — Learner's Characteristic Curves

## What it is

LCC is a dynamic micro-student model for tutorial dialogue. It evaluates how
each learner contribution relates to the current instructional question,
expected answers, known misconceptions, the learner's own previous
contributions, and content already covered in the dialogue.

Source materials use both "Learner's Characteristics Curves" and "Learner's
Characteristic Curves". This product normalises on **Learner's Characteristic
Curves (LCC)** while preserving source terminology in scholarly metadata.

LCC supports monitoring productive contribution and possible roadblocks. It may
inform tutoring decisions, but this API keeps measurement separate from
pedagogical action: it returns candidate moves, never actions.

## What it is not

LCC is **not** ICCC applied to one person. ICCC measures a participant against
the other participants and the evolving discussion. LCC measures a learner
against a *versioned instructional reference model*. Remove the reference model
and LCC does not degrade — it becomes inapplicable.

## Preconditions

All of the following, or the API returns `not_applicable` with reasons:

- `interactionType` is `tutorial_dyad` or `group_tutoring`
- at least one participant carries the `learner` role
- at least one tutor or tutoring-agent role exists
- a current instructional question or problem is stated
- a versioned reference model exists with at least one expectation

Misconceptions are strongly recommended but not required. Without them,
irrelevant content stays unmapped rather than being forced into a category.

## The reference model

```jsonc
{
  "referenceModelId": "refm_…",
  "version": "2.1.0",
  "questionOrProblem": "A book rests on a table. Why does it not accelerate downward?",
  "learningObjective": "Distinguish balanced forces from third-law pairs.",
  "language": "en",
  "expectations": [
    { "expectationId": "E1", "description": "…", "weight": 1.0, "required": true }
  ],
  "misconceptions": [
    { "misconceptionId": "M1", "description": "…", "weight": 1.0 }
  ]
}
```

Versions are immutable. Publishing a change requires a new version string, and
every result records the identifier and version it was computed against. The
reference model is proprietary instructional content and is **never** exposed
through a research curve scope.

## The two-by-two space

|  | New | Old / repeated |
|---|---|---|
| **Relevant** | **RN** | **RO** |
| **Irrelevant** | **IN** | **IO** |

- **RN** — the learner adds material aligned with an expectation that has not
  already been adequately expressed.
- **RO** — the learner repeats or paraphrases previously expressed reference-aligned content.
- **IN** — the learner introduces content with low alignment to the reference model.
- **IO** — the learner repeats content with low alignment to the reference model.

"Irrelevant" is relative to the **current instructional goal**. It does not mean
globally meaningless or unimportant. A correct, insightful tangent is IN.
Embedding similarity alone does not distinguish a misconception from a valid
alternative explanation missing from the reference model, nor establish factual
correctness. Misconception matches are reference-match indicators requiring review.

## Operationalisation

Relevance `R` and novelty `N` are estimated per semantic unit and mapped through
piecewise-linear membership functions between versioned thresholds. Soft
membership then gives

```
RN = R·N     RO = R·(1−N)     IN = (1−R)·N     IO = (1−R)·(1−N)
```

which sums to 1 by construction. Six curves are directly inspectable: `R`, `N`,
and the four quadrants. The quadrants are the primary classification; `R` and
`N` expose the underlying dimensions.

The shifted cosine scale is bounded but **not calibrated as a probability**.
Orthogonal vectors map to 0.5; unrelated texts need not be orthogonal. Thresholds
require empirical calibration for the embedding model, language and task.

### Methods

| Method | Behaviour |
|---|---|
| `hybrid` *(preferred)* | Segment into semantic units, compare each with expectations and misconceptions, compare with prior learner content, assign soft membership, aggregate weighted by unit length, return unit-level evidence |
| `factor_product` | Score the whole contribution from its turn-level representation |
| `direct_semantic_classification` | Assign each unit to its dominant embedding-derived quadrant, then aggregate proportions; this is not an independent correctness classifier |

### Accumulation

New clients should use these reference-alignment names. Legacy fields are retained
with identical values for compatibility but deprecated because their names can
misleadingly suggest factual correctness:

| Preferred field | Formula | Deprecated alias |
|---|---|---|
| `relevantNewMass` | RN | `currentCorrectContribution` |
| `offReferenceNewMass` | IN | `currentWrongContribution` |
| `relevantMass` | RN + RO | `accumulatedCorrectContribution` |
| `offReferenceMass` | IN + IO | `accumulatedWrongContribution` |
| `referenceAlignmentScore` | (RN + RO) − (IN + IO) | `overallScore` |

These are *this contribution's* mass and alignment, not running totals. Session
totals live separately in `sessionTotals`. Historical stored artifacts may contain
only the legacy names; recalculation emits both naming sets without changing the
legacy per-turn formulas. Missing values remain `null` in both sets.

Since `lcc-1.1.0`, expectation coverage retains the **maximum per-turn matched
relevance mass**, not its sum: `nextCoverage = max(previousCoverage, contributedAmount)`.
Identical partial evidence therefore cannot fill the remaining coverage through
repetition. Only an increase above the prior maximum is `newContributionAmount`.
This is a conservative reference-match summary, not mastery: without finer-grained
reference subpoints it cannot recognize complementary partial explanations as
distinct parts of a completed expectation. Prior `lcc-1.0.0` results used additive
coverage and should be recalculated before comparisons with this version.

### Unmapped irrelevant content

When irrelevant content does not match any known misconception above the mapping
threshold, it is reported as `unmappedIrrelevantNew` / `unmappedIrrelevantOld`
with `LCC_UNMAPPED_IRRELEVANT_CONTENT`. Forcing it into the nearest
misconception would manufacture evidence.

## Instructional states and tutoring moves

Descriptive states: `productive_contribution`, `relevant_repetition`,
`new_irrelevant_direction`, `repeated_irrelevant_direction`,
`mixed_contribution`, `possible_roadblock`, `insufficient_evidence`.

Candidate moves: `pump`, `self_reflection_prompt`, `hint`, `prompt`,
`elaboration`, `summary`. These are recommendations for a separate tutoring
application. This API never acts on them.

## Prohibited interpretations

- The overall score is **not** mastery, learning gain, ability or effort.
- IN is not stupidity and IO is not stubbornness.
- Validity depends on the reference model's quality as much as the classifier's.
- Nothing here has been externally validated against learning outcomes.

## Reading a curve honestly

A learner whose RN is high early and RO high later is producing more repeated,
reference-aligned material. That pattern alone does not establish consolidation.
A learner with sustained IO may be stuck — or may be pursuing something the
reference model does not represent. The curve tells you where to inspect the
transcript; interpretation requires independent evidence.
