Files
Hankan/fixtures/tutor-messages.json
MechaCat02 e72b77d6c2 chore: take in the 16 Sep bundle — lib, curriculum v5, prompt, gate audit
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>
2026-09-16 19:49:52 +02:00

47 lines
30 KiB
JSON

{
"note": "Real 선생님 messages from the artifact, units 1.1-1.9. The gate MUST be measured against these before it is allowed to reject anything: the first version of the scan, which read his prose, would have rejected 17 of these 41.",
"unit": "messages were produced across units 1.1-1.9",
"messages": [
"All correct — 나라 had no lookup this time, so it confirms. 시간, 얼음, 작은 still need one more unaided pass.\n\n::confirmed\n나라\n::\n\n::task match\n얼음 | ice\n작은 | small (modifier)\n시간 | time / hour\n음악 | music\n::\n\n::words\n얼음 | ice | \n작은 | small (modifier) | \n시간 | time / hour | \n음악 | music | \n::\n\n::progress 89 | 나라 confirmed, three holdouts remain for another pass",
"시간 had no lookup this time — confirmed. 작은 and 얼음 still need one clean pass.\n\n::confirmed\n시간\n::\n\n::task match\n얼음 | ice\n작은 | small (modifier)\n목소리 | voice\n하늘 | sky\n::\n\n::words\n얼음 | ice | \n작은 | small (modifier) | \n목소리 | voice | \n하늘 | sky | \n::\n\n::progress 89 | 시간 confirmed, 작은/얼음 still slipping into lookups",
"작은 and 얼음 both correct with no lookup this time — confirmed.\n\n::confirmed\n작은\n얼음\n::\n\n목소리 and 하늘 still need one clean unaided pass.\n\n::task match\n목소리 | voice\n하늘 | sky\n마음 | heart / mind\n이야기 | story\n::\n\n::words\n목소리 | voice | \n하늘 | sky | \n마음 | heart / mind | \n이야기 | story | \n::\n\n::progress 91 | 작은/얼음 finally confirmed, four words left in the open list",
"목소리 and 이야기 correct with no lookup — confirmed.\n\n::confirmed\n목소리\n이야기\n::\n\n마음 and 하늘 still need a clean unaided pass. Let's mix them with words you're solid on.\n\n::task match\n마음 | heart / mind\n하늘 | sky\n바다 | sea\n나무 | tree\n::\n\n::words\n마음 | heart / mind | \n하늘 | sky | \n바다 | sea | \n나무 | tree | \n::\n\n::progress 92 | 목소리/이야기 confirmed, only 마음/하늘 plus a couple rules remain",
"Still leaning on lookups for 마음 and 하늘 — matching keeps letting you pattern-match rather than recall. Let's switch to translating short lines instead.\n\n::task translate\n하늘 좋아\n마음 커\n바다 좋아\n::\n\n::words\n하늘 | sky | \n좋아 | to be good / like | from 좋다\n마음 | heart / mind | \n커 | to be big | from 크다\n바다 | sea | \n::\n\n::progress 90 | 마음/하늘 not landing through matching, trying context sentences",
"하늘 correct with no lookup this time — confirmed.\n\n::confirmed\n하늘\n::\n\n마음 still needs a clean pass. Let's try it alone, paired with something very familiar.\n\n::task translate\n마음 좋아\n바다 좋아\n::\n\n::words\n마음 | heart / mind | \n좋아 | to be good / like | from 좋다\n바다 | sea | \n::\n\n::progress 92 | 하늘 confirmed, 마음 is the one stubborn holdout now",
"Both correct, no lookups — 마음 confirms. (Small note: nothing in the sentence says \"your,\" but you clearly read 마음 as heart, which is what mattered.)\n\n::confirmed\n마음\n::\n\n::progress 93 | 마음 finally landed unaided, vocabulary list nearly closed",
"Targeting the remaining open words directly.\n\n::task match\n입니다 | (formal) is/am/are\n한국말 | Korean language (speech)\n여덟 | eight\n얼굴 | face\n::\n\n::words\n입니다 | (formal) is/am/are | ending word\n한국말 | Korean language (speech) | \n여덟 | eight | \n얼굴 | face | \n::",
"한국말 and 입니다 correct with no lookup — confirmed.\n\n::confirmed\n한국말\n입니다\n::\n\n얼굴 and 여덟 still need one clean pass.\n\n::task match\n얼굴 | face\n여덟 | eight\n발음 | pronunciation\n학년 | school year / grade\n::\n\n::words\n얼굴 | face | \n여덟 | eight | \n발음 | pronunciation | \n학년 | school year / grade | \n::\n\n::progress 95 | 한국말/입니다 confirmed, just 얼굴 and 여덟 plus 첫 낱말 left open",
"All correct with no lookups — 얼굴 and 여덟 both confirm.\n\n::confirmed\n얼굴\n여덟\n::\n\n::progress 97 | vocabulary list closed, only the 첫 낱말 rule remains open",
"Last one standing — plain word recognition, no sound rule at play.\n\n::task translate\n개 좋아\n포도 커\n차 마셔\n::\n\n::words\n개 | dog | \n좋아 | to be good / like | from 좋다\n포도 | grape(s) | \n커 | to be big | from 크다\n차 | tea | \n마셔 | to drink | from 마시다\n::",
"개 correct, no lookup — good. 포도 and 마셔 still needed a look, so let's try plain-reading once more with fully secure words.\n\n::task translate\n아빠 좋아\n토끼 커\n소리 좋아\n::\n\n::words\n아빠 | dad | \n좋아 | to be good / like | from 좋다\n토끼 | rabbit | \n커 | to be big | from 크다\n소리 | sound | \n::\n\n::progress 97 | plain word reading almost proven, one more clean pass needed",
"All three correct with no lookups — that's the clean unaided pass needed.\n\n::confirmed\n첫 낱말\n::\n\n::progress 99 | every rule and word in Phase 1 now proven unaided",
"반가워요. 저는 선생님이에요 — your reading tutor.\n\nPicking up where you left off. Nothing will turn up in an exercise that I haven't taught you first — if it does, tell me and I'll drop it.\n\nThe plan is six phases, 56 units, ending with you reading a manhwa page at speed. **Roadmap** above shows the whole thing; you can jump anywhere in it whenever you like.\n\nHit **시작 · Start unit** below, and we'll pick up 1.10 다지기 — Phase 1 review — every sound rule, every word.",
"좋아요, Fabian. 1.10 다지기에 온 걸 환영해요.\n\n이 유닛은 새로운 게 하나도 없어요. Phase 1에서 배운 아홉 가지 소리 규칙 — 자음과 모음, 겹모음, 된소리·거센소리, 받침, 연음, 비음화, 겹받침, 나머지 소리 변화, 첫 낱말 읽기 — 그리고 그 과정에서 만난 단어들 전부를, 사전 없이 바로 읽고 뜻을 아는지 확인하는 자리예요.\n\n방식은 이래요: 앱이 정한 순서대로 단어와 규칙을 묶음(batch)으로 던져줄 거예요. 한 단어가 \"확인됨\"으로 넘어가려면 서로 다른 라운드에서 세 번 맞아야 해요 — 한 번 맞혔다고 끝난 게 아니에요. 틀리면 다시 큐에 들어가고요. 저는 새로 가르치지 않고, 이미 아는 걸로만 계속 돌릴 거예요.\n\n지금 열려 있는 건 아홉 개 규칙 전부와 100개가 넘는 단어들이에요. 오늘은 그 중 첫 배치 — 여기 · 거기 · 저기 — 그리고 앱이 우선순위로 올린 몇 단어를 같이 섞어서 시작할게요.\n\n첫 라운드는 매칭이에요. 한글과 뜻을 짝지어 보세요.\n\n::task match\n여기 | here\n거기 | there\n저기 | over there\n나 | I, me\n너 | you\n하나 | one\n네 | yes\n많다 | to be many\n::\n\n::words\n여기 | here | place word\n거기 | there | place word\n저기 | over there | place word\n나 | I, me | casual\n너 | you | casual\n하나 | one | native number\n네 | yes | response word\n많다 | to be many | adjective\n::",
"All five correct, no lookups.\n\n✓ 국물 is read as → 궁물\n✓ 작년 is read as → 장년\n✓ 입니다 is read as → 임니다\n✓ 십만 is read as → 심만\n✓ 꽃말 is read as → 꼰말\n\nClean sweep across all three shift types, in two different exercise formats, with no lookups either time. Let's try it from the other direction — hearing the shifted sound and picking the correctly spelled word — and mix in a slide word from last unit so the two rules don't blur together.\n\n::task choice\nWhich word is spelled 국물 (before you apply any sound change)? | 국물 | 굼물 | 궁물\nWhich one uses liaison, not nasalisation? | 한국어 | 입니다 | 작년\nWhich word is read 감사함니다? | 감사합니다 | 감사한니다 | 감사함니다\n::\n\n::words\n국물 | soup broth | read 궁물\n한국어 | Korean language | read 한구거\n입니다 | is / am / are (formal) | read 임니다\n작년 | last year | read 장년\n감사합니다 | thank you | read 감사함니다\n::\n\n::progress 32 | consistent, error-free production of all three nasalisation shifts across formats",
"✓ 국물 → 국물 (correct — that's the spelling itself, no change applied)\n✓ 감사합니다 is read 감사함니다 → correctly picked 감사합니다 as the spelling\n— \"Which one uses liaison, not nasalisation?\" left open. Here's the distinction: 한국어 has a ㄱ final followed by 어, which starts with silent ㅇ — nothing to trigger nasalisation, so the ㄱ just slides over: 한구거. That's liaison. 입니다 and 작년 both have a stop final followed by ㄴ or ㅁ, so they nasalise instead of sliding.\n\nLet's isolate just that contrast.\n\n::task choice\n한국어 | slides (liaison) | nasalises\n작년 | slides (liaison) | nasalises\n입니다 | slides (liaison) | nasalises\n국물 | slides (liaison) | nasalises\n::\n\n::words\n한국어 | Korean language | read 한구거\n작년 | last year | read 장년\n입니다 | is / am / are (formal) | read 임니다\n국물 | soup broth | read 궁물\n::\n\n::progress 32 | shift production solid; needs the liaison-vs-nasalisation trigger distinction explicitly",
"All four correct.\n\n✓ 한국어 → slides (liaison) — followed by silent ㅇ\n✓ 작년 → nasalises — ㄱ before ㄴ becomes ㅇ\n✓ 입니다 → nasalises — ㅂ before ㄴ becomes ㅁ\n✓ 국물 → nasalises — ㄱ before ㅁ becomes ㅇ\n\nThat closes the gap — you now correctly identify not just how each word shifts, but *why*: what's next to the final decides whether it slides or transforms. Between the clean production across all three nasalisation types and this correct trigger distinction, the unit's core content is landing solidly.\n\n::progress 45 | trigger distinction (silent ㅇ vs ㄴ/ㅁ) now correctly identified alongside reliable shift production",
"::task translate\n작년 학교 좋았어\n십만 원 없어\n국물 마셔\n꽃말 몰라\n::\n\nNew word here: 원 isn't on the list, so I'll avoid it — let me swap that line.\n\n::task translate\n작년 학교 좋았어\n국물 마셔\n꽃말 몰라\n한국말 재미없어\n::\n\nNote: 재미없어 isn't on your list either — swapping again.\n\n::task translate\n작년 학교 좋았어\n국물 마셔\n꽃말 몰라\n한국말 안 좋아\n::\n\n::words\n작년 | last year | read 장년\n학교 | school | known\n좋았어 | was good | from 좋다\n국물 | soup broth | read 궁물\n마셔 | drink | from 마시다\n꽃말 | flower's meaning | read 꼰말\n몰라 | don't know | from 모르다\n한국말 | Korean language | read 한궁말\n안 좋아 | not good | known\n::\n\n::progress 45 | building sentence-level practice mixing nasalisation words with known vocabulary",
"Good catch working through the version before my swap — let me mark it, and own a mistake: 원 (won, the currency) was never on this unit's list and I shouldn't have written that line at all. Dropping it now.\n\n✓ 작년 학교 좋았어 → school last year was good\n✓ 국물 마셔 → drink soup broth\n✗ 꽃말 몰라 → you wrote \"don't know the flower,\" but 꽃말 means the flower's *meaning* (its symbolic meaning), not the flower itself — so it's \"don't know the flower's meaning.\"\n— 십만 원 없어 → skip this one, 원 shouldn't have appeared at all.\n\n::words\n꽃말 | flower's meaning | read 꼰말\n몰라 | don't know | from 모르다\n::\n\n::progress 47 | nasalised words read correctly; one vocabulary meaning slip on 꽃말, unrelated to the sound rule",
"::task build\nLast year's school was good. | 작년 | 학교 | 좋았어\nDrink soup broth. | 국물 | 마셔\nDon't know the flower's meaning. | 꽃말 | 몰라\nDon't know Korean. | 한국말 | 몰라\n::\n\n::words\n작년 | last year | read 장년\n학교 | school | known\n좋았어 | was good | from 좋다\n국물 | soup broth | read 궁물\n마셔 | drink | from 마시다\n꽃말 | flower's meaning | read 꼰말\n몰라 | don't know | from 모르다\n한국말 | Korean language | read 한궁말\n::\n\n::progress 47 | reinforcing nasalised vocabulary through sentence assembly",
"All four correct, no lookups.\n\n✓ 작년 학교 좋았어\n✓ 국물 마셔\n✓ 꽃말 몰라\n✓ 한국말 몰라\n\nClean across the board, and 꽃말's meaning has clearly stuck after the correction. You're now reliably producing all three nasalisation shifts, distinguishing them from liaison by trigger, and reading them correctly inside full sentences with no lookups. That's a solid, rounded grasp of this unit's target.\n\n::progress 58 | full sentence production clean with no lookups; core nasalisation rule solidly landed",
"::task match\n몇 명 | 면명\n직업 없어 | 지겅 업써\n십만 | 심만\n작년 | 장년\n꽃말 | 꼰말\n국물 | 궁물\n::\n\nNew word this round: 몇 명 (how many people) — 몇's representative sound is ㄷ, and before 명's ㅁ it becomes ㄴ.\n\nNote: I need to flag something — \"지겅 업써\" isn't right, that's tensification territory (없어 has its own separate shift) which isn't part of this unit. Let me drop that line entirely and keep this clean.\n\n::task match\n몇 명 | 면명\n십만 | 심만\n작년 | 장년\n꽃말 | 꼰말\n국물 | 궁물\n한국말 | 한궁말\n::\n\n::words\n몇 명 | how many people | read 면명\n십만 | one hundred thousand | read 심만\n작년 | last year | read 장년\n꽃말 | flower's meaning | read 꼰말\n국물 | soup broth | read 궁물\n한국말 | Korean language | read 한궁말\n::\n\n::progress 58 | introducing 몇 명 as a new nasalisation example, avoided drifting into an ungated sound rule",
"✓ 십만 = 심만 (correct, though you looked this one up — worth another pass)\n✓ 꽃말 = 꼰말\n✓ 몇 명 = 면명\n✓ 국물 = 궁물\n✓ 작년 = 장년\n— 직업 없어: I'd already pulled that one from the exercise since it involves a different sound rule not covered yet, so no mark either way there — nothing to worry about.\n\nEverything else, including the new word 몇 명, landed correctly. Since 십만 needed a lookup, let's bring it back shortly. For now, a quick round mixing today's words with no repeats to check retention without the crutch.\n\n::task translate\n작년 국물 좋아\n몇 명 몰라\n꽃말 몰라\n한국말 좋아\n::\n\n::words\n작년 | last year | read 장년\n국물 | soup broth | read 궁물\n좋아 | good / like | known\n몇 명 | how many people | read 면명\n몰라 | don't know | from 모르다\n꽃말 | flower's meaning | read 꼰말\n한국말 | Korean language | read 한궁말\n::\n\n::progress 58 | 십만 needed a lookup, rest solid; retention check underway",
"All four correct.\n\n✓ 작년 국물 좋아 → last year's broth was good\n✓ 몇 명 몰라 → don't know how many people\n✓ 꽃말 몰라 → don't know the flower's meaning\n✓ 한국말 좋아 → like Korean\n\nThe meanings are right every time, but you looked up nearly the whole set — including 작년, 국물, and 몰라, which you've read correctly unaided several rounds running. That's a sign the reading is solid but not yet automatic; it hasn't moved into memory the way it should. Let's do a fast, low-pressure recognition round with the same words, no new ones, to help that settle.\n\n::task choice\n작년 means | last year | this year | next year\n국물 means | rice | soup broth | flower\n몰라 means | know | don't know | don't like\n꽃말 means | flower | flower's meaning | flower shop\n::\n\n::words\n작년 | last year | read 장년\n국물 | soup broth | read 궁물\n몰라 | don't know | from 모르다\n꽃말 | flower's meaning | read 꼰말\n::\n\n::progress 58 | translation accuracy strong but heavy lookup reliance suggests recognition not yet automatic",
"All four correct, no lookups this time.\n\n✓ 작년 means → last year\n✓ 국물 means → soup broth\n✓ 몰라 means → don't know\n✓ 꽃말 means → flower's meaning\n\nGood — with the meaning locked in via pure recognition, the earlier lookups were about vocabulary retention, not the sound rule itself. On the actual target of this unit, you've now shown, repeatedly and across every format, that you correctly nasalise ㄱ→ㅇ, ㄷ→ㄴ, and ㅂ→ㅁ, that you distinguish nasalisation from liaison by trigger, and that you read the shifted sentences correctly. That's the core of 1.6 solidly in place.\n\n::progress 62 | nasalisation rule itself fully reliable across all formats; vocabulary retention lagging slightly behind but improving",
"Good question. 말 by itself means \"word\" or \"speech/language.\" So it's not that 말 changes meaning — it's the same word both times, just combining differently with what's in front of it.\n\n한국말 = 한국 (Korea) + 말 (speech/language) → \"Korea-language\" → Korean.\n꽃말 = 꽃 (flower) + 말 (word) → \"flower-word\" → the word/meaning a flower carries, i.e. its symbolic meaning.\n\nSame building block, different first half, so the compound lands somewhere different in English — but in both cases 말 is just \"word/language\" doing its normal job.\n\n::words\n말 | word / language / speech | building block in compounds\n한국말 | Korean language | 한국 + 말, read 한궁말\n꽃말 | flower's meaning | 꽃 + 말, read 꼰말\n::",
"::task build\nLast year I didn't know the flower's meaning. | 작년 | 꽃말 | 몰랐어\nI don't know how many people like Korean. | 몇 명 | 한국말 | 좋아하는지 | 몰라\nDrink the soup broth, it's good. | 국물 | 마셔 | 좋아\n::\n\nThat middle one reaches for a form you haven't seen — dropping it.\n\n::task build\nLast year I didn't know the flower's meaning. | 작년 | 꽃말 | 몰랐어\nDrink the soup broth, it's good. | 국물 | 마셔 | 좋아\nI don't know Korean. | 한국말 | 몰라\n::\n\n::words\n작년 | last year | read 장년\n꽃말 | flower's meaning | read 꼰말\n몰랐어 | didn't know | from 모르다\n국물 | soup broth | read 궁물\n마셔 | drink | from 마시다\n좋아 | good / like | known\n한국말 | Korean language | read 한궁말\n몰라 | don't know | from 모르다\n::\n\n::progress 62 | continuing to reinforce nasalised vocabulary in production tasks",
"겹받침 — this unit is about blocks that end in TWO consonants stacked together, like ㄺ, ㄳ, ㄼ, ㄵ, ㅄ. Korean blocks can only hold one final sound out loud, so when nothing follows, only ONE of the two consonants is actually pronounced — the other is silent, just sitting there in the spelling. Which one survives isn't fully predictable by rule; it's learned word by word, the same way you just memorise that 닭 sounds like 닥.\n\nSome examples of the silent half at the end of a word:\n닭 (chicken) — ㄹ+ㄱ batchim, but only ㄱ is heard → 닭 [닥]\n값 (price) — ㅂ+ㅅ batchim, only ㅂ is heard → 값 [갑]\n여덟 (eight) — ㄹ+ㅂ batchim, only ㄹ is heard → 여덟 [여덜]\n\nBut when a VOWEL follows — same liaison idea you already know, where a final consonant slides into a following ㅇ block — something different happens with a double batchim: instead of only one consonant surviving, the SECOND one slides across into the next syllable, and the first stays put. So 읽다 (to read) with the ending -어 becomes 읽어, and it splits: ㄹ stays behind as the final of the first block, ㄱ slides over to become the onset of the second block.\n\n읽어 → 일거 (reads / reading)\n\nThat's the one new mechanic this unit — everything else is just learning which consonant is silent, word by word.\n\nThe mistake to watch for: assuming double batchim always drops the SAME consonant (like always keeping the first or always keeping the second). It doesn't — 닭 keeps the first (ㄱ, wait — keeps ㄱ which is second in writing order but that's just how ㄺ is built), while 여덟 keeps ㄹ, the first. There's no shortcut — treat each word as its own item to learn.\n\n::task match\n닭 | chicken\n값 | price\n여덟 | eight\n읽다 | to read\n::\n\n::words\n닭 | chicken | read 닥\n값 | price | read 갑\n여덟 | eight | read 여덜\n읽다 | to read | dictionary form\n읽어 | reads / read | splits as 일거 with a vowel ending\n::\n\n::progress 15 | new unit just introduced, first exposure to double batchim concept",
"All four correct, no lookups.\n\n✓ 닭 = chicken\n✓ 여덟 = eight\n✓ 값 = price\n✓ 읽다 = to read\n\nClean first pass on brand-new vocabulary — good start. Now let's check whether you've actually got the SOUND each one makes, not just the meaning, since that's the real point of this unit.\n\n::task choice\n닭 is read | 닥 | 달 | 닭\n값 is read | 갑 | 갓 | 값\n여덟 is read | 여덟 | 여덜 | 여덥\n읽다 is read | 읽다 | 익다 | 일따\n::\n\n::words\n닭 | chicken | read 닥\n값 | price | read 갑\n여덟 | eight | read 여덜\n읽다 | to read | read 익따\n::\n\n::progress 20 | vocabulary meanings solid on first exposure; now testing which half of each double batchim is actually heard",
"✓ 닭 is read → 닥\n✓ 값 is read → 갑\n✓ 읽다 is read → 익다 — right, the ㄹ drops and only ㄱ is heard\nopen: 여덟 — this one is read 여덜. The batchim is ㄹ+ㅂ, but here it's the ㄹ that survives and the ㅂ that stays silent, the opposite pattern from 닭. That's exactly the \"no shortcut, learn it per word\" point from the intro.\n\nThree out of four landed with no hesitation — the pattern is starting to stick, you just haven't met 여덟's split yet. Let's drill it specifically now.\n\n::task choice\n여덟 is read | 여덜 | 여덥 | 여덟\n닭 is read | 닥 | 달 | 닭\n여덟 살 이야 (I'm eight years old) — how is 여덟 read here | 여덜 | 여덥 | 여덟\n값 is read | 갑 | 값 | 갓\n::\n\n::words\n여덟 | eight | read 여덜\n닭 | chicken | read 닥\n살 | years old | known\n이야 | is / am (casual) | known\n값 | price | read 갑\n::\n\n::progress 30 | three of four double batchim readings correct on first try; 여덟's ㄹ-surviving pattern needs isolated repetition",
"All four correct, no lookups.\n\n✓ 여덟 is read → 여덜\n✓ 닭 is read → 닥\n✓ 여덟 살 이야 → 여덜 (same word, holds even inside a sentence)\n✓ 값 is read → 갑\n\nThat's 여덟 locked in now, including in context — you didn't get thrown by the extra words around it. All four double batchim words so far (닭, 값, 여덟, 읽다) are being read correctly and consistently. Next let's bring in the new mechanic from the intro — what happens when a vowel follows and the second consonant slides across.\n\n::task choice\n읽어 (reads) is read | 읽어 | 일거 | 익어\n닭 이 있어 (there is a chicken) — how does 닭이 sound | 다기 | 달기 | 닥이\n값 이 있어 (there is a price) — how does 값이 sound | 갑시 | 가비 | 갑이\n::\n\n::words\n읽어 | reads / read | from 읽다\n닭이 | chicken (+이) | liaison example\n값이 | price (+이) | liaison example\n있어 | there is / have | known\n::\n\n::progress 40 | all four core double batchim words solid; introducing vowel-liaison splitting behaviour next\n</br>",
"All three correct.\n\n✓ 읽어 (reads) → 일거\n✓ 닭이 (there is a chicken) → 달기\n✓ 값이 (there is a price) → 갑시\n\nThat's the split mechanic landing perfectly on the first try, across three different double batchim types — ㄺ and ㅄ both handled correctly, on top of the plain no-vowel readings you'd already nailed. You're reading these confidently now rather than guessing.\n\n::task translate\n닭 있어\n값 몰라\n여덟 살 이야\n읽어\n::\n\n::words\n닭 | chicken | read 닥\n있어 | there is / have | known\n값 | price | read 갑\n몰라 | don't know | from 모르다\n여덟 | eight | read 여덜\n살 | years old | known\n이야 | is / am (casual) | known\n읽어 | reads / read | from 읽다\n::\n\n::progress 55 | vowel-liaison split fully correct across two different double batchim types on first attempt",
"All four correct in meaning.\n\n✓ 닭 있어 → there is a chicken\n✓ 값 몰라 → I don't know the price\n✓ 여덟 살 이야 → I am 8 years old\n✓ 읽어 → I read\n\nEverything here is right, and the lookups (몰라, 살) are older vocabulary rather than anything from this unit — the double batchim words themselves (닭, 값, 여덟, 읽어) all went through without a check this time. That's the real signal: this unit's actual content is sticking well after just a few rounds — both the silent-half readings and the vowel-liaison split have been consistent across multiple word types now.\n\n::progress 62 | double batchim words now read without lookup; rule application solid across silent and liaison contexts",
"::task build\nI don't know the chicken's price. | 닭 | 값 | 몰라\nI read the flower's meaning. | 꽃말 | 읽어\nThere are eight students. | 학생 | 여덟 | 명 | 있어\n::\n\n::words\n닭 | chicken | read 닥\n값 | price | read 갑\n몰라 | don't know | from 모르다\n꽃말 | flower's meaning | read 꼰말\n읽어 | reads / read | from 읽다\n학생 | student | known\n여덟 | eight | read 여덜\n명 | people (counter) | known\n있어 | there is / have | known\n::\n\n::progress 62 | building sentences that combine double batchim words with earlier vocabulary and nasalisation",
"All three correct, no lookups.\n\n✓ 닭 값 몰라\n✓ 꽃말 읽어\n✓ 학생 여덟 명 있어\n\nClean across the board, and this one's worth noting: 닭 값 sitting next to each other doesn't trigger liaison here because they're separate words in the sentence, not one block flowing into the next the way 닭이 did — you handled that distinction correctly without it being pointed out. Double batchim reading, the vowel-split, and correct word order with a counter are all working together smoothly now.\n\n::progress 68 | combining double batchim vocabulary into full sentences with no errors and no lookups",
"::task match\n앉다 | to sit\n없다 | to not exist / not have\n많다 | to be a lot / many\n넓다 | to be wide\n짧다 | to be short\n삶 | life\n::\n\n::words\n앉다 | to sit | dictionary form\n없다 | to not exist / not have | dictionary form\n많다 | to be a lot / many | dictionary form\n넓다 | to be wide | dictionary form\n짧다 | to be short | dictionary form\n삶 | life | noun\n::\n\n::progress 68 | introducing remaining new-word set for this unit via meaning matching before testing their sounds",
"All six correct in meaning.\n\n✓ 짧다 = to be short\n✓ 삶 = life\n✓ 많다 = to be a lot / many\n✓ 앉다 = to sit\n✓ 없다 = to not exist / not have\n✓ 넓다 = to be wide\n\nThat's a fresh set of six new words, all matched correctly on the first pass — looking them up to get the meaning is completely normal here, since this is their very first appearance. Now the real double batchim test: how each of these actually sounds when spoken, since that's the whole point of this unit, not just recognizing them on paper.\n\n::task choice\n앉다 is read | 안따 | 앋다 | 앉다\n없다 is read | 업다 | 없다 | 얼다\n많다 is read | 만타 | 많다 | 마다\n넓다 is read | 널따 | 넙다 | 넓다\n짧다 is read | 짤따 | 짭다 | 짧다\n삶 is read | 삼 | 살 | 삶\n::\n\n::words\n앉다 | to sit | read 안따\n없다 | to not exist / not have | read 업따\n많다 | to be a lot / many | read 만타\n넓다 | to be wide | read 널따\n짧다 | to be short | read 짤따\n삶 | life | read 삼\n::\n\n::progress 70 | meanings solid for new word set; now testing actual pronunciation of each double batchim\n</br>",
"All six correct.\n\n✓ 앉다 is read → 안따\n✓ 없다 is read → 업다\n✓ 많다 is read → 만타\n✓ 넓다 is read → 널따\n✓ 짧다 is read → 짤따\n✓ 삶 is read → 삼\n\nFull set, right on the first attempt — even though you needed the meanings looked up, the sound pattern (which half of the double batchim survives) was correct across all six new words without a single miss. That's the actual skill this unit is testing, and it's transferring well to brand-new vocabulary you'd never seen before this round.\n\n::progress 76 | new word set's double batchim readings all correct on first exposure; strong transfer of the core skill",
"Not a hard rule, no — that's exactly why this unit calls them \"learned as items\" rather than by rule. But there is a rough tendency you can lean on, even if it has exceptions:\n\nFor most double batchim, the FIRST consonant tends to survive and the second drops — that's what happens in 앉다 (ㄴ survives), 많다 (ㄴ survives), 넓다 (ㄹ survives), 짧다 (ㄹ survives), 여덟 (ㄹ survives).\n\nㄺ is the odd one out — there the SECOND consonant (ㄱ) survives instead, as in 닭 and 읽다. That's really the one pattern worth memorising as an exception: \"ㄺ keeps the ㄱ,\" everything else you've seen so far keeps the first.\n\n값 fits the general tendency too — ㅂ is first, and ㅂ survives.\n\nSo: default guess = first one survives, with ㄺ words as the flagged exception. It's a decent guide for a new word, not a guarantee — which is exactly why native speakers just know it per word rather than deriving it.\n\n::progress 76 | conceptual understanding of the survives-which-half question now explicit, not just pattern-matched",
"::task translate\n의자 많이 없어\n학생 앉아\n꽃 넓어\n삶 짧아\n::\n\nWait — let me give you a cleaner set, some of these words need an ending you haven't drilled. Here's the actual exercise:\n\n::task translate\n친구 많이 없어\n학생 앉아\n바다 넓어\n삶 짧아\n::\n\n::words\n친구 | friend | known\n많이 | a lot | from 많다\n없어 | there isn't / don't have | from 없다\n학생 | student | known\n앉아 | sits / sitting | from 앉다\n바다 | sea | known\n넓어 | is wide | from 넓다\n삶 | life | noun\n짧아 | is short | from 짧다\n::\n\n::progress 76 | building sentences with new double batchim adjectives combined with earlier vocabulary"
]
}