| name | find-your-level |
| version | 1.0.0 |
| description | Interactive 10-question placement quiz that maps your cryptography knowledge to a starting point in the 21-phase, ~241-lesson Cryptography from Scratch curriculum. Trigger phrases: "where should I start", "find my level", "what do I know about crypto", "which phase", "assess my knowledge", "placement test", "skip ahead".
|
| tags | ["assessment","onboarding","curriculum","cryptography"] |
Find Your Level
Administer a placement quiz for the Cryptography from Scratch curriculum
(21 phases, ~241 lessons). Figure out where the learner should begin so they
skip material they already know and land where the challenge starts.
Quiz Structure
5 knowledge areas, 2 questions each, 10 questions total. Present in rounds
of 2 (one per area). After both questions in a round, score that area before
moving on.
Scoring
Each question worth 1 point. Each area scores 0–2. Total ranges 0–10.
Administering the Quiz
Greet briefly, then jump into Round 1. Use AskUserQuestion for every
question when the runtime exposes it. If AskUserQuestion is unavailable
(e.g. opencode — only bash, edit, glob, grep, read, skill, task, todowrite, webfetch, websearch, write are exposed), render each question
as a plain chat message and wait for the user's reply. After each round,
announce area score (e.g. "Number Theory: 2/2"). Keep commentary short.
Do not explain answers until the end.
Rendering rules (critical — do not leak answers)
When building options (for AskUserQuestion or plain chat fallback),
follow these rules strictly:
- Option label = the bare answer text from the markdown below
(e.g.
"2", "Completeness, soundness, zero-knowledge"). Do NOT add
category tags, hint phrases, parenthetical numbers, or commentary.
- Option description = leave empty, or use neutral parallel framing
that applies equally to every option in that question (e.g. all four
descriptions are the same shape:
"numeric result", "numeric result",
"numeric result", "numeric result"). Never describe one option as
"the classic X", "the correct trinity", "the standard answer", or any
phrasing that singles out the right choice.
- Never echo the
**Correct: ...** line, the parenthetical explanation
next to it (e.g. (343 mod 11 = 2), (Sony PS3 case)), or any topic
label that maps 1:1 to the correct answer.
- Distractors must look as legitimate as the correct option. If you cannot
write a neutral description, write none.
- Reveal the
**Correct: ...** text and its parenthetical context only
AFTER the user submits — and only in the final per-question recap at the
end of the quiz, not between rounds.
Self-check before sending each question: read the four option descriptions
out of context. If a stranger could pick the right answer from descriptions
alone, rewrite them.
Length parity: all options in a question must be within ~25% of each
other in character count. A noticeably longer option screams "correct
answer". If the right answer needs more words, pad distractors with
plausible technical detail until lengths match.
Round 1 — Number Theory & Modular Arithmetic
Q1. What is 7^3 mod 11?
Correct: A) 2 (343 mod 11 = 2)
Q2. When does a have a multiplicative inverse modulo n?
- A) Always, when
a ≠ 0
- B) When
gcd(a, n) = 1
- C) When
a < n
- D) When
n is prime
Correct: B) When gcd(a, n) = 1 (B includes the prime case)
Round 2 — Symmetric & Classical Asymmetric
Q3. Why is AES-ECB unsafe for encrypting images?
- A) ECB throughput is too low for large files
- B) Equal plaintext blocks map to equal ciphertext blocks
- C) ECB lacks a proper key schedule for 256-bit keys
- D) ECB cannot encrypt non-ASCII byte sequences
Correct: B) Equal plaintext blocks map to equal ciphertext blocks
Q4. In RSA, if n = p·q, e = 65537, what is the private exponent d?
- A)
d ≡ e mod n
- B)
d ≡ e^(-1) mod φ(n), φ(n)=(p-1)(q-1)
- C)
d ≡ (p+q)·e^(-1) mod n
- D)
d ≡ n·e^(-1) mod φ(n)
Correct: B) d ≡ e^(-1) mod φ(n) where φ(n) = (p-1)(q-1)
Round 3 — Elliptic Curves & Protocols
Q5. On an elliptic curve over F_p, what does scalar multiplication k·P
mean?
- A) Multiply x-coordinate by k, reduce mod p
- B) Add P to itself k times under the group law
- C) Multiply both coordinates by k, reduce mod p
- D) Raise x to the k-th power, reduce mod p
Correct: B) Add the point P to itself k times using the curve group law
Q6. What goes wrong in ECDSA if you reuse the random nonce k across two
signatures with the same key?
- A) Nothing —
k is regenerated internally
- B) Both signatures fail verification against the public key
- C) An attacker recovers the private key from the two signatures
- D) The hash output collides, leaking the message digest
Correct: C) An attacker recovers the private key from the two signatures (Sony PS3 case)
Round 4 — Zero-Knowledge
Q7. What three properties define a zero-knowledge proof?
- A) Speed, simplicity, succinctness
- B) Completeness, soundness, zero-knowledge
- C) Confidentiality, integrity, availability
- D) Public, private, hybrid
Correct: B) Completeness, soundness, zero-knowledge
Q8. What does the Fiat-Shamir heuristic do?
- A) Speeds up modular exponentiation via windowed scalar tables
- B) Replaces the verifier's challenge with a hash, removing interaction
- C) Compresses a SNARK proof using polynomial commitments
- D) Prevents nonce reuse in ECDSA by deriving k from the message
Correct: B) Turns an interactive Σ-protocol into a non-interactive proof by replacing the verifier's challenge with a hash
Round 5 — Post-Quantum & Advanced
Q9. Why does Shor's algorithm threaten RSA but not AES-128?
- A) RSA uses smaller keys, so quantum search converges faster
- B) Shor breaks factoring/DLP in poly time; AES only loses half its bits to Grover
- C) AES is information-theoretically secure against any quantum adversary
- D) RSA is already broken classically via the GNFS at 2048-bit sizes
Correct: B) Shor solves factoring and discrete log in polynomial time on a quantum computer; AES has no such structure — Grover only halves the security level
Q10. What hard problem underpins Kyber (ML-KEM)?
- A) Integer factoring
- B) Elliptic curve discrete log
- C) Module Learning With Errors (MLWE)
- D) Syndrome decoding
Correct: C) Module Learning With Errors (MLWE)
After All 5 Rounds
Display area breakdown and total:
Number Theory & Modular Arithmetic: X/2
Symmetric & Classical Asymmetric: X/2
Elliptic Curves & Protocols: X/2
Zero-Knowledge: X/2
Post-Quantum & Advanced: X/2
-------------------------------------------
Total: X/10
Score-to-Entry-Point Mapping
| Total Score | Entry Point | What It Means |
|---|
| 0–3 | Phase 1: Number Theory | Build math foundation from the ground up |
| 4–5 | Phase 4: Lattices | You have number theory + ECC, time for the post-quantum math |
| 6–7 | Phase 8: Classical Asymmetric | Math is solid, build primitives next |
| 8–9 | Phase 11: Zero-Knowledge Foundations | Strong base, dive into ZK |
| 10 | Phase 14: Post-Quantum Lattice-Based | You know the classical world, build Kyber/Dilithium |
Personalized Learning Path
After revealing entry point, generate a markdown table covering all 21
phases. Use the score to determine status of each phase. Phases below entry
point get "Skip" (already known). Phases at or above entry point get "Do".
If learner scored 1/2 in an area mapping to a skippable phase, mark that
phase "Review" instead of "Skip".
Area-to-phase mapping for review detection:
- Number Theory & Modular Arithmetic (1/2) → mark Phase 1 as "Review"
- Symmetric & Classical Asymmetric (1/2) → mark Phases 7 and 8 as "Review"
- Elliptic Curves & Protocols (1/2) → mark Phases 3 and 10 as "Review"
- Zero-Knowledge (1/2) → mark Phases 11 and 12 as "Review"
- Post-Quantum & Advanced (1/2) → mark Phases 14 and 17 as "Review"
Read time estimates from ROADMAP.md (canonical source). Each phase heading
contains estimated hours in format (~N hours). Parse these instead of
hardcoding. Keeps path in sync with roadmap as estimates update.
Output Format
| Phase | Name | Status | Est. Hours |
|-------|------|--------|------------|
| 0 | Setup & Tooling | Skip | -- |
| 1 | Number Theory | Review | 21 |
| 2 | Abstract Algebra | Skip | -- |
| 3 | Elliptic Curves | Do | 13 |
| ... | ... | ... | ... |
Rules:
- "Skip" phases show
-- (do not count toward total)
- "Review" phases show full hours
- "Do" phases show full hours
- Phase 0 (Setup & Tooling) always "Skip" regardless of score (tooling, not knowledge)
- Sum hours for "Review" + "Do" phases, show total at bottom
After table, add: "Your personalized path: ~X hours across Y phases."
Then brief recommendation: which phase to start with, what to focus on
based on weakest area.
Persist Progress
After showing the path, write the result to .progress.json at repo root.
If the file does not exist, create it. If it exists, merge — preserve
existing phases entries; overwrite only the placement section.
Schema (write the placement block):
{
"version": 1,
"placement": {
"score": <total 0-10>,
"areas": {
"number_theory": <0-2>,
"symmetric_asymmetric": <0-2>,
"ecc_protocols": <0-2>,
"zero_knowledge": <0-2>,
"post_quantum": <0-2>
},
"entry_phase": <1|4|8|11|14>,
"date": "<today YYYY-MM-DD>"
},
"phases": { ... preserved as-is ... }
}
Tell the user one line at the end: "Progress saved to .progress.json. Run
/my-progress anytime to see your dashboard."