skilldrop-cli 1.10.0 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +3 -2
  2. package/catalogue.json +9 -1
  3. package/model-routing.json +8 -0
  4. package/package.json +1 -1
  5. package/packs/converters/skills/file-to-markdown/manifest.json +1 -1
  6. package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +13 -4
  7. package/packs/educator/pack.json +25 -0
  8. package/packs/educator/skills/exam-paper-check/SKILL.md +125 -0
  9. package/packs/educator/skills/exam-paper-check/evals/eval_queries.json +30 -0
  10. package/packs/educator/skills/exam-paper-check/evals/evals.json +73 -0
  11. package/packs/educator/skills/exam-paper-check/evals/files/1/year9-science-scheme.md +16 -0
  12. package/packs/educator/skills/exam-paper-check/evals/files/1/year9-science.md +58 -0
  13. package/packs/educator/skills/exam-paper-check/evals/files/2/mock-paper1-ms.md +32 -0
  14. package/packs/educator/skills/exam-paper-check/evals/files/2/mock-paper1.md +60 -0
  15. package/packs/educator/skills/exam-paper-check/evals/files/3/hist1042-quiz-markscheme.md +37 -0
  16. package/packs/educator/skills/exam-paper-check/evals/files/3/hist1042-quiz.md +50 -0
  17. package/packs/educator/skills/exam-paper-check/evals/files/4/chem-mock-paper.md +51 -0
  18. package/packs/educator/skills/exam-paper-check/evals/files/4/chem-mock-scheme.md +32 -0
  19. package/packs/educator/skills/exam-paper-check/evals/files/5/econ-p2-paper.md +57 -0
  20. package/packs/educator/skills/exam-paper-check/evals/files/5/econ-p2-scheme.md +34 -0
  21. package/packs/educator/skills/exam-paper-check/examples/inputs/spec.json +3 -0
  22. package/packs/educator/skills/exam-paper-check/examples/inputs/year9-science-scheme.md +16 -0
  23. package/packs/educator/skills/exam-paper-check/examples/inputs/year9-science.md +58 -0
  24. package/packs/educator/skills/exam-paper-check/examples/year9-forces.md +68 -0
  25. package/packs/educator/skills/exam-paper-check/manifest.json +33 -0
  26. package/packs/educator/skills/exam-paper-check/scripts/exam_check.py +328 -0
  27. package/packs/educator/skills/exam-paper-check/templates/spec.json +11 -0
  28. package/packs/startup-legal/pack.json +10 -2
  29. package/packs/startup-legal/skills/vesting-schedule/SKILL.md +122 -0
  30. package/packs/startup-legal/skills/vesting-schedule/evals/eval_queries.json +30 -0
  31. package/packs/startup-legal/skills/vesting-schedule/evals/evals.json +70 -0
  32. package/packs/startup-legal/skills/vesting-schedule/examples/cofounder-leaving.md +66 -0
  33. package/packs/startup-legal/skills/vesting-schedule/examples/inputs/vesting.json +8 -0
  34. package/packs/startup-legal/skills/vesting-schedule/manifest.json +33 -0
  35. package/packs/startup-legal/skills/vesting-schedule/scripts/vesting.py +280 -0
  36. package/packs/startup-legal/skills/vesting-schedule/templates/vesting.json +12 -0
package/README.md CHANGED
@@ -51,7 +51,7 @@ A good result runs your lint, typecheck and tests through a gate script, then a
51
51
  In Claude Code you can use the plugin marketplace instead: run `/plugin marketplace add sananthanarayan/skilldrop`, then `/plugin install dev-team@skilldrop`. [Every install route](guides/how-to/install.md) covers single skills, other IDEs, loops, reviewer subagents, profiles and updates.
52
52
 
53
53
  <details>
54
- <summary><b>Choose your role:</b> 24 packs, from product management and architecture to SRE, GRC, job applications, building design and startup legal</summary>
54
+ <summary><b>Choose your role:</b> 25 packs, from product management and architecture to SRE, GRC, job applications, building design, startup legal and teaching</summary>
55
55
 
56
56
  Install one pack. Every role pack also brings `core` (intake, critique, review council, output hygiene, and the decisions behind a codebase). Each pack page has a starter prompt to paste and says what a good result looks like.
57
57
 
@@ -77,7 +77,8 @@ Install one pack. Every role pack also brings `core` (intake, critique, review c
77
77
  - **Running a team on shifts:** `operations-manager` — a weekly rota checked for cover, hours, rest between shifts and days in a row, handed back in your own sheet. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/operations-manager/)
78
78
  - **Running events:** `event-planner` — a seating plan where every together, keep-apart and access request holds, and a run of show with no room or person booked twice, both checked and drawn. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/event-planner/)
79
79
  - **Furnishing rooms:** `interior-designer` — a dimensioned furniture plan for one room, checked for door swings, bed and chair clearances, a clear route to everything and turning space where it's required. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/interior-designer/)
80
- - **Startup founders:** `startup-legal` — an agreement checked before you sign it, with wording to push back on, your cap table through SAFEs and a priced round, and your first office lease's real cost and exit dates. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/startup-legal/)
80
+ - **Startup founders:** `startup-legal` — an agreement checked before you sign it, with wording to push back on, your cap table through SAFEs and a priced round, vesting with the 83(b) deadline, and your first office lease's real cost and exit dates. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/startup-legal/)
81
+ - **Teachers:** `educator` — an exam paper and its mark scheme checked before printing: totals that add up, parts the scheme misses or marks differently, and balance across objectives. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/educator/)
81
82
  - **Everyone:** `core` on its own. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/core/)
82
83
 
83
84
  </details>
package/catalogue.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "RFC-0034. The catalogue index: pack display order and the outcome browse axis (RFC-0026). Pack metadata lives in packs/<pack>/pack.json; membership is the folders — a skill is in a pack because it sits at packs/<pack>/skills/<name>/.",
3
3
  "version": "1.0.0",
4
- "packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "frontend", "skill-engineering", "career", "civil-architect", "operations-manager", "event-planner", "interior-designer", "startup-legal"],
4
+ "packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "frontend", "skill-engineering", "career", "civil-architect", "operations-manager", "event-planner", "interior-designer", "startup-legal", "educator"],
5
5
  "outcomes": {
6
6
  "decide-what-to-build": {
7
7
  "for": "Product managers · founders · strategists",
@@ -242,8 +242,16 @@
242
242
  "skills": [
243
243
  "contract-check",
244
244
  "cap-table",
245
+ "vesting-schedule",
245
246
  "lease-check"
246
247
  ]
248
+ },
249
+ "set-a-fair-assessment": {
250
+ "for": "Teachers · exam setters · heads of department",
251
+ "description": "Send out a test whose marks add up, whose mark scheme matches it part by part, and whose questions are balanced and clear.",
252
+ "skills": [
253
+ "exam-paper-check"
254
+ ]
247
255
  }
248
256
  },
249
257
  "retired": {
@@ -275,6 +275,10 @@
275
275
  "tier": "standard",
276
276
  "rationale": "Contract drafting against the AsyncAPI shape with fixed rules on ordering, delivery and versioning; mid tier is enough."
277
277
  },
278
+ "exam-paper-check": {
279
+ "tier": "standard",
280
+ "rationale": "The arithmetic and the scheme-against-paper comparison come from the script; reading the questions for clarity and fairness is bounded judgment."
281
+ },
278
282
  "exec-summary": {
279
283
  "tier": "standard",
280
284
  "rationale": "Compression to one page. Needs to keep the right signal; escalate on very long source docs."
@@ -571,6 +575,10 @@
571
575
  "tier": "light",
572
576
  "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 92% and 92% of checks in two tier trials, against standard's 83% and heavy's 75% and 83%, within 5 points of the best both times."
573
577
  },
578
+ "vesting-schedule": {
579
+ "tier": "standard",
580
+ "rationale": "Turning grant documents into the script's input and explaining leavers and acceleration is bounded; the script does the date arithmetic."
581
+ },
574
582
  "web-performance-review": {
575
583
  "tier": "standard",
576
584
  "rationale": "The metrics, opportunities and the elements behind them are read out of the Lighthouse report by its script; the model ranks fixes by what moves the user-facing numbers."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "1.10.0",
3
+ "version": "1.11.1",
4
4
  "description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "author": {
6
6
  "name": "Sanjay Ananthanarayan",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "file-to-markdown",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Convert a Word document, PowerPoint deck, Excel workbook, web page, CSV, JSON, text file, email (.eml or Outlook .msg) or PDF into clean Markdown. It keeps headings, lists, tables, links, bold and italic, slide titles and speaker notes. It saves embedded images beside the Markdown and links them, shows tracked changes as pending rather than accepted, and reports everything else it dropped (charts, comments, formulas), so the content can be read, reviewed or fed to another skill. Use when the user hands over a .docx, .pptx, .xlsx, .html, .csv, .json, .eml, .msg or .pdf and says \"read this\", \"turn this into markdown\", \"extract the text\", or wants it critiqued or briefed.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -727,6 +727,14 @@ def cell_ref(ref):
727
727
  return int(m.group(2)) - 1, n - 1
728
728
 
729
729
 
730
+ def _int_or(text, default):
731
+ """int(text), or default when a damaged file leaves it empty or not a number."""
732
+ try:
733
+ return int(text)
734
+ except (TypeError, ValueError):
735
+ return default
736
+
737
+
730
738
  def xlsx_to_md(path, rep, max_rows=0):
731
739
  z = open_zip(path, ".xlsx")
732
740
  names = set(z.namelist())
@@ -749,10 +757,10 @@ def xlsx_to_md(path, rep, max_rows=0):
749
757
  nf = st.find(S + "numFmts")
750
758
  for f in (nf if nf is not None else []):
751
759
  code = re.sub(r'"[^"]*"|\[[^\]]*\]|\\.', "", f.get("formatCode", "")).lower()
752
- custom[int(f.get("numFmtId"))] = bool(re.search(r"[dmyh]", code))
760
+ custom[_int_or(f.get("numFmtId"), -1)] = bool(re.search(r"[dmyh]", code))
753
761
  xfs = st.find(S + "cellXfs")
754
762
  for k, xf in enumerate(xfs if xfs is not None else []):
755
- fid = int(xf.get("numFmtId", "0"))
763
+ fid = _int_or(xf.get("numFmtId", "0"), 0)
756
764
  if fid in BUILTIN_DATE_FMTS or custom.get(fid):
757
765
  date_styles.add(k)
758
766
  rels = read_rels(z, "xl/_rels/workbook.xml.rels")
@@ -788,14 +796,15 @@ def xlsx_to_md(path, rep, max_rows=0):
788
796
  if c.find(S + "f") is not None:
789
797
  formulas += 1
790
798
  if t == "s" and v is not None:
791
- val = shared[int(v.text)] if int(v.text) < len(shared) else ""
799
+ i = _int_or(v.text, -1) # an empty or non-numeric index reads as a blank cell
800
+ val = shared[i] if 0 <= i < len(shared) else ""
792
801
  elif t == "inlineStr":
793
802
  val = "".join(x.text or "" for x in c.iter(S + "t"))
794
803
  elif t == "b" and v is not None:
795
804
  val = "TRUE" if v.text == "1" else "FALSE"
796
805
  elif v is not None and v.text is not None:
797
806
  val = v.text
798
- if t == "n" and int(c.get("s", "0")) in date_styles:
807
+ if t == "n" and _int_or(c.get("s", "0"), 0) in date_styles:
799
808
  try:
800
809
  d = epoch + timedelta(days=float(val))
801
810
  val = d.strftime("%Y-%m-%d") if float(val) == int(float(val)) \
@@ -0,0 +1,25 @@
1
+ {
2
+ "description": "Assessments that hold up in the exam room and at moderation: an exam paper and its mark scheme checked by a script for totals that don't add up, either/or questions worth different marks, numbering that skips, parts the scheme misses or marks differently, and objectives off their weighting, then read for wording and fairness.",
3
+ "display_name": "Educator",
4
+ "keywords": ["teacher", "exam", "test", "mark scheme", "assessment", "moderation", "school", "education"],
5
+ "links": {"documentation": "https://sananthanarayan.github.io/skilldrop/packs/educator/"},
6
+ "maintainers": [{"name": "sananthanarayan"}],
7
+ "first-value": {
8
+ "audience-posture": "non-technical",
9
+ "prerequisites": ["Your exam paper and mark scheme as Word, Markdown or text files", "Python 3 on the machine, which the check runs on"],
10
+ "starter-task": "Check a test and its mark scheme before printing",
11
+ "starter-prompt": "Check my end-of-unit test (paper.docx) and its mark scheme (mark-scheme.docx) before I print it. Our grid is AO1 40%, AO2 40%, AO3 20%.",
12
+ "verification": "exam-paper-check leads with what to fix before printing, gives each question's marks against its stated total and the paper's, lines the mark scheme up against the paper part by part, and shows marks per objective against your grid.",
13
+ "recovery": "If exam-paper-check does not activate, ask for it by name (\"use exam-paper-check\"). If your paper is a PDF, save it as Word or text first."
14
+ },
15
+ "requires": ["core"],
16
+ "journey": {
17
+ "when": "A test, mock or assessment is written and about to go to print or to a colleague.",
18
+ "you_bring": ["the exam paper", "its mark scheme", "your planning grid or objective weightings, if you have them"],
19
+ "steps": [
20
+ {"skill": "exam-paper-check", "you_do": "Give it the paper, the mark scheme and your weightings.", "you_get": "What to fix before printing, the marks table, every scheme mismatch, the balance across objectives and wording problems.", "decide": "Fix and print, or ask for corrected copies."},
21
+ {"skill": "exam-paper-check", "you_do": "Ask for corrected copies.", "you_get": "The paper and scheme corrected beside your originals, with every change listed."}
22
+ ],
23
+ "you_end_with": "A paper and mark scheme that add up and match, ready to print or moderate."
24
+ }
25
+ }
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: exam-paper-check
3
+ description: Check an exam paper and its mark scheme before they go to print or to a moderator — a script reads the teacher's own files and finds part marks that don't add up to a question's total, questions that don't add up to the paper's total (an either/or choice counted once), numbering that skips or repeats, parts with no marks, parts the mark scheme misses or marks differently, and objectives that are never assessed or far off their weighting — then reads the questions for clarity and fairness. Use when a teacher asks to "check my exam paper", "proofread this test", "does the mark scheme match the paper", "do the marks add up", "check this assessment before moderation", or "is this paper balanced across the objectives".
4
+ ---
5
+
6
+ # exam-paper-check
7
+
8
+ A paper with a total that doesn't add up, a missing part (b), or a mark scheme that gives
9
+ part (c) three marks when the paper says two is found by a student in the exam hall or by a
10
+ moderator afterwards. Both are expensive. A capable agent reads a paper fluently and misses
11
+ these, because it reads what the teacher meant. A script reads the teacher's own files, adds up
12
+ every part, question and the paper, lines the mark scheme up against the paper part by part,
13
+ and weighs the marks against the objectives. The agent then reads the questions themselves for
14
+ what a script can't judge.
15
+
16
+ ## How to respond
17
+
18
+ **These rules come before the steps and outrank them:**
19
+
20
+ - **Lead with what would go wrong in the exam room, in a teacher's words.** ✅ *"Three things
21
+ to fix before printing: the paper says 50 marks but the questions add up to 41; Question 3
22
+ goes from (a) to (c); and the mark scheme gives Question 7 twelve marks where the paper says
23
+ ten."* Never mention a script, this skill's name, a path inside its folder or a temporary
24
+ path, and never call your work "the check" or "a tool".
25
+ - **Every arithmetic and structural finding comes from the files,** with the question and
26
+ part. Never add marks in your head.
27
+ - **Their files are never overwritten.** When asked for corrected versions, write them beside
28
+ the originals under plain names (`paper-corrected.docx`), and list every change in the
29
+ reply. Keep their layout, numbering style and wording except where a fix needs it.
30
+ - **Fix with the smallest change, and say which you assumed.** When the total and the parts
31
+ disagree, say which looks intended (a part's marks that match its scheme entry, a total that
32
+ matches the cover page) and give both fixes if it's unclear. Never rebalance a paper unasked.
33
+ - **Read every question as a student would, under the paper's own conditions,** after the
34
+ arithmetic. Work each calculation through: can it be done without a calculator on a
35
+ non-calculator paper (a square root to 2 decimal places can't), is every value it needs
36
+ given, does it fit the marks? Then a command word that doesn't match the marks ("State" for
37
+ 4 marks, "Evaluate" for 1), a question that gives away or depends on another's answer, a
38
+ leading or loaded premise, units, ambiguous wording, an unfair reading load. When in doubt
39
+ about whether a question works, say so; never wave one through as "feasible" without
40
+ doing it. One line each, with the question and the change to make.
41
+ - **Never pass on a finding you can't explain.** Each one in the reply says what is wrong and
42
+ what to change, in a sentence a colleague would understand; no "FAIL" or "WARN" labels, no
43
+ raw output.
44
+ - **Working files stay out of sight.** A spec you write goes in a private temporary folder
45
+ (`mktemp -d`) and is deleted before replying.
46
+
47
+ 1. **Find the paper and the mark scheme,** and the spec if there is one: the duration, the
48
+ assessment objectives with their target weightings, and which parts assess which objective
49
+ (a question-level map in the scheme or a planning grid). Ask at most once, for the mark
50
+ scheme when it isn't supplied.
51
+
52
+ 2. **Run the check on their files.** It reads Markdown, text and Word; for a PDF, save it as
53
+ text first.
54
+
55
+ ```bash
56
+ work=$(mktemp -d 2>/dev/null || mktemp -d ./.work.XXXXXX) # a private folder for this run only
57
+ # Claude Code
58
+ python3 "${CLAUDE_SKILL_DIR}/scripts/exam_check.py" ./paper.docx --scheme ./mark-scheme.docx --spec "$work/spec.json"
59
+ # Other IDEs (from the skill folder)
60
+ python3 scripts/exam_check.py ./paper.md --scheme ./scheme.md
61
+ ```
62
+
63
+ The spec is optional, in the shape of [`templates/spec.json`](templates/spec.json): write it
64
+ from their planning grid when they have one. Exit 0 means no failures, 1 means a failure, 2
65
+ means a file can't be read. It **fails** on totals that don't add up (the paper's and the mark
66
+ scheme's own), an either/or pair worth different marks, a part counted twice, a part the
67
+ scheme misses or marks differently, a scheme entry for a part that isn't there, and an
68
+ objective never assessed. It **warns** on
69
+ numbering that skips, a part with no marks, and an objective far off its weighting. It also
70
+ gives the minutes per mark.
71
+
72
+ 3. **Read the questions** for the student-facing problems in the rules above, and check the
73
+ minutes per mark against the paper's level: around a minute a mark is usual for school
74
+ exams; much less is a rush, much more is padding.
75
+
76
+ 4. **Reply in this order:**
77
+ 1. **What to fix before it goes out,** most serious first, one line each with the question.
78
+ 2. **The marks table:** each question's marks against its stated total, and the paper's.
79
+ 3. **Mark scheme mismatches,** part by part.
80
+ 4. **Balance:** marks per objective against the target, and the minutes per mark.
81
+ 5. **Wording and fairness,** one line each with the change to make.
82
+ 6. **Corrected files,** when asked, with every change listed.
83
+
84
+ **Non-interactive runs** (subagent, CI, headless): with no mark scheme, check the paper alone
85
+ and say the scheme wasn't checked; with no spec, skip the balance section and say so. With no
86
+ paper, emit `BLOCKED: need the exam paper (and its mark scheme)`.
87
+
88
+ ## Useful references in this skill
89
+
90
+ - [`templates/spec.json`](templates/spec.json) — the optional spec: objectives with target weightings, and which parts assess which
91
+ - [`scripts/exam_check.py`](scripts/exam_check.py) — totals, either/or choices, numbering, missing marks, scheme against paper, objective balance, minutes per mark
92
+ - [`examples/year9-forces.md`](examples/year9-forces.md) — worked example: a Year 9 science test whose cover says 50 marks and whose questions add up to 41
93
+
94
+ ## Quality bar
95
+
96
+ - **Every total is added from the files,** and every mismatch names the question and part.
97
+ - **The mark scheme is lined up against the paper part by part,** both ways.
98
+ - **An either/or choice counts once,** and its two options must be worth the same.
99
+ - **The reply leads with what to fix before printing,** in plain words, with no mention of scripts or files.
100
+ - **Fixes are the smallest that work,** with the assumption stated when it's unclear which number is wrong.
101
+ - **Their files are never overwritten,** and every change in a corrected copy is listed.
102
+
103
+ ## When to use this skill
104
+
105
+ - ✅ A test or mock paper before it's printed, or sent to a colleague to proofread
106
+ - ✅ A mark scheme written separately from the paper, before marking starts
107
+ - ✅ An assessment going to internal or external moderation
108
+ - ✅ Checking a paper's balance across objectives against the planning grid
109
+
110
+ ## When NOT to use this skill
111
+
112
+ - ❌ Writing questions or a paper from scratch: write it, then check it here
113
+ - ❌ Marking students' scripts or moderating their marks
114
+ - ❌ Setting grade boundaries
115
+ - ❌ Coursework or essays with no marks per part
116
+
117
+ ## Anti-patterns to avoid
118
+
119
+ - ❌ **"The marks look right."** Add them: a 50-mark cover over 41 marks of questions is the commonest fault.
120
+ - ❌ **Counting both halves of an either/or.** The student answers one.
121
+ - ❌ **Fixing the total when the part was wrong,** or the reverse, without saying which you assumed.
122
+ - ❌ **Rewriting their questions in your own style.** Change what's unclear or unfair, nothing else.
123
+ - ❌ **Missing the mark scheme's extra entry** for a part that was cut from the paper.
124
+ - ❌ **"The script found…"** The teacher wants the list of fixes.
125
+ - ❌ **Calling a question fine without working it.** Do the calculation under the paper's rules first.
@@ -0,0 +1,30 @@
1
+ [
2
+ {
3
+ "query": "Check my exam paper before it goes to print",
4
+ "should_trigger": true
5
+ },
6
+ {
7
+ "query": "Does the mark scheme match the paper?",
8
+ "should_trigger": true
9
+ },
10
+ {
11
+ "query": "Do the marks on this test add up?",
12
+ "should_trigger": true
13
+ },
14
+ {
15
+ "query": "Check this assessment is balanced across AO1 to AO3 before moderation",
16
+ "should_trigger": true
17
+ },
18
+ {
19
+ "query": "Write ten multiple-choice questions on photosynthesis",
20
+ "should_trigger": false
21
+ },
22
+ {
23
+ "query": "Make a slide deck for my Year 9 lesson on forces",
24
+ "should_trigger": false
25
+ },
26
+ {
27
+ "query": "Proofread this research paper's citations",
28
+ "should_trigger": false
29
+ }
30
+ ]
@@ -0,0 +1,73 @@
1
+ {
2
+ "skill_name": "exam-paper-check",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "Can you check my Year 9 forces test before it goes to the printers? Paper is year9-science.md and the mark scheme is year9-science-scheme.md. Our grid is AO1 40%, AO2 40%, AO3 20%.",
7
+ "assertions": [
8
+ "Says the questions add up to 41 marks while the cover says 50, counting only one of the either/or Questions 6 and 7",
9
+ "Flags that Questions 6 and 7 are a choice but worth 12 and 10 marks",
10
+ "Flags that Question 3 goes from (a) to (c)",
11
+ "Flags that the mark scheme has no entry for 2(b) and gives Question 7 twelve marks where the paper says ten",
12
+ "Leads with what to fix before printing, in plain words",
13
+ "Does not mention a script or the skill's name, and does not invent questions or marks that aren't in the files"
14
+ ]
15
+ },
16
+ {
17
+ "id": 2,
18
+ "held_out": "2026-11-08",
19
+ "prompt": "Can you check my Year 10 mock before it goes to reprographics? Paper is mock-paper1.md, mark scheme is mock-paper1-ms.md.",
20
+ "assertions": [
21
+ "Finds that Question 3's part marks (2 + 3 + 2 = 7) do not add up to its stated total of 8 marks",
22
+ "Finds that Question 4's parts go (a), (b), (d) - part (c) is skipped",
23
+ "Finds that the mark scheme awards 3 marks (M1 M1 A1) for Question 5(b) while the paper shows [2], so Question 5 would be out of 5 not 4",
24
+ "Finds that the mark scheme has no entry for Question 6(c), a 3-mark part",
25
+ "Reports the paper total correctly: the stated question totals add to 48, matching the cover, but the part marks add to 47 (3+4+7+8+4+8+5+8), so 48 only holds once Question 3 is fixed",
26
+ "Flags Question 7(b), finding the square root of 37 to 2 decimal places, as unfair or unsuitable on a paper marked non-calculator, and suggests a fix (e.g. ask for an estimate or between which two integers it lies)",
27
+ "Does not invent problems in Questions 1, 2 or 8 (their parts add up and match the scheme) and does not invent a mark value for the missing Question 4(c)"
28
+ ]
29
+ },
30
+ {
31
+ "id": 3,
32
+ "held_out": "2026-11-08",
33
+ "prompt": "I'm module lead for HIST1042 and the Week 8 quiz goes to our external moderator on Friday. Files are hist1042-quiz.md and hist1042-quiz-markscheme.md. Please check that the marks add up, that the mark scheme covers every part of the paper with the same marks, and that the quiz is balanced across our learning outcomes. The module handbook targets LO1 (knowledge of key terms and events) 20%, LO2 (analysis and evaluation of sources) 20%, LO3 (sustained historical argument) 30%, LO4 (use of quantitative and statistical evidence) 30%. Our mapping is: Q1 and Q2 assess LO1; Q3 and Q7 assess LO2; Q4 and Q5 assess LO3. Also tell me if any question wording would be unfair to students.",
34
+ "assertions": [
35
+ "Finds that the Section B either/or choice is unequal: Question 4 is worth 15 marks and Question 5 only 12, so a student choosing Q5 can score at most 47 (20 + 12 + 15) against the stated 50, while Q4 gives 50 (20 + 15 + 15)",
36
+ "Counts the either/or choice once when totalling the paper (does not add Q4 and Q5 together to get 62)",
37
+ "Finds that the question numbering skips Question 6 (Q5 is followed by Q7)",
38
+ "Finds that the mark scheme gives Question 3(c) 3 marks while the paper shows [4 marks]",
39
+ "Reports the objective balance on the 50-mark (Q4) route: LO1 10 marks = 20% (on target), LO2 25 marks = 50% against a 20% target, LO3 15 marks = 30% (on target, or 12/47 = about 25.5% on the Q5 route), and LO4 0 marks against 30% - LO4 is never assessed",
40
+ "Flags Question 2(b) ('Explain why the Corn Laws were a disaster for everyone in Britain') as leading or presupposing its answer, and suggests neutral wording such as 'How far...' or 'Explain the effects of...'",
41
+ "Does not invent a Question 6, marks for it, or learning outcomes and targets beyond the four given"
42
+ ]
43
+ },
44
+ {
45
+ "id": 4,
46
+ "held_out": "2026-11-09",
47
+ "prompt": "Can you check my Year 11 chemistry mock before it goes to print? Paper is chem-mock-paper.md, mark scheme is chem-mock-scheme.md.",
48
+ "assertions": [
49
+ "Flags Question 2: its parts are worth 2 + 3 + 4 = 9 marks but its heading says 'Total for Question 2: 8 marks'; notes the stated question totals (8 + 8 + 12 + 15 = 43) therefore disagree with the paper total of 44, which matches the parts (8 + 9 + 12 + 15 = 44)",
50
+ "Flags that the numbering jumps from Question 3 to Question 5, with no Question 4, and asks whether a question is missing or the paper should be renumbered",
51
+ "Flags that 3(b) is worth 3 marks on the paper but 2 marks in the mark scheme",
52
+ "Flags that the mark scheme has no entry for 5(c) (percentage yield, 3 marks), and that the scheme's rows add to 40 (8 + 9 + 11 + 12), not its stated 'Total: 44 marks'",
53
+ "Flags that 3(c) asks for 53.9 / 37 and 0.0539 / 24.0 to 3 significant figures (1.46 cm3/s, 0.00225 mol) although the instructions say calculators must not be used",
54
+ "Flags that 5(d) uses the command word 'State' for a 6-mark, level-of-response question whose scheme expects an explanation (alternative pathway, lower activation energy)",
55
+ "Does not invent faults or content not in the files: does not call the 44-mark paper total wrong, and does not make up a Question 4 or marks for it"
56
+ ]
57
+ },
58
+ {
59
+ "id": 5,
60
+ "held_out": "2026-11-09",
61
+ "prompt": "I'm head of economics at Calderbrook Sixth Form. Attached are our Year 13 Paper 2 mock (econ-p2-paper.md) and its mark scheme (econ-p2-scheme.md). They go to the external moderator on Friday. Please check that the marks add up and that the paper and scheme match, and flag anything in the questions a student could reasonably complain about. Don't rewrite the paper - just give me a list of what to fix, most serious first.",
62
+ "assertions": [
63
+ "Flags the Section B either/or as unequal: Question 3 is 10 + 15 = 25 marks but Question 4 is 10 + 12 = 22 marks although both headings (and the instructions) say 25; so the paper totals 38 + 25 = 63 for a Question 3 candidate but 38 + 22 = 60 for a Question 4 candidate",
64
+ "Flags that Question 1's parts go (a), (b), (c), (e) with no (d)",
65
+ "Flags that 2(a) is worth 5 marks on the paper but 6 in the mark scheme",
66
+ "Flags that the scheme's 'Total for Section A: 40 marks' does not match its own rows (2 + 2 + 4 + 10 + 6 + 15 = 39), nor the paper's Section A (18 + 20 = 38)",
67
+ "Flags that 1(b) cannot be answered: it asks for the change in nominal GDP from 2022 to 2024 but Extract A gives no 2024 GDP figure",
68
+ "Flags 2(b) ('Discuss why the Bank of Estoria was right to cut interest rates') as a leading question that presupposes the conclusion, so a balanced answer arguing the cut was wrong is discouraged",
69
+ "Returns a prioritised list of fixes without rewriting the paper, and does not invent faults or data not in the files (e.g. a 2024 GDP figure, assessment objectives or weightings the paper never states)"
70
+ ]
71
+ }
72
+ ]
73
+ }
@@ -0,0 +1,16 @@
1
+ # Mark scheme — Year 9 Forces and Energy
2
+
3
+ 1 (a) friction / air resistance [1]
4
+ 1 (b) F = m × a (1); = 2 × 3 (1); = 6 N (1) [3]
5
+ 1 (c) newton / N [1]
6
+ 2 (a)(i) gravitational potential to kinetic (1); some to thermal / sound (1) [2]
7
+ 2 (a)(ii) Ep = mgh (1); 0.5 × 10 × 1.8 (1); = 9 J (1) [3]
8
+ 2 (a)(iii) energy dissipated as heat and sound on impact [2]
9
+ 3 (a) useful output ÷ total input [1]
10
+ 3 (c) 0.8 × 2400 (1); = 1920 J (2) [3]
11
+ 3 (d) energy wasted as thermal energy to surroundings / sound [2]
12
+ 4 Level-marked: see levels of response grid [6]
13
+ 5 (a) 300 ÷ 20 (1); = 15 m/s (1) [2]
14
+ 5 (b) straight line through origin [2]
15
+ 6 Level-marked comparison [12]
16
+ 7 Level-marked evaluation [12]
@@ -0,0 +1,58 @@
1
+ # Year 9 Science — End of Unit Test: Forces and Energy
2
+
3
+ Time allowed: 50 minutes
4
+ Total marks: 50
5
+
6
+ Answer ALL questions in Section A. In Section B, answer either Question 6 or Question 7.
7
+
8
+ ## Section A
9
+
10
+ **1** A trolley is pushed along a bench.
11
+
12
+ (a) Name the force that slows the trolley down. [1]
13
+
14
+ (b) The trolley has a mass of 2 kg and accelerates at 3 m/s². Calculate the resultant force on it. Show your working. [3]
15
+
16
+ (c) State the unit of force. [1]
17
+
18
+ (Total for Question 1 = 5 marks)
19
+
20
+ **2** A student drops a ball from a height of 1.8 m.
21
+
22
+ (a) (i) Describe the energy transfer as the ball falls. [2]
23
+
24
+ (ii) Calculate the gravitational potential energy store of the 0.5 kg ball at the start. g = 10 N/kg. [3]
25
+
26
+ (iii) Explain why the ball does not bounce back to 1.8 m. [2]
27
+
28
+ (b) Suggest one way to reduce errors when measuring the height. [1]
29
+
30
+ (Total for Question 2 = 8 marks)
31
+
32
+ **3** Electric kettles transfer energy by heating.
33
+
34
+ (a) Define efficiency. [1]
35
+
36
+ (c) A kettle is 80% efficient. 2400 J is supplied. Calculate the useful energy transferred. [3]
37
+
38
+ (d) Suggest why the kettle is not 100% efficient. [2]
39
+
40
+ (Total for Question 3 = 6 marks)
41
+
42
+ **4** Describe how you would investigate how the extension of a spring depends on the force applied. Include a risk assessment. [6]
43
+
44
+ (Total for Question 4 = 6 marks)
45
+
46
+ **5** A car travels 300 m in 20 s.
47
+
48
+ (a) Calculate its average speed. [2]
49
+
50
+ (b) Sketch a distance–time graph for a car moving at constant speed. [2]
51
+
52
+ (Total for Question 5 = 4 marks)
53
+
54
+ ## Section B
55
+
56
+ **6** Compare the use of wind turbines and gas power stations to generate electricity. [12]
57
+
58
+ **7** Evaluate the use of solar panels and nuclear power to generate electricity. [10]
@@ -0,0 +1,32 @@
1
+ # Hollinsford Academy - Year 10 Mock, Paper 1 (Non-calculator)
2
+ ## Mark scheme
3
+
4
+ M = method mark, A = accuracy mark, B = independent mark.
5
+
6
+ | Question | Answer | Marks | Guidance |
7
+ |---|---|---|---|
8
+ | 1(a) | 2x + 7y | B1 | |
9
+ | 1(b) | x^2 + x - 6 | M1 A1 | M1 for 3 of 4 terms correct |
10
+ | 2(a) | 3/8 | M1 A1 | M1 for 375/1000 |
11
+ | 2(b) | 1 5/6 | M1 A1 | M1 for 11/4 x 2/3 |
12
+ | 3(a) | 20 | M1 A1 | M1 for 60 / 12 |
13
+ | 3(b) | 25/54 | M1 M1 A1 | M1 for 54 remaining, M1 for 25 green |
14
+ | 3(c) | 9 : 20 : 25 | M1 A1 | M1 for 9 : 20 : 25 unsimplified attempt; already in simplest form |
15
+ | 4(a) | 70 degrees | M1 M1 A1 | M1 180 - 40, M1 divide by 2 |
16
+ | 4(b) | Angles in a triangle sum to 180; base angles of an isosceles triangle are equal | B1 B1 | |
17
+ | 4(d) | 24 cm^2 | M1 M1 A1 | M1 for 1/2 x 8 x 6, M1 for 48 / 2 |
18
+ | 5(a) | x = 8 | M1 A1 | M1 for 2x = 16 |
19
+ | 5(b) | x = 6 | M1 M1 A1 | M1 expand, M1 isolate x |
20
+ | 6(a) | 3 | M1 A1 | M1 for 9 / 3 |
21
+ | 6(b) | y = 3x | M1 M1 A1 | M1 gradient used, M1 substitute a point |
22
+ | 7(a) | 300 (from 50 x 3 / 0.5) | M1 A1 | Accept 270 to 320 with correct rounding shown |
23
+ | 7(b) | 6.08 | M1 M1 A1 | M1 for between 6 and 7, M1 for 6.08^2 = 36.97 |
24
+ | 8(a) | n + (n+1) + (n+2) = 3n + 3 = 3(n+1) | M1 M1 M1 A1 | Full algebraic proof required |
25
+ | 8(b) | (2a+1)(2b+1) = 4ab + 2a + 2b + 1 = 2(2ab+a+b) + 1 | M1 M1 M1 A1 | |
26
+
27
+ Total: 48 marks
28
+
29
+ Notes for markers
30
+ - Follow-through is allowed in 3(c) from 3(b).
31
+ - Do not award accuracy marks for answers given without working in Q4 and Q8.
32
+ - Questions with no working shown: award B marks only.
@@ -0,0 +1,60 @@
1
+ # Hollinsford Academy
2
+ ## Year 10 Mathematics Mock Examination
3
+ ### Paper 1 (Non-calculator) - Foundation/Higher crossover
4
+
5
+ Time allowed: 1 hour 15 minutes
6
+ You must NOT use a calculator.
7
+ Total for paper: 48 marks
8
+
9
+ ---
10
+
11
+ **Question 1**
12
+ (a) Simplify fully 3x + 5y - x + 2y **[1]**
13
+ (b) Expand and simplify (x + 3)(x - 2) **[2]**
14
+ *(Total for Question 1: 3 marks)*
15
+
16
+ **Question 2**
17
+ (a) Write 0.375 as a fraction in its simplest form. **[2]**
18
+ (b) Work out 2 3/4 divided by 1 1/2. Give your answer as a mixed number. **[2]**
19
+ *(Total for Question 2: 4 marks)*
20
+
21
+ **Question 3**
22
+
23
+ A bag contains only red, blue and green counters in the ratio 3 : 4 : 5. There are 60 counters in the bag.
24
+ (a) How many blue counters are in the bag? **[2]**
25
+ (b) Six red counters are removed. A counter is then taken at random. Work out the probability that it is green. **[3]**
26
+ (c) Write the new ratio red : blue : green in its simplest form. **[2]**
27
+ *(Total for Question 3: 8 marks)*
28
+
29
+ **Question 4**
30
+
31
+ The diagram (not drawn to scale) shows triangle ABC with AB = AC and angle BAC = 40 degrees.
32
+ (a) Work out the size of angle ABC. **[3]**
33
+ (b) Give a reason for each step of your working in part (a). **[2]**
34
+ (d) A different triangle, PQR, has base 8 cm and perpendicular height 6 cm. Work out its area. **[3]**
35
+ *(Total for Question 4: 8 marks)*
36
+
37
+ **Question 5**
38
+ (a) Solve 4x - 7 = 2x + 9 **[2]**
39
+ (b) Solve 3(x - 2) = 12 **[2]**
40
+ *(Total for Question 5: 4 marks)*
41
+
42
+ **Question 6**
43
+
44
+ A straight line passes through the points (1, 3) and (4, 12).
45
+ (a) Work out the gradient of the line. **[2]**
46
+ (b) Find the equation of the line. **[3]**
47
+ (c) Does the point (10, 30) lie on the line? Show how you decide. **[3]**
48
+ *(Total for Question 6: 8 marks)*
49
+
50
+ **Question 7**
51
+ (a) Estimate the value of (48.7 x 3.1) / 0.49 **[2]**
52
+ (b) Work out the square root of 37, correct to 2 decimal places. **[3]**
53
+ *(Total for Question 7: 5 marks)*
54
+
55
+ **Question 8**
56
+ (a) Prove that the sum of any three consecutive integers is a multiple of 3. **[4]**
57
+ (b) Prove that the product of two odd numbers is always odd. **[4]**
58
+ *(Total for Question 8: 8 marks)*
59
+
60
+ **END OF PAPER**
@@ -0,0 +1,37 @@
1
+ # HIST1042 Week 8 Quiz - Mark Scheme (for markers and moderator)
2
+
3
+ General: credit any valid point supported by accurate evidence. Use levels for extended answers.
4
+
5
+ ## Section A
6
+
7
+ **Q1(a)** [2] - 1 mark for rural/household-based manufacture; 1 mark for production for distant markets before the factory system.
8
+
9
+ **Q1(b)** [2] - 1 mark each, e.g. West Riding of Yorkshire, Lancashire, East Anglia (worsted), the Midlands (hosiery).
10
+
11
+ **Q2(a)** [3] - 1 mark per feature described, up to 3: Acts of Parliament per parish; consolidation of strips; loss of common rights; hedging and fencing costs.
12
+
13
+ **Q2(b)** [3] - Up to 3 marks for explanation: high bread prices; benefit to landowners; Anti-Corn Law League agitation; repeal 1846.
14
+
15
+ **Q3(a)** [3] - 1 mark per valid inference from Source A, supported by a quotation.
16
+
17
+ **Q3(b)** [3] - 1 mark for agreement, 1 for disagreement, 1 for an overall judgement.
18
+
19
+ **Q3(c)** [3] - Level 1 (1): comments on one source. Level 2 (2): both sources, provenance considered. Level 3 (3): combined utility judged with reference to purpose.
20
+
21
+ ## Section B
22
+
23
+ **Q4(a)** [5] - 1 mark per change outlined, up to 5: speed, cost per ton-mile, bulk goods (coal), perishable goods, national markets.
24
+
25
+ **Q4(b)** [10] - Level 1 (1-3) descriptive; Level 2 (4-6) some argument; Level 3 (7-8) balanced argument; Level 4 (9-10) sustained, well-evidenced judgement weighing other causes (coal, cotton, overseas trade).
26
+
27
+ **Q5(a)** [4] - 1 mark per step, up to 4: Huskisson's tariff reforms of the 1820s; Peel's budgets of 1842 and 1845; repeal of the Corn Laws 1846; repeal of the Navigation Acts 1849; Cobden-Chevalier Treaty 1860.
28
+
29
+ **Q5(b)** [8] - Level 1 (1-2); Level 2 (3-4); Level 3 (5-6); Level 4 (7-8) sustained judgement.
30
+
31
+ ## Section C
32
+
33
+ **Q7(a)** [5] - 1 mark per claim identified (max 2); 1 mark per supported/unsupported judgement using Source D (max 2); 1 mark for a precise reference to the census figures.
34
+
35
+ **Q7(b)** [10] - Level 1 (1-3) content only; Level 2 (4-6) provenance; Level 3 (7-8) provenance and context; Level 4 (9-10) sustained evaluation using both sources and own knowledge.
36
+
37
+ Total for quiz: 50 marks.