You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Browse filesBrowse the repository at this point in the historyBrowse files
authored
feat: imported-course mode for needs-analysis, assessment-design, course-builder (#9)
* feat: imported-course mode for needs-analysis, assessment-design, course-builder
Three skills assumed net-new course design and broke down for imported courses
(TMC-430 test report issues #7, #13, #14). Each now branches early on
import_metadata.source:
- needs-analysis: skips the "is training the right intervention?" decision
gate for credit-bearing imports (the registrar can't be told to remove the
course); records justification automatically and runs a design-fit check.
- assessment-design: adds Mode 3 (Audit Existing Assessments) alongside the
existing Mode 1/Mode 2 split. Reads existing rubrics, classifies on Bloom's,
compares to ILOs, surfaces alignment gaps. Does NOT propose new assessments
unless asked. Mode 3 takes precedence over Mode 1.
- course-builder: adds gap-fill mode triggered when import_metadata.source is
set and course_content.modules is non-empty. Generates ONLY artifacts
upstream skills flagged as missing, instead of regenerating syllabus,
modules, and rubrics that already exist in the cartridge.
All three skills announce the chosen mode at the start of the conversation,
so the user can override if auto-detection is wrong.
Canonical schema gains optional needs_analysis.mode, assessments.mode,
course_content.mode (record the mode), assessments.audit_notes[] (Mode 3
output), and course_content.recommended_generation_targets[] (gap-fill
output). Additive — no schema version bump.
assessment-design also switches its manifest write to bin/idstack-manifest-merge
(landed in v2.1.0.0), eliminating the misleading "include the COMPLETE schema
structure" instruction.
Smoke test grows from 150 to 153 assertions: each mode-aware skill template
must reference import_metadata.source (drift guard).
Resolves test-report issues #7, #13, #14.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix: address Gemini code review findings on PR #9
Two corrections from Gemini Code Assist's review of this PR:
- assessment-design: the manifest-write text said "writes two sections —
assessments and learning_objectives.alignment_matrix.ilo_to_assessment" but
the merge tool operates on top-level sections only, and Mode 3 also writes
to learning_objectives.alignment_matrix.gaps. Clarified to "writes two
top-level sections — assessments and learning_objectives" with a note about
reading-then-merging the full learning_objectives section before passing
it to the merge tool.
- course-builder: gap-fill mode instructions referenced
course_builder_notes.recommended_generation_targets and
course_builder_notes.mode, but the canonical schema (and the
course_content.generated_files reference in the same sentence) puts these
under course_content. Real bug — Claude following the skill would write to
a section that isn't whitelisted by bin/idstack-manifest-merge. Renamed
both to course_content.
Smoke test 153/153 unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: philippos savvides <philippossavvides@mac.lan>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+15Lines changed: 15 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,20 @@
1
1
# Changelog
2
2
3
+
## v2.3.0.0 (2026-05-02)
4
+
5
+
### Added
6
+
-**Imported-course mode for `needs-analysis`, `assessment-design`, and `course-builder`.** The TMC-430 test report flagged that these skills assume net-new course design and break down for imported courses. Each now branches early on `import_metadata.source`:
7
+
-`needs-analysis` skips the "is training the right intervention?" decision gate for credit-bearing imports (the registrar can't be told to remove the course); records the rationale and confidence automatically and runs a "design-fit" check instead.
8
+
-`assessment-design` adds **Mode 3: Audit Existing Assessments** alongside the existing Mode 1/Mode 2 split. Reads the existing rubrics from the cartridge, classifies criteria on Bloom's, compares to ILOs, and surfaces alignment gaps — does NOT propose new assessments unless the user explicitly asks. Mode 3 takes precedence over Mode 1.
9
+
-`course-builder` adds **gap-fill mode** triggered when `import_metadata.source` is set and `course_content.modules` is non-empty. Generates ONLY the artifacts upstream skills flagged as missing (e.g., a missing rubric, a formative practice quiz set), instead of regenerating the syllabus, modules, and rubrics that already exist in the cartridge.
10
+
- All three skills announce the chosen mode at the start of the conversation so the user can override if the auto-detection is wrong.
11
+
- Resolves test-report issues #7, #13, #14.
12
+
-**Canonical schema additions** (additive, no version bump): optional `needs_analysis.mode`, `assessments.mode`, `course_content.mode` (record which mode the skill ran in); `assessments.audit_notes[]` (Mode 3 outputs); `course_content.recommended_generation_targets[]` (gap-fill mode outputs). Per-section item shapes documented in `templates/manifest-schema.md`.
13
+
-**`assessment-design` switches to `bin/idstack-manifest-merge`.** Replaces the inline-write pattern (with its misleading "Include the COMPLETE schema structure" instruction) with two scoped merge calls — one for `assessments`, one for `learning_objectives`. Same atomic-write benefits introduced in v2.1.0.0.
14
+
15
+
### Changed
16
+
- Smoke test now runs 153 assertions (was 150). New: each of the 3 mode-aware skill templates must reference `import_metadata.source` (drift guard against accidental removal of the mode-detection branch).
Copy file name to clipboardExpand all lines: skills/accessibility-review/SKILL.md
+38-2Lines changed: 38 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -597,6 +597,7 @@ The merge tool replaces only the named top-level section, preserves every other
597
597
"available_tech": []
598
598
},
599
599
"needs_analysis": {
600
+
"mode": "",
600
601
"organizational_context": {
601
602
"problem_statement": "",
602
603
"stakeholders": [],
@@ -633,6 +634,7 @@ The merge tool replaces only the named top-level section, preserves every other
633
634
"expertise_reversal_flags": []
634
635
},
635
636
"assessments": {
637
+
"mode": "",
636
638
"assessment_strategy": "",
637
639
"items": [],
638
640
"formative_checkpoints": [],
@@ -642,9 +644,11 @@ The merge tool replaces only the named top-level section, preserves every other
642
644
"peer_review": false
643
645
},
644
646
"feedback_quality_score": 0,
645
-
"rubrics": []
647
+
"rubrics": [],
648
+
"audit_notes": []
646
649
},
647
650
"course_content": {
651
+
"mode": "",
648
652
"generated_at": "",
649
653
"expertise_adaptation": "",
650
654
"syllabus": "",
@@ -654,7 +658,8 @@ The merge tool replaces only the named top-level section, preserves every other
654
658
"content_dir": ".idstack/course-content/",
655
659
"generated_files": [],
656
660
"build_timestamp": "",
657
-
"placeholders_used": []
661
+
"placeholders_used": [],
662
+
"recommended_generation_targets": []
658
663
},
659
664
"import_metadata": {
660
665
"source": "",
@@ -876,6 +881,37 @@ These document the **shape of array elements and dictionary values** that the ca
876
881
}
877
882
```
878
883
884
+
### Mode field — design-new vs audit-existing
885
+
886
+
`needs_analysis.mode`, `assessments.mode`, and `course_content.mode` record which operating mode the corresponding skill ran in. Trigger: `import_metadata.source` ∈ `{cartridge, scorm, canvas-api}` plus the relevant section being non-empty (skill-specific check).
887
+
888
+
Allowed values per skill:
889
+
-`needs_analysis.mode`: `"design-new"` or `"audit-existing"`
Copy file name to clipboardExpand all lines: skills/assessment-design/SKILL.md
+96-15Lines changed: 96 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -317,7 +317,7 @@ fi
317
317
318
318
## Pipeline Context Check
319
319
320
-
Determine your operating mode based on available data.
320
+
Determine your operating mode based on available data.**Check Mode 3 first** — it's the more specific case (imported course with existing assessments) and takes precedence over Mode 1 even when both conditions hold.
321
321
322
322
### Mode 1: Full Upstream Data
323
323
@@ -355,6 +355,38 @@ cognitive process) before proceeding to assessment design. Use the same classifi
355
355
approach as the `/learning-objectives` skill: ask for clarification when verbs are
356
356
ambiguous [Alignment-12][T2].
357
357
358
+
### Mode 3: Audit Existing Assessments
359
+
360
+
**Condition (BOTH must be true):**
361
+
-`import_metadata.source` is one of `cartridge`, `scorm`, `canvas-api`
362
+
-`assessments.items` is non-empty (course-import populated it) OR `course_content.assessments` is non-empty (cartridge has assessment artifacts)
363
+
364
+
**Announce the chosen mode to the user as the first sentence:**
365
+
366
+
> "Mode 3: audit-existing. The imported course already contains [N] assessments and [M] rubrics — I'll audit them against your ILOs rather than designing new ones from scratch. If you want to add new assessments, say 'design more' at any point."
367
+
368
+
**What audit-existing does (and doesn't do):**
369
+
370
+
- ✅ Reads existing rubrics from the manifest (`assessments.rubrics`) or from the cartridge files referenced by `course_content.rubrics`.
371
+
- ✅ Classifies each rubric criterion on Bloom's level (same classification approach as Mode 1).
372
+
- ✅ Compares to the course ILOs from `learning_objectives.ilos`. Flags:
373
+
-**Bloom's level mismatch** — rubric tests below the ILO's claimed level (e.g., ILO says "analyze" but rubric criteria are "list/describe").
374
+
-**Untested ILOs** — an ILO has no rubric criterion measuring it.
375
+
-**Orphaned criteria** — a rubric criterion doesn't measure any stated ILO.
376
+
-**Missing rubric** — an assessment has weight ≥10% but no rubric.
- ✅ Output: an audit table per assessment, plus 1-3 rubric-improvement recommendations.
379
+
- ❌ Does NOT generate new rubrics or new assessments unless the user explicitly says "design more."
380
+
381
+
**Audit workflow steps (replaces Steps 1-4 of the design workflow below):**
382
+
383
+
1.**Inventory.** List every assessment from `assessments.items` (or derived from cartridge if items is empty). Note type, title, weight, ILOs claimed.
384
+
2.**Per-assessment Bloom's mapping.** For each assessment, examine its rubric criteria and classify each on Bloom's. Record in `assessments.items[].alignment_status` (`"weak" | "moderate" | "strong"` per the canonical schema) based on whether the criteria collectively reach the ILO's claimed level.
385
+
3.**Cross-walk.** Build a `learning_objectives.alignment_matrix.gaps[]` entries for each Bloom-mismatch, untested ILO, or orphaned criterion. Use the canonical `gaps[]` shape: `{ilo, type, description, severity}`.
386
+
4.**Recommendations.** Surface the top 1-3 fixes — usually rubric criterion edits, not new assessments. If the user wants to act on them, propose specific edits and apply via `Edit`. Track applied/deferred fixes in a new optional `assessments.audit_notes` array.
387
+
388
+
When done, write the manifest using `bin/idstack-manifest-merge` (see "Write Manifest" below). Skip the rest of this skill (Steps 1-4 of the design workflow are for design-new mode only).
389
+
358
390
---
359
391
360
392
## Assessment Design Workflow
@@ -593,19 +625,32 @@ Consider adding a formative peer review checkpoint to partially address the gap.
593
625
594
626
## Write Manifest
595
627
596
-
Create or update the project manifest at `.idstack/project.json`.
628
+
Save results to `.idstack/project.json` via `bin/idstack-manifest-merge`. The merge tool
629
+
replaces only the named section, preserves every other section verbatim, validates JSON,
630
+
and atomically updates the top-level `updated` timestamp. **This skill writes two
631
+
top-level sections** — `assessments` and `learning_objectives` — so call the merge tool
632
+
twice (once per section). The `learning_objectives` write needs to update the
633
+
`alignment_matrix.ilo_to_assessment` mapping (and in Mode 3, the
634
+
`alignment_matrix.gaps` array as well). Read the existing `learning_objectives` section
635
+
first, merge in your changes, then pass the full updated section as the payload.
597
636
598
-
**CRITICAL — Manifest Integrity Rules:**
599
-
1. If a manifest already exists, READ it first with the Read tool. Then modify ONLY
600
-
the `assessments` section and the `learning_objectives.alignment_matrix.ilo_to_assessment`
601
-
mapping. Preserve all other sections unchanged.
602
-
2. Include the COMPLETE schema structure. Do not omit fields.
603
-
3. Before writing, mentally verify the JSON is valid: matching braces, proper commas,
604
-
quoted strings, no trailing commas.
605
-
4. The `updated` timestamp must reflect the current time.
606
-
5. If this is a new manifest (no needs analysis or learning objectives were run),
607
-
initialize ALL sections with empty/default values so downstream skills find the
If `bin/idstack-manifest-merge` is unavailable: fall back to manual write (Read manifest, modify only the two sections, Write back, preserve all others).
652
+
653
+
If `.idstack/project.json` does not exist yet, run `bin/idstack-migrate .idstack/project.json` first — that creates a fresh canonical manifest. The merge tool then merges into it.
609
654
610
655
**Populate the `assessments` section:**
611
656
@@ -746,6 +791,7 @@ The merge tool replaces only the named top-level section, preserves every other
746
791
"available_tech": []
747
792
},
748
793
"needs_analysis": {
794
+
"mode": "",
749
795
"organizational_context": {
750
796
"problem_statement": "",
751
797
"stakeholders": [],
@@ -782,6 +828,7 @@ The merge tool replaces only the named top-level section, preserves every other
782
828
"expertise_reversal_flags": []
783
829
},
784
830
"assessments": {
831
+
"mode": "",
785
832
"assessment_strategy": "",
786
833
"items": [],
787
834
"formative_checkpoints": [],
@@ -791,9 +838,11 @@ The merge tool replaces only the named top-level section, preserves every other
791
838
"peer_review": false
792
839
},
793
840
"feedback_quality_score": 0,
794
-
"rubrics": []
841
+
"rubrics": [],
842
+
"audit_notes": []
795
843
},
796
844
"course_content": {
845
+
"mode": "",
797
846
"generated_at": "",
798
847
"expertise_adaptation": "",
799
848
"syllabus": "",
@@ -803,7 +852,8 @@ The merge tool replaces only the named top-level section, preserves every other
803
852
"content_dir": ".idstack/course-content/",
804
853
"generated_files": [],
805
854
"build_timestamp": "",
806
-
"placeholders_used": []
855
+
"placeholders_used": [],
856
+
"recommended_generation_targets": []
807
857
},
808
858
"import_metadata": {
809
859
"source": "",
@@ -1025,6 +1075,37 @@ These document the **shape of array elements and dictionary values** that the ca
1025
1075
}
1026
1076
```
1027
1077
1078
+
### Mode field — design-new vs audit-existing
1079
+
1080
+
`needs_analysis.mode`, `assessments.mode`, and `course_content.mode` record which operating mode the corresponding skill ran in. Trigger: `import_metadata.source` ∈ `{cartridge, scorm, canvas-api}` plus the relevant section being non-empty (skill-specific check).
1081
+
1082
+
Allowed values per skill:
1083
+
-`needs_analysis.mode`: `"design-new"` or `"audit-existing"`
0 commit comments