Didactopus/src/didactopus/knowledge_export.py

60 lines
2.1 KiB
Python

from __future__ import annotations
import json
from pathlib import Path
from .repository import get_pack, load_learner_state
def build_knowledge_snapshot(learner_id: str, pack_id: str) -> dict:
pack = get_pack(pack_id)
state = load_learner_state(learner_id)
concept_map = {c.id: c for c in (pack.concepts if pack else [])}
observations = []
for rec in state.records:
concept = concept_map.get(rec.concept_id)
observations.append({
"concept_id": rec.concept_id,
"title": concept.title if concept else rec.concept_id,
"score": rec.score,
"confidence": rec.confidence,
"evidence_count": rec.evidence_count,
"interpretation": (
"candidate mastery"
if rec.score >= 0.65 and rec.confidence >= 0.5
else "still developing"
),
})
return {
"learner_id": learner_id,
"pack_id": pack_id,
"export_kind": "knowledge_snapshot",
"pack_title": pack.title if pack else "",
"observations": observations,
"pack_improvement_candidates": [
"Look for concepts with repeated low-confidence evidence.",
"Check whether hidden prerequisites are missing.",
"Inspect surprising learner success for better examples or shortcuts."
],
"curriculum_product_candidates": [
"study_guide",
"lesson_outline",
"exercise_set",
"mentor_notes"
],
"skill_export_candidates": [
"agent skill manifest",
"evaluation checklist",
"failure-mode notes",
"canonical examples"
],
}
def main():
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("learner_id")
parser.add_argument("pack_id")
parser.add_argument("out_json")
args = parser.parse_args()
payload = build_knowledge_snapshot(args.learner_id, args.pack_id)
Path(args.out_json).write_text(json.dumps(payload, indent=2), encoding="utf-8")
print(f"Wrote {args.out_json}")