Single overwritten record: per-glyph SRS state + the directed confusion map. Read once at startup; overwritten on flush. rkey is literally `self`.
literal:self
Fixed literal value
Properties
confusion
unknown
Required
Directed, single-kana only: shown glyph -> { answered-as romaji: count }. Counts are decayed (x0.9/session) so the app stores them as fixed-point ×10000 INTEGERS (no float type). `unknown` map; the app owns the value scaling at the record edge.
glyphs
unknown
Required
Map keyed by glyph -> { box:int, lastSeen:str, modes:{ tap:{seen,missed,ewmaParseMs|null}, type:{seen,missed,ewmaParseMs|null} } }. Per-mode (tap vs type) success + latency; box is shared. All-integer. Legacy flat records ({box,ewmaParseMs,seen,missed}) are migrated to tap on read. `unknown` because lexicons have no dynamic-key map type (see README).
updatedAt
string
datetime
Required
An RFC 3339 formatted timestamp.
View raw schema
{
"key": "literal:self",
"type": "record",
"record": {
"type": "object",
"required": [
"updatedAt",
"glyphs",
"confusion"
],
"properties": {
"glyphs": {
"type": "unknown",
"description": "Map keyed by glyph -> { box:int, lastSeen:str, modes:{ tap:{seen,missed,ewmaParseMs|null}, type:{seen,missed,ewmaParseMs|null} } }. Per-mode (tap vs type) success + latency; box is shared. All-integer. Legacy flat records ({box,ewmaParseMs,seen,missed}) are migrated to tap on read. `unknown` because lexicons have no dynamic-key map type (see README)."
},
"confusion": {
"type": "unknown",
"description": "Directed, single-kana only: shown glyph -> { answered-as romaji: count }. Counts are decayed (x0.9/session) so the app stores them as fixed-point ×10000 INTEGERS (no float type). `unknown` map; the app owns the value scaling at the record edge."
},
"updatedAt": {
"type": "string",
"format": "datetime"
}
}
},
"description": "Single overwritten record: per-glyph SRS state + the directed confusion map. Read once at startup; overwritten on flush. rkey is literally `self`."
}