Engine · 3

Recognition

Recognition scores how well a story fills a trope's when: pattern and reports a ranked ladder — Confirmed / Possible / In-Flight — without the author naming the trope. It backs the editor's Recognitions panel.

Recall and coverage

Recognition runs in two phases. Recall matches the when: event patterns against the story's events. Coverage then re-checks the static tags, but only on the entities an event role bound. Confidence is the coverage fraction, and it sets the tier. A tag beside an unbound variable is not re-checked, so a discriminator must ride an event (see the style guide).

verb Betrays(agent: char, target: char)

rule Betrayal {
  when:
    evt $e [&Betrays(agent=$t, target=$v)]
    char $t [+Ally!]           // ! necessary: no prior ally, no betrayal
  then:
    $t [+Traitor]
}

char vale [+Ally]
char renn
scene s { beat 1 { evt e [&Betrays(agent=vale, target=renn)] } }

What recognition reads

Recognition matches against the story you derive, not only the one you wrote. Before scoring, it runs the corpus's forward rules to a fixpoint over the chart (engine 0.32.1), so a charted measurement satisfies an anchor on the sign it implies — a [^Temp >= 38] reading derives [=Febrile], and a trope gated on the sign matches the number. This is the same closure predict has always used, so recognition and planning now read one fact set.

Two vocabulary structures ride that expansion. A taxonomy edge ([+Swordsman{Archetype}] under [+Warrior]) lets a specific tag satisfy an ancestor's anchor, one direction only. An exclusive partition lets a present member refute a sibling's anchor — and in an exactly-one partition, an eliminated member is derived from the rest. A rule can also anchor a partition label ([+Allegiance!]) to demand the partition be resolved before it matches. Neither taxonomy nor a partition inflates coverage: they steer what matches, not the score.

Facet-role marks

A when: facet can carry a trailing mark that changes how it counts (all local to the tag):

[=Sign!]  necessary
Its absence gates the candidate — confidence capped below the report floor — so a trope whose distinctive anchor is missing drops out instead of coasting on scaffolding.
[+Risk?]  bonus
A presence-only bonus — lifts confidence when present, ignored when absent. For supporting evidence that should never penalize its own absence.
[=Sign*3]  weight
An evidence weight (a likelihood ratio, default 1). It is recognition-neutral — it does not change confidence or coverage; it only informs the planning verbs (frontier, predict). Marks compose: [=Wounded!*3].

The base-rate prior

A header field @prevalence <tier> gives a trope a base rate. As of engine 0.17.3 it is ranking-only: confidence and the Confirmed/Possible tier are the coverage score alone (prior-independent, so a full-coverage vignette always confirms), and the prior only orders candidates within a tier — a common condition leads a rare one at equal coverage. It is also the prior in predict --bayesian. Recognition also carries each trope's header metadata (its @laconic, @source, and any domain tag) alongside the hit.

Drams — corpus coverage

Recognition scores one trope against one story; drams is the aggregate — how richly a whole corpus reads a story. Where a single trope's coverage (above) is one pattern's fit, drams reports density over coverage across the whole corpus:

coverage ≤ 100%
the fraction of the story's facts that at least one trope explains; 1 − coverage is the gap.
density unbounded
the average number of tropes reading each fact — a rich corpus climbs past 1.0×.
gap a list
the uncovered facts — a prioritized worklist of tropes still to write.

Encoding a story more faithfully adds facts, so coverage can dip until the corpus catches up; it is a corpus-builder's instrument. See the guide.

Interfaces

CLI
tropelang suggest <file> (ranked ladder) · shape <file> --why (per-hit coverage) · drams <file> (density/coverage/gap).
WASM
suggest(src) / suggest_local(src, …) — recognitions with confidence, tier, bindings, span, and header meta; explain(src) — the per-clause "why".