Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
242 commits
Select commit Hold shift + click to select a range
7403cf2
Pipeline self-trust + v0.1.0 to v1.0 roadmap
claude Apr 17, 2026
6cc4c3f
Address branch review: archive scaffold, H5, suppressor, Courseforge …
claude Apr 17, 2026
5d00780
Worker A: pipeline architecture ADR and cross-worker contracts
mdmurphy822 Apr 17, 2026
390e316
Worker B: flow metrics in quality_report (METRICS_SEMANTIC_VERSION 3→4)
mdmurphy822 Apr 17, 2026
0f8bb07
Worker D: per-chunk summaries + retrieval benchmark (CHUNK_SCHEMA_VER…
mdmurphy822 Apr 17, 2026
b69426c
Worker C: training-pair synthesis (SFT + DPO)
mdmurphy822 Apr 17, 2026
e02a27b
Worker F: typed-edge concept graph (rule-based inference + optional L…
mdmurphy822 Apr 17, 2026
5374201
Worker E: chunk provenance (source.html_xpath + char_span for audit t…
mdmurphy822 Apr 17, 2026
5e4a038
Session 1: WCAG_201 package quality fixes (pre-worker consolidation b…
mdmurphy822 Apr 17, 2026
adf7f79
Merge Worker C: training-pair synthesis
mdmurphy822 Apr 17, 2026
80a7ce7
Merge Worker F: typed-edge concept graph
mdmurphy822 Apr 17, 2026
35f44d0
Merge Worker B: flow metrics (METRICS_SEMANTIC_VERSION 3->4)
mdmurphy822 Apr 17, 2026
0c35213
Merge Worker D: per-chunk summaries + recall benchmark
mdmurphy822 Apr 17, 2026
404ad80
Merge Worker E: chunk provenance (html_xpath + char_span)
mdmurphy822 Apr 17, 2026
c0f00b1
Worker G: cross-package concept index + libv2_fsck staleness check
mdmurphy822 Apr 17, 2026
c078cca
Worker H: Courseforge per-week learningObjectives specificity (fixes …
mdmurphy822 Apr 17, 2026
049efae
Merge Worker G: cross-package concept index + libv2_fsck staleness check
mdmurphy822 Apr 17, 2026
7425508
Merge Worker H: Courseforge per-week learningObjectives specificity
mdmurphy822 Apr 17, 2026
cde1a13
Regenerate LibV2 courses through integration/v4-cohort pipeline
mdmurphy822 Apr 17, 2026
cf0cf68
Worker I: packager pre-build LO-validation gate (FOLLOWUP-WORKER-H-3)
mdmurphy822 Apr 17, 2026
2ebe278
Worker J: retrieval_scoring module (metadata-aware boosts)
mdmurphy822 Apr 17, 2026
9bbfd0e
Worker J: extend retriever with rationale, v4 filters, structured tokens
mdmurphy822 Apr 17, 2026
2ca81af
Worker J: retrieval-eval CLI + evaluate_retrieval harness
mdmurphy822 Apr 17, 2026
c83b882
Worker J: retriever + scoring + eval + back-compat tests
mdmurphy822 Apr 17, 2026
1a21a6b
Worker J: gold-standard queries for WCAG_201 (hand-curated, 20 queries)
mdmurphy822 Apr 17, 2026
af52bd5
Worker J: gold-standard queries for DIGPED_101 + tighten .gitignore
mdmurphy822 Apr 17, 2026
4957379
Worker J: reference-retrieval docs + ADR-002 + README + workers.md
mdmurphy822 Apr 17, 2026
bb891aa
Worker K: anonymize example-course references in code and test fixtures
mdmurphy822 Apr 17, 2026
4c964e9
Worker K: anonymize WCAG_201 narrative in VERSIONING and archive README
mdmurphy822 Apr 17, 2026
efc7968
Merge integration/v4-cohort: Session 1 fixes + Workers A-H + LibV2 regen
mdmurphy822 Apr 17, 2026
683bfa4
Merge worker-i: packager pre-build LO-validation gate
mdmurphy822 Apr 17, 2026
248eb42
Merge worker-j: LibV2 reference retrieval (ADR-002, rationale, metada…
mdmurphy822 Apr 17, 2026
44495df
Merge worker-k: anonymize example-course references on the base branch
mdmurphy822 Apr 17, 2026
f6d0807
README: drop v0.1.0/v1.0 roadmap framing from concept-graph paragraph
mdmurphy822 Apr 17, 2026
005e9c4
Worker L: anonymize docs (ADR-002, reference-retrieval, cross-package…
mdmurphy822 Apr 17, 2026
ede519f
Worker L: anonymize script docstrings (process_course, synthesize_tra…
mdmurphy822 Apr 17, 2026
2b3ca86
Worker L: anonymize tests and make provenance corpus path env-configu…
mdmurphy822 Apr 17, 2026
b76c4da
Worker L: anonymize schemas — drop wcag_201 chunk ID from instruction…
mdmurphy822 Apr 17, 2026
0b8bd26
Worker L: stop tracking per-course retrieval gold queries + cross_pac…
mdmurphy822 Apr 17, 2026
651570b
Worker L: VERSIONING.md — add v0.2.0 section, mark shipped v1.0 items
mdmurphy822 Apr 17, 2026
5168b46
Merge pull request #8 from mdmurphy822/worker-l/finish-anonymization
mdmurphy822 Apr 17, 2026
de58526
Worker M1 (§4.4a diagnostic): instrument _metadata_trace on chunks
mdmurphy822 Apr 17, 2026
16c8a11
Worker M1: tests for _metadata_trace diagnostic (8 new)
mdmurphy822 Apr 17, 2026
fb4ac9d
Worker M1: §4.4a diagnostic report (docs/validation/enrichment-trace-…
mdmurphy822 Apr 17, 2026
559d038
Worker P: package_completeness top-level aggregate (METRICS_SEMANTIC_…
mdmurphy822 Apr 17, 2026
ac355b1
Worker O: gold-queries path in retrieval_benchmark + summary-vs-body …
mdmurphy822 Apr 17, 2026
0c6f4f0
Worker N: typed-edge plausibility validation (docs/validation/typed-e…
mdmurphy822 Apr 17, 2026
4988364
Worker Q: Courseforge data-cf-role=template-chrome + Trainforge parse…
mdmurphy822 Apr 17, 2026
4dffe18
Merge pull request #12 from mdmurphy822/worker-n/typed-edge-validation
mdmurphy822 Apr 17, 2026
15604f7
Merge pull request #13 from mdmurphy822/worker-q/courseforge-template…
mdmurphy822 Apr 17, 2026
37316f3
Merge pull request #11 from mdmurphy822/worker-o/summary-retrieval-be…
mdmurphy822 Apr 17, 2026
c2ef87d
Merge pull request #10 from mdmurphy822/worker-p/package-completeness
mdmurphy822 Apr 17, 2026
ae44ed6
Merge remote-tracking branch 'origin/dev-v0.2.0' into worker-m1/44a-d…
mdmurphy822 Apr 17, 2026
f3c3bc2
Merge pull request #9 from mdmurphy822/worker-m1/44a-diagnostic
mdmurphy822 Apr 17, 2026
07a5f68
Worker R: Courseforge shared-schema migration (academic + compliance)
mdmurphy822 Apr 19, 2026
b335b62
Worker T: /schemas/ subfolder reorganization (events + knowledge)
mdmurphy822 Apr 19, 2026
f5f9586
Worker S: LibV2 schema + ontology migration (library + taxonomies)
mdmurphy822 Apr 19, 2026
be32159
Merge pull request #14 from mdmurphy822/worker-r/courseforge-schema-u…
mdmurphy822 Apr 19, 2026
e29e765
Merge pull request #15 from mdmurphy822/worker-t/schemas-subfolder-reorg
mdmurphy822 Apr 19, 2026
fea48f8
Merge pull request #16 from mdmurphy822/worker-s/libv2-schema-unify
mdmurphy822 Apr 19, 2026
8783619
Worker U: schemas/README.md + schemas/ONTOLOGY.md
mdmurphy822 Apr 19, 2026
925a69a
Merge pull request #17 from mdmurphy822/worker-u/schemas-ontology-map
mdmurphy822 Apr 19, 2026
31bff80
Worker V: docs/validation/ontology-review-v0.2.0.md — KG-publish-read…
mdmurphy822 Apr 19, 2026
65883e1
Merge pull request #18 from mdmurphy822/worker-v/ontology-review-v0.2.0
mdmurphy822 Apr 19, 2026
0c99c51
Worker G: REC-CTR-04 — decision_type enum reconciliation + fail-close…
mdmurphy822 Apr 19, 2026
93c75da
Worker F: Wave 1.1 taxonomy + page-types schemas (8 new files)
mdmurphy822 Apr 19, 2026
26f3731
Merge pull request #20 from mdmurphy822/worker-f/wave1-taxonomies
mdmurphy822 Apr 19, 2026
e0455eb
Merge pull request #19 from mdmurphy822/worker-g/wave1-decision-type
mdmurphy822 Apr 19, 2026
17c7ca2
Worker I: REC-JSL-01 + REC-CTR-01 knowledge schemas + opt-in chunk va…
mdmurphy822 Apr 19, 2026
f698497
Worker H: REC-BL-01 lib/ontology/bloom.py loader + BLOOM_VERBS migrat…
mdmurphy822 Apr 19, 2026
56eda4d
Merge pull request #22 from mdmurphy822/worker-h/wave1-bloom-loader
mdmurphy822 Apr 19, 2026
4159576
Merge pull request #21 from mdmurphy822/worker-i/wave1-knowledge-schemas
mdmurphy822 Apr 19, 2026
720505d
Worker L: REC-CTR-03 — packager objectives validation default-on + wo…
mdmurphy822 Apr 19, 2026
0427615
Worker J: REC-TAX-01 + REC-JSL-02 — classification stub + prerequisit…
mdmurphy822 Apr 19, 2026
7093136
Merge pull request #25 from mdmurphy822/worker-j/wave2-taxonomy-prereq
mdmurphy822 Apr 19, 2026
1a90022
Worker K: REC-VOC-02 — teaching_role emit + deterministic consume
mdmurphy822 Apr 19, 2026
7c447f5
Merge pull request #24 from mdmurphy822/worker-k/wave2-teaching-role
mdmurphy822 Apr 19, 2026
befd6f6
Merge pull request #23 from mdmurphy822/worker-l/wave2-objectives-def…
mdmurphy822 Apr 19, 2026
9b8dc7e
Worker M: Wave 3 — JSL-03 + opt-in LO case preservation + packager st…
mdmurphy822 Apr 19, 2026
e3dde95
Merge pull request #26 from mdmurphy822/worker-m/wave3-consume-alignment
mdmurphy822 Apr 19, 2026
010f889
archive: remove v0.1.0-baseline scaffold
mdmurphy822 Apr 20, 2026
f36c8a1
Worker N: REC-ID-01 — opt-in content-hash chunk IDs + schema pattern …
mdmurphy822 Apr 20, 2026
e0d7898
Worker P: REC-PRV-01 — run_id + created_at on chunks/nodes/edges (add…
mdmurphy822 Apr 20, 2026
737e744
Merge pull request #30 from mdmurphy822/worker-p/wave4-provenance-fields
mdmurphy822 Apr 20, 2026
44f91e5
Worker O: REC-ID-02 — opt-in course-scoped concept IDs + schema cours…
mdmurphy822 Apr 20, 2026
61842db
Merge pull request #29 from mdmurphy822/worker-o/wave4-concept-scoping
mdmurphy822 Apr 20, 2026
3edf730
Merge pull request #28 from mdmurphy822/worker-n/wave4-content-hash-ids
mdmurphy822 Apr 20, 2026
0943e46
Worker R: REC-LNK-02 — first-class Misconception schema + content-has…
mdmurphy822 Apr 20, 2026
73c7bde
Worker Q: REC-ID-03 — unified slug function at lib/ontology/slugs.py
mdmurphy822 Apr 20, 2026
88237e0
Merge pull request #32 from mdmurphy822/worker-q/wave4-unified-slug
mdmurphy822 Apr 20, 2026
dec8e3f
Merge pull request #31 from mdmurphy822/worker-r/wave4-misconception-…
mdmurphy822 Apr 20, 2026
589bb75
Worker S: REC-LNK-01 — occurrences[] back-reference on concept nodes
mdmurphy822 Apr 20, 2026
36cdc9a
Worker T: REC-VOC-03 Phase 2 — opt-in content_type enforcement
mdmurphy822 Apr 20, 2026
72e6a88
Merge pull request #33 from mdmurphy822/worker-s/wave5-concept-occurr…
mdmurphy822 Apr 20, 2026
10a13c8
Merge pull request #34 from mdmurphy822/worker-t/wave5-content-type-e…
mdmurphy822 Apr 20, 2026
3b8d621
Worker U: REC-LNK-04 — 5 pedagogical edge types (assesses, exemplifie…
mdmurphy822 Apr 20, 2026
5bf2c9a
Merge pull request #35 from mdmurphy822/worker-u/wave5-pedagogical-edges
mdmurphy822 Apr 20, 2026
fcc18ae
Worker V: REC-CTR-05 + REC-CTR-06 — YAML phase routing + meta-schema …
mdmurphy822 Apr 20, 2026
1c0b57e
Worker W: Wave 6 schema + docs cleanup (PRV-02 + JSL-04 + agent sweep…
mdmurphy822 Apr 20, 2026
d3d7b3e
Merge pull request #36 from mdmurphy822/worker-v/wave6-workflow-gover…
mdmurphy822 Apr 20, 2026
1d32685
Merge pull request #37 from mdmurphy822/worker-w/wave6-schema-docs-cl…
mdmurphy822 Apr 20, 2026
66bc713
Merge pull request #27 from mdmurphy822/chore/remove-archive-scaffold
mdmurphy822 Apr 20, 2026
ff5113f
chore: commit plans/ tree (KG-quality review working artifacts)
mdmurphy822 Apr 20, 2026
e25f0de
docs: refresh README + CLAUDE.md files for v0.2.0 state
mdmurphy822 Apr 20, 2026
6aff7cf
Merge pull request #38 from mdmurphy822/chore/wave6-consolidation
mdmurphy822 Apr 20, 2026
6a3cb43
Wave 7: Pipeline orchestration foundation (ed4all run + LLMBackend)
mdmurphy822 Apr 20, 2026
7e6eae6
chore: remove v0.2.0 status callout from README
mdmurphy822 Apr 20, 2026
5b5930f
Merge pull request #39 from mdmurphy822/worker-y/wave7-orchestration
mdmurphy822 Apr 20, 2026
dfcb474
chore: commit plans/source-provenance/ design docs
mdmurphy822 Apr 20, 2026
8417d77
Merge pull request #40 from mdmurphy822/chore/provenance-plans
mdmurphy822 Apr 20, 2026
98d518a
Wave 8: DART source-provenance foundation
mdmurphy822 Apr 20, 2026
45e27b4
Merge pull request #41 from mdmurphy822/worker-z/wave8-dart-provenance
mdmurphy822 Apr 20, 2026
d6f4589
Wave 9: Courseforge source attribution
mdmurphy822 Apr 20, 2026
9b64c5c
Merge pull request #42 from mdmurphy822/worker-aa/wave9-courseforge-p…
mdmurphy822 Apr 20, 2026
16ca170
Wave 10: Trainforge chunk + node source-provenance propagation
mdmurphy822 Apr 20, 2026
f4a1de4
Merge pull request #43 from mdmurphy822/worker-bb/wave10-trainforge-c…
mdmurphy822 Apr 20, 2026
5d5448a
Wave 11: Trainforge evidence-arm source-provenance enrichment
mdmurphy822 Apr 20, 2026
f0f0249
Merge pull request #44 from mdmurphy822/worker-cc/wave11-trainforge-e…
mdmurphy822 Apr 20, 2026
ef0b09b
fix(wave7): wire _build_tool_registry() into PipelineOrchestrator fal…
mdmurphy822 Apr 20, 2026
dfea5fc
Merge pull request #45 from mdmurphy822/fix/wave7-orchestrator-tool-r…
mdmurphy822 Apr 20, 2026
c2d7685
fix: pipeline run gaps (DART per-PDF output + source-router stub)
mdmurphy822 Apr 20, 2026
4370db6
Merge pull request #46 from mdmurphy822/fix/pipeline-run-gaps
mdmurphy822 Apr 20, 2026
200750d
fix: add tool_schemas entry for build_source_module_map
mdmurphy822 Apr 20, 2026
7814fbf
Merge pull request #47 from mdmurphy822/fix/source-router-param-mapper
mdmurphy822 Apr 20, 2026
cae89f1
fix: make archive_to_libv2 'domain' optional with 'general' default
mdmurphy822 Apr 20, 2026
466fb3e
Merge pull request #48 from mdmurphy822/fix/archive-domain-optional
mdmurphy822 Apr 20, 2026
771fc39
block: pipeline-execution contracts, reference fixtures, integration …
mdmurphy822 Apr 20, 2026
6a27640
Merge pull request #49 from mdmurphy822/block/contracts-fixtures-inte…
mdmurphy822 Apr 20, 2026
b299275
Worker γ: LibV2 archival wiring (chunks/graph copy + features flags)
mdmurphy822 Apr 20, 2026
bec33a4
Merge pull request #50 from mdmurphy822/worker-gamma/libv2-archival
mdmurphy822 Apr 20, 2026
7e14dfa
Worker α: rebuild _generate_course_content to emit 5-page weekly modules
mdmurphy822 Apr 20, 2026
4c2392b
Merge pull request #51 from mdmurphy822/worker-alpha/courseforge-cont…
mdmurphy822 Apr 20, 2026
37c4075
Worker β: wire Trainforge CourseProcessor into _generate_assessments
mdmurphy822 Apr 20, 2026
958a23a
Merge pull request #52 from mdmurphy822/worker-beta/trainforge-execution
mdmurphy822 Apr 20, 2026
2e9072f
fix: reconcile β/γ path contract (nested CourseProcessor layout)
mdmurphy822 Apr 20, 2026
fb92fdd
Merge pull request #53 from mdmurphy822/fix/gamma-beta-path-contract
mdmurphy822 Apr 20, 2026
ab42a29
fix: filter front/back-matter chrome from DART-extracted topic headings
mdmurphy822 Apr 20, 2026
52cb2d8
Merge pull request #54 from mdmurphy822/fix/objective-heading-filter
mdmurphy822 Apr 20, 2026
3df738c
fix: tighten heading filter — reject sentence-body residue
mdmurphy822 Apr 20, 2026
6435a53
Merge pull request #55 from mdmurphy822/fix/heading-filter-tighten
mdmurphy822 Apr 20, 2026
bf196ce
fix: reject hyphen-truncated + repeated-phrase heading artifacts
mdmurphy822 Apr 20, 2026
817e72c
Merge pull request #56 from mdmurphy822/fix/heading-filter-artifacts
mdmurphy822 Apr 20, 2026
04aa4bd
MCP pipeline_tools: registry stubs, source-router heuristic, LO scoping
mdmurphy822 Apr 20, 2026
dd68be5
Content-gen layer: remove placeholder prose, dynamic content pages, t…
mdmurphy822 Apr 20, 2026
bdb56ab
Worker W4: Trainforge + docs remediation
mdmurphy822 Apr 20, 2026
47a0853
Merge pull request #59 from mdmurphy822/worker-w4/trainforge-docs-rem…
mdmurphy822 Apr 20, 2026
9f2494e
Merge pull request #58 from mdmurphy822/worker-w3/pipeline-tools-reme…
mdmurphy822 Apr 20, 2026
f1e007d
Merge pull request #57 from mdmurphy822/worker-w1/content-gen-remedia…
mdmurphy822 Apr 20, 2026
522c5b0
W2 (pipeline plumbing): --weeks propagation + 7 missing tool schemas
mdmurphy822 Apr 20, 2026
800757e
Merge pull request #60 from mdmurphy822/worker-w2/cli-schemas-yaml-adds
mdmurphy822 Apr 20, 2026
48de38b
fix(dart): per-PDF title + tighten heading detection in _raw_text_to_…
mdmurphy822 Apr 21, 2026
9695525
Merge pull request #61 from mdmurphy822/fix/dart-semantic-structure
mdmurphy822 Apr 21, 2026
ed456a0
fix(dart): round 2 — standalone-line check + multi-space column reject
mdmurphy822 Apr 21, 2026
47d8355
Merge pull request #62 from mdmurphy822/fix/dart-structure-round2
mdmurphy822 Apr 21, 2026
650e14d
fix(dart): 8-fix deep overhaul of _raw_text_to_accessible_html
mdmurphy822 Apr 21, 2026
1de8ca9
Merge pull request #63 from mdmurphy822/fix/dart-semantic-structure-deep
mdmurphy822 Apr 21, 2026
98b29a1
Wave 12: DART ontology-aware converter foundation
mdmurphy822 Apr 21, 2026
ab39614
Merge pull request #64 from mdmurphy822/wave12/dart-pipeline-foundation
mdmurphy822 Apr 21, 2026
d6f499a
Wave 13: expand DART converter templates with ontology layers
mdmurphy822 Apr 21, 2026
b43cd5c
Merge pull request #65 from mdmurphy822/wave13/ontology-layer-expansion
mdmurphy822 Apr 21, 2026
781bc5b
Wave 14: LLM-backed DART block classifier behind LLMBackend (#66)
mdmurphy822 Apr 21, 2026
31464b4
Fix convert_pdftotext_to_html RuntimeError inside running event loop
mdmurphy822 Apr 21, 2026
9b4b7c6
Merge pull request #67 from mdmurphy822/hotfix/convert-pdftotext-runn…
mdmurphy822 Apr 21, 2026
a045300
Wave 15: pipeline flip + document-level ontology decoration
mdmurphy822 Apr 21, 2026
241b5fc
Merge pull request #68 from mdmurphy822/wave15/document-decoration
mdmurphy822 Apr 21, 2026
d615899
Wave 16: dual-extraction pipeline + MathML fallback
mdmurphy822 Apr 21, 2026
856a363
Merge pull request #69 from mdmurphy822/wave16/dual-extraction-mathml
mdmurphy822 Apr 21, 2026
8cb1ce7
Wave 17: persist PyMuPDF figures + caption detection + WCAG fallback
mdmurphy822 Apr 21, 2026
6444028
Merge pull request #70 from mdmurphy822/wave17/figure-persistence
mdmurphy822 Apr 21, 2026
789dba8
Wave 18: PyMuPDF peer extractors + font-size heading promotion
mdmurphy822 Apr 21, 2026
5df855c
Merge pull request #71 from mdmurphy822/wave18/pymupdf-peer-extractor
mdmurphy822 Apr 21, 2026
347dfc0
Wave 19: restore legacy contract dropped by Waves 12-18
mdmurphy822 Apr 21, 2026
88dcdfc
Merge pull request #72 from mdmurphy822/wave19/contract-restoration
mdmurphy822 Apr 21, 2026
2ddd1bb
Wave 20: page-chrome detection strips running headers/footers/page-nu…
mdmurphy822 Apr 21, 2026
cdd40fe
Merge pull request #73 from mdmurphy822/wave20/page-chrome
mdmurphy822 Apr 21, 2026
4e6492e
Mirror Wave 19 figures archival in registry archive_to_libv2
mdmurphy822 Apr 21, 2026
4d27142
Merge pull request #74 from mdmurphy822/hotfix/registry-archive-to-li…
mdmurphy822 Apr 21, 2026
5f9736e
Wave 21: list detection promotes bullet/numbered paragraphs to <ul>/<ol>
mdmurphy822 Apr 21, 2026
dce71a0
Merge remote-tracking branch 'origin/dev-v0.2.0' into worktree-agent-…
mdmurphy822 Apr 21, 2026
5472173
Merge pull request #75 from mdmurphy822/wave21/list-detection
mdmurphy822 Apr 21, 2026
2ba62ee
Gitignore plans/ — keep scratch reviews + sub-plans local-only
mdmurphy822 Apr 21, 2026
2490749
Merge pull request #76 from mdmurphy822/chore/gitignore-plans
mdmurphy822 Apr 21, 2026
0080771
Gitignore inputs/ contents, keep directory via .gitkeep
mdmurphy822 Apr 21, 2026
89dc7e0
Merge pull request #77 from mdmurphy822/chore/gitignore-inputs
mdmurphy822 Apr 21, 2026
756fb61
Wave 22: fix hardening wiring + decision-capture instrumentation (F1/…
mdmurphy822 Apr 21, 2026
e26de63
Merge pull request #78 from mdmurphy822/wave22/executor-hardening-dec…
mdmurphy822 Apr 21, 2026
f03e8fe
Wave 23: per-gate input routing + orchestrator executor wiring + libv…
mdmurphy822 Apr 21, 2026
166a3af
Merge pull request #79 from mdmurphy822/wave23/gate-orchestrator-wiring
mdmurphy822 Apr 21, 2026
dd2e404
Wave 24: real objective_extraction + course_planning, fail-loud LO al…
mdmurphy822 Apr 21, 2026
e2cb6d3
Merge pull request #80 from mdmurphy822/wave24/objective-extraction-l…
mdmurphy822 Apr 21, 2026
8692d1b
Wave 25: DART classification-cascade fixes (7 independent guards)
mdmurphy822 Apr 21, 2026
a3a2ec1
Merge pull request #81 from mdmurphy822/wave25/dart-classifier-guardr…
mdmurphy822 Apr 21, 2026
3c0f79a
Wave 26: assessment pedagogical quality — real-failure-mode validators
mdmurphy822 Apr 21, 2026
a49a3ea
Merge pull request #82 from mdmurphy822/wave26/assessment-pedagogical…
mdmurphy822 Apr 21, 2026
f4a1d3d
Wave 27: Courseforge packager routing, heading byline/math filter, so…
mdmurphy822 Apr 21, 2026
2f750a5
Merge pull request #83 from mdmurphy822/wave27/packager-headings-sour…
mdmurphy822 Apr 21, 2026
6bf2472
Wave 28b: de-corpus production comments + test fixtures
mdmurphy822 Apr 21, 2026
3594383
Merge pull request #84 from mdmurphy822/wave28b/de-corpus-source
mdmurphy822 Apr 21, 2026
9224f8a
Wave 28: content flow hardening — week titles, activity variety, disp…
mdmurphy822 Apr 21, 2026
2cff75d
Merge remote-tracking branch 'origin/dev-v0.2.0' into worktree-agent-…
mdmurphy822 Apr 21, 2026
379e118
Merge pull request #85 from mdmurphy822/wave28/content-flow-hardening
mdmurphy822 Apr 21, 2026
97f2958
Wave 28c: de-corpus residue in byline tests + one packager comment
mdmurphy822 Apr 21, 2026
0c953ba
Merge pull request #86 from mdmurphy822/wave28c/test-fixture-cleanup
mdmurphy822 Apr 21, 2026
cf38be0
Rewrite end-customer READMEs for clarity and concision
mdmurphy822 Apr 21, 2026
349c82a
Merge remote-tracking branch 'origin/dev-v0.2.0' into worktree-agent-…
mdmurphy822 Apr 21, 2026
1f11002
Merge pull request #87 from mdmurphy822/docs/readme-end-customer
mdmurphy822 Apr 21, 2026
38c675f
Wave 29: six-defect followup — article nesting, gate routing, CLI exi…
mdmurphy822 Apr 21, 2026
0abb55b
Merge remote-tracking branch 'origin/dev-v0.2.0' into worktree-agent-…
mdmurphy822 Apr 21, 2026
008564b
Merge pull request #88 from mdmurphy822/wave29/article-gates-cli-codes
mdmurphy822 Apr 21, 2026
5e47781
docs: refresh CLAUDE.md family + ONTOLOGY.md to current state
mdmurphy822 Apr 21, 2026
e6927e1
Merge remote-tracking branch 'origin/dev-v0.2.0' into worktree-agent-…
mdmurphy822 Apr 21, 2026
7db53a4
Merge pull request #89 from mdmurphy822/docs/claude-md-refresh
mdmurphy822 Apr 21, 2026
f766386
Wave 28d: de-corpus gold_standard.html + _content_gen_helpers comments
mdmurphy822 Apr 21, 2026
a718dac
Merge remote-tracking branch 'origin/dev-v0.2.0' into worktree-agent-…
mdmurphy822 Apr 21, 2026
449e102
Merge pull request #90 from mdmurphy822/wave28d/gold-standard-residua…
mdmurphy822 Apr 21, 2026
cc9a0a2
Wave 28e: close 4 loose ends from MCP surface audit #2
mdmurphy822 Apr 21, 2026
ff99604
Merge pull request #91 from mdmurphy822/wave28e/mcp-surface-integrity
mdmurphy822 Apr 21, 2026
f092bd0
Wave 30: close four user-visible quality gaps surfaced by 5-persona sim
mdmurphy822 Apr 21, 2026
a872b5b
Merge pull request #92 from mdmurphy822/wave30/alt-text-anchors-train…
mdmurphy822 Apr 21, 2026
c904ed8
Wave 31: rebuild rubber-stamping validators — OSCQR + WCAG + ContentG…
mdmurphy822 Apr 21, 2026
7494160
Merge pull request #93 from mdmurphy822/wave31/validator-semantics
mdmurphy822 Apr 21, 2026
04de13d
Wave 28f Phase 1: zero-risk bloat removal
mdmurphy822 Apr 21, 2026
831a84f
Wave 28f Phase 2: orphaned Courseforge script + agent subtrees
mdmurphy822 Apr 21, 2026
ca922b0
Wave 28f Phase 3: ratcheted removal of grace-expired surfaces
mdmurphy822 Apr 21, 2026
538b533
Wave 28f Phase 4: trivia fixes
mdmurphy822 Apr 21, 2026
7b40b2d
Merge pull request #94 from mdmurphy822/wave28f/bloat-removal
mdmurphy822 Apr 21, 2026
be265ac
Wave 32: close 3 sim-2 bugs — training_synthesis schema, gate-input
mdmurphy822 Apr 22, 2026
09c14dd
Merge pull request #95 from mdmurphy822/wave32/phase-outputs-training…
mdmurphy822 Apr 22, 2026
772e208
Wave 33: close sim-03 execution-model bugs (A schema, B gate ordering…
mdmurphy822 Apr 22, 2026
6f911be
Merge pull request #96 from mdmurphy822/wave33/execution-model-ordering
mdmurphy822 Apr 22, 2026
844e0fd
Wave 34 Deliverable 1: TaskMailbox atomic file-based bridge
mdmurphy822 Apr 22, 2026
2ecfe72
Wave 34 Deliverable 2: LocalDispatcher mailbox bridge
mdmurphy822 Apr 22, 2026
1eb04ae
Wave 34 Deliverable 3: ed4all mailbox watch CLI
mdmurphy822 Apr 22, 2026
5cc9ad3
Wave 34 Deliverable 4: content_prompts prompt builders
mdmurphy822 Apr 22, 2026
bb42b4c
Wave 34 smoke: 2-week synthetic content_generation via mailbox bridge
mdmurphy822 Apr 22, 2026
b60c486
Merge pull request #97 from mdmurphy822/wave34/local-dispatcher-mailb…
mdmurphy822 Apr 22, 2026
09fb3ca
Wave 35: content_grounding path — section-boundary fallback, article …
mdmurphy822 Apr 22, 2026
41b879d
Wave 36: Critical fixes — slug alignment, retry backoff, doc drift
mdmurphy822 Apr 22, 2026
97697f7
Wave 37: Medium-scope cleanup — doc alignment, envelope shape, param …
mdmurphy822 Apr 22, 2026
0da5a83
Wave 38: Architectural cleanup — poison cancel, capture wiring test, …
mdmurphy822 Apr 22, 2026
42979bc
Merge pull request #98 from mdmurphy822/wave35-36-37/content-groundin…
mdmurphy822 Apr 22, 2026
0e03d09
Release v0.2.0: bump package + CLI version
mdmurphy822 Apr 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,18 @@ coverage.xml
# =============================================================================
# Ed4All - LibV2 Content (preserve structure, exclude data)
# =============================================================================
# Course directories under LibV2/courses/ contain user-specific content
# (chunks.jsonl, graph/, quality/, retrieval/gold_queries.jsonl, ...). These
# are intentionally not tracked so this repository stays course-agnostic.
# Reference-retrieval fixtures live in
# LibV2/tools/libv2/tests/test_eval_harness_retrieval.py; users curate their
# own per-course gold queries locally (see docs/libv2/reference-retrieval.md
# "Adding gold queries to your own corpus").
LibV2/courses/*
!LibV2/courses/.gitkeep
# LibV2/catalog/cross_package_concepts.json is regenerated on demand via
# ``libv2 cross-index`` against whatever courses a user has loaded locally;
# we do not ship a course-specific snapshot.
LibV2/catalog/*
!LibV2/catalog/.gitkeep

Expand Down Expand Up @@ -102,6 +112,8 @@ training-captures/trainforge/*
!training-captures/trainforge/.gitkeep
training-captures/textbook-pipeline/*
!training-captures/textbook-pipeline/.gitkeep
training-captures/pipeline/*
!training-captures/pipeline/.gitkeep

# MCP runtime
MCP/runtime/
Expand Down Expand Up @@ -129,3 +141,10 @@ state/GENERATION_PROGRESS.md

# Examples output
examples/output/

# Planning artifacts — scratch docs, reviews, sub-plans; kept local-only
plans/

# Top-level inputs/ — corpus PDFs + local scratch; directory kept, contents ignored
inputs/*
!inputs/.gitkeep
236 changes: 198 additions & 38 deletions CLAUDE.md

Large diffs are not rendered by default.

77 changes: 61 additions & 16 deletions Courseforge/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,17 +86,14 @@ USER REQUEST →
### Course Creation Agents
| Agent | Purpose | When to Use |
|-------|---------|-------------|
| `exam-research` | Certification objective analysis | Analyzing exam/certification objectives |
| `requirements-collector` | Course specification gathering | New course projects |
| `course-outliner` | Course structure and learning objectives | Creating course framework |
| `course-outliner` | Synthesize canonical `TO-NN` / `CO-NN` objectives from textbook structure; persist `synthesized_objectives.json`. Wave 24+ routes this agent to `plan_course_structure` (no longer just creates project dirs). | Creating course framework |
| `content-generator` | Educational content creation | Content development (1 file per agent) |
| `educational-standards` | Pedagogical framework compliance | UDL, ADDIE, Bloom's alignment |
| `quality-assurance` | Pattern prevention and validation | Quality gates |
| `oscqr-course-evaluator` | Educational quality assessment | OSCQR evaluation |
| `brightspace-packager` | IMSCC package generation | Final deployment |
| `html-design-research` | HTML/CSS design pattern research | Template and design validation |
| `objective-synthesizer` | Learning objective synthesis | Combining objectives from textbooks |
| `textbook-ingestor` | Textbook content processing | Entry point for textbook materials |
| `source-router` | Bind DART source blocks to Courseforge module pages | Source attribution for pipeline runs |

### Intake & Remediation Agents (NEW)
| Agent | Purpose | When to Use |
Expand Down Expand Up @@ -151,10 +148,9 @@ Task(content-generator, "Create all Week 1 content") # NEVER DO THIS
├── schemas/ # IMSCC and content schemas
├── imscc-standards/ # Brightspace/IMSCC technical specs
├── scripts/ # Automation scripts
│ ├── imscc-extractor/ # Universal IMSCC extraction (NEW)
│ ├── dart-batch-processor/ # Automated DART conversion (NEW)
│ ├── component-applier/ # Interactive component application (NEW)
│ └── remediation-validator/ # Final quality validation (NEW)
│ ├── imscc-extractor/ # Universal IMSCC extraction
│ ├── component-applier/ # Interactive component application
│ └── remediation-validator/ # Final quality validation
├── exports/ # Generated course packages
│ └── YYYYMMDD_HHMMSS_name/ # Timestamped project folders
└── runtime/ # Agent workspaces (auto-created)
Expand Down Expand Up @@ -243,25 +239,75 @@ Courseforge HTML pages embed machine-readable instructional design metadata for

| Attribute | Element | Purpose |
|-----------|---------|---------|
| `data-cf-objective-id` | `<li>` (objectives) | Learning objective identifier |
| `data-cf-role` | `<body>` (template chrome) | Page role classification (e.g. `template-chrome`) |
| `data-cf-objective-id` | `<li>` (objectives) | Learning objective identifier (canonical `TO-NN` / `CO-NN` pattern) |
| `data-cf-bloom-level` | `<li>`, `.self-check`, `.activity-card` | Bloom's taxonomy level |
| `data-cf-bloom-verb` | `<li>` (objectives) | Detected Bloom's verb |
| `data-cf-bloom-range` | `<section>`, `<h2>` | Section-level Bloom level span (emit-only) |
| `data-cf-cognitive-domain` | `<li>` (objectives) | Knowledge domain (factual/conceptual/procedural/metacognitive) |
| `data-cf-content-type` | `<h2>`, `<h3>`, `.callout` | Section content classification |
| `data-cf-teaching-role` | `<section>`, component wrappers | Pedagogical teaching role |
| `data-cf-key-terms` | `<h2>`, `<h3>` | Comma-separated term slugs |
| `data-cf-term` | key-term `<span>` | Individual term slug (emit-only) |
| `data-cf-component` | `.flip-card`, `.self-check`, `.activity-card` | Interactive component type |
| `data-cf-purpose` | `.flip-card`, `.self-check`, `.activity-card` | Pedagogical purpose |
| `data-cf-objective-ref` | `.self-check`, `.activity-card` | Associated learning objective |
| `data-cf-source-ids` | `<section>`, headings, component wrappers | DART `sourceId`(s) that ground this block. Shape: `dart:{slug}#{block_id}`. Carried through from DART's `data-dart-block-id` when source material is present; elided when no source grounding exists. |
| `data-cf-source-primary` | `<section>`, headings, component wrappers | The primary `sourceId` for the block (subset of `data-cf-source-ids`) when one source dominates. |

Attributes stop at the **section / component wrapper level** — never on every `<p>` / `<li>` / `<tr>` in prose.

### Wave 35: ancestor-walkable grounding

`ContentGroundingValidator` walks each non-trivial `<p>` / `<li>` /
`<figcaption>` / `<blockquote>`'s ancestor chain to find the first
`data-cf-source-ids` attribute. Three emit-side contracts keep that
walk passing:

1. **Content sections are wrapped in `<section data-cf-source-ids="…">`.**
`Courseforge/scripts/generate_course.py::_render_content_sections`
now wraps each h2/h3 + paragraph group in a `<section>` wrapper
carrying the section's resolved source-ids. Pre-Wave-35 the
attribute lived only on the `<h2>` (a DOM sibling of the `<p>`),
which the validator's ancestor walk couldn't reach.
2. **`content_NN` pages inherit `content_01` grounding.**
`_page_refs_for` falls back from `content_NN` → `content_01` in
the `source_module_map`. The source-router only emits a single
per-week `content_01` entry; every generated content page in that
week shares the same DART source region, so the fallback is the
correct grounding (not a workaround).
3. **Objectives `<section>` mirrors page-level source-ids.**
`ensure_objectives_on_page` scans the page body for the first
`<section data-cf-source-ids="…">` wrapper and stamps the same
ids onto the injected objectives section. Long synthesized LO
statements that exceed the 30-word non-trivial floor otherwise
flagged as ungrounded under the ancestor walk.

DART-side slug contract (see `DART/CLAUDE.md`): the `dart:{slug}#{block_id}`
slug uses `lowercase + space-to-hyphen` normalization (not
`canonical_slug`'s underscore collapse), matching the validator's
`_resolve_valid_block_ids` rule.

### JSON-LD Structured Metadata

Each page includes a `<script type="application/ld+json">` block in `<head>` with:
- `learningObjectives`: ID, statement, Bloom's level/verb, cognitive domain, assessment suggestions
- `sections`: Heading, content type, Bloom's range, key terms with definitions
- `learningObjectives`: ID (canonical `TO-NN` / `CO-NN`), statement, Bloom's level/verb, cognitive domain, assessment suggestions
- `sections`: Heading, content type, Bloom's range, key terms with definitions, optional per-section `sourceReferences`
- `misconceptions`: Common misconceptions with corrections
- `suggestedAssessmentTypes`: Recommended question formats
- `prerequisitePages`: Cross-page prerequisite refs
- `sourceReferences`: Optional page-level DART source references (canonical `{sourceId, role, weight?, confidence?, pages?, extractor?}` shape). Page-level JSON-LD `role` is authoritative (`primary` / `contributing` / `corroborating`) and takes precedence over attribute-level roles.

Context namespace: `https://ed4all.dev/ns/courseforge/v1`
Canonical shape: `schemas/knowledge/courseforge_jsonld_v1.schema.json`. Context namespace: `https://ed4all.dev/ns/courseforge/v1`.

### Learning Objective IDs

Emitted LO IDs follow the pattern `^[A-Z]{2,}-\d{2,}$` from the canonical helper `lib/ontology/learning_objectives.py::mint_lo_id`:

- `TO-NN` — terminal (course-wide) objective.
- `CO-NN` — chapter-level objective.

Synthesized objectives are persisted to `{project}/01_learning_objectives/synthesized_objectives.json` by the `plan_course_structure` phase in the `textbook_to_course` pipeline. Downstream Trainforge consumers match case-insensitively; the `TRAINFORGE_PRESERVE_LO_CASE` flag preserves the emit case.

---

Expand Down Expand Up @@ -341,14 +387,13 @@ Courseforge can import and remediate IMSCC packages from:
### Scripts for Course Generation
| Script | Location | Purpose |
|--------|----------|---------|
| `generate_course.py` | `scripts/` | Multi-file weekly course generation with metadata enrichment |
| `package_multifile_imscc.py` | `scripts/` | Package multi-file course output into IMSCC |
| `generate_course.py` | `scripts/` | Multi-file weekly course generation. Emits page-level JSON-LD, `course_metadata.json`, prerequisite-page refs, `data-cf-teaching-role`, and `data-cf-source-ids` / page-level `sourceReferences` when DART source material is staged. |
| `package_multifile_imscc.py` | `scripts/` | Packages multi-file output into IMSCC. Structural validation is on by default (per-week `learningObjectives` must resolve to the week's LO manifest). Auto-discovers `course.json` and bundles `course_metadata.json` at the zip root. Manifest uses IMS Common Cartridge v1.3 namespaces; resources are nested under per-week `<item>` wrappers in the organization tree. **This is the runtime target of the MCP `package_imscc` tool** — `MCP/tools/pipeline_tools.py::_package_imscc` imports and delegates here instead of hand-rolling a ZIP. |

### Scripts for Intake
| Script | Location | Purpose |
|--------|----------|---------|
| `imscc_extractor.py` | `scripts/imscc-extractor/` | Universal IMSCC parsing |
| `dart_batch_processor.py` | `scripts/dart-batch-processor/` | Parallel DART conversion |
| `component_applier.py` | `scripts/component-applier/` | Interactive component application |
| `remediation_validator.py` | `scripts/remediation-validator/` | Final quality validation |

Expand Down
196 changes: 12 additions & 184 deletions Courseforge/README.md
Original file line number Diff line number Diff line change
@@ -1,201 +1,29 @@
# Courseforge

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
[![WCAG 2.2 AA](https://img.shields.io/badge/WCAG-2.2%20AA-green.svg)](https://www.w3.org/WAI/WCAG22/quickref/)

**Education Reimagined. Access for All.**
**Generate LMS-ready course packages from learning objectives or accessible textbook content.**

AI-powered course generation and remediation system that creates and improves accessible, LMS-ready IMSCC packages.
Courseforge turns a set of objectives (and optional DART-processed textbook HTML) into a complete, accessible, IMSCC-packaged online course. Output includes weekly modules with content pages, activities, self-checks, summaries, and discussions — all WCAG 2.2 AA compliant and ready to import into Brightspace, Canvas, Blackboard, or Moodle. Every page carries rich machine-readable metadata (Bloom's-aligned learning objectives, content types, key terms, misconceptions) so downstream tools can ground assessments and retrieval in cited source material. Courseforge can also ingest an existing IMSCC package from any supported LMS and remediate it to 100% WCAG 2.2 AA compliance.

## Overview

Courseforge uses a multi-agent orchestration system to create high-quality online courses compatible with Brightspace/D2L and other learning management systems. It also provides comprehensive intake and remediation capabilities for existing courses.

### Key Features

**Course Creation**
- **Simplified Pipeline**: Exam objectives + textbooks → IMSCC package
- **DART Integration**: Accessibility-first textbook processing
- **Multi-Agent System**: Specialized agents for each phase of development
- **WCAG 2.2 AA**: Built-in accessibility compliance
- **OSCQR Standards**: Educational quality validation
- **Pattern Prevention**: 22+ error patterns identified and prevented

**Course Intake & Remediation (NEW)**
- **Universal IMSCC Import**: Canvas, Blackboard, Moodle, Brightspace, Sakai
- **Automated DART Conversion**: PDFs and Office docs → accessible HTML
- **AI-Powered Accessibility Fixes**: Alt text, heading structure, contrast
- **Intelligent Component Styling**: AI-selected interactive elements
- **100% WCAG 2.2 AA Compliance**: Guaranteed accessibility output

## Quick Start

### Mode 1: Course Creation
1. Place exam objectives in `inputs/exam-objectives/`
2. (Optional) Process textbooks through DART and place in `inputs/textbooks/`
3. Invoke: `exam-research → course-outliner → content-generator → brightspace-packager`
4. Output: IMSCC file in `exports/YYYYMMDD_HHMMSS_coursename/`

### Mode 2: Course Remediation (NEW)
1. Place existing IMSCC in `inputs/existing-packages/`
2. Invoke: `imscc-intake-parser → content-analyzer → remediation agents → brightspace-packager`
3. Output: Improved IMSCC with 100% accessibility compliance

## Project Structure

```
Courseforge/
├── CLAUDE.md # Orchestration instructions
├── README.md # This file
├── docs/ # Documentation
│ ├── troubleshooting.md
│ ├── workflow-reference.md
│ └── getting-started.md
├── agents/ # Agent specifications
├── inputs/ # Input files
│ ├── exam-objectives/
│ ├── textbooks/
│ └── existing-packages/ # IMSCC for intake (NEW)
├── scripts/ # Automation scripts (NEW)
│ ├── imscc-extractor/
│ ├── dart-batch-processor/
│ ├── component-applier/
│ └── remediation-validator/
├── templates/ # HTML templates
├── schemas/ # IMSCC schemas
├── imscc-standards/ # Technical specs
├── exports/ # Generated packages
└── runtime/ # Agent workspaces
```

## Available Agents

### Course Creation
| Agent | Purpose |
|-------|---------|
| `exam-research` | Certification objective analysis |
| `requirements-collector` | Course specification gathering |
| `course-outliner` | Structure and learning objectives |
| `content-generator` | Educational content creation |
| `educational-standards` | Pedagogical compliance |
| `quality-assurance` | Pattern prevention |
| `oscqr-course-evaluator` | Quality assessment |
| `brightspace-packager` | IMSCC packaging |

### Intake & Remediation (NEW)
| Agent | Purpose |
|-------|---------|
| `imscc-intake-parser` | Universal IMSCC import |
| `content-analyzer` | Accessibility/quality gap detection |
| `dart-automation-coordinator` | Automated document conversion |
| `accessibility-remediation` | WCAG 2.2 AA fixes |
| `content-quality-remediation` | Educational depth enhancement |
| `intelligent-design-mapper` | AI component selection |

## Workflow

```
USER REQUEST →
exam-research (analyze objectives) →
course-outliner (create structure) →
content-generator (create content, 10 agents/batch) →
quality-assurance + oscqr-course-evaluator (validate) →
brightspace-packager (package) →
IMSCC OUTPUT
```

## Textbook Processing

Textbooks must be processed through DART before use:
## Quick example

```bash
# Set DART_PATH to your DART installation directory
cd $DART_PATH
python convert.py textbook.pdf -o /path/to/courseforge/inputs/textbooks/
# From the repo root, as part of the full Ed4All pipeline:
ed4all run textbook-to-course --corpus my_textbook.pdf --course-name MY_COURSE_101
```

DART produces WCAG 2.2 AA accessible HTML with:
- Semantic structure
- Alt text for images
- MathML for equations
- Proper heading hierarchy

## Quality Standards

### OSCQR Thresholds
- Pre-development: 70%
- Pre-production: 90%
- Accessibility: 100%

### Pattern Prevention
Critical patterns addressed:
- Schema/namespace consistency
- Assessment XML format (QTI 1.2)
- Content completeness
- Organization hierarchy

See `docs/troubleshooting.md` for complete pattern list.

## Documentation

| Document | Purpose |
|----------|---------|
| `CLAUDE.md` | Main orchestration instructions |
| `docs/troubleshooting.md` | Error patterns and solutions |
| `docs/workflow-reference.md` | Execution protocols |
| `docs/getting-started.md` | Quick start guide |
| `agents/*.md` | Individual agent specs |

## Technical Requirements

- Python 3.9+
- Claude Code access
- Brightspace/D2L for import testing

## DART Setup (Optional)

DART (Digital Accessibility Remediation Tool) is a separate tool used for converting PDFs and Office documents to accessible HTML. It's **optional** but recommended for textbook processing.

### Installation

DART is available as a separate project. Once installed, configure the environment variable:

```bash
# Add to your shell profile (.bashrc, .zshrc, etc.)
export DART_PATH=/path/to/your/DART/installation
```

### Usage with Courseforge

Once `DART_PATH` is set, Courseforge scripts will automatically detect and use DART for:
- PDF textbook conversion
- Office document (Word, PowerPoint) conversion
- Batch document processing via `scripts/dart-batch-processor/`

### Without DART

Courseforge works without DART for:
- Course creation from exam objectives
- IMSCC package generation
- Course remediation (accessibility fixes to existing HTML)

Only textbook PDF/Office conversion requires DART.
Finished packages land under `Courseforge/exports/YYYYMMDD_HHMMSS_coursename/`. For intake/remediation of an existing package, drop the IMSCC into `Courseforge/inputs/existing-packages/` and run the `intake_remediation` workflow.

## Compatibility
## LMS compatibility

- Brightspace/D2L
- Canvas
- Blackboard
- Moodle
- Any LMS supporting IMSCC 1.1+
Brightspace / D2L, Canvas, Blackboard, Moodle, Sakai, and any LMS that supports IMSCC 1.1 or later.

---
## More

**Version**: 1.0.0
**License**: MIT
**Last Updated**: December 2025
See [`Courseforge/CLAUDE.md`](CLAUDE.md) for the full agent pipeline, metadata contract (`data-cf-*` + JSON-LD), template components, and quality standards.

---
## License

*Love and be loved, live and be free.*
MIT
Loading
Loading