The artifact was reworked after real incidents: a week of lost data, a
student taught out of order, and spelling diagnoses the model invented.
This takes the new export in verbatim; the port catches up in the
commits that follow.
Copied byte-identical from the bundle:
lib/ lexicon.js and sync.js are new; gate.js gains enforcement,
hangul.js letter-level marking, srs.js recall evidence,
conjugation.js deconjugate(); blocks.js now takes the last
block, closes gloss at "=", and parses recall, ::result and
::confirmed
data/ curriculum.json v5 — six 다지기 phase reviews; the 371
roadmap words are unchanged and no band moves
prompt/ English-only rule, recall, LETTER-LEVEL CHECK, marking
audit-gate.mjs, run-checks.sh, fixtures/ — the word gate measured
against 54 real tutor messages
CI runs run-checks.sh in place of validate.mjs alone, and `npm run check`
gains the audit. Baselines: validate PASS 0/0; audit 7 of 41 and 2 of 13.
types/lib/ declares the new API, and test/lib/ pins it: letterCheck on
the prompt's own 짧다/빫다 case, deconjugation, the roadmap-first order
that keeps 마셔 out of Phase 1, sync's three gates, and recall evidence —
including the two ways lib's evidence is looser than PORT.md, pinned as
they are so the call site that tightens them is visibly needed.
TaskHost gains a plain recall renderer so the tree typechecks against the
wider Task union.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
18 lines
7.0 KiB
JSON
18 lines
7.0 KiB
JSON
{
|
|
"note": "The 1.10 다지기 session. Contains two real gate violations to regression-test against: 아파 (unit 3.2) used in a Phase 1 review, and 안 (not) declared in a ::words block and waved through by the old check.",
|
|
"messages": [
|
|
"All four correct, but every one needed the lookup chain first — that's real information: he can recognize and use these words in context (match, build, translate) but pure recall-from-English is still shaky, especially for 머리, which handled fine as recognition earlier but stalled here.\n\n::result\n머리 | ok\n놓다 | ok\n싫어 | ok\n넓다 | ok\n::\n\n::words\n머리 | head / hair | \n놓다 | to put down, to let go | \n싫어 | I hate it / I don't want to | \n넓다 | to be wide | \n::\n\n::progress 87 | recall lags behind recognition — right answers, but only after the lookup crutch",
|
|
"Translate round — let's see these words in sentences instead of isolation.\n\n::task translate\n머리 아파\n싫어! 안 가\n방 넓어\n::\n\n::words\n머리 | head / hair | \n아파 | hurts (casual) | from 아프다\n싫어 | I hate it / I don't want to | \n안 | not | \n가 | go (casual) | from 가다\n방 | room | \n넓어 | is wide (casual) | from 넓다\n::",
|
|
"I need to flag something: I used 안 (not) + verb in that last exercise, and that's not on his roadmap yet — my mistake, dropping it going forward.\n\nOn the answers: 방 넓어 correct. For 머리 아파, \"head hurts\" — you wrote \"leg,\" likely crossing 머리 with 다리; that's a headword mix-up, not a grammar issue. For 싫어! 안 가, since 안 isn't something you've been taught, I won't hold the negation against you — but 싫어 itself means \"I hate it / I don't want to,\" not a command to \"go.\"\n\n::result\n머리 아파 | wrong | read 머리 as \"leg\" (crossed with 다리)\n싫어! 안 가 | wrong | (ungated grammar on my part, not counted)\n방 넓어 | ok\n::\n\n::words\n머리 | head / hair | \n아파 | hurts (casual) | from 아프다\n싫어 | I hate it / I don't want to | \n방 | room | \n넓어 | is wide (casual) | from 넓다\n::\n\n::progress 85 | 머리/다리 confusion surfaced, 넓어 solid in context",
|
|
"Choice round — putting 머리 and 다리 head to head since they got crossed.\n\n::task choice\n머리 아파 means... | My leg hurts | My head hurts | My arm hurts\n다리 아파 means... | My leg hurts | My head hurts | My voice hurts\nWhich one is \"head / hair\"? | 다리 | 머리 | 소리\nWhich one is \"leg / bridge\"? | 다리 | 머리 | 소리\n::\n\n::words\n머리 | head / hair | \n다리 | leg / bridge | \n아파 | hurts (casual) | from 아프다\n소리 | sound | \n::",
|
|
"All four correct, no lookups — the 머리/다리 confusion is cleared up now that they've been set side by side.\n\n::result\n머리 아파 means... | ok\n다리 아파 means... | ok\nWhich one is \"head / hair\"? | ok\nWhich one is \"leg / bridge\"? | ok\n::\n\n::words\n머리 | head / hair | \n다리 | leg / bridge | \n아파 | hurts (casual) | from 아프다\n::\n\n::progress 88 | 머리 vs 다리 contrast resolved cleanly",
|
|
"Match round.\n\n::task match\n넓다 | to be wide\n놓다 | to put down, to let go\n싫어 | I hate it / I don't want it\n닭 | chicken\n하나 | one (Native)\n좋다 | to be good\n습니다 | formal polite verb ending\n앉히다 | to seat someone\n::\n\n::words\n넓다 | to be wide | \n놓다 | to put down, to let go | \n싫어 | I hate it / I don't want it | \n닭 | chicken | \n하나 | one (Native) | \n좋다 | to be good | \n습니다 | formal polite verb ending | \n앉히다 | to seat someone | \n::",
|
|
"All eight correct — nice clean sweep, though 놓다, 앉히다, 싫어, and 습니다 still need the lookup. Good sign that 닭, 하나, 좋다, and 넓다 came straight through unaided.\n\n::result\n좋다 | ok\n닭 | ok\n하나 | ok\n넓다 | ok\n놓다 | ok\n앉히다 | ok\n싫어 | ok\n습니다 | ok\n::\n\n::words\n넓다 | to be wide | \n놓다 | to put down, to let go | \n싫어 | I hate it / I don't want it | \n닭 | chicken | \n하나 | one (Native) | \n좋다 | to be good | \n습니다 | formal polite verb ending | \n앉히다 | to seat someone | \n::\n\n::progress 88 | matching solid across the board, several words still lookup-dependent for recall",
|
|
"Build round — includes some earlier words for retention.\n\n::task build\nPut it down here. | 여기 | 놓아\nI hate coffee. | 나 | 커피 | 싫어\nThat room is wide. | 그 | 방 | 넓어\n::\n\n::words\n여기 | here | \n놓아 | put down (casual) | from 놓다\n나 | I / me | \n커피 | coffee | \n싫어 | I hate it / I don't want it | \n그 | that | \n방 | room | \n넓어 | is wide (casual) | from 넓다\n::",
|
|
"All three correct, no lookups — clean round across 놓아, 싫어, and 넓어 together.\n\n::result\nPut it down here. | ok\nI hate coffee. | ok\nThat room is wide. | ok\n::\n\n::words\n여기 | here | \n놓아 | put down (casual) | from 놓다\n나 | I / me | \n커피 | coffee | \n싫어 | I hate it / I don't want it | \n그 | that | \n방 | room | \n넓어 | is wide (casual) | from 넓다\n::\n\n::progress 90 | building sentences with these words unaided now, strong round",
|
|
"Translate round.\n\n::task translate\n다리 짧아\n너 머리 짧아\n나 커피 싫어\n::\n\n::words\n다리 | leg / bridge | \n짧아 | is short (casual) | from 짧다\n너 | you | \n머리 | head / hair | \n나 | I / me | \n커피 | coffee | \n싫어 | I hate it / I don't want it | \n::",
|
|
"All three correct — nice reading of 머리 as \"hair\" in context this time, right call. 짧아 still needs the lookup, so that one keeps circulating.\n\n::result\n다리 짧아 | ok\n너 머리 짧아 | ok\n나 커피 싫어 | ok\n::\n\n::words\n다리 | leg / bridge | \n짧아 | is short (casual) | from 짧다\n너 | you | \n머리 | head / hair | \n나 | I / me | \n커피 | coffee | \n싫어 | I hate it / I don't want it | \n::\n\n::progress 90 | contextual reading strong, 짧아 alone is the lingering gap",
|
|
"Recall round.\n\n::task recall\nto be short (dictionary form)\none (Native)\nformal polite verb ending\nchicken\n::\n\n::words\n짧다 | to be short | \n하나 | one (Native) | \n습니다 | formal polite verb ending | \n닭 | chicken | \n::",
|
|
"네 개 중 세 개는 맞았어요! 하나, 습니다, 닭 all correct from memory of the meaning (though 습니다 and 닭 still needed lookup to write). But \"to be short\" — you wrote 빫다, which isn't quite right: it should be 짧다, with the double batchim ㄼ (ㄹ+ㅂ) under the 짧, not ㅃ. Easy mix-up since both involve doubled-looking consonants, but they're different letters — ㅃ is a single tense consonant, while ㄼ is two consonants stacked as a batchim.\n\n::result\nto be short (dictionary form) | wrong | wrote 빫다 (confused ㅃ for the ㄼ batchim)\none (Native) | ok\nformal polite verb ending | ok\nchicken | ok\n::\n\n::words\n짧다 | to be short | double batchim ㄼ\n하나 | one (Native) | \n습니다 | formal polite verb ending | \n닭 | chicken | \n::\n\n::progress 87 | 짧다's double batchim spelling slipped under recall pressure"
|
|
]
|
|
} |