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>
This commit is contained in:
MechaCat02
2026-09-16 19:49:52 +02:00
parent 75dd699f3e
commit e72b77d6c2
34 changed files with 2201 additions and 89 deletions

View File

@@ -1,6 +1,6 @@
{
"version": 4,
"note": "Each unit declares what it TEACHES (adds to the running inventory), what it must AVOID, and the only new WORDS it may introduce. Anything a later unit teaches is, by construction, forbidden now. | v4: 1.5 liaison examples made word-internal; sound-example fences added to 1.6-1.8; duplicate words moved from words[] into revisits[].",
"version": 5,
"note": "Each unit declares what it TEACHES (adds to the running inventory), what it must AVOID, and the only new WORDS it may introduce. Anything a later unit teaches is, by construction, forbidden now. | v4: 1.5 liaison examples made word-internal; sound-example fences added to 1.6-1.8; duplicate words moved from words[] into revisits[]. | v5: every phase ends with a 다지기 review unit that confirms all of its rules and words.",
"phases": [
{
"phase": 1,
@@ -297,6 +297,23 @@
"이야기"
],
"revisits": []
},
{
"id": "1.10",
"ko": "다지기",
"name": "Phase 1 review — every sound rule, every word",
"goal": "Nothing new. This unit exists to prove Phase 1 holds: every one of the nine sound topics, read correctly and named correctly, and every word introduced along the way, recognised without a lookup. You do not leave 한글 until all of it is confirmed.",
"vocabUnit": false,
"review": true,
"teaches": [
"confirming, not adding — everything Phase 1 introduced, proven unaided"
],
"avoid": [
"anything from a later phase",
"introducing any new word — this unit adds none"
],
"words": [],
"revisits": []
}
]
},
@@ -584,6 +601,23 @@
"별로"
],
"revisits": []
},
{
"id": "2.9",
"ko": "다지기",
"name": "Phase 2 review — the frame, confirmed",
"goal": "Nothing new. Confirm the whole basic frame: the copula, 있다/없다, word order and the ending word, pointing and asking, both number systems with their counters, negation in front — and every word Phase 2 introduced.",
"vocabUnit": false,
"review": true,
"teaches": [
"confirming, not adding — everything Phase 2 introduced, proven unaided"
],
"avoid": [
"anything from a later phase",
"introducing any new word — this unit adds none"
],
"words": [],
"revisits": []
}
]
},
@@ -800,6 +834,23 @@
"지키다"
],
"revisits": []
},
{
"id": "3.8",
"ko": "다지기",
"name": "Phase 3 review — every conjugation, confirmed",
"goal": "Nothing new. Confirm the 아/어 rule and all seven irregular classes by producing them on demand, past and future included, plus every verb and adjective Phase 3 introduced.",
"vocabUnit": false,
"review": true,
"teaches": [
"confirming, not adding — everything Phase 3 introduced, proven unaided"
],
"avoid": [
"anything from a later phase",
"introducing any new word — this unit adds none"
],
"words": [],
"revisits": []
}
]
},
@@ -1008,6 +1059,23 @@
"from": "3.5"
}
]
},
{
"id": "4.9",
"ko": "다지기",
"name": "Phase 4 review — every particle, confirmed",
"goal": "Nothing new. Confirm each particle by choosing correctly between them in context — 은/는 against 이/가 especially — and by tracking a dropped subject through an exchange. Plus every word Phase 4 introduced.",
"vocabUnit": false,
"review": true,
"teaches": [
"confirming, not adding — everything Phase 4 introduced, proven unaided"
],
"avoid": [
"anything from a later phase",
"introducing any new word — this unit adds none"
],
"words": [],
"revisits": []
}
]
},
@@ -1237,6 +1305,23 @@
"from": "2.2"
}
]
},
{
"id": "5.11",
"ko": "다지기",
"name": "Phase 5 review — every ending, confirmed",
"goal": "Nothing new. Confirm every ending and clause connector from Phase 5, told apart by feel and not just by shape, plus the honorific and formal registers, plus every word the phase introduced.",
"vocabUnit": false,
"review": true,
"teaches": [
"confirming, not adding — everything Phase 5 introduced, proven unaided"
],
"avoid": [
"anything from a later phase",
"introducing any new word — this unit adds none"
],
"words": [],
"revisits": []
}
]
},
@@ -1419,6 +1504,23 @@
"avoid": [],
"words": [],
"revisits": []
},
{
"id": "6.9",
"ko": "다지기",
"name": "Phase 6 review — reading, confirmed",
"goal": "Nothing new, and the last unit on the roadmap. Confirm every reading skill from Phase 6 — modifiers, quotation, register, spacing, sound words, genre vocabulary — on real manhwa lines at speed.",
"vocabUnit": false,
"review": true,
"teaches": [
"confirming, not adding — everything Phase 6 introduced, proven unaided"
],
"avoid": [
"anything from a later phase",
"introducing any new word — this unit adds none"
],
"words": [],
"revisits": []
}
]
}