Agent skill
LC Again
the marker that never graduates
README's status column reads 325 AGAIN against 124 OK, and 106 problems carry
the marker after twelve or more review passes. Nothing in this repo ever promotes a
row, so AGAIN behaves as a permanent tag rather than a verdict —
which means a problem you have actually mastered keeps scoring as a gap and keeps
being handed back to you. /lc-again is the missing half of that loop.
1 row README:937 — AGAIN*************** (7) (MUST)
15 stars, 7 in the paren, and a MUST that has to survive
2 establish re-derived unaided? yes
the invariant? only start a run at n whose n-1 is absent
the line that sets the complexity? the while(n+1) walk
the edges? empty, all-duplicates
3 edit OK*************** (7) (MUST)
^^ ^^^^^^^^^ every star, the (7) and the
only this word (MUST) kept exactly as written
changed
4 refresh get_again_problems.sh → 879 lines to 876
(the file had been stale since Nov 2025)
5 check suggest_review.py --only again no longer offers 128
--only must still finds it
6 owed the attempt itself still needs /lc-log 128 ok
A real run. The bar in step 2 is the whole skill: a promotion that is given away turns the column into noise in the other direction.
Why a skill and not a habit
A column that only ever accretes
This is not a style problem. Three pieces of tooling read this column, and a marker that never moves makes all three of them wrong in the same direction.
The readiness guide says it outright: 125 of 136 hard rows carry AGAIN, some after 20+ passes, so the Mastery percentage cannot be read as one.
Cost: the number you would act on is the number you cannot trust.
suggest_review.py reads a high pass count on an AGAIN row as difficulty, not progress. A problem you have mastered scores higher the more times you have beaten it.
Fix: a row that graduates leaves the pool.
data/again_problems.txt is generated from README, and was last regenerated in November 2025 — ten months of edits it has not seen.
Rule: the edit and the refresh are one step, not two.
One pass, no branches
Six steps, in order
The steps never reorder and none of them is optional. Pick one to see what it does and the rule that step exists to enforce.
What the cell means
Three moves, and what must survive them
The column is free text, but three pieces of it are load-bearing. Everything else is your own note and is preserved verbatim, typos included.
| The re-solve went | Move | Example |
|---|---|---|
| clean, unaided, all four | promote — swap the word, keep the stars and notes | AGAIN*** (3) → OK*** (3) |
| came back / needed a hint | another pass — keep AGAIN, add one * | AGAIN** → AGAIN*** |
a previously-OK problem failed | demote — keep the stars, add one | OK* (2) → AGAIN** (2) |
Another pass is the default and the most common outcome. A problem that needed
one nudge did not graduate. A row marked (not start) has never been
attempted at all, so a first attempt makes it an ordinary row rather than a promotion.
| Piece | Read by | Meaning |
|---|---|---|
| OK / AGAIN | suggest_review.py, get_again_problems.sh | the verdict |
the * run | suggest_review.py's passes, and the readiness cost curve | how many review passes the problem has cost |
| MUST, any casing | extract_must_lc.py, suggest_review.py | the must-know marker |
AGAIN*** (3) three recorded passes, still not solid
OK* (2) solid, and it cost two passes to get there
AGAIN (not start) never attempted; not a promotion candidate
AGAIN*************** (7) (MUST) LC 128, as it really reads
The star run and the (n) frequently disagree — LC 128 above is 15
against 7. Neither is recomputed from the other; both are kept as written. This is
not the commit that standardises 403 spellings.
All four, or it is another pass:
1 re-derived it yourself, without looking at the old solution
2 can state the INVARIANT it turns on
(not the steps - the reason the steps are correct)
3 can name the ONE LINE that sets the complexity
4 handled the edges - empty, single element, duplicates, overflow
Asking once is correct; interrogating twice is not. Once you answer, your word is taken. And if you would rather not answer, the move is another pass — which is not a punishment, it is just what the column already says.
Arguments are inferred, not interrogated
How to call it
One problem, one re-solve, one decision. It does not bulk-promote.
/lc-again 128 ok
/lc-again 139
I finally got 128, mark it OK
560 came back again
refresh the again list
| Left out | What happens |
|---|---|
| Verdict | It asks how the re-solve actually went before deciding — the four questions, once. |
| Which row | All of them, when a problem is filed twice. Named in the report either way. |
| The star count | Never recomputed. It is read off the cell and carried through. |
| LC number | The one thing it will ask for. |
The guardrails
What it will not do
A promotion that is given away is worse than no promotion at all — it turns the column into noise in the other direction, and that is harder to notice.
- Promote on request alone.Without establishing that you re-derived it unaided, the move is another pass. Saying "mark it OK" is not the same as having earned it.
- Drop the star run.It is the cost record, not the verdict. Promoting is not forgetting what the problem cost, and the readiness cost curve is computed from exactly those stars.
- Tidy a cell's spelling while it is in there.403 spellings exist. Standardising them is a different commit, and doing it invisibly inside an unrelated edit is how a column stops being readable.
- Touch any other cell or row.Not the tags, not the complexity, not the solution links. One row, one cell.
- Write the practice log.That is /lc-log. A practice attempt and a mastery verdict are different records, and this skill says which one you still owe.
- Bulk-promote.There is no batch mode, on purpose. The bar only means something applied one problem at a time.
One markdown file, no dependencies
Install
SKILL.md is the whole recipe — nothing to build and no network calls,
so the same source runs on any agent that takes a system prompt. Pick yours.
Drop the skill directory into your user-level skills folder and it loads in every repo:
git clone --depth 1 https://github.com/yennanliu/CS_basics.git /tmp/cs_basics
mkdir -p ~/.claude/skills
cp -r /tmp/cs_basics/.claude/skills/lc-again ~/.claude/skills/
Already installed inside this repo at .claude/skills/lc-again/, so a
clone of CS_basics needs no setup at all. Claude Code matches it on the description,
or you can call /lc-again by name — the directory name is
the command.
Zip the directory, then Customize → Skills → + → + Create skill → Upload a skill:
cd .claude/skills && zip -r lc-again.zip lc-again
Leave the YAML frontmatter in SKILL.md intact. description is
what Claude matches your request against when deciding to load the skill on its own.
Codex reads AGENTS.md at the repo root automatically. Point it at the skill:
## Moving a problem's status
When asked to mark a problem solid, graduate an AGAIN marker, or record
another failed pass, follow `.claude/skills/lc-again/SKILL.md`.
A pointer, not a copy — one source of truth means a fix reaches every agent at once.
Same shape in GEMINI.md, or point at it for a single session:
gemini -p "Follow the recipe in .claude/skills/lc-again/SKILL.md. \
I re-solved LC 128 unaided today - should it graduate?"
Paste SKILL.md in as the system prompt. It is self-contained and has no
references/ to carry. For Cursor or Windsurf, put the Codex pointer above
into a rule file (.cursor/rules/lc-again.mdc or the editor's equivalent).
curl -sL https://raw.githubusercontent.com/yennanliu/CS_basics/master/.claude/skills/lc-again/SKILL.md
One caveat away from this repo: steps 4 and 5 run this repo's scripts. The four-question bar in step 2 is the part that transfers anywhere.
Under the hood
What is inside
One file. The steps live there and nowhere else — this page describes them, but
SKILL.md is what actually runs, so the two cannot drift into two recipes.
- SKILL.md The whole recipe — why the marker never graduates, what the cell means, the five prime directives, the three moves, the six steps, the do-not list, and the LC 128 worked example.
Gated in CI by check_skills.py — frontmatter every host can parse, the directory name pinned to the command name, and whether the links on this page still resolve.
The rest of the loop
Where it fits
/lc-log records that you practised something;
/lc-again records that it finally stuck. Between them they are what
suggest review and the
review plan read to decide what you are owed, and
what LC Coach is scoring against when it asks whether you
could do it unaided.