at.kotoba.lesson.pack

kotoba.at

Documentation

Lesson content the app drills. Append-only stack; latest = active. Free-form by design: a known core the UI reads + open `meta`/`defaults` round-tripped untouched (SPEC §3.1a). This record body IS the upload interchange shape (lessons/pack.schema.json).

main record

Lesson content the app drills. Append-only stack; latest = active. Free-form by design: a known core the UI reads + open `meta`/`defaults` round-tripped untouched (SPEC §3.1a). This record body IS the upload interchange shape (lessons/pack.schema.json).

Record Key tid Timestamp-based ID

Properties

createdAt string Optional

ISO 8601. NOTE: the app currently stamps a date-only string (YYYY-MM-DD), not a datetime — left unformatted here pending reconciliation (see README).

defaults ref #defaults Optional

No description available.

items array of ref #item Required

No description available.

meta unknown Optional

Pack-level open extension; UI ignores, round-trips.

phase string Optional

Open. kana | vocab | grammar.

rationale string Optional

No description available.

script array of string Optional

Declared scripts; drives chips + Focus. Derived from item types if omitted.

title string Required

No description available.

View raw schema
{
  "key": "tid",
  "type": "record",
  "record": {
    "type": "object",
    "required": [
      "title",
      "items"
    ],
    "properties": {
      "meta": {
        "type": "unknown",
        "description": "Pack-level open extension; UI ignores, round-trips."
      },
      "items": {
        "type": "array",
        "items": {
          "ref": "#item",
          "type": "ref"
        }
      },
      "phase": {
        "type": "string",
        "description": "Open. kana | vocab | grammar."
      },
      "title": {
        "type": "string"
      },
      "script": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Declared scripts; drives chips + Focus. Derived from item types if omitted."
      },
      "defaults": {
        "ref": "#defaults",
        "type": "ref"
      },
      "createdAt": {
        "type": "string",
        "description": "ISO 8601. NOTE: the app currently stamps a date-only string (YYYY-MM-DD), not a datetime — left unformatted here pending reconciliation (see README)."
      },
      "rationale": {
        "type": "string"
      }
    }
  },
  "description": "Lesson content the app drills. Append-only stack; latest = active. Free-form by design: a known core the UI reads + open `meta`/`defaults` round-tripped untouched (SPEC §3.1a). This record body IS the upload interchange shape (lessons/pack.schema.json)."
}
defaults object

Pack-level drill defaults (SPEC §4). Open additional keys round-trip via the pack `meta`.

Properties

katakanaMultiplier integer Optional

Queue weight multiplier for katakana. Fixed-point ×10000 (e.g. 1.5 -> 15000); no float type.

tapToTypeBox integer Optional

Leitner box at/above which a glyph may graduate tap -> type.

minimum: 1maximum: 5
View raw schema
{
  "type": "object",
  "properties": {
    "tapToTypeBox": {
      "type": "integer",
      "maximum": 5,
      "minimum": 1,
      "description": "Leitner box at/above which a glyph may graduate tap -> type."
    },
    "katakanaMultiplier": {
      "type": "integer",
      "description": "Queue weight multiplier for katakana. Fixed-point ×10000 (e.g. 1.5 -> 15000); no float type."
    }
  },
  "description": "Pack-level drill defaults (SPEC §4). Open additional keys round-trip via the pack `meta`."
}
item object

A card. Core: glyph/romaji/type. `glyph` is 1+ chars (single kana, word, or kanji).

Properties

confusableWith array of string Optional

ROMAJI (not glyphs) of same-script confusers; cold-start distractor seed.

gloss string Optional

English meaning; recommended for words/kanji.

glyph string Required

No description available.

meta unknown Optional

Item-level open extension; UI ignores, round-trips.

romaji string Required

Expected reading; lowercase Hepburn, exact case-insensitive match.

row string Optional

Gojuon row label, single kana only.

type string Required

Open. hiragana | katakana | kanji | word.

weight integer Optional

Optional author priority override. Fixed-point ×10000 (e.g. 1.8 -> 18000); lexicons have no float type. App scales at the record edge (see README).

View raw schema
{
  "type": "object",
  "required": [
    "glyph",
    "romaji",
    "type"
  ],
  "properties": {
    "row": {
      "type": "string",
      "description": "Gojuon row label, single kana only."
    },
    "meta": {
      "type": "unknown",
      "description": "Item-level open extension; UI ignores, round-trips."
    },
    "type": {
      "type": "string",
      "description": "Open. hiragana | katakana | kanji | word."
    },
    "gloss": {
      "type": "string",
      "description": "English meaning; recommended for words/kanji."
    },
    "glyph": {
      "type": "string"
    },
    "romaji": {
      "type": "string",
      "description": "Expected reading; lowercase Hepburn, exact case-insensitive match."
    },
    "weight": {
      "type": "integer",
      "description": "Optional author priority override. Fixed-point ×10000 (e.g. 1.8 -> 18000); lexicons have no float type. App scales at the record edge (see README)."
    },
    "confusableWith": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "ROMAJI (not glyphs) of same-script confusers; cold-start distractor seed."
    }
  },
  "description": "A card. Core: glyph/romaji/type. `glyph` is 1+ chars (single kana, word, or kanji)."
}

Lexicon Garden

@