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 − coverageis 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 headermeta;explain(src)— the per-clause "why".