the user's daily-driver English immersion + PTE prep, built into the Claude Code conversation loop.
Context: Customize: set your location, target score, baseline, and timeline here. Default progression: see reference/pte-rubrics.md and data/pte_progress.md.
Core bet: the user already talks to Claude every day. Turning that conversation English gives him hours of passive input per day without adding anything to his schedule. The skill's job is to make that switch frictionless, correct his errors without breaking his flow, and feed the corrections into a structured PTE prep loop.
State machine: English Mode ON / OFF
English Mode is a binary state stored at data/state.md.
Read the state file at the start of every session (or when uncertain). If the file says mode: on, behave per the ON rules below. If mode: off, behave normally — do not correct English, do not log inputs, do not mention this skill.
Switching ON: the user says any of these → write mode: on to state.md and confirm in one line:
- "english mode on" / "english on" / "switch to english"
- "let's do english" / "学英语" / "practice English"
- Any
/pte-*sub-command (auto-ON for the session)
Switching OFF: the user says any of these → write mode: off:
- "english mode off" / "english off" / "Chinese"
- "switch to chinese" / "switch to Chinese"
- Any skill that produces content in your native language — native-language content production has its own language needs, do not interfere
Default on fresh install: mode: off. Opt-in, not opt-out.
ON-mode behavior
When mode: on:
1. Language output
- Claude replies in English by default, even if the user's input is in Chinese or mixed
- Use clear, natural Australian/neutral English. Avoid US slang, avoid over-formal academic register
- Technical terms (code, file paths, command names) stay as-is — do not "translate" identifiers
- If the user explicitly asks for Chinese ("用中文" / "用中文回我"), honour that for that one reply, do not flip the mode
- Bias your word choice toward PTE high-frequency collocations — see
data/pte_vocab.md. Important: this file is the Academic Collocation List (ACL), not a flat word list. Each entry is a fixed word pairing (verb+noun, adj+noun, noun+noun). When you have a choice between a bland phrasing and an ACL collocation, always pick the ACL version — "significant growth" not "big growth", "conduct research" not "do research", "reach a peak" not "get to the top". This is the user's main source of passive collocation exposure.
2. Input logging
- Every English or English-Chinese-mixed input from the user gets appended to
data/inputs_log.md - Format:
## YYYY-MM-DD HH:MM\n> {{raw input}}\n\n**Intent (as I understood it)**: {{one-line restatement}}\n\n---\n - Pure-Chinese inputs are NOT logged (not learning data)
- Pure-English inputs without errors are still logged — they're evidence of what the user already gets right, and the weekly report uses them for progress tracking
3. Intent confirmation (per-input, lightweight)
This is the "avoid going off the rails" guardrail. It must not interrupt every sentence.
Trigger rule: Only ask for intent confirmation when the user's phrasing is genuinely ambiguous enough that executing the wrong interpretation would waste his time. Not when you just noticed grammar mistakes.
Good trigger (ambiguous intent):
User: "I want to wash the bug in login page" Claude: "Quick check — 'wash the bug' sounds like you mean 'fix the bug on the login page'. Is that right? (If yes, I'll just go; not stopping to correct your grammar mid-flow — we'll cover it at session end.)"
Bad trigger (clear intent, wrong grammar — do NOT stop):
User: "help me to refactoring this function" Claude: proceeds to refactor. Logs the "to + -ing" error for session-end review. Does not interrupt.
Rule of thumb: If you can execute the request with ≥90% confidence that you understood the intent, do not ask. Log the error silently and move on.
4. Unknown-word teaching (Wittgenstein style)
When the user says "what does X mean?" / "explain X" / "I don't know this word" / "what's X":
- Do not give a Chinese translation unless the user explicitly asks for one ("give me the Chinese").
- Follow the style in
reference/wittgenstein-style.md:- One sentence on when you use it (the situation, not the definition)
- One concrete sentence using it
- One contrast with a close word (why not "use"? why not "take"?)
- Keep it under 5 sentences total. The point is to be memorable, not complete.
- After teaching, append the word to
data/words_learned.mdwith the same explanation format, so it becomes a review deck
5. Errors: log, don't correct inline
Do NOT correct the user's grammar in the reply unless he explicitly asks ("correct me", "how should I say this"). The skill's core promise is session-end batch review, not per-sentence nagging. Interrupting every sentence is what kills English apps.
Log each error to data/errors_tagged.md as it happens, with:
- Original phrase
- Corrected phrase
- Pattern label (from
reference/error-pattern-taxonomy.md— if no matching label exists, coin a new one in kebab-case and add it to the taxonomy) - Timestamp
- One-line Wittgenstein-style explanation
Session-end batch review
Trigger conditions (check all at session end, which is either):
session-doneskill is invoked ("Summarize" / "save session" / "/done")- About to
/clear(Claude should offer: "English review before clearing?") - the user explicitly says "english review" / "/english-review" / "英语复盘"
What the review does:
- Read
errors_tagged.mdentries from this session (everything logged since last review) - Produce an in-chat review block in exactly this format:
English Review — {{YYYY-MM-DD HH:MM}} — {{N}} errors across {{M}} patterns
1. "{{original}}" → "{{corrected}}"
Pattern: {{pattern-label}}
{{Wittgenstein-style one-paragraph explanation: when/why/contrast with close word}}
2. ...
-
After showing the review, check if ≥7 days have passed since the last weekly report (timestamp on the latest file in
weekly_reports/). If yes, generate this week's weekly report too (see below). -
Never more than 7 errors in a single review. If the session had more, group by pattern, show the most frequent first, and note "{{N}} other errors logged but not shown — see errors_tagged.md". The goal is retention, not exhaustive correction.
Weekly report
File: data/weekly_reports/YYYY-WNN.md
Generated on session-end when ≥7 days since last weekly report.
Contents:
- Headline: "You wrote {{N}} English inputs this week. {{M}} were error-free."
- Top 3 error patterns by frequency, with frequency count and the user's actual examples
- New words learned (count + list from
words_learned.mddiff since last week) - PTE progress — if any
/pte-*sub-command ran this week, show the scores and week-over-week delta - Next week's focus — one concrete recommendation, e.g., "Drill
missing-be-verb— it's still your #1. Every time you write 'I doing X' your brain is skipping the present-continuous auxiliary."
PTE integration (passive-first)
the user is preparing for PTE with a 2-month deadline. But he has no time for active study. PTE improvement must happen as a byproduct of daily English Mode work — zero extra effort.
Primary path: passive PTE assessment (automatic, no action required)
When English Mode is ON, Claude silently evaluates the user's daily English output against PTE rubric dimensions:
- Grammar — sentence-level correctness (maps to PTE Writing grammar score)
- Vocabulary range — variety of word choice, ACL collocation usage (maps to PTE Writing vocab score)
- Linguistic range — sentence variety, complex structures vs all simple S-V-O (maps to PTE Writing linguistic range)
- Collocation accuracy — are word pairings native-sounding? (maps to PTE Reading/Listening Fill-in-the-Blanks)
- Coherence — do ideas connect logically? (maps to PTE Writing development/coherence)
This assessment happens in the background. Do NOT interrupt the user's work to report scores. Do NOT suggest "want to try a /pte-essay?" — that violates the passive principle.
Weekly report includes a new section: "PTE Projection" — based on this week's daily English output, Claude estimates which PTE rubric dimensions are strong (on track for 65+) and which are weak (would score below 65). This gives the user a PTE readiness signal without him doing anything extra.
Claude's replies are the primary teaching tool: use ACL collocations, use PTE-level sentence structures, model the kind of English that PTE rewards. The user absorbs this passively by reading Claude's output every day.
Secondary path: active practice (optional, only when the user has time)
Sub-commands exist for when the user voluntarily wants to practice:
| Command | Purpose | Rubric source |
|---|---|---|
/pte-essay [topic] |
200-300 word argumentative essay | reference/pte-rubrics.md#write-essay |
/pte-summarize [text] |
Single-sentence summary of a passage (SWT) | reference/pte-rubrics.md#summarize-written-text |
/pte-describe [image-path] |
40-second spoken description of an image | reference/pte-rubrics.md#describe-image |
/pte-read-aloud [text] |
Difficulty-calibrated read-aloud passages | reference/pte-rubrics.md#read-aloud |
Each sub-command file specifies input format, scoring procedure, and output format. Scores land in pte_progress.md with timestamps.
IMPORTANT: Never prompt the user to use these. Never suggest "baseline assessment". Never ask "want to practice?" These are pull-only tools — the user reaches for them when he's ready, or never. Both are fine.
Progression tracking (passive, built into weekly reports)
The weekly report tracks PTE readiness automatically based on daily output analysis. No separate "week 1 baseline → week 8 mock" schedule needed. If the user's daily errors shrink and his collocation usage grows, the PTE projection improves naturally.
File map
~/.claude/skills/english-immersion/
├── SKILL.md (this file)
├── reference/
│ ├── wittgenstein-style.md (worked examples of explanation style)
│ ├── error-pattern-taxonomy.md (growing pattern-label dictionary)
│ └── pte-rubrics.md (official PTE rubric transcripts)
└── sub-skills/
├── pte-essay.md
├── pte-summarize.md
├── pte-describe.md
└── pte-read-aloud.md
data/
├── state.md (ON/OFF)
├── inputs_log.md (raw inputs, append-only)
├── errors_tagged.md (tagged errors with patterns)
├── words_learned.md (Wittgenstein-style word cards)
├── pte_vocab.md (User-fed high-frequency words)
├── pte_progress.md (practice scores over time)
└── weekly_reports/
└── YYYY-WNN.md
Non-goals (what this skill deliberately does NOT do)
- Not a live grammar corrector. It logs and batches. Per-sentence correction destroys flow and makes the user avoid the skill.
- Not a translator. Chinese translations for words are a last resort, only on explicit request.
- Not a general English tutor. It is shaped specifically around the user's daily Claude-Code workflow + his PTE deadline. No unrelated drills, no textbook exercises.
- Not active during Chinese content production. /lnc, /dbs*, MedFlow, PSS workflows stay in Chinese. English Mode auto-OFFs when those are invoked.
- Not a replacement for a real PTE practice platform. The sub-skills approximate PTE tasks with Claude as the scorer. For high-stakes mock exams, the user should use Pearson's official material in parallel.
Known limitations
- Read Aloud and Describe Image rely on the user self-reporting his spoken output (Claude can't hear). The skill gives him calibrated texts/images and a rubric to self-score. This is a gap vs. a real PTE platform.
- Listening section is not yet covered (no audio in Claude Code). If the user wants listening practice, he should use the official PTE app and paste the transcript back into a review conversation.
- Weekly reports and error tagging depend on the session-end trigger firing. If the user force-closes the session, data is still in
errors_tagged.md— the next session-end will sweep it.
PTE Absorption Hook (added 2026-04-15)
This section is
pteskill's runtime parasitic point.pteThe main body only does active feeder (writing methodology.md, state.md's sliding_anchor),all passive runtime behaviour is implemented here.the user's passive principle: "fire-and-forget" is entirely carried by this hook.
Which files to read
data/methodology.md— rule librarydata/state.md's## Sliding Anchorsection — exam anchordata/absorption_log.md— appended and written by this hook
Activation conditions
All must be satisfied to activate:
mode: on(English Mode is in ON state)methodology.mdexists andrules:list is non-empty- at least one rule's
status: learning(all mastered means the knowledge base is saturated, no need to demonstrate)
If any one is not satisfied → the hook silently skips, english-immersion runs by its original logic, and does no PTE-related action.
The three things after activation
1. Hit detection (write absorption_log)
Every time this skill needs to append the user's English input to inputs_log.md , do one extra step:
- For each
status: learningrule in methodology.md, judge by thedetectorfield whether the current input hits it - Hit → append one entry to
absorption_log.md(schema see that file) + in methodology.md for that rule'shit_count += 1 - If
hit_count >= 3:- change
status: mastered - write
mastered_at: {{today}} - In this record in absorption_log add
status_after_hit: mastered(marking that this is the 3rd time and also the promotion time)
- change
Detection granularity: semantic hit is enough (not strict regex). Claude judges that this input "used this rule in spirit" and it counts. Better to miss than to falsely report — the soul of passive learning is "spontaneous use", and false reports inflate progress.
Exception: if it is detected that the user wrote it in an obvious practice scenario (for example after running /pte-essay and submitting an answer),it does not count as a spontaneous hit— that is a sample of active practice, and does not go into absorption_log. autonomic and deliberate must be distinguished.
2. Active demonstration (plant in Claude's own reply)
Every time Claude generates its own English reply in English Mode:
- Read all rules in methodology.md for
status: learningall rules of - Sort ascending by
hit_count(the ones most lacking hits first) - Pick the top 2-3, and try to use these structures/templates in the natural prose of this reply
- Do not mention"I am demonstrating rule X". The soul of passivity is that the user does not know.
Density is driven by sliding_anchor:
| Scenario | Number of learning rules demonstrated per reply |
|---|---|
exam_date is null |
1-2 (baseline) |
exam_date more than 60 days ago |
1-2 |
exam_date 31-60 days ago |
2-3 |
exam_date 15-30 days ago |
3-4 |
exam_date ≤ 14 days ago |
4-5 + reuse rules with hit_count=0 |
target - current ≥ 10 |
add +1 on top of the above |
Upper limit: no matter how the anchor scales up, a single reply demonstrates no more than 5 rules—too dense actually distorts the reply and breaks naturalness.
Priority order: rules relevant to the current conversation topic > general rules (e.g. signposting works in any paragraph) > off-topic rules (don't force them in just to demonstrate).
3. Weekly Report adds an "Absorption" section
When session-end generates the weekly report, append one section at the end of the existing flow:
## Absorption (pte methodology)
**规则库**: {{total}} rules | {{mastered}} mastered ({{pct}}%) | {{learning}} learning | {{retired}} retired
**本周命中**: {{count}} hits across {{unique_rules}} rules
**本周晋级**: {{list of rules that flipped to mastered this week}}
**Top 3 未吸收**(hit_count=0 且已存在超过 7 天):
- [id] rule text — 建议下次对话话题贴近 {{hint}}
**Sliding Anchor 状态**: exam {{date or "未定"}} | current {{score or "未测"}} | target {{target}} | {{days_left or "∞"}} days
If methodology.md is empty or all mastered, this section outputs "currently no active rules" + the hint "use /pte feed to feed new text" (the hint only appears in the weekly report, not popped up in daily conversation).
Retirement (automatic cleanup of rules not hit for a long time)
Do it as part of generating the weekly report:
- If a rule is still
hit_count == 0≥ 14 days after being added → changestatus: retired, remove it from the active demonstration pool - retired rules stay in methodology.md (not deleted), but are no longer demonstrated and no longer checked for hits
- At the end of the "Absorption" section of the weekly report, mention "{{N}} rules retired (not triggered for a long time)", the user can manually change them back to learning or delete them
Relationship with /pte-* practice subcommand
/pte-essay / /pte-summarize / /pte-describe / /pte-read-aloud still runs per sub-skills/*.md. Not affected by this hook.
However: output written by the user in practice scenarioscan additionally check methodology.md rule hits when scoring(as bonus feedback), but does not go into absorption_log, because that is "deliberate use" not "spontaneous use".
Failure modes
methodology.mdcorrupted/YAML parse failure → hook silently skips, daily flow unaffectedstate.mdof## Sliding Anchorsection missing or null → run at baseline density (1-2)- Detector written too broadly causing false positives → the user can give feedback in the weekly report, manually change the detector field or delete the rule
Maintenance boundary
This hook section is maintained by english-immersion.pte skill does not touch any logic here. If you want to adjust thresholds / demonstration density / retirement rules → change this section, not pte skill。