Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
{
"name": "ccaf",
"source": "./ccaf",
"description": "CCAF (Claude Certified Architect – Foundations) mock-exam readiness gate. /ccaf:mock-exam assembles a 60-question case-study-framed mock with machine-enforced domain weighting — every question generated fresh per attempt and independently verified — administers it 4 per screen with resumable progress, and scores it on the real 100–1000 band with a 720 pass line plus a per-domain breakdown."
"description": "CCAF (Claude Certified Architect – Foundations, exam code CCAR-F) readiness gate, aligned to exam guide v1.0. /ccaf:mock-exam assembles a 60-item case-study-framed mock of single-answer questions, with machine-enforced domain weighting, answer-position spread, and per-objective tagging — every item generated fresh per attempt and independently verified — administers it 4 per screen with resumable progress, and scores it on the real 100–1000 band with a 720 pass line plus per-domain and per-objective breakdowns. /ccaf:prepare teaches the 30 task statements turn by turn; /ccaf:practice drills chosen domains."
},
{
"name": "discovery",
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,12 @@
.claude/bee-insights/
.claude/ccaf-exam.local.md
.claude/ccaf-exam.local.answers.md
.claude/ccaf-practice.local.md
.claude/ccaf-practice.local.answers.md

# Reference PDFs (e.g. the CCAF exam guide) are read while authoring the plugin's
# self-authored content but must never be redistributed with it.
ccaf/*.pdf

# Editor workspace settings
.vscode/
4 changes: 2 additions & 2 deletions ccaf/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ccaf",
"version": "0.1.1",
"description": "CCAF (Claude Certified Architect – Foundations) mock-exam readiness gate. Assembles a 60-question case-study-framed mock with machine-enforced domain weighting — every question generated fresh per attempt and independently verified — administers it 4 per screen with resumable progress, and scores it on the real 100–1000 band with a 720 pass line plus a per-domain breakdown. Run /ccaf:mock-exam.",
"version": "0.3.0",
"description": "CCAF (Claude Certified Architect – Foundations, exam code CCAR-F) readiness gate, aligned to exam guide v1.0. Assembles a 60-item case-study-framed mock of single-answer questions with machine-enforced domain weighting, answer-position spread, and per-objective tagging — every item generated fresh per attempt and independently verified — administers it 4 per screen with resumable progress, and scores it on the real 100–1000 band with a 720 pass line plus per-domain and per-objective breakdowns. Learn with /ccaf:prepare, drill with /ccaf:practice, gate with /ccaf:mock-exam.",
"author": {
"name": "Incubyte"
},
Expand Down
38 changes: 32 additions & 6 deletions ccaf/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
# CCAF: Claude Certified Architect – Foundations mock exam

A self-serve readiness gate for the CCAF certification. `/ccaf:mock-exam` administers a faithful
mock exam and reports a scaled /1000 score with the 720 pass line, so a candidate can check
readiness before booking the real (paid) exam.
A self-serve readiness gate for the CCAF certification (exam code `CCAR-F`). `/ccaf:mock-exam`
administers a faithful mock exam and reports a scaled /1000 score with the 720 pass line, so a
candidate can check readiness before booking the real (paid) exam.

Aligned to exam guide **v1.0 (effective July 2026)**. The guide's published *facts* are encoded
here; none of its prose is. Every stem, option, explanation, scenario brief, task-statement
description, and exercise is self-authored for this plugin — keep it that way when editing, and do
not commit the guide PDF (it is gitignored).

## Layout

Expand All @@ -13,9 +18,10 @@ readiness before booking the real (paid) exam.
- `skills/ccaf-exam/SKILL.md` — the assemble → administer → score engine.
- `skills/ccaf-practice/SKILL.md` — the domain-selection → assemble → administer → score engine for focused domain practice; uses a separate state file so it never conflicts with `/ccaf:mock-exam`.
- `agents/ccaf-check-author.md` — mini-agent the tutor spawns to author one scenario check at a time.
- `data/ccaf-blueprint.md` — domains, weights, scenarios, the syllabus, scope lists, scoring. Shared curriculum for both commands.
- `data/ccaf-question-bank.md` — 12 self-authored reference questions; style/difficulty anchors only, never served in an exam (helper-enforced).
- `scripts/ccaf-exam.sh` — silent state helper (init / get / record / blanks / audit / score / clear); never use Write/Edit on the attempt files. `init` takes one payload (with keys) and splits it: questions file (write-once) + answers file (hot, ~60 lines) — so `record` rewrites only the tiny answers file and `get` output is key-free. Guards: `init` validates the payload — and, for 60-question exams, enforces the blueprint composition (domain quotas 16/11/12/12/9, 4 scenarios in contiguous sections each headed by its own `[[CASE:]]` brief — so a screen's brief always matches its questions — non-degenerate key spread) — and refuses to overwrite an in-progress attempt (unless `--force`); `record` takes one or more `--q/--answer` pairs atomically (one call per screen) and requires an in-progress attempt; `score` cross-validates the pair and requires `--partial` to score with unanswered questions. All writes serialize through a directory lock (stale locks are stolen), so mid-exam `record` calls run **in the background** while the next screen shows; the final screen records in the foreground and completion is verified before scoring.
- `data/ccaf-blueprint.md` — domains, weights, item composition, the 30 task statements (D1.1–D5.6), scenarios, case-study briefs, scope lists, scoring. Shared curriculum for all three commands, and the only authority for item content.
- `data/ccaf-question-bank.md` — 30 self-authored reference questions, one per task statement, each tagged with its `task:`; style/difficulty anchors only, never served in an exam (helper-enforced). All single-answer. Their key letters lean toward A — content is the reference, letters are noise.
- `data/ccaf-prep-guide.md` — study routes, four hands-on exercises, and certification logistics (fee, retakes, recertification). Read by the tutor; read by the exam skills only for post-result guidance, never for item content.
- `scripts/ccaf-exam.sh` — silent state helper (init / get / record / blanks / audit / score / clear); never use Write/Edit on the attempt files. `init` takes one payload (with keys) and splits it: questions file (write-once) + answers file (hot, ~60 lines) — so `record` rewrites only the tiny answers file and `get` output is key-free. Guards: `init` validates the payload — one `answer_key` letter A–D per item, and a `task:` tag that exists and belongs to the item's own domain — and, for 60-item exams, enforces the blueprint composition (domain quotas 16/11/12/12/9; 4 scenarios in contiguous sections each headed by its own `[[CASE:]]` brief — so a screen's brief always matches its items; a key spread within a sixth to a third per letter) — and refuses to overwrite an in-progress attempt (unless `--force`); `record` takes one or more `--q/--answer` pairs atomically (one call per screen), uppercases each answer so a lowercase free-text reply matches, and requires an in-progress attempt; `score` cross-validates the pair and requires `--partial` to score with unanswered items. All writes serialize through a directory lock (stale locks are stolen), so mid-exam `record` calls run **in the background** while the next screen shows; the final screen records in the foreground and completion is verified before scoring.
- `scripts/tests/ccaf-exam.test.sh` — shell test harness for the data files + helper logic.

## Conventions
Expand All @@ -27,5 +33,25 @@ readiness before booking the real (paid) exam.
so the two modes never interfere.
- Untimed, honor-system, fully offline. Self-serve: nothing is reported or persisted as history.
The real exam's 120-minute budget is stated once up front for self-pacing; no time is ever captured.
- **Single-answer items only** — four options A–D, exactly one correct. This is a deliberate
divergence: the real exam also uses multiple-response items. The blueprint records the reasoning
and the consequence (a score here is, if anything, optimistic), and the README's fidelity table
states it. Never reintroduce a response count without changing all three.
- Scoring: `scaled = 100 + 15 × correct` (linear over the real 100–1000 band); pass = 720 (≥ 42/60).
Results always show per-domain correct/total **and percent**, labelled diagnostic-only — pass/fail
is the total scaled score, as on the real criterion-referenced exam.
- Every item carries a `task:` tag (`D1.1`–`D5.6`) that `init` validates against its `domain:`, and
`score` aggregates misses by task statement so a result names the objectives to revisit. This goes
beyond what the real score report shows; the validation exists because a mistagged item would send
a candidate to study the wrong thing. Task-statement counts per domain: D1 7, D2 5, D3–D5 6 each.
- The scaled score is an honest estimate, never presented as Anthropic's proprietary equating curve.
- Process creation can be slow on some machines (Windows + AV in particular), so hot paths in the
helper avoid gratuitous subprocesses — `normalize_answer` is pure bash, and each validation check
(`check_items`, `check_composition_questions`, `check_key_spread`) is a single `awk` pass rather
than a loop of `grep`s. **Keep it that way.** This is not micro-optimising:
an earlier grep-per-check version made the test suite slow enough to exhaust Cygwin's fork table
mid-run (`fork: Resource temporarily unavailable`), so the suite could not finish at all on
Windows. `record` runs once per exam screen and `validate_pair` runs on every score.
- Even now the suite can occasionally report spurious failures on Windows when a fork fails inside a
fixture's `init` (the symptom is a whole section failing with "not found" / empty field reads).
Re-run before investigating; if it reproduces, it is real. A clean run is `100 passed, 0 failed`.
Loading