{"version":3,"sources":["../src/errors/index.ts","../src/ai/streamRunner.ts","../src/ai/provider-factory.ts","../src/services/templateLoader.ts","../src/pipeline/artifactLinter.ts","../src/parsers/lessonFlowParser.ts","../src/ai/prompts/slideBlueprintPrompt.ts","../src/services/slideVisionJudge.ts","../src/ai/prompts/slideBatchPrompt.ts","../src/ai/prompts/slideBespokePrompt.ts","../src/media/types.ts","../src/media/stockSearch.ts","../src/media/imageProviders.ts","../src/media/slideImages.ts","../src/media/iconRepair.ts","../src/services/slideBudget.ts","../src/services/utils/slideAuditUtils.ts","../src/services/utils/jsonExtractionUtils.ts","../src/services/utils/slideBatchUtils.ts","../src/services/slideProductionWorkflow.ts","../src/schemas/lessonPlanSchema.ts","../src/schemas/activitySchema.ts","../src/schemas/codeLabSchema.ts","../src/schemas/worksheetSchema.ts","../src/schemas/handoutSchema.ts","../src/schemas/slideDeckSchema.ts","../src/schemas/teacherGuideSchema.ts","../src/schemas/extensionSchema.ts","../src/schemas/judgeSchema.ts","../src/schemas/projectGraphSchema.ts","../src/schemas/instructionSchema.ts","../src/schemas/selfLabSchema.ts","../src/schemas/diagnosticQuizSchema.ts","../src/schemas/selfPacedBundleSchema.ts","../src/schemas/rubricSchema.ts","../src/schemas/exitTicketSchema.ts","../src/schemas/tieredPracticeSchema.ts","../src/schemas/bellRingerSchema.ts","../src/schemas/glossarySchema.ts","../src/schemas/choiceBoardSchema.ts","../src/schemas/graphicOrganizerSchema.ts","../src/schemas/scienceLabSchema.ts","../src/schemas/stationRotationSchema.ts","../src/schemas/taskCardsSchema.ts","../src/schemas/reviewGameSchema.ts","../src/schemas/curriculumPlanSchema.ts","../src/schemas/index.ts","../src/ai/index.ts","../src/ai/prompts/lessonMasterPrompt.ts","../src/ai/prompts/activityPrompt.ts","../src/ai/prompts/codeLabPrompt.ts","../src/ai/prompts/worksheetPrompt.ts","../src/ai/prompts/handoutPrompt.ts","../src/ai/prompts/slidesPrompt.ts","../src/ai/prompts/teacherGuidePrompt.ts","../src/ai/prompts/extensionPrompt.ts","../src/ai/prompts/judgePrompt.ts","../src/ai/prompts/projectInstructionPrompt.ts","../src/ai/prompts/selfLabPrompt.ts","../src/ai/prompts/diagnosticQuizPrompt.ts","../src/ai/flows/generateLessonMasterFlow.ts","../src/ai/streamJson.ts","../src/ai/flows/generateActivityFlow.ts","../src/ai/flows/generateCodeLabFlow.ts","../src/ai/flows/generateWorksheetFlow.ts","../src/ai/flows/generateHandoutFlow.ts","../src/ai/flows/generateSlidesFlow.ts","../src/ai/flows/generateTeacherGuideFlow.ts","../src/ai/flows/generateExtensionFlow.ts","../src/ai/flows/auditCurriculumQualityFlow.ts","../src/services/prefillService.ts","../src/constants/pedagogy.ts","../src/ai/flows/generateProjectInstructionFlow.ts","../src/ai/flows/generateSelfLabFlow.ts","../src/ai/flows/generateDiagnosticQuizFlow.ts","../src/ai/flows/streamLessonMasterFlow.ts","../src/ai/flows/streamSelfLabFlow.ts","../src/ai/flows/streamDiagnosticQuizFlow.ts","../src/ai/tools/specialistTools.ts","../src/ai/modelPolicyResolver.ts","../src/ai/llmJudgeEngine.ts","../src/ai/chatToolLoop.ts","../src/pipeline/markdownSerializers.ts","../src/pipeline/selfPacedSerializers.ts","../src/pipeline/autonomousRepair.ts","../src/constants/activityCatalog.ts","../src/services/loTimeEstimator.ts","../src/pipeline/milestoneBundleGenerator.ts","../src/pipeline/roadmapCurriculumGenerator.ts","../src/pipeline/projectInstructionGenerator.ts","../src/pipeline/generateSelfPacedBundle.ts","../src/pipeline/roadmapSotAdapter.ts","../src/pipeline/index.ts","../src/storage/fileSystemCurriculumAdapter.ts","../src/storage/supabaseCurriculumAdapter.ts","../src/storage/factory.ts","../src/services/statusService.ts","../src/services/contextService.ts","../src/services/sotGeneratorService.ts","../src/services/frameworkLinter.ts","../src/standards/standardStackGenerator.ts","../src/services/languageDirective.ts","../src/services/sotOwnership.ts","../src/services/lessonProductionService.ts","../src/workflow/gateSettings.ts","../src/parsers/headerDictionary.ts","../src/registry/artifactRegistry.ts","../src/services/curriculumHorizon.ts","../src/services/contextBuilder.ts","../src/services/artifactValidators.ts","../src/services/productSpec.ts","../src/services/knowledgeExpositionService.ts","../src/services/depthReconciler.ts","../src/services/curriculumPlannerService.ts","../src/standards/standardsContextInjector.ts","../src/standards/standardsCoverageGate.ts","../src/standards/frameworkPackSchema.ts","../src/standards/data/csta-pk12-2026.json","../src/standards/data/csta-k12-2017.json","../src/standards/data/acm-ieee-cs2023.json","../src/standards/bundledPacks.ts","../src/registry/artifactValidatorGate.ts","../src/parsers/artifactAstParser.ts","../src/parsers/artifactAstProjection.ts","../src/services/contextSlots.ts","../src/services/productionPromptAssembler.ts","../src/services/singleArtifactService.ts","../src/services/contextRouting.ts","../src/media/index.ts","../src/media/ledger.ts","../src/media/curator.ts","../src/media/orchestrate.ts","../src/services/projectCreationService.ts","../src/services/commandService.ts","../src/services/deterministicPipelineRunner.ts","../src/services/frameworkProjectionService.ts","../src/services/translationPolicyService.ts","../src/services/index.ts","../src/publishers/localWorkspaceManager.ts","../src/publishers/gitPublisher.ts","../src/publishers/supabasePublisher.ts","../src/publishers/packagingService.ts","../src/index.ts","../src/evaluators/deterministicStructuralLinter.ts","../src/evaluators/academicAuditor.ts","../src/evaluators/bloomTaxonomyEvaluator.ts","../src/evaluators/crossArtifactDriftEvaluator.ts","../src/evaluators/constructiveAlignmentEvaluator.ts","../src/evaluators/fiveEInstructionalEvaluator.ts","../src/evaluators/codeHardwareFeasibilityEvaluator.ts","../src/evaluators/misconceptionEvaluator.ts","../src/evaluators/semanticEvaluators.ts","../src/parsers/index.ts","../src/services/sectionExtractor.ts","../src/services/promptResolver.ts","../src/standards/standardsRegistryAdapter.ts"],"names":["path","fs","lines","durMatch","streamText","slidesSpec","resolveApiKey","jsonrepair","esc","generateObject","slides","detail","buildVisionRepairPrompt","z","blueprintItems","userPrompt","streamObject","__filename","fileURLToPath","__dirname","keyPath","excerpt","verified","norm","runCurriculumAIInference","rest","createHash","toString","BLOOM_LEVELS","t","context","TEMPLATE_BY_TYPE","lessonTitle","objective","concept","prerequisites","bloomLevel","injectYamlReviewMetadata","executeSlideProductionWorkflow","extPrompt","report","lintAndSanitizeArtifact","pad2","createClient","header","rows","dimFindings"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Curriculum OS - Standardized Error Taxonomy & Traceability System\n *\n * Provides typed, structured, and traceable error codes for all pipeline failures,\n * API exceptions, safeguard blocks, and contract violations.\n */\n\nexport type CurriculumErrorCode =\n  | 'ERR_AI_NO_API_KEY'\n  | 'ERR_AI_RATE_LIMIT'\n  | 'ERR_AI_AUTH_FAILED'\n  | 'ERR_AI_NETWORK_TIMEOUT'\n  | 'ERR_AI_RESPONSE_MALFORMED'\n  | 'ERR_AI_ALL_PROVIDERS_FAILED'\n  | 'ERR_CUSTOM_INFERENCE_REQUIRED'\n  | 'ERR_SOT_MISSING'\n  | 'ERR_SOT_INVALID_SCHEMA'\n  | 'ERR_TASK_GATE_BLOCKED'\n  | 'ERR_METERED_LIMIT_EXCEEDED'\n  | 'ERR_SCHEMA_CONTRACT_VIOLATION'\n  | 'ERR_STORAGE_IO_FAILED'\n  | 'ERR_LESSON_NOT_IN_SOT'\n  | 'ERR_CONTEXT_MISSING';\n\nexport interface CurriculumErrorDetail {\n  errorCode: CurriculumErrorCode;\n  agent?: string;\n  artifactType?: string;\n  lessonId?: string;\n  provider?: string;\n  statusCode?: number;\n  message: string;\n  suggestedAction: string;\n  retryable: boolean;\n  timestamp: string;\n  rawError?: string;\n}\n\nexport class CurriculumError extends Error {\n  public readonly detail: CurriculumErrorDetail;\n\n  constructor(detail: Omit<CurriculumErrorDetail, 'timestamp'>) {\n    super(`[${detail.errorCode}] ${detail.message}`);\n    this.name = 'CurriculumError';\n    this.detail = {\n      ...detail,\n      timestamp: new Date().toISOString()\n    };\n    Object.setPrototypeOf(this, CurriculumError.prototype);\n  }\n\n  get errorCode(): CurriculumErrorCode {\n    return this.detail.errorCode;\n  }\n\n  get retryable(): boolean {\n    return this.detail.retryable;\n  }\n\n  get suggestedAction(): string {\n    return this.detail.suggestedAction;\n  }\n\n  toJSON(): CurriculumErrorDetail {\n    return this.detail;\n  }\n}\n\n/**\n * Helper to build standardized AI inference errors\n */\nexport function createAiInferenceError(params: {\n  errorCode: CurriculumErrorCode;\n  message: string;\n  provider?: string;\n  statusCode?: number;\n  agent?: string;\n  artifactType?: string;\n  lessonId?: string;\n  rawError?: any;\n  suggestedAction?: string;\n  retryable?: boolean;\n}): CurriculumError {\n  const {\n    errorCode,\n    message,\n    provider,\n    statusCode,\n    agent,\n    artifactType,\n    lessonId,\n    rawError,\n    suggestedAction = getSuggestedActionForCode(errorCode),\n    retryable = isCodeRetryable(errorCode)\n  } = params;\n\n  return new CurriculumError({\n    errorCode,\n    message,\n    provider,\n    statusCode,\n    agent,\n    artifactType,\n    lessonId,\n    suggestedAction,\n    retryable,\n    rawError: typeof rawError === 'string' ? rawError : rawError?.message || JSON.stringify(rawError)\n  });\n}\n\nfunction getSuggestedActionForCode(code: CurriculumErrorCode): string {\n  switch (code) {\n    case 'ERR_AI_NO_API_KEY':\n      return 'Vào Settings > API Keys để cấu hình ít nhất một khóa API (Gemini, DeepSeek, OpenRouter, Alibaba hoặc NVIDIA).';\n    case 'ERR_AI_RATE_LIMIT':\n      return 'API đã vượt quá giới hạn lượt gọi (Rate Limit HTTP 429). Hãy chờ 30-60 giây rồi bấm Rerun hoặc chuyển sang Provider dự phòng.';\n    case 'ERR_AI_AUTH_FAILED':\n      return 'API Key không hợp lệ hoặc đã hết hạn (HTTP 401/403). Vui lòng kiểm tra lại Key trong mục Cài đặt.';\n    case 'ERR_AI_NETWORK_TIMEOUT':\n      return 'Kết nối mạng tới máy chủ AI bị quá thời gian chờ (Timeout). Vui lòng kiểm tra đường truyền và bấm Rerun.';\n    case 'ERR_AI_RESPONSE_MALFORMED':\n      return 'Mô hình AI trả về kết quả rỗng hoặc không đúng định dạng markdown. Bấm Rerun để yêu cầu AI sinh lại.';\n    case 'ERR_AI_ALL_PROVIDERS_FAILED':\n      return 'Toàn bộ các nhà cung cấp trong chuỗi Fallback đều thất bại. Vui lòng kiểm tra kết nối Internet và hạn mức Token.';\n    case 'ERR_SOT_MISSING':\n      return 'Thiếu tài liệu nền tảng SOT (CURRICULUM_FRAMEWORK.md hoặc LEARNER_PROFILE.md). Hãy chạy workflow Khởi tạo dự án trước.';\n    case 'ERR_TASK_GATE_BLOCKED':\n      return 'Học liệu phía sau bị chặn do Giáo án (LESSON) phía trước chưa được Phê duyệt (Approval Gate). Hãy bấm Phê duyệt Giáo án để mở khóa.';\n    case 'ERR_METERED_LIMIT_EXCEEDED':\n      return 'Chính sách Metered Execution giới hạn tối đa 2 bài học mỗi đợt. Vui lòng phê duyệt các bài hiện tại trước khi tạo thêm.';\n    case 'ERR_SCHEMA_CONTRACT_VIOLATION':\n      return 'Nội dung sinh ra thiếu các phần bắt buộc [REQUIRED]. Hãy kích hoạt kiểm thử hoặc bấm Rerun.';\n    case 'ERR_STORAGE_IO_FAILED':\n      return 'Lỗi đọc/ghi tệp tin trên hệ thống lưu trữ. Kiểm tra quyền ghi thư mục output/projects.';\n    case 'ERR_CONTEXT_MISSING':\n      return 'Thiếu nguồn tri thức bắt buộc (KNOWLEDGE_EXPOSITION hoặc CANONICAL LESSON) theo Dependency Routing Matrix. Vui lòng tạo hoặc đồng bộ tài liệu nguồn trước.';\n    default:\n      return 'Bấm Rerun để thử lại hoặc kiểm tra nhật ký hệ thống.';\n  }\n}\n\nfunction isCodeRetryable(code: CurriculumErrorCode): boolean {\n  switch (code) {\n    case 'ERR_AI_RATE_LIMIT':\n    case 'ERR_AI_NETWORK_TIMEOUT':\n    case 'ERR_AI_RESPONSE_MALFORMED':\n    case 'ERR_STORAGE_IO_FAILED':\n      return true;\n    case 'ERR_AI_NO_API_KEY':\n    case 'ERR_AI_AUTH_FAILED':\n    case 'ERR_SOT_MISSING':\n    case 'ERR_TASK_GATE_BLOCKED':\n    case 'ERR_METERED_LIMIT_EXCEEDED':\n    case 'ERR_SCHEMA_CONTRACT_VIOLATION':\n    case 'ERR_CONTEXT_MISSING':\n      return false;\n    default:\n      return true;\n  }\n}\n\nexport function createContextMissingError(params: {\n  artifactType: string;\n  missingSource: string;\n  lessonId?: string;\n  agent?: string;\n}): CurriculumError {\n  return new CurriculumError({\n    errorCode: 'ERR_CONTEXT_MISSING',\n    artifactType: params.artifactType,\n    lessonId: params.lessonId,\n    agent: params.agent,\n    message: `Required context source \"${params.missingSource}\" is missing for artifact \"${params.artifactType}\"`,\n    suggestedAction: `Generate or provide the authoritative \"${params.missingSource}\" source before producing \"${params.artifactType}\".`,\n    retryable: false\n  });\n}\n\n","import { createAiInferenceError } from '../errors';\nimport type { ToolDefinition, AggregatedToolCall } from './toolLoopTypes';\nimport fs from 'fs';\nimport path from 'path';\n\nexport interface ChatMessage {\n  role: 'user' | 'assistant' | 'system' | 'model';\n  content: string;\n}\n\nexport interface StreamRunnerOptions {\n  openrouterKey?: string;\n  deepseekKey?: string;\n  alibabaKey?: string;\n  geminiKey?: string;\n  nvidiaKey?: string;\n  openaiKey?: string;\n  anthropicKey?: string;\n  model?: string;\n  systemPersona?: string;\n  maxTokens?: number;\n  temperature?: number;\n  reasoningEffort?: 'off' | 'low' | 'medium' | 'high' | 'max';\n  /** Thời gian tối đa cho phép không nhận thêm token mới trước khi abort (mặc định 90_000ms = 90s; env ARTIFACT_STREAM_IDLE_TIMEOUT_MS override) */\n  idleTimeoutMs?: number;\n  /** Thời gian hard cap tối đa cho toàn bộ lượt stream trước khi abort (mặc định 420_000ms = 7 phút) */\n  timeoutMs?: number;\n  /**\n   * Host-provided inference override (Vercel AI SDK gateway, test stubs, …).\n   * When set, ALL built-in provider routes (raw-fetch NVIDIA/OpenRouter/\n   * DeepSeek/DashScope/Gemini + designated fallback chain) are bypassed and\n   * every inference call goes through this function instead. It receives the\n   * fully-formed system instruction (persona + project context + guidelines)\n   * and the user prompt, plus the same onChunk contract as the built-in\n   * routes: stream text deltas via ('content'|'thought'), and report token\n   * spend via onChunk(JSON.stringify({ promptTokens, completionTokens,\n   * totalTokens, reasoningTokens }), 'usage'). Return the full completion text.\n   */\n  customInference?: (request: {\n    systemInstruction: string;\n    userPrompt: string;\n    messages: ChatMessage[];\n    temperature: number;\n    maxTokens: number;\n    onChunk: (token: string, type: ChunkType) => void;\n  }) => Promise<string>;\n  /**\n   * Host-provided TOOL-CALLING inference override (unified-tracing mandate,\n   * gap #8 audit 2026-09-14). When present, `streamCurriculumAIInferenceWithTools`\n   * routes every turn through this gateway instead of its built-in raw-fetch\n   * provider routes, so tool-loop calls emit the host's OpenTelemetry spans\n   * (unified Langfuse trace). The request carries the FULL conversation\n   * (including prior assistant tool_calls and tool results) and the OpenAI-\n   * compatible tool definitions; the implementation returns the turn result.\n   * Stream text deltas via ('content'|'thought') chunks and report token spend\n   * via onChunk(JSON.stringify({ promptTokens, completionTokens, totalTokens,\n   * reasoningTokens }), 'usage') — same contract as customInference.\n   */\n  customToolInference?: (request: {\n    messages: Array<{\n      role: string;\n      content: string | null;\n      tool_calls?: Array<{ id: string; type: 'function'; function: { name: string; arguments: string } }>;\n      tool_call_id?: string;\n    }>;\n    tools: ToolDefinition[];\n    temperature: number;\n    maxTokens: number;\n    onChunk: (token: string, type: ChunkType) => void;\n  }) => Promise<{ content: string; toolCalls: AggregatedToolCall[] }>;\n}\n\nexport function resolveApiKey(keyName: string, explicitKey?: string): string {\n  if (explicitKey && explicitKey.trim()) return explicitKey.trim();\n  if (typeof process !== 'undefined' && process.env && process.env[keyName]) {\n    return process.env[keyName]!;\n  }\n\n  try {\n    const currentDir = process.cwd();\n    const envPaths = [\n      path.resolve(currentDir, '.env.local'),\n      path.resolve(currentDir, '.env'),\n      path.resolve(currentDir, 'apps/web/.env.local'),\n      path.resolve(currentDir, 'packages/learnwell-platform/.env'),\n      path.resolve(currentDir, '..', '.env.local'),\n      path.resolve(currentDir, '..', '.env'),\n      path.resolve(currentDir, '../..', '.env.local'),\n      path.resolve(currentDir, '../..', '.env'),\n    ];\n    for (const envPath of envPaths) {\n      if (fs.existsSync(envPath)) {\n        const content = fs.readFileSync(envPath, 'utf-8');\n        for (const line of content.split('\\n')) {\n          const trimmed = line.trim();\n          if (trimmed && !trimmed.startsWith('#') && trimmed.startsWith(keyName + '=')) {\n            return trimmed.substring(keyName.length + 1).trim().replace(/^[\"']|[\"']$/g, '');\n          }\n        }\n      }\n    }\n  } catch {}\n  return '';\n}\n\n/**\n * Checks if a specific AI provider is enabled via environment variables.\n * Supported env controls:\n * 1. ENABLE_<PROVIDER>=true|false (e.g. ENABLE_ALIBABA=false, ENABLE_OPENROUTER=true)\n * 2. ALLOWED_AI_PROVIDERS=openrouter,nvidia\n * 3. DISABLED_AI_PROVIDERS=alibaba,deepseek,gemini\n */\nexport function isProviderEnabled(provider: string): boolean {\n  const p = provider.toLowerCase();\n\n  // 1. Explicit ENABLE_<PROVIDER>=true/false\n  const explicitVal = resolveApiKey(`ENABLE_${p.toUpperCase()}`);\n  if (explicitVal !== '') {\n    return explicitVal === 'true' || explicitVal === '1';\n  }\n\n  // 2. ALLOWED_AI_PROVIDERS (whitelist)\n  const allowedList = resolveApiKey('ALLOWED_AI_PROVIDERS');\n  if (allowedList && allowedList.trim()) {\n    const allowed = allowedList.split(',').map(s => s.trim().toLowerCase());\n    return allowed.includes(p);\n  }\n\n  // 3. DISABLED_AI_PROVIDERS (blacklist)\n  const disabledList = resolveApiKey('DISABLED_AI_PROVIDERS');\n  if (disabledList && disabledList.trim()) {\n    const disabled = disabledList.split(',').map(s => s.trim().toLowerCase());\n    if (disabled.includes(p)) return false;\n  }\n\n  return true;\n}\n\n/**\n * Checks if a model is permitted by ALLOWED_AI_MODELS filter (supports wildcards e.g. nvidia/*, *:free)\n */\nexport function isModelAllowed(model: string): boolean {\n  const allowedList = resolveApiKey('ALLOWED_AI_MODELS');\n  if (!allowedList || !allowedList.trim()) return true;\n\n  const patterns = allowedList.split(',').map(s => s.trim());\n  return patterns.some(pattern => {\n    if (pattern === '*' || pattern === model) return true;\n    if (pattern.endsWith('*') && model.startsWith(pattern.slice(0, -1))) return true;\n    if (pattern.startsWith('*') && model.endsWith(pattern.slice(1))) return true;\n    return false;\n  });\n}\n\nexport interface FallbackTarget {\n  provider: string;\n  model: string;\n}\n\n/**\n * Resolves the designated last-resort fallback chain from environment variables.\n * Comma-separated lists are parsed in left-to-right priority order:\n * - FALLBACK_AI_PROVIDER=nvidia,openrouter (Must be enabled / in ALLOWED_AI_PROVIDERS)\n * - FALLBACK_AI_MODEL=nvidia/nemotron-3-ultra-550b-a55b:free,@preset/coding-free,deepseek/deepseek-chat:free\n */\nexport function getDesignatedFallbackChain(): FallbackTarget[] {\n  const rawProviders =\n    resolveApiKey('FALLBACK_AI_PROVIDER') ||\n    resolveApiKey('FALLBACK_AI_PROVIDERS') ||\n    resolveApiKey('DEFAULT_AI_PROVIDER') ||\n    '9router,nvidia,openrouter';\n\n  const rawModels =\n    resolveApiKey('FALLBACK_AI_MODEL') ||\n    resolveApiKey('FALLBACK_AI_MODELS') ||\n    resolveApiKey('DEFAULT_AI_MODEL') ||\n    'fast-reasoning,deep-reasoning,mid-range,free-tier';\n\n  // Providers in priority order (MUST be enabled / allowed in ALLOWED_AI_PROVIDERS)\n  const providerList = rawProviders\n    .split(',')\n    .map((p) => p.trim().toLowerCase())\n    .filter((p) => p.length > 0 && isProviderEnabled(p));\n\n  const modelList = rawModels\n    .split(',')\n    .map((m) => m.trim())\n    .filter((m) => m.length > 0 && isModelAllowed(m));\n\n  const chain: FallbackTarget[] = [];\n\n  for (const provider of providerList) {\n    let providerModels: string[] = [];\n\n    if (provider === '9router' || provider === 'ninerouter') {\n      providerModels = modelList.filter((m) => ['fast-reasoning', 'deep-reasoning', 'mid-range', 'free-tier'].includes(m));\n      if (providerModels.length === 0) {\n        providerModels = ['fast-reasoning', 'mid-range', 'free-tier'];\n      }\n    } else if (provider === 'nvidia') {\n      providerModels = modelList.filter((m) => m.startsWith('nvidia/') || m.startsWith('meta/') || m.startsWith('mistralai/'));\n      if (providerModels.length === 0) {\n        providerModels = ['nvidia/nemotron-3-ultra-550b-a55b:free', 'nvidia/nemotron-3.5-lightning-30b-a3b'];\n      }\n    } else if (provider === 'openrouter') {\n      providerModels = modelList.filter((m) => m.startsWith('@') || m.includes('/') || m.includes(':'));\n      if (providerModels.length === 0) {\n        providerModels = ['@preset/coding-free', 'deepseek/deepseek-chat:free', 'meta-llama/llama-3.3-70b-instruct:free'];\n      }\n    } else if (provider === 'alibaba' || provider === 'dashscope') {\n      providerModels = modelList.filter((m) => m.startsWith('qwen') || m.includes('deepseek'));\n      if (providerModels.length === 0) {\n        providerModels = ['deepseek-v4-flash-0731', 'qwen-plus', 'qwen3.7-plus'];\n      }\n    } else if (provider === 'google' || provider === 'gemini') {\n      providerModels = modelList.filter((m) => m.startsWith('gemini'));\n      if (providerModels.length === 0) {\n        providerModels = ['gemini-2.0-flash', 'gemini-1.5-flash'];\n      }\n    } else if (provider === 'deepseek') {\n      providerModels = modelList.filter((m) => m.startsWith('deepseek'));\n      if (providerModels.length === 0) {\n        providerModels = ['deepseek-chat', 'deepseek-reasoner'];\n      }\n    } else {\n      providerModels = modelList.length > 0 ? modelList : ['default'];\n    }\n\n    for (const model of providerModels) {\n      if (!chain.some((c) => c.provider === provider && c.model === model)) {\n        chain.push({ provider, model });\n      }\n    }\n  }\n\n  return chain;\n}\n\nexport function getDesignatedFallbackConfig(): FallbackTarget {\n  const chain = getDesignatedFallbackChain();\n  if (chain.length > 0) return chain[0];\n  return { provider: '9router', model: 'fast-reasoning' };\n}\n\nexport type ChunkType = 'content' | 'thought' | 'tool_call' | 'usage';\n\n/**\n * Separate thinking process from main content safely\n */\nexport function extractThoughtAndContent(rawText: string): { thought: string; content: string } {\n  let text = rawText || '';\n  let thought = '';\n\n  // 1. Explicit <think>...</think> tags\n  const thinkMatch = text.match(/<think>([\\s\\S]*?)<\\/think>/i);\n  if (thinkMatch) {\n    thought = thinkMatch[1].trim();\n    text = text.replace(/<think>[\\s\\S]*?<\\/think>/gi, '').trim();\n  } else if (text.includes('<think>')) {\n    // Unclosed <think> tag\n    const parts = text.split('<think>');\n    text = parts[0].trim();\n    thought = parts[1].trim();\n  }\n\n  // 2. Patterns like \"Here's a thinking process: ... \\n\\n# Main Title\"\n  if (!thought && (text.startsWith(\"Here's a thinking process:\") || text.startsWith(\"Thinking Process:\"))) {\n    // Look for markdown heading (# or ## or 🎯 or 1. or ---) as transition to main answer\n    const splitRegex = /\\n(?=(?:#|##|###|🎯|🧭|📋|🚀|1\\.\\s+[A-Z\\u00C0-\\u1EF9]|---))/m;\n    const match = text.search(splitRegex);\n    if (match > 0) {\n      thought = text.slice(0, match).trim();\n      text = text.slice(match).trim();\n    }\n  }\n\n  // 3. Strip outer markdown codeblock fence if AI wrapped the entire document\n  let content = text.trim();\n  if (content.startsWith('```markdown')) {\n    content = content.replace(/^```markdown\\s*\\n/i, '').replace(/\\n```\\s*$/i, '');\n  } else if (content.startsWith('```md')) {\n    content = content.replace(/^```md\\s*\\n/i, '').replace(/\\n```\\s*$/i, '');\n  } else if (content.startsWith('```') && content.endsWith('```') && !content.includes('---')) {\n    content = content.replace(/^```\\w*\\s*\\n/i, '').replace(/\\n```\\s*$/i, '');\n  }\n\n  return {\n    thought: thought.trim(),\n    content: content.trim()\n  };\n}\n\nexport const DEFAULT_ARTIFACT_STREAM_IDLE_MS = 90_000;\nexport const DEFAULT_ARTIFACT_STREAM_TOTAL_MS = 480_000;\n\nexport interface StreamAbortController {\n  signal: AbortSignal;\n  /** Reset the idle window (call on every received chunk). */\n  kick: () => void;\n  /** Clear all pending timers once the request lifecycle is over. */\n  dispose: () => void;\n}\n\n/**\n * Budget-aware stream abort controller. Combines an idle window (kicked on\n * every received chunk — covers slow TTFT and hung connections) with a generous\n * total hard cap (defaults to 420s / 7 minutes).\n *\n * Configurable via options or process.env:\n *   - ARTIFACT_STREAM_IDLE_TIMEOUT_MS / STREAM_IDLE_TIMEOUT_MS\n *   - ARTIFACT_STREAM_TOTAL_TIMEOUT_MS / STREAM_TOTAL_TIMEOUT_MS\n */\nexport function createStreamAbortController(options?: { idleMs?: number; totalMs?: number }): StreamAbortController {\n  const envIdle = Number(process.env.ARTIFACT_STREAM_IDLE_TIMEOUT_MS || process.env.STREAM_IDLE_TIMEOUT_MS);\n  const envTotal = Number(process.env.ARTIFACT_STREAM_TOTAL_TIMEOUT_MS || process.env.STREAM_TOTAL_TIMEOUT_MS);\n\n  const idleMs = Number.isFinite(options?.idleMs) && (options!.idleMs! > 0)\n    ? options!.idleMs!\n    : (Number.isFinite(envIdle) && envIdle > 0 ? envIdle : DEFAULT_ARTIFACT_STREAM_IDLE_MS);\n\n  const totalMs = Number.isFinite(options?.totalMs) && (options!.totalMs! > 0)\n    ? options!.totalMs!\n    : (Number.isFinite(envTotal) && envTotal > 0 ? envTotal : DEFAULT_ARTIFACT_STREAM_TOTAL_MS);\n\n  const controller = new AbortController();\n  let idleTimer: ReturnType<typeof setTimeout> | null = null;\n  let totalTimer: ReturnType<typeof setTimeout> | null = null;\n\n  const armIdle = () => {\n    if (idleTimer) clearTimeout(idleTimer);\n    idleTimer = setTimeout(\n      () => controller.abort(new Error(`Idle timeout: no data for ${Math.round(idleMs / 1000)}s`)),\n      idleMs\n    );\n    (idleTimer as any)?.unref?.();\n  };\n  armIdle();\n\n  if (totalMs > 0) {\n    totalTimer = setTimeout(\n      () => controller.abort(new Error(`Total stream timeout after ${Math.round(totalMs / 1000)}s`)),\n      totalMs\n    );\n    (totalTimer as any)?.unref?.();\n  }\n\n  return {\n    signal: controller.signal,\n    kick: armIdle,\n    dispose: () => {\n      if (idleTimer) clearTimeout(idleTimer);\n      if (totalTimer) clearTimeout(totalTimer);\n      idleTimer = null;\n      totalTimer = null;\n    }\n  };\n}\n\n/** Backward-compatible alias */\nexport function createIdleAbortController(idleMs?: number, totalMs?: number): StreamAbortController {\n  return createStreamAbortController({ idleMs, totalMs });\n}\nexport type IdleAbort = StreamAbortController;\n\n/**\n * Helper to process an OpenAI-compatible SSE response stream with Thinking & Tool Call streaming\n */\nasync function processOpenAISSEStream(\n  response: Response,\n  onChunk?: (token: string, type: ChunkType) => void,\n  idle?: IdleAbort,\n  toolCallCollector?: Map<string, { id: string; name: string; argsBuffer: string }>\n): Promise<string> {\n  if (!response.body) return '';\n  const reader = response.body.getReader();\n  const decoder = new TextDecoder('utf-8');\n  let fullRaw = '';\n  let buffer = '';\n  let insideThinkTag = false;\n\n  while (true) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    idle?.kick();\n    buffer += decoder.decode(value, { stream: true });\n\n    const lines = buffer.split('\\n');\n    buffer = lines.pop() || '';\n\n    for (const line of lines) {\n      const trimmed = line.trim();\n      if (!trimmed || trimmed.startsWith(':')) continue;\n      if (trimmed === 'data: [DONE]') continue;\n      if (trimmed.startsWith('data: ')) {\n        try {\n          const json = JSON.parse(trimmed.substring(6));\n\n          // 0. Capture exact provider token usage if available in the SSE stream\n          if (json.usage) {\n            const promptTokens = json.usage.prompt_tokens || json.usage.input_tokens || 0;\n            const completionTokens = json.usage.completion_tokens || json.usage.output_tokens || 0;\n            const totalTokens = json.usage.total_tokens || (promptTokens + completionTokens);\n            const reasoningTokens = json.usage.completion_tokens_details?.reasoning_tokens || 0;\n            if (onChunk) {\n              onChunk(JSON.stringify({ promptTokens, completionTokens, totalTokens, reasoningTokens }), 'usage');\n            }\n          }\n\n          const delta = json.choices?.[0]?.delta;\n          if (!delta) continue;\n\n          // 1. Explicit reasoning_content (DeepSeek / Qwen / Claude / Gemini on OpenRouter)\n          const reasoning = delta.reasoning_content || delta.thought || delta.reasoning || delta.thought_process || '';\n          if (reasoning) {\n            if (onChunk) onChunk(reasoning, 'thought');\n          }\n\n          // 2. Tool Calls — stream ra UI + aggregate thành call hoàn chỉnh khi có collector\n          if (delta.tool_calls) {\n            const toolStr = JSON.stringify(delta.tool_calls);\n            if (onChunk) onChunk(toolStr, 'tool_call');\n            if (toolCallCollector) {\n              for (const tc of delta.tool_calls) {\n                const idx = String(tc.index ?? tc.id ?? '0');\n                const existing = toolCallCollector.get(idx) || { id: tc.id || `call_${idx}`, name: '', argsBuffer: '' };\n                if (tc.id) existing.id = tc.id;\n                if (tc.function?.name) existing.name += tc.function.name;\n                if (tc.function?.arguments) existing.argsBuffer += tc.function.arguments;\n                toolCallCollector.set(idx, existing);\n              }\n            }\n          }\n\n          // 3. Content tokens (handle inline <think> tags dynamically)\n          let content = delta.content || '';\n          if (content) {\n            fullRaw += content;\n\n            if (content.includes('<think>')) {\n              insideThinkTag = true;\n              const parts = content.split('<think>');\n              if (parts[0] && onChunk) onChunk(parts[0], 'content');\n              content = parts[1] || '';\n            }\n            if (content.includes('</think>')) {\n              insideThinkTag = false;\n              const parts = content.split('</think>');\n              if (parts[0] && onChunk) onChunk(parts[0], 'thought');\n              content = parts[1] || '';\n            }\n\n            if (insideThinkTag) {\n              if (onChunk && content) onChunk(content, 'thought');\n            } else if (content) {\n              if (onChunk) onChunk(content, 'content');\n            }\n          }\n        } catch {\n          // Incomplete JSON chunk, skip\n        }\n      }\n    }\n  }\n\n  idle?.dispose();\n\n  // Final sanity cleanup so raw output has thinking separated\n  const extracted = extractThoughtAndContent(fullRaw);\n  return extracted.content || fullRaw;\n}\n\n/**\n * Helper to process a Google Gemini SSE stream with Thought streaming\n */\nasync function processGeminiSSEStream(\n  response: Response,\n  onChunk?: (token: string, type: ChunkType) => void,\n  idle?: IdleAbort\n): Promise<string> {\n  if (!response.body) return '';\n  const reader = response.body.getReader();\n  const decoder = new TextDecoder('utf-8');\n  let fullText = '';\n  let buffer = '';\n\n  while (true) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    idle?.kick();\n    buffer += decoder.decode(value, { stream: true });\n\n    const lines = buffer.split('\\n');\n    buffer = lines.pop() || '';\n\n    for (const line of lines) {\n      const trimmed = line.trim();\n      if (!trimmed || trimmed.startsWith(':')) continue;\n      if (trimmed.startsWith('data: ')) {\n        try {\n          const json = JSON.parse(trimmed.substring(6));\n\n          if (json.usageMetadata) {\n            const promptTokens = json.usageMetadata.promptTokenCount || 0;\n            const completionTokens = json.usageMetadata.candidatesTokenCount || 0;\n            const totalTokens = json.usageMetadata.totalTokenCount || (promptTokens + completionTokens);\n            if (onChunk) {\n              onChunk(JSON.stringify({ promptTokens, completionTokens, totalTokens }), 'usage');\n            }\n          }\n\n          const parts = json.candidates?.[0]?.content?.parts || [];\n          for (const part of parts) {\n            if (part.thought) {\n              if (onChunk) onChunk(part.text || '', 'thought');\n            } else if (part.text) {\n              fullText += part.text;\n              if (onChunk) onChunk(part.text, 'content');\n            }\n          }\n        } catch {\n          // Incomplete JSON chunk, skip\n        }\n      }\n    }\n  }\n  idle?.dispose();\n  return fullText;\n}\n\n/**\n * Real-time Streaming Multi-Provider Inference Runner with Thinking & Tool Streaming\n */\nexport async function streamCurriculumAIInference(\n  messages: ChatMessage[],\n  projectContext: string,\n  options: StreamRunnerOptions = {},\n  onChunk?: (token: string, type: ChunkType) => void\n): Promise<string> {\n  const openrouterKey = resolveApiKey('OPENROUTER_API_KEY', options.openrouterKey);\n  const deepseekKey = resolveApiKey('DEEPSEEK_API_KEY', options.deepseekKey);\n  const alibabaKey = resolveApiKey('ALIBABA_API_KEY', options.alibabaKey) || resolveApiKey('DASHSCOPE_API_KEY');\n  const geminiKey = resolveApiKey('GEMINI_API_KEY', options.geminiKey) || resolveApiKey('NEXT_PUBLIC_GEMINI_API_KEY');\n  const nvidiaKey = resolveApiKey('NVIDIA_API_KEY', options.nvidiaKey);\n\n  const temperature = options.temperature ?? 0.3;\n  // Default to 32768 tokens (32k) so long reasoning, deep curriculum artifacts, code labs, and quizzes are never truncated\n  const maxTokens = options.maxTokens ?? 32768;\n\n  const basePersona = options.systemPersona || 'You are Curriculum OS Assistant — Senior AI Technical Curriculum Architect & Educational Content Specialist.';\n\n  const systemInstruction = `${basePersona}\n\nProject Context:\n${projectContext}\n\nGuidelines:\n1. You have full context of the project hierarchy, syllabus, lessons, and learning objectives. Answer precisely, deeply, and directly.\n2. Complete responses fully without truncation. When generating tables or roadmaps, include all sections/milestones.\n3. Keep technical terminology and official API symbols intact.\n4. Format output using clean Markdown, clear sections, bullet points, and code blocks where required.\n5. Do NOT use emojis in headings, tab titles, or UI navigation labels.`;\n\n  // ── Route 0: Host-provided inference override (Vercel AI SDK gateway, …) ──\n  // When the embedding app supplies customInference, it is the SOLE inference\n  // path: the raw-fetch provider routes below never run, so host apps that\n  // mandate a gateway (e.g. Vercel AI SDK) get exactly one auditable engine.\n  if (options.customInference) {\n    try {\n      const text = await options.customInference({\n        systemInstruction,\n        userPrompt: messages.map(m => m.content).join('\\n\\n'),\n        messages,\n        temperature,\n        maxTokens,\n        onChunk: onChunk ?? (() => {}),\n      });\n      if (text && text.trim()) return text;\n      throw createAiInferenceError({\n        errorCode: 'ERR_AI_ALL_PROVIDERS_FAILED',\n        message: 'customInference returned empty output',\n        rawError: { customInference: 'empty response' }\n      });\n    } catch (e: any) {\n      if (e?.errorCode || e?.name === 'AiInferenceError') throw e;\n      throw createAiInferenceError({\n        errorCode: 'ERR_AI_ALL_PROVIDERS_FAILED',\n        message: `customInference failed: ${e?.message || e}`,\n        rawError: { customInference: String(e?.message || e) }\n      });\n    }\n  }\n\n  // ── Unified-tracing mandate (2026-09-14): fail LOUD on silent bypass ──\n  // The embedding app routes every LLM call through its own gateway\n  // (customInference → Vercel AI SDK → OpenTelemetry → Langfuse). The raw-fetch\n  // routes below are OUTSIDE that telemetry boundary: a call site that forgets\n  // to pass customInference used to fall through here silently, producing\n  // untraceable generations. When the host mandates gateway-only inference\n  // (CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE=1), refuse to run raw instead of\n  // silently bypassing the unified tracing mechanism.\n  if (!options.customInference && resolveApiKey('CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE') === '1') {\n    throw createAiInferenceError({\n      errorCode: 'ERR_CUSTOM_INFERENCE_REQUIRED',\n      message:\n        'customInference is REQUIRED (CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE=1): pass buildKitCustomInference(...) ' +\n        'so every LLM call flows through the host AI SDK gateway and its unified Langfuse tracing. ' +\n        'Raw-fetch provider routes are disabled by mandate.',\n      rawError: { mandate: 'CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE', hasCustomInference: false },\n    });\n  }\n\n  const formattedMessages = [\n    { role: 'system', content: systemInstruction },\n    ...messages.map(m => ({\n      role: m.role === 'assistant' || m.role === 'model' ? 'assistant' : 'user',\n      content: m.content\n    }))\n  ];\n\n  // Collect failure errors for full traceability\n  const providerErrors: Record<string, string> = {};\n\n  const requestedModel = options.model || 'fast-reasoning';\n  const isNvidiaPreferred = requestedModel.startsWith('nvidia/') || (Boolean(nvidiaKey && !openrouterKey) && isProviderEnabled('nvidia'));\n\n  // ── Route 0: 9Router Gateway ──\n  const ninerouterKey = resolveApiKey('NINEROUTER_API_KEY') || resolveApiKey('NINE_ROUTER_API_KEY');\n  if (ninerouterKey && isProviderEnabled('9router')) {\n    const rawUrl = resolveApiKey('NINEROUTER_BASE_URL') || resolveApiKey('NINE_ROUTER_BASE_URL') || 'https://ai-router.orchable.app/v1';\n    const ninerouterBaseUrl = rawUrl.replace(/^[\"']|[\"']$/g, '').replace(/\\/$/, '');\n    const candidateModels = [\n      options.model || 'fast-reasoning',\n      'fast-reasoning',\n      'mid-range',\n      'free-tier',\n    ].filter(m => isModelAllowed(m));\n    const unique9RouterModels = Array.from(new Set(candidateModels));\n\n    for (const model of unique9RouterModels) {\n      try {\n        // 2026-09-14 (SLIDE idle audit): 45s was tuned for chat-sized prompts.\n        // SLIDE cluster prompts run 30k+ chars and the gateway can think for\n        // >45s BEFORE the first token, so the budget aborted healthy streams\n        // (\"Idle timeout: no data for 45s\"). Honor options.idleTimeoutMs /\n        // env like every other route, falling back to the same 90s default.\n        const r9Idle = options.idleTimeoutMs\n          ?? (Number(process.env.ARTIFACT_STREAM_IDLE_TIMEOUT_MS || process.env.STREAM_IDLE_TIMEOUT_MS) || 0)\n          ?? 0;\n        const r9Total = options.timeoutMs\n          ?? (Number(process.env.ARTIFACT_STREAM_TOTAL_TIMEOUT_MS || process.env.STREAM_TOTAL_TIMEOUT_MS) || 0)\n          ?? 0;\n        const idle = createStreamAbortController({\n          idleMs: r9Idle > 0 ? r9Idle : 90_000,\n          totalMs: r9Total > 0 ? r9Total : 300_000,\n        });\n        const res = await fetch(`${ninerouterBaseUrl}/chat/completions`, {\n          method: 'POST',\n          headers: {\n            'Authorization': `Bearer ${ninerouterKey}`,\n            'Content-Type': 'application/json',\n          },\n          body: JSON.stringify({\n            model,\n            messages: formattedMessages,\n            max_tokens: maxTokens,\n            temperature,\n            stream: true,\n            stream_options: { include_usage: true },\n          }),\n          signal: idle.signal,\n        });\n        if (res.ok) {\n          const text = await processOpenAISSEStream(res, onChunk, idle);\n          if (text && text.trim()) return text;\n        } else {\n          const errText = await res.text().catch(() => '');\n          providerErrors[`9router_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n        }\n      } catch (e: any) {\n        providerErrors[`9router_${model}`] = e?.message || 'Network error';\n        console.warn(`[9Router Stream] Failover for ${model}:`, e?.message || e);\n      }\n    }\n  }\n\n  // ── Route 1: NVIDIA NIM (Nemotron Suite) ──\n  if (nvidiaKey && isProviderEnabled('nvidia')) {\n    const candidateNemotronModels = [\n      requestedModel.startsWith('nvidia/') ? requestedModel : 'nvidia/nemotron-3-ultra-550b-a55b:free',\n      'nvidia/nemotron-3-ultra-550b-a55b:free',\n      'nvidia/nemotron-3.5-lightning-30b-a3b',\n      'nvidia/nemotron-3-super-120b-a12b',\n      'nvidia/llama-3.1-nemotron-70b-instruct'\n    ].filter(m => isModelAllowed(m));\n    const uniqueNvidiaModels = Array.from(new Set(candidateNemotronModels));\n\n    if (isNvidiaPreferred || uniqueNvidiaModels.length > 0) {\n      for (const model of uniqueNvidiaModels) {\n        try {\n          const nvdIdle = options.idleTimeoutMs ?? 180_000;\n          const nvdTotal = options.timeoutMs ?? 600_000;\n          const idle = createStreamAbortController({ idleMs: nvdIdle, totalMs: nvdTotal });\n          const res = await fetch('https://integrate.api.nvidia.com/v1/chat/completions', {\n            method: 'POST',\n            headers: {\n              'Authorization': `Bearer ${nvidiaKey}`,\n              'Content-Type': 'application/json'\n            },\n            body: JSON.stringify({\n              model,\n              messages: formattedMessages,\n              max_tokens: maxTokens,\n              temperature,\n              stream: true,\n              stream_options: { include_usage: true }\n            }),\n            signal: idle.signal\n          });\n\n          if (res.ok) {\n            const text = await processOpenAISSEStream(res, onChunk, idle);\n            if (text && text.trim()) return text;\n          } else {\n            const errText = await res.text().catch(() => '');\n            providerErrors[`nvidia_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n          }\n        } catch (e: any) {\n          providerErrors[`nvidia_${model}`] = e?.message || 'Network error';\n          console.warn(`[NVIDIA Stream] Failover for ${model}:`, e?.message || e);\n        }\n      }\n    }\n  }\n\n  // ── Route 2: OpenRouter (Primary Free Presets & Models) ──\n  if (openrouterKey && isProviderEnabled('openrouter')) {\n    const openrouterModels = [\n      requestedModel,\n      'openrouter/free',\n      'nvidia/nemotron-3-super-120b-a12b:free',\n      'nvidia/nemotron-3-ultra-550b-a55b:free',\n      'nvidia/nemotron-3.5-lightning:free',\n      'minimax/minimax-m3:free',\n      'cohere/north-mini-code:free',\n    ].filter(m => isModelAllowed(m));\n    const uniqueOrModels = Array.from(new Set(openrouterModels));\n\n    for (const model of uniqueOrModels) {\n      try {\n        const idle = createStreamAbortController({ idleMs: options.idleTimeoutMs, totalMs: options.timeoutMs });\n        const res = await fetch('https://openrouter.ai/api/v1/chat/completions', {\n          method: 'POST',\n          headers: {\n            'Authorization': `Bearer ${openrouterKey}`,\n            'Content-Type': 'application/json',\n            'HTTP-Referer': 'https://orchable.composer',\n            'X-Title': 'Curriculum OS Studio'\n          },\n          body: JSON.stringify({\n            model,\n            messages: formattedMessages,\n            max_tokens: maxTokens,\n            temperature,\n            stream: true,\n            stream_options: { include_usage: true }\n          }),\n          signal: idle.signal\n        });\n\n        if (res.ok) {\n          const text = await processOpenAISSEStream(res, onChunk, idle);\n          if (text && text.trim()) return text;\n        } else {\n          const errText = await res.text().catch(() => '');\n          providerErrors[`openrouter_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n          if (res.status === 429) {\n            console.warn(`[OpenRouter] Rate limited (429) for ${model}, trying fallback...`);\n          }\n        }\n      } catch (e: any) {\n        providerErrors[`openrouter_${model}`] = e?.message || 'Network error';\n        console.warn(`[OpenRouter Stream] Failover for ${model}:`, e?.message || e);\n      }\n    }\n  }\n\n  // ── Route 3: DeepSeek Official API (Configurable via ENABLE_DEEPSEEK=true) ──\n  if (deepseekKey && isProviderEnabled('deepseek')) {\n    const dsModel = options.model?.includes('deepseek-reasoner') ? 'deepseek-reasoner' : 'deepseek-chat';\n    if (isModelAllowed(dsModel)) {\n      try {\n        const idle = createStreamAbortController({ idleMs: options.idleTimeoutMs, totalMs: options.timeoutMs });\n        const res = await fetch('https://api.deepseek.com/chat/completions', {\n          method: 'POST',\n          headers: {\n            'Authorization': `Bearer ${deepseekKey}`,\n            'Content-Type': 'application/json'\n          },\n          body: JSON.stringify({\n            model: dsModel,\n            messages: formattedMessages,\n            max_tokens: maxTokens,\n            temperature,\n            stream: true,\n            stream_options: { include_usage: true }\n          }),\n          signal: idle.signal\n        });\n\n        if (res.ok) {\n          const text = await processOpenAISSEStream(res, onChunk, idle);\n          if (text && text.trim()) return text;\n        } else {\n          const errText = await res.text().catch(() => '');\n          providerErrors['deepseek'] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n        }\n      } catch (e: any) {\n        providerErrors['deepseek'] = e?.message || 'Network error';\n        console.warn(`[DeepSeek Stream] Failover:`, e?.message || e);\n      }\n    }\n  }\n\n  // ── Route 4: Alibaba DashScope / Qwen Cloud (Configurable via ENABLE_ALIBABA=true) ──\n  if (alibabaKey && isProviderEnabled('alibaba')) {\n    const qwenModels = (options.model?.startsWith('qwen')\n      ? [options.model, 'qwen3.7-plus', 'qwen3.6-flash']\n      : ['qwen3.7-plus', 'qwen3.6-flash']).filter(m => isModelAllowed(m));\n\n    const baseUrl = alibabaKey.startsWith('sk-sp-')\n      ? 'https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions'\n      : 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions';\n\n    for (const qwenModel of qwenModels) {\n      try {\n        const idle = createStreamAbortController({ idleMs: options.idleTimeoutMs, totalMs: options.timeoutMs });\n        const payload: any = {\n          model: qwenModel,\n          messages: formattedMessages,\n          max_tokens: maxTokens,\n          temperature,\n          stream: true,\n          stream_options: { include_usage: true }\n        };\n\n        const res = await fetch(baseUrl, {\n          method: 'POST',\n          headers: {\n            'Authorization': `Bearer ${alibabaKey}`,\n            'Content-Type': 'application/json'\n          },\n          body: JSON.stringify(payload),\n          signal: idle.signal\n        });\n\n        if (res.ok) {\n          const text = await processOpenAISSEStream(res, onChunk, idle);\n          if (text && text.trim()) return text;\n        } else {\n          const errText = await res.text().catch(() => '');\n          providerErrors[`alibaba_${qwenModel}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n        }\n      } catch (e: any) {\n        providerErrors[`alibaba_${qwenModel}`] = e?.message || 'Network error';\n        console.warn(`[Alibaba Stream] Failover for ${qwenModel}:`, e?.message || e);\n      }\n    }\n  }\n\n  // ── Route 5: Google Gemini Direct (Configurable via ENABLE_GEMINI=true) ──\n  if (geminiKey && (isProviderEnabled('gemini') || isProviderEnabled('google'))) {\n    const geminiModels = (options.model?.startsWith('gemini')\n      ? [options.model, 'gemini-1.5-flash', 'gemini-2.0-flash']\n      : ['gemini-1.5-flash', 'gemini-2.0-flash']).filter(m => isModelAllowed(m));\n\n    const geminiContents = [\n      { role: 'user', parts: [{ text: systemInstruction }] },\n      { role: 'model', parts: [{ text: 'Tôi đã hiểu rõ toàn bộ bối cảnh dự án và sẵn sàng hỗ trợ bạn một cách chuyên sâu, chính xác nhất.' }] },\n      ...messages.map(m => ({\n        role: m.role === 'assistant' || m.role === 'model' ? 'model' : 'user',\n        parts: [{ text: m.content }]\n      }))\n    ];\n\n    for (const gModel of geminiModels) {\n      try {\n        const idle = createStreamAbortController({ idleMs: options.idleTimeoutMs, totalMs: options.timeoutMs });\n        const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${gModel}:streamGenerateContent?alt=sse&key=${geminiKey}`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            contents: geminiContents,\n            generationConfig: {\n              temperature,\n              maxOutputTokens: maxTokens,\n            }\n          }),\n          signal: idle.signal\n        });\n\n        if (res.ok) {\n          const text = await processGeminiSSEStream(res, onChunk, idle);\n          if (text && text.trim()) return text;\n        } else {\n          const errText = await res.text().catch(() => '');\n          providerErrors[`gemini_${gModel}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n        }\n      } catch (e: any) {\n        providerErrors[`gemini_${gModel}`] = e?.message || 'Network error';\n        console.warn(`[Gemini Stream] Failover for ${gModel}:`, e?.message || e);\n      }\n    }\n  }\n\n  // ── Route 6: Ultimate Designated Fallback Chain (Configurable via FALLBACK_AI_PROVIDER / FALLBACK_AI_MODEL) ──\n  const fallbackChain = getDesignatedFallbackChain();\n  if (fallbackChain.length > 0) {\n    console.log(\n      `[streamRunner] 🛡️ Primary routes failed/exhausted. Invoking designated last-resort fallback chain:`,\n      fallbackChain.map((c) => `${c.provider}(${c.model})`).join(' -> ')\n    );\n\n    for (const target of fallbackChain) {\n      const { provider, model } = target;\n\n      // ── 9Router designated fallback ──\n      // 2026-09-14 (9Router-only mandate): the loop previously had NO branch\n      // for provider '9router', so a 9router-only chain iterated without ever\n      // attempting a call and providerErrors stayed {} — masking the real\n      // failure as \"Chi tiết: {}\". This branch makes the designated fallback\n      // actually call the gateway (OpenAI-compatible SSE, same as Route 0).\n      if ((provider === '9router' || provider === 'ninerouter') && ninerouterKey && isProviderEnabled('9router')) {\n        try {\n          const rawUrl = resolveApiKey('NINEROUTER_BASE_URL') || resolveApiKey('NINE_ROUTER_BASE_URL') || 'https://ai-router.orchable.app/v1';\n          const fbBaseUrl = rawUrl.replace(/[\"']/g, '').replace(/\\/$/, '');\n          // Same SLIDE idle-audit fix as Route 0: honor options/env instead of\n          // a hardcoded 45s that aborted healthy long-prompt streams.\n          const fbIdle = options.idleTimeoutMs\n            ?? (Number(process.env.ARTIFACT_STREAM_IDLE_TIMEOUT_MS || process.env.STREAM_IDLE_TIMEOUT_MS) || 0)\n            ?? 0;\n          const fbTotal = options.timeoutMs\n            ?? (Number(process.env.ARTIFACT_STREAM_TOTAL_TIMEOUT_MS || process.env.STREAM_TOTAL_TIMEOUT_MS) || 0)\n            ?? 0;\n          const idle = createStreamAbortController({\n            idleMs: fbIdle > 0 ? fbIdle : 90_000,\n            totalMs: fbTotal > 0 ? fbTotal : 300_000,\n          });\n          const res = await fetch(`${fbBaseUrl}/chat/completions`, {\n            method: 'POST',\n            headers: {\n              'Authorization': `Bearer ${ninerouterKey}`,\n              'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({\n              model,\n              messages: formattedMessages,\n              max_tokens: maxTokens,\n              temperature,\n              stream: true,\n              stream_options: { include_usage: true },\n            }),\n            signal: idle.signal,\n          });\n          if (res.ok) {\n            const text = await processOpenAISSEStream(res, onChunk, idle);\n            if (text && text.trim()) {\n              console.log(`[streamRunner] ✅ Designated fallback 9Router (${model}) succeeded!`);\n              return text;\n            }\n          } else {\n            const errText = await res.text().catch(() => '');\n            providerErrors[`designated_fallback_9router_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n          }\n        } catch (e: any) {\n          providerErrors[`designated_fallback_9router_${model}`] = e?.message || 'Network error';\n        }\n      } else if (provider === 'nvidia' && nvidiaKey && isProviderEnabled('nvidia')) {\n        try {\n          const nvdIdle = options.idleTimeoutMs ?? 180_000;\n          const nvdTotal = options.timeoutMs ?? 600_000;\n          const idle = createStreamAbortController({ idleMs: nvdIdle, totalMs: nvdTotal });\n          const res = await fetch('https://integrate.api.nvidia.com/v1/chat/completions', {\n            method: 'POST',\n            headers: {\n              'Authorization': `Bearer ${nvidiaKey}`,\n              'Content-Type': 'application/json'\n            },\n            body: JSON.stringify({\n              model,\n              messages: formattedMessages,\n              max_tokens: maxTokens,\n              temperature,\n              stream: true,\n              stream_options: { include_usage: true }\n            }),\n            signal: idle.signal\n          });\n\n          if (res.ok) {\n            const text = await processOpenAISSEStream(res, onChunk, idle);\n            if (text && text.trim()) {\n              console.log(`[streamRunner] ✅ Designated fallback NVIDIA (${model}) succeeded!`);\n              return text;\n            }\n          } else {\n            const errText = await res.text().catch(() => '');\n            providerErrors[`designated_fallback_nvidia_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n          }\n        } catch (e: any) {\n          providerErrors[`designated_fallback_nvidia_${model}`] = e?.message || 'Network error';\n        }\n      } else if (provider === 'openrouter' && openrouterKey && isProviderEnabled('openrouter')) {\n        try {\n          const idle = createStreamAbortController({ idleMs: options.idleTimeoutMs, totalMs: options.timeoutMs });\n          const res = await fetch('https://openrouter.ai/api/v1/chat/completions', {\n            method: 'POST',\n            headers: {\n              'Authorization': `Bearer ${openrouterKey}`,\n              'Content-Type': 'application/json',\n              'HTTP-Referer': 'https://orchable.composer',\n              'X-Title': 'Curriculum OS Studio'\n            },\n            body: JSON.stringify({\n              model,\n              messages: formattedMessages,\n              max_tokens: maxTokens,\n              temperature,\n              stream: true,\n              stream_options: { include_usage: true }\n            }),\n            signal: idle.signal\n          });\n\n          if (res.ok) {\n            const text = await processOpenAISSEStream(res, onChunk, idle);\n            if (text && text.trim()) {\n              console.log(`[streamRunner] ✅ Designated fallback OpenRouter (${model}) succeeded!`);\n              return text;\n            }\n          } else {\n            const errText = await res.text().catch(() => '');\n            providerErrors[`designated_fallback_openrouter_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n          }\n        } catch (e: any) {\n          providerErrors[`designated_fallback_openrouter_${model}`] = e?.message || 'Network error';\n        }\n      } else if ((provider === 'alibaba' || provider === 'dashscope') && alibabaKey && isProviderEnabled('alibaba')) {\n        const baseUrl = alibabaKey.startsWith('sk-sp-')\n          ? 'https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions'\n          : 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions';\n        try {\n          const idle = createStreamAbortController({ idleMs: options.idleTimeoutMs, totalMs: options.timeoutMs });\n          const res = await fetch(baseUrl, {\n            method: 'POST',\n            headers: {\n              'Authorization': `Bearer ${alibabaKey}`,\n              'Content-Type': 'application/json'\n            },\n            body: JSON.stringify({\n              model,\n              messages: formattedMessages,\n              max_tokens: maxTokens,\n              temperature,\n              stream: true,\n              stream_options: { include_usage: true }\n            }),\n            signal: idle.signal\n          });\n\n          if (res.ok) {\n            const text = await processOpenAISSEStream(res, onChunk, idle);\n            if (text && text.trim()) {\n              console.log(`[streamRunner] ✅ Designated fallback Alibaba (${model}) succeeded!`);\n              return text;\n            }\n          } else {\n            const errText = await res.text().catch(() => '');\n            providerErrors[`designated_fallback_alibaba_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n          }\n        } catch (e: any) {\n          providerErrors[`designated_fallback_alibaba_${model}`] = e?.message || 'Network error';\n        }\n      } else if ((provider === 'google' || provider === 'gemini') && geminiKey && (isProviderEnabled('gemini') || isProviderEnabled('google'))) {\n        try {\n          const idle = createStreamAbortController({ idleMs: options.idleTimeoutMs, totalMs: options.timeoutMs });            const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${model}:streamGenerateContent?alt=sse&key=${geminiKey}`,\n              {\n                method: 'POST',\n                headers: { 'Content-Type': 'application/json' },\n                body: JSON.stringify({\n                  contents: [\n                    { role: 'user', parts: [{ text: systemInstruction }] },\n                    { role: 'model', parts: [{ text: 'Understood. I will follow the project context and guidelines.' }] },\n                    ...messages.map((m) => ({\n                      role: m.role === 'assistant' || m.role === 'model' ? 'model' : 'user',\n                      parts: [{ text: m.content }]\n                    }))\n                  ],\n              generationConfig: {\n                temperature,\n                maxOutputTokens: maxTokens\n              }\n            }),\n            signal: idle.signal\n          });\n\n          if (res.ok) {\n            const text = await processGeminiSSEStream(res, onChunk, idle);\n            if (text && text.trim()) {\n              console.log(`[streamRunner] ✅ Designated fallback Gemini (${model}) succeeded!`);\n              return text;\n            }\n          } else {\n            const errText = await res.text().catch(() => '');\n            providerErrors[`designated_fallback_gemini_${model}`] = `HTTP ${res.status}: ${errText.slice(0, 120)}`;\n          }\n        } catch (e: any) {\n          providerErrors[`designated_fallback_gemini_${model}`] = e?.message || 'Network error';\n        }\n      }\n    }\n  }\n\n  const isRateLimited = Object.values(providerErrors).some(msg => msg.includes('429'));\n  const isAuthFailed = Object.values(providerErrors).some(msg => msg.includes('401') || msg.includes('403'));\n\n  const errorCode = isRateLimited\n    ? 'ERR_AI_RATE_LIMIT'\n    : isAuthFailed\n    ? 'ERR_AI_AUTH_FAILED'\n    : 'ERR_AI_ALL_PROVIDERS_FAILED';\n\n  throw createAiInferenceError({\n    errorCode,\n    message: `Không thể kết nối tới các nhà cung cấp AI trong chuỗi Fallback. Chi tiết: ${JSON.stringify(providerErrors)}`,\n    rawError: providerErrors\n  });\n}\n\n/**\n * Synchronous Multi-Model Inference Wrapper with strict error propagation\n */\nexport async function runCurriculumAIInference(\n  messages: ChatMessage[],\n  projectContext: string,\n  options: StreamRunnerOptions = {},\n  onChunk?: (token: string, type: ChunkType) => void\n): Promise<string> {\n  return await streamCurriculumAIInference(messages, projectContext, options, onChunk);\n}\n","import { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createDeepSeek } from '@ai-sdk/deepseek';\nimport type { LanguageModel } from 'ai';\nimport { isProviderEnabled, isModelAllowed, getDesignatedFallbackConfig, resolveApiKey } from './streamRunner';\n\n/**\n * 9Router's NON-STREAMING responses glue a literal `data: [DONE]` marker\n * right after the JSON object — the AI SDK then fails JSON.parse and throws\n * \"Invalid JSON response\" (AI_JSONParseError) on every generateText /\n * generateObject call. Streaming paths are unaffected (the SDK treats the\n * marker as a valid stream terminator).\n *\n * This fetch wrapper repairs non-streaming bodies (strip the trailing\n * marker; reassemble a full SSE body returned to a non-streaming call into\n * one JSON completion) and passes streaming calls (`\"stream\":true`) through\n * untouched so live SSE chunk streams are never buffered/collapsed.\n */\nconst MAX_ERROR_SNIPPET = 400;\n\n/** One-line, length-capped view of a body — enough to diagnose, small enough to log. */\nfunction snippet(text: string | undefined): string {\n  const compact = String(text ?? '').replace(/\\s+/g, ' ').trim();\n  return compact.length > MAX_ERROR_SNIPPET ? `${compact.slice(0, MAX_ERROR_SNIPPET)}…` : compact;\n}\n\n/**\n * Normalizes ANY error body into a JSON error object. The AI SDK only builds a\n * meaningful AI_APICallError when it can read `error.message`; given an SSE\n * frame, an HTML page, or an empty body it throws with an EMPTY message\n * (\"AI_APICallError: <none>\" / \"Failed to process error response\"), which is\n * undiagnosable in pipeline logs. Status is always preserved, and the raw body\n * rides along as `detail`.\n */\nfunction jsonErrorResponse(res: Response, text: string, statusOverride?: number): Response {\n  // A 200 carrying an error payload would be parsed as a completion (and blow\n  // up as \"Invalid JSON response\"), so an error body always ships a failing status.\n  const status = statusOverride ?? (res.ok ? 502 : res.status);\n  const message = snippet(text) || `HTTP ${status} ${res.statusText || ''}`.trim();\n  const headers = new Headers(res.headers);\n  headers.set('content-type', 'application/json');\n  return new Response(\n    JSON.stringify({ error: { message, code: status, type: 'upstream_error', detail: snippet(text) } }),\n    { status, statusText: res.statusText, headers }\n  );\n}\n\ninterface AssembledSse {\n  content: string;\n  reasoningContent: string;\n  finishReason: string | null;\n  id?: string;\n  model?: string;\n  created?: number;\n  usage?: unknown;\n  errorFrame?: string;\n}\n\n/** Collapses a full SSE body into one completion, PRESERVING finish_reason and usage. */\nfunction reassembleSse(text: string): AssembledSse | null {\n  let content = '';\n  let reasoningContent = '';\n  let finishReason: string | null = null;\n  let usage: unknown;\n  let errorFrame: string | undefined;\n  let id: string | undefined;\n  let model: string | undefined;\n  let created: number | undefined;\n  let sawFrame = false;\n\n  for (const line of text.split('\\n')) {\n    const l = line.trim();\n    if (!l.startsWith('data:')) continue;\n    const payload = l.slice(5).trim();\n    if (!payload || payload === '[DONE]') continue;\n    let chunk: any;\n    try {\n      chunk = JSON.parse(payload);\n    } catch {\n      continue;\n    }\n    sawFrame = true;\n    // Upstream failures are often relayed as an SSE error frame — surface them\n    // instead of silently collapsing to an empty completion.\n    if (chunk?.error) {\n      errorFrame = snippet(typeof chunk.error === 'string' ? chunk.error : JSON.stringify(chunk.error));\n      continue;\n    }\n    id = chunk.id ?? id;\n    model = chunk.model ?? model;\n    created = chunk.created ?? created;\n    const choice = chunk.choices?.[0];\n    const delta = choice?.delta ?? choice?.message;\n    // Reasoning models emit `reasoning_content` (or `reasoning`) beside — never\n    // inside — `content`. Both are kept: dropping reasoning made genuinely\n    // empty answers indistinguishable from a broken call.\n    const c = typeof delta?.content === 'string' ? delta.content : '';\n    const rc = typeof delta?.reasoning_content === 'string'\n      ? delta.reasoning_content\n      : typeof delta?.reasoning === 'string'\n        ? delta.reasoning\n        : '';\n    content += c;\n    reasoningContent += rc;\n    if (choice?.finish_reason) finishReason = choice.finish_reason;\n    if (chunk.usage) usage = chunk.usage;\n  }\n\n  if (!sawFrame) return null;\n  return { content, reasoningContent, finishReason, id, model, created, usage, errorFrame };\n}\n\nfunction toJsonResponse(res: Response, body: string): Response {\n  const headers = new Headers(res.headers);\n  headers.set('content-type', 'application/json');\n  return new Response(body, { status: res.status, statusText: res.statusText, headers });\n}\n\nfunction cleanNonStreamingFetch(): typeof fetch {\n  return async (input, init) => {\n    const res = await fetch(input, init);\n    let wantsStream = false;\n    try {\n      const body = init?.body;\n      if (typeof body === 'string') wantsStream = /\"stream\"\\s*:\\s*true/.test(body);\n    } catch {}\n    // Live SSE consumers must receive the raw stream — buffering would collapse it.\n    if (wantsStream) return res;\n\n    const contentType = res.headers.get('content-type') || '';\n    const isEventStream = contentType.includes('text/event-stream');\n    const isJson = contentType.includes('application/json');\n\n    // Bodies we do not understand (HTML error pages, 204s) still need their\n    // error surfaced as JSON, otherwise the SDK reports an empty message.\n    if (!isEventStream && !isJson) {\n      if (!res.ok) return jsonErrorResponse(res, await res.text());\n      return res;\n    }\n\n    // Read ONCE, then always hand back a fresh Response — returning this `res`\n    // after reading its body gave the SDK an unusable (empty) stream.\n    const text = await res.text();\n    if (!res.ok) return jsonErrorResponse(res, text);\n\n    const trimmed = text.trim();\n    if (isEventStream || trimmed.startsWith('data:')) {\n      const assembled = reassembleSse(text);\n      if (!assembled) return jsonErrorResponse(res, text);\n      if (assembled.errorFrame) {\n        // Honor the upstream status when the frame carries an HTTP-ish code.\n        const code = Number((assembled.errorFrame.match(/\"code\"\\s*:\\s*(\\d{3})/) || [])[1]);\n        return jsonErrorResponse(res, assembled.errorFrame, code >= 400 && code <= 599 ? code : undefined);\n      }\n      return toJsonResponse(res, JSON.stringify({\n        id: assembled.id || 'chatcmpl-' + Date.now(),\n        object: 'chat.completion',\n        created: assembled.created || Math.floor(Date.now() / 1000),\n        model: assembled.model || '9router',\n        choices: [{\n          index: 0,\n          message: {\n            role: 'assistant',\n            content: assembled.content,\n            ...(assembled.reasoningContent ? { reasoning_content: assembled.reasoningContent } : {}),\n          },\n          // Real finish_reason (e.g. `length`) is preserved so callers can tell\n          // a truncated answer from a wrong one — hardcoding 'stop' hid it.\n          finish_reason: assembled.finishReason || 'stop',\n        }],\n        usage: assembled.usage || undefined,\n      }));\n    }\n\n    const doneIndex = text.indexOf('data: [DONE]');\n    return toJsonResponse(res, doneIndex === -1 ? trimmed : text.slice(0, doneIndex).trim());\n  };\n}\n\nexport type AIProviderName = '9router' | 'ninerouter' | 'google' | 'openai' | 'deepseek' | 'alibaba' | 'dashscope' | 'ollama' | 'nvidia' | 'openrouter';\n\nexport interface ModelResolutionOptions {\n  provider?: AIProviderName;\n  modelName?: string;\n  apiKey?: string;\n  baseURL?: string;\n}\n\nconst DEFAULT_MODELS: Record<string, string> = {\n  '9router': 'fast-reasoning',\n  ninerouter: 'fast-reasoning',\n  nvidia: 'nvidia/nemotron-3-ultra-550b-a55b:free',\n  openrouter: '@preset/coding-free',\n  alibaba: 'qwen3.7-plus',\n  dashscope: 'qwen3.7-plus',\n  google: 'gemini-1.5-flash',\n  deepseek: 'deepseek-chat',\n  openai: 'gpt-4o-mini',\n  ollama: 'deepseek-v4-flash:0731',\n};\n\nexport const NVIDIA_MODELS = {\n  codingFast: 'nvidia/nemotron-3.5-lightning-30b-a3b',\n  reasoningUltra: 'nvidia/nemotron-3-ultra-550b-a55b:free',\n  superMoE: 'nvidia/nemotron-3-super-120b-a12b',\n  llamaNemotron: 'nvidia/llama-3.1-nemotron-70b-instruct',\n  translation: 'nvidia/riva-translate-4b-instruct-v2',\n  embedding: 'nvidia/nemotron-3-embed-1b',\n  visionLlama: 'meta/llama-3.2-11b-vision-instruct',\n} as const;\n\n/**\n * Resolves a Vercel AI SDK LanguageModel instance based on provider options or environment variables.\n * Automatically falls back to designated fallback provider/model if requested provider is disabled.\n */\nexport function getAIModel(options: ModelResolutionOptions = {}): LanguageModel {\n  const designated = getDesignatedFallbackConfig();\n  const defaultProvider = process.env.DEFAULT_AI_PROVIDER || process.env.LLM_PROVIDER || detectDefaultProvider();\n  let provider = (options.provider || defaultProvider).toLowerCase() as AIProviderName;\n\n  // If requested provider is disabled in .env, automatically route to designated fallback\n  if (!isProviderEnabled(provider)) {\n    console.warn(`[provider-factory] Provider \"${provider}\" is disabled via environment toggle. Falling back to designated provider \"${designated.provider}\".`);\n    provider = designated.provider as AIProviderName;\n  }\n\n  let resolvedModelName =\n    options.modelName ||\n    process.env.DEFAULT_AI_MODEL ||\n    process.env.LLM_MODEL ||\n    DEFAULT_MODELS[provider] ||\n    designated.model;\n\n  if (!isModelAllowed(resolvedModelName)) {\n    console.warn(`[provider-factory] Model \"${resolvedModelName}\" is not permitted by ALLOWED_AI_MODELS. Using designated model \"${designated.model}\".`);\n    resolvedModelName = designated.model;\n  }\n\n  if (provider === '9router' || (provider as string) === 'ninerouter') {\n    const apiKey = options.apiKey || resolveApiKey('NINEROUTER_API_KEY') || resolveApiKey('NINE_ROUTER_API_KEY') || '';\n    const rawUrl = options.baseURL || resolveApiKey('NINEROUTER_BASE_URL') || resolveApiKey('NINE_ROUTER_BASE_URL') || 'https://ai-router.orchable.app/v1';\n    const ninerouter = createOpenAI({\n      apiKey,\n      baseURL: rawUrl.replace(/^[\"']|[\"']$/g, '').trim(),\n      fetch: cleanNonStreamingFetch(),\n    });\n    return ninerouter.chat(resolvedModelName || 'fast-reasoning');\n  }\n\n  if (provider === 'nvidia') {\n    const apiKey = options.apiKey || process.env.NVIDIA_API_KEY || '';\n    const nvidia = createOpenAI({\n      apiKey,\n      baseURL: options.baseURL || 'https://integrate.api.nvidia.com/v1',\n    });\n    return nvidia.chat(resolvedModelName || 'nvidia/nemotron-3-ultra-550b-a55b:free');\n  }\n\n  if (provider === 'openrouter') {\n    const apiKey = options.apiKey || process.env.OPENROUTER_API_KEY || process.env.OPENAI_API_KEY || '';\n    const openrouter = createOpenAI({\n      apiKey,\n      baseURL: options.baseURL || 'https://openrouter.ai/api/v1',\n    });\n    return openrouter.chat(resolvedModelName || '@preset/coding-free');\n  }\n\n  if (provider === 'alibaba' || provider === 'dashscope') {\n    const effectiveKey =\n      options.apiKey ||\n      process.env.ALIBABA_API_KEY ||\n      process.env.DASHSCOPE_API_KEY ||\n      process.env.SAAS_ALIBABA_API_KEY ||\n      process.env.SAAS_DASHSCOPE_API_KEY ||\n      '';\n\n    let defaultBaseURL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';\n    if (effectiveKey.startsWith('sk-sp-')) {\n      defaultBaseURL = 'https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1';\n    }\n\n    const rawUrl = options.baseURL || process.env.ALIBABA_BASE_URL || process.env.DASHSCOPE_BASE_URL || defaultBaseURL;\n    const cleanBaseURL = rawUrl.replace(/^[\"']|[\"']$/g, '').trim();\n\n    const alibaba = createOpenAI({\n      apiKey: effectiveKey,\n      baseURL: cleanBaseURL,\n      // Passthrough: no forced format injection — the Vercel AI SDK's generateObject\n      // already instructs the model to return JSON via its schema definition.\n      // Injecting 'Output format: JSON.' into markdown-based lesson prompts caused\n      // model confusion (mixed markdown + JSON output).\n    });\n\n    return alibaba.chat(resolvedModelName);\n  }\n\n  if (provider === 'google') {\n    const apiKey = options.apiKey || process.env.GOOGLE_GENERATIVE_AI_API_KEY || process.env.GEMINI_API_KEY || '';\n    const google = createGoogleGenerativeAI({ apiKey });\n    return google(resolvedModelName);\n  }\n\n  if (provider === 'deepseek') {\n    const apiKey = options.apiKey || process.env.DEEPSEEK_API_KEY || process.env.SAAS_DEEPSEEK_API_KEY || '';\n    const deepseek = createDeepSeek({ apiKey });\n    return deepseek(resolvedModelName);\n  }\n\n  if (provider === 'openai') {\n    const apiKey = options.apiKey || process.env.OPENAI_API_KEY || '';\n    const openai = createOpenAI({\n      apiKey,\n      baseURL: options.baseURL || process.env.OPENAI_BASE_URL,\n    });\n    return openai.chat(resolvedModelName);\n  }\n\n  if (provider === 'ollama') {\n    const apiKey = options.apiKey || process.env.OLLAMA_API_KEY || 'ollama';\n    const baseURL = options.baseURL || process.env.OLLAMA_BASE_URL || process.env.OPENAI_BASE_URL || 'http://127.0.0.1:11434/v1';\n    const ollama = createOpenAI({\n      apiKey,\n      baseURL,\n    });\n    return ollama.chat(resolvedModelName || 'qwen2.5:latest');\n  }\n\n  // Fallback to OpenAI-compatible\n  const fallback = createOpenAI({\n    apiKey: options.apiKey || process.env.OPENAI_API_KEY || '',\n    baseURL: options.baseURL || process.env.OPENAI_BASE_URL,\n  });\n  return fallback.chat(resolvedModelName);\n}\n\nfunction detectDefaultProvider(): AIProviderName {\n  if ((process.env.NINEROUTER_API_KEY || resolveApiKey('NINEROUTER_API_KEY') || resolveApiKey('NINE_ROUTER_API_KEY')) && isProviderEnabled('9router')) {\n    return '9router';\n  }\n  if (process.env.NVIDIA_API_KEY && isProviderEnabled('nvidia')) {\n    return 'nvidia';\n  }\n  if (process.env.OPENROUTER_API_KEY && isProviderEnabled('openrouter')) {\n    return 'openrouter';\n  }\n  if ((process.env.ALIBABA_API_KEY || process.env.DASHSCOPE_API_KEY || process.env.SAAS_ALIBABA_API_KEY) && isProviderEnabled('alibaba')) {\n    return 'alibaba';\n  }\n  if ((process.env.GOOGLE_GENERATIVE_AI_API_KEY || process.env.GEMINI_API_KEY) && (isProviderEnabled('gemini') || isProviderEnabled('google'))) {\n    return 'google';\n  }\n  if ((process.env.DEEPSEEK_API_KEY || process.env.SAAS_DEEPSEEK_API_KEY) && isProviderEnabled('deepseek')) {\n    return 'deepseek';\n  }\n  if (process.env.OPENAI_API_KEY && process.env.OPENAI_API_KEY !== 'ollama' && isProviderEnabled('openai')) {\n    return 'openai';\n  }\n  return getDesignatedFallbackConfig().provider as AIProviderName;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\n/**\n * P52/P53 — Runtime artifact-template loading (single source of truth).\n *\n * Restores the curriculum-mcp architecture that was lost when prompt\n * skeletons were retyped as hardcoded strings inside\n * `lessonProductionService.ts` (the \"mandated duplication\" regression):\n *   - artifact structure lives in template .md files, loaded at RUNTIME;\n *   - methodology directives stay in the prompt-builder;\n *   - project-local `_templates/` may override any template (MCP parity).\n *\n * P53 rev3 (echo model): a template file = YAML frontmatter (system-owned\n * cached echo: `template_language`, `template_required_sections`) + fill-in\n * body. The BODY headings are the single source of structure — the\n * frontmatter list is regenerated mechanically (assembleTranslatedTemplate /\n * editor save), never hand-maintained.\n *\n * Heading standard (H1–H3 only; H4+ do not exist):\n *   - every heading is REQUIRED by default → the `[REQUIRED]` marker is\n *     stripped everywhere (bundled + baked + generated artifacts);\n *   - `[OPTIONAL]` → still a heading, but excluded from the echo/contract;\n *   - `[CONDITIONAL]` → required echo + exposed as semantic metadata;\n *   - a heading containing a VARIABLE part (`{{placeholder}}` or bracket\n *     `[guidance]`) is not a section at all — it is an instance/guidance\n *     header (Q1, Challenge 1, Term Name, phase timing) → excluded from the\n *     echo. Static durations belong on a `**Duration:**` line under the\n *     heading, never inside it.\n */\n\nexport interface ResolvedTemplate {\n  /** Fill-in body (frontmatter + leading HTML comments stripped). */\n  content: string;\n  /**\n   * P53 rev3 — mechanical echo of the template BODY headings (H2/H3, static\n   * text only, `[OPTIONAL]` excluded, markers/ordinals stripped). This IS the\n   * contract; the frontmatter list is just its cached copy.\n   */\n  sections: string[];\n  /** Headings explicitly marked `[OPTIONAL]` (excluded from `sections`). */\n  optionalSections: string[];\n  /** Absolute path the template was loaded from (telemetry / debugging). */\n  sourcePath: string;\n  /**\n   * P53 — canonical sections carrying a `[CONDITIONAL]` marker in the body.\n   */\n  conditionals: string[];\n  /**\n   * P53 — declared authoring language of the template body\n   * (`template_language:` frontmatter, default \"en\"). \"en\" = bundled source;\n   * anything else = translated project copy (bake-aware regime downstream).\n   */\n  declaredLang: string;\n}\n\n/**\n * Strip YAML frontmatter from a template document.\n * NOTE: HTML comments are intentionally preserved — some templates embed\n * semantic markers (e.g. ACT's `<!-- [HARDWARE_BOM] -->`) that downstream\n * extraction pipelines depend on. Only frontmatter is noise here.\n */\nexport function stripTemplateFrontmatter(raw: string): string {\n  let body = raw;\n  if (body.startsWith('---')) {\n    const end = body.indexOf('\\n---', 3);\n    if (end !== -1) body = body.slice(end + 4);\n  }\n  return body\n    .split('\\n')\n    .filter((l) => l.trim() !== '<!-- INJECT_BODY -->')\n    .join('\\n')\n    .replace(/^\\s*\\n/, '')\n    .trimEnd();\n}\n\n/**\n * Legacy reader for the `template_required_sections:` YAML list (the cached\n * echo). Kept for app-side consumers reading artifact frontmatter; the kit\n * itself now derives structure from the body (extractEchoSections).\n */\nexport function extractRequiredSections(raw: string): string[] | null {\n  const lines = raw.split('\\n');\n  const start = lines.findIndex((l) => /^template_required_sections:\\s*$/.test(l.trim()));\n  if (start === -1) return null;\n  const items: string[] = [];\n  for (let i = start + 1; i < lines.length; i++) {\n    const line = lines[i] ?? '';\n    if (line.trim() === '') continue;\n    if (!/^\\s+-\\s/.test(line)) break; // next top-level key → stop\n    items.push(line.trim().replace(/^-\\s+/, '').replace(/^[\"']|[\"']$/g, ''));\n  }\n  return items.length > 0 ? items : null;\n}\n\n/**\n * P53 — canonical heading key: strips contract markers AND ordinal prefixes\n * so `### 1. Learning Objectives & Evidence` and `1) Learning Objectives…`\n * both normalize to the same key. Users may renumber headings without\n * breaking matching.\n */\nexport function stripHeadingKey(h: string): string {\n  return h\n    .replace(/\\[(REQUIRED|OPTIONAL|CONDITIONAL)\\]\\s*/gi, '')\n    .replace(/^\\s*\\d+[.)]\\s+/, '')\n    .replace(/\\s+/g, ' ')\n    .trim();\n}\n\n/** A heading with any variable part is an instance/guidance header, not a section. */\nfunction isVariableHeading(text: string): boolean {\n  return /\\{\\{[^}]*\\}\\}/.test(text) || /\\[[^\\]]+\\]/.test(text);\n}\n\ninterface CollectedHeading {\n  level: number; // 2 | 3\n  name: string; // stripped key\n  optional: boolean;\n}\n\n/** Fence-aware H2/H3 collector implementing the P53 heading standard. */\nfunction collectHeadings(body: string): CollectedHeading[] {\n  const out: CollectedHeading[] = [];\n  let inFence = false;\n  for (const line of body.split('\\n')) {\n    if (/^(```|~~~)/.test(line.trim())) {\n      inFence = !inFence;\n      continue;\n    }\n    if (inFence) continue; // `# comment` inside a code block is not a heading\n    const m = line.match(/^(#{2,3})\\s+(.*)$/);\n    if (!m) continue;\n    const text = m[2].trim();\n    const optional = /^\\[OPTIONAL\\]/i.test(text);\n    const name = stripHeadingKey(text);\n    if (!name || isVariableHeading(name)) continue; // Rule 1+2: variable → not a section\n    out.push({ level: m[1].length, name, optional });\n  }\n  return out;\n}\n\n/**\n * P53 rev3 — the contract echo of a template/artifact document: required\n * sections (default) and explicitly-optional ones, straight from the body.\n */\nexport function extractEchoSections(raw: string): { required: string[]; optional: string[] } {\n  const hs = collectHeadings(stripTemplateFrontmatter(raw));\n  return {\n    required: hs.filter((h) => !h.optional).map((h) => h.name),\n    optional: hs.filter((h) => h.optional).map((h) => h.name),\n  };\n}\n\n/** P53 — canonical sections carrying a `[CONDITIONAL]` marker in the body. */\nexport function extractConditionalSections(raw: string): string[] {\n  const body = stripTemplateFrontmatter(raw);\n  return body\n    .split('\\n')\n    .filter((l) => /^#{2,3} .*\\[CONDITIONAL\\]/i.test(l))\n    .map((l) => stripHeadingKey(l.replace(/^#{2,3}\\s*/, '').trim()))\n    .filter((s) => s.length > 0 && !isVariableHeading(s));\n}\n\n/** P53 — `template_language:` frontmatter value (default \"en\"). */\nexport function extractDeclaredLanguage(raw: string): string {\n  const m = raw.match(/^template_language:\\s*[\"']?([a-zA-Z-]+)[\"']?\\s*$/m);\n  return m?.[1]?.toLowerCase() || 'en';\n}\n\nconst KIT_TEMPLATE_FALLBACK_DIRS = [\n  // Packaged with the npm bundle (dist/templates) — resolves from node_modules.\n  'templates',\n  // Repo checkout layouts.\n  'docs/refs/templates',\n];\n\n// ESM/CJS-safe directory of this module (kit is ESM; tsup CJS build has __dirname).\nconst _moduleDir = (() => {\n  try {\n    if (typeof import.meta !== 'undefined' && typeof import.meta.url === 'string') {\n      return path.dirname(fileURLToPath(import.meta.url));\n    }\n  } catch {\n    // CJS build falls through to __dirname below.\n  }\n  return typeof __dirname !== 'undefined' ? __dirname : process.cwd();\n})();\n\nfunction candidateDirs(explicitDir?: string): string[] {\n  const dirs: string[] = [];\n  if (explicitDir) dirs.push(explicitDir);\n  if (process.env.CURRICULUM_TEMPLATES_DIR) dirs.push(process.env.CURRICULUM_TEMPLATES_DIR);\n  // Project-local override, matching curriculum-mcp's resolve order.\n  dirs.push(path.resolve(process.cwd(), '_templates'));\n  for (const rel of KIT_TEMPLATE_FALLBACK_DIRS) {\n    dirs.push(path.resolve(_moduleDir, rel));\n    dirs.push(path.resolve(process.cwd(), rel));\n    dirs.push(path.resolve(process.cwd(), 'packages/curriculum-kit', rel));\n  }\n  return dirs;\n}\n\nfunction findTemplatePath(templateName: string, explicitDir?: string): string | null {\n  for (const dir of candidateDirs(explicitDir)) {\n    const p = path.join(dir, templateName);\n    if (!fs.existsSync(p)) continue;\n    try {\n      fs.accessSync(p, fs.constants.R_OK);\n      return p;\n    } catch {\n      // unreadable → try next candidate\n    }\n  }\n  // ponytail: fail-open by design — callers degrade to inline scaffolding\n  // (pre-P52 contract). Missing templates log nothing here to avoid per-call\n  // noise in production streams; upgrade path: emit a one-shot warn per name.\n  return null;\n}\n\n/**\n * Resolve a canonical template by file name. First existing candidate wins:\n * explicit dir → CURRICULUM_TEMPLATES_DIR → <cwd>/_templates → packaged\n * dist/templates → repo docs/refs/templates. Returns null when unresolvable\n * (callers fall back to inline scaffolding, same contract as before).\n */\nexport function resolveArtifactTemplate(\n  templateName: string,\n  opts?: { templatesDir?: string }\n): ResolvedTemplate | null {\n  const p = findTemplatePath(templateName, opts?.templatesDir);\n  if (!p) return null;\n  try {\n    const raw = fs.readFileSync(p, 'utf-8');\n    const echo = extractEchoSections(raw);\n    return {\n      content: stripTemplateFrontmatter(raw),\n      sections: echo.required,\n      optionalSections: echo.optional,\n      sourcePath: p,\n      conditionals: extractConditionalSections(raw),\n      declaredLang: extractDeclaredLanguage(raw),\n    };\n  } catch {\n    return null;\n  }\n}\n\n/** AI runner contract for template translation (injected — kit stays provider-agnostic). */\nexport type TemplateTranslateRunner = (prompt: string) => Promise<string>;\n\nexport interface AssembledTemplate {\n  /** Full document: REGENERATED frontmatter echo + translated body. */\n  raw: string;\n  /** Contract echo of the translated body (= the regenerated FM list). */\n  sections: string[];\n  templateLanguage: string;\n}\n\n/**\n * P53 rev3 — assemble a project template copy from an AI-translated BODY.\n * The frontmatter is never AI-edited: it is regenerated mechanically —\n * `template_language` stamp + `template_required_sections` echoed from the\n * translated headings (the body is the single source; the FM list follows it).\n *\n * Structural verification: heading count, order, and levels must survive\n * translation 1:1 (required AND optional). Any drift → null; the caller\n * falls back to the bundled English template rather than shipping a broken\n * contract. `{{placeholder}}` / marker preservation is verified here too.\n */\nexport function assembleTranslatedTemplate(\n  templateName: string,\n  translatedBody: string,\n  targetLanguage: string,\n  opts?: { templatesDir?: string }\n): AssembledTemplate | null {\n  const raw = loadCurriculumTemplate(templateName, opts?.templatesDir);\n  if (!raw || !translatedBody?.trim()) return null;\n\n  const base = collectHeadings(stripTemplateFrontmatter(raw));\n  const out = collectHeadings(translatedBody);\n  if (base.length !== out.length) return null; // section lost or invented\n  for (let i = 0; i < base.length; i++) {\n    if (base[i].level !== out[i].level || base[i].optional !== out[i].optional) return null;\n  }\n\n  // `{{placeholder}}` and semantic markers must survive verbatim.\n  const srcBody = stripTemplateFrontmatter(raw);\n  for (const ph of new Set(srcBody.match(/\\{\\{[^}]+\\}\\}/g) ?? [])) {\n    if (!translatedBody.includes(ph)) return null;\n  }\n  for (const mk of new Set(srcBody.match(/<!--\\s*\\[\\/?[^\\]]+\\]\\s*-->/g) ?? [])) {\n    if (!translatedBody.includes(mk)) return null;\n  }\n\n  const lang = targetLanguage.trim().toLowerCase() || 'en';\n  const req = out.filter((h) => !h.optional).map((h) => h.name);\n  // Frontmatter (original fields preserved, echo + language re-stamped) is\n  // re-attached to the TRANSLATED body — the original English body is dropped.\n  let fmRaw = '';\n  if (raw.startsWith('---')) {\n    const end = raw.indexOf('\\n---', 3);\n    if (end !== -1) fmRaw = raw.slice(0, end + 4);\n  }\n  const fm = stampEchoOnFrontmatter(fmRaw || '---\\n---', lang, req);\n  return { raw: `${fm}\\n${translatedBody.trimStart()}`, sections: req, templateLanguage: lang };\n}\n\n/**\n * System-owned frontmatter update: keep every original field verbatim, only\n * replace the `template_required_sections` echo (regenerated from the body)\n * and stamp `template_language`. A template without frontmatter gets a block.\n */\nfunction stampEchoOnFrontmatter(rawDoc: string, lang: string, sections: string[]): string {\n  const echoLines = ['template_language: \"' + lang + '\"', 'template_required_sections:', ...sections.map((n) => `  - \"${n.replace(/\"/g, '\\\\\"')}\"`)];\n  if (rawDoc.startsWith('---')) {\n    const lines = rawDoc.split('\\n');\n    const closeIdx = lines.findIndex((l, i) => i > 0 && l.trim() === '---');\n    if (closeIdx === -1) {\n      // malformed FM → regenerate a minimal block (frontmatter fields lost is\n      // better than a file whose FM leaks into prompts).\n      return ['---', ...echoLines, '---', '', stripTemplateFrontmatter(rawDoc)].join('\\n');\n    }\n    // Drop a previous stamp/echo (idempotent) INCLUDING the old list's child\n    // lines — filtering only the key line would orphan its `  - ` items.\n    const kept: string[] = [];\n    let skippingList = false;\n    for (const l of lines.slice(0, closeIdx)) {\n      const t = l.trim();\n      if (/^template_required_sections:$/.test(t)) {\n        skippingList = true;\n        continue;\n      }\n      if (/^template_language:/.test(t)) continue;\n      if (skippingList) {\n        if (/^\\s+-\\s/.test(l)) continue;\n        skippingList = false;\n      }\n      kept.push(l);\n    }\n    return [...kept, ...echoLines, '---', ...lines.slice(closeIdx + 1)].join('\\n');\n  }\n  return ['---', ...echoLines, '---', '', rawDoc].join('\\n');\n}\n\n/**\n * P53 — full-body template translation (AI, once per language + content hash;\n * caching is the caller's job). The kit stays language-neutral: bundled\n * templates are never translated in-repo.\n *\n * Pipeline: split frontmatter (never sent to AI) → prompt the runner with\n * preservation rules → assembleTranslatedTemplate regenerates the frontmatter\n * echo and structurally verifies the result. Returns null on any violation;\n * the caller falls back to the bundled English template.\n */\nexport async function translateTemplate(\n  templateName: string,\n  targetLanguage: string,\n  runner: TemplateTranslateRunner,\n  opts?: { templatesDir?: string }\n): Promise<AssembledTemplate | null> {\n  const raw = loadCurriculumTemplate(templateName, opts?.templatesDir);\n  if (!raw) return null;\n\n  const body = stripTemplateFrontmatter(raw);\n  const placeholders = Array.from(new Set(body.match(/\\{\\{[^}]+\\}\\}/g) ?? []));\n  const markers = Array.from(new Set(body.match(/<!--\\s*\\[\\/?[^\\]]+\\]\\s*-->/g) ?? []));\n\n  const prompt = `Translate the following Markdown artifact TEMPLATE body into ${targetLanguage}.\nSTRICT PRESERVATION RULES (violating any of these invalidates the output):\n1. Keep the document structure EXACTLY: same number of headings, same order, same heading levels (## / ###).\n2. Translate heading TEXT naturally, but a heading must remain a single static line: move nothing into or out of it. Headings never contain durations or placeholders — if a source heading carries \"[X mins]\"-style timing, the timing belongs on the line below the heading, not inside it.\n3. Keep every placeholder token VERBATIM (do not translate or alter), including {{ XX }}-style duration tokens: ${placeholders.join(' ') || '(none)'}\n4. Keep every HTML comment marker VERBATIM: ${markers.join(' ') || '(none)'}\n5. Keep code blocks, file paths, technical identifiers (API names, protocols, component models) untranslated.\n6. Translate ONLY natural-language prose, headings, and table headers into natural ${targetLanguage}.\n7. Output ONLY the translated markdown — no explanations, no code fences around the whole document.\n\nTEMPLATE BODY:\n${body}`;\n\n  let translatedBody: string;\n  try {\n    translatedBody = await runner(prompt);\n  } catch {\n    return null;\n  }\n  if (!translatedBody || translatedBody.length < body.length * 0.4) return null;\n  translatedBody = translatedBody.trim().replace(/^```(?:markdown)?\\n/, '').replace(/\\n```$/, '');\n\n  return assembleTranslatedTemplate(templateName, translatedBody, targetLanguage, opts);\n}\n\n/**\n * Legacy raw-content lookup retained for existing callers\n * (`singleArtifactService`, SLIDE workflow). Returns the file verbatim —\n * frontmatter included, byte-compatible with the pre-P52 helper it replaces.\n * Empty string = not found.\n */\nexport function loadCurriculumTemplate(templateName: string, templatesDir?: string): string {\n  const p = findTemplatePath(templateName, templatesDir);\n  if (!p) return '';\n  try {\n    return fs.readFileSync(p, 'utf-8');\n  } catch {\n    return '';\n  }\n}\n\n/**\n * Frontmatter-stripped lookup for JSON-first authoring builders\n * (`ai/prompts/*`) that embed the template in a prompt as a structural\n * alignment reference. Prompt-embedded noise (frontmatter) is stripped so\n * the LLM sees only the fill-in skeleton. Empty string = not found.\n */\nexport function loadAuthoringTemplate(templateName: string, templatesDir?: string): string {\n  const p = findTemplatePath(templateName, templatesDir);\n  if (!p) return '';\n  try {\n    return stripTemplateFrontmatter(fs.readFileSync(p, 'utf-8'));\n  } catch {\n    return '';\n  }\n}\n","export interface LintIssue {\n  line?: number;\n  type: 'PREAMBLE' | 'POSTAMBLE' | 'CODE_FENCE' | 'EMPTY_CODE_FENCE' | 'TABLE' | 'MERMAID' | 'FRONTMATTER' | 'PLACEHOLDER' | 'MATH';\n  severity: 'ERROR' | 'WARNING';\n  message: string;\n  autoFixable: boolean;\n}\n\nexport interface ArtifactLintReport {\n  filePath?: string;\n  isValid: boolean;\n  issues: LintIssue[];\n  autoFixedContent: string;\n  fixedCount: number;\n}\n\n/**\n * Validates Mermaid diagram blocks for common syntax errors\n */\nexport function validateMermaidSyntax(code: string): { valid: boolean; error?: string } {\n  const trimmed = code.trim();\n  if (!trimmed) return { valid: false, error: 'Empty mermaid block' };\n\n  // Check valid start keyword\n  const validStarts = ['graph', 'flowchart', 'sequenceDiagram', 'classDiagram', 'stateDiagram', 'erDiagram', 'gantt', 'pie', 'mindmap', 'gitGraph', 'timeline', 'quadrantChart', 'sankey-beta', 'block-beta'];\n  const firstWord = trimmed.split(/\\s+/)[0]?.replace(/^---[\\s\\S]*?---\\s*/, '') || '';\n  const hasValidStart = validStarts.some(k => trimmed.startsWith(k) || trimmed.includes(`\\n${k}`));\n\n  if (!hasValidStart) {\n    return { valid: false, error: `Invalid mermaid declaration: \"${firstWord}\"` };\n  }\n\n  // Check balanced brackets, parentheses and braces in nodes\n  const lines = trimmed.split('\\n');\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n    // Check unmatched square brackets\n    const openBrackets = (line.match(/\\[/g) || []).length;\n    const closeBrackets = (line.match(/\\]/g) || []).length;\n    if (openBrackets !== closeBrackets) {\n      return { valid: false, error: `Line ${i + 1}: Unmatched square brackets '[' and ']'` };\n    }\n\n    // Check unmatched parentheses\n    const openParens = (line.match(/\\(/g) || []).length;\n    const closeParens = (line.match(/\\)/g) || []).length;\n    if (openParens !== closeParens) {\n      return { valid: false, error: `Line ${i + 1}: Unmatched parentheses '(' and ')'` };\n    }\n\n    // Check unmatched curly braces\n    const openCurly = (line.match(/\\{/g) || []).length;\n    const closeCurly = (line.match(/\\}/g) || []).length;\n    if (openCurly !== closeCurly) {\n      return { valid: false, error: `Line ${i + 1}: Unmatched curly braces '{' and '}'` };\n    }\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validates and repairs markdown tables for column parity\n */\nexport function validateMarkdownTables(raw: string): { issues: LintIssue[]; fixedContent: string } {\n  const issues: LintIssue[] = [];\n  const lines = raw.split('\\n');\n  const fixedLines: string[] = [];\n\n  let inTable = false;\n  let tableHeaderCols = 0;\n  let tableStartLine = 0;\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n    const isTableRow = line.trim().startsWith('|') && line.trim().endsWith('|');\n\n    if (isTableRow) {\n      const cols = line.split('|').slice(1, -1);\n      const colCount = cols.length;\n\n      if (!inTable) {\n        // Table Header\n        inTable = true;\n        tableHeaderCols = colCount;\n        tableStartLine = i + 1;\n        fixedLines.push(line);\n      } else if (i === tableStartLine) {\n        // Table Separator (|---|---|)\n        if (colCount !== tableHeaderCols) {\n          issues.push({\n            line: i + 1,\n            type: 'TABLE',\n            severity: 'WARNING',\n            message: `Table separator row at line ${i + 1} has ${colCount} columns, expected ${tableHeaderCols}`,\n            autoFixable: true\n          });\n          // Auto-fix separator\n          const fixedSep = '|' + Array(tableHeaderCols).fill('---').join('|') + '|';\n          fixedLines.push(fixedSep);\n        } else {\n          fixedLines.push(line);\n        }\n      } else {\n        // Data row\n        if (colCount !== tableHeaderCols) {\n          issues.push({\n            line: i + 1,\n            type: 'TABLE',\n            severity: 'WARNING',\n            message: `Table row at line ${i + 1} has ${colCount} columns, expected ${tableHeaderCols}`,\n            autoFixable: true\n          });\n          // Auto-fix by padding or trimming\n          let fixedRowCols = [...cols];\n          if (colCount < tableHeaderCols) {\n            fixedRowCols = fixedRowCols.concat(Array(tableHeaderCols - colCount).fill(' '));\n          } else {\n            fixedRowCols = fixedRowCols.slice(0, tableHeaderCols);\n          }\n          fixedLines.push('|' + fixedRowCols.join('|') + '|');\n        } else {\n          fixedLines.push(line);\n        }\n      }\n    } else {\n      if (inTable) inTable = false;\n      fixedLines.push(line);\n    }\n  }\n\n  return { issues, fixedContent: fixedLines.join('\\n') };\n}\n\n/**\n * Scans, lints, and automatically sanitizes an artifact markdown document.\n */\nexport function lintAndSanitizeArtifact(rawContent: string, filePath?: string): ArtifactLintReport {\n  const issues: LintIssue[] = [];\n  let currentContent = rawContent;\n  let fixedCount = 0;\n\n  // 1. Strip Conversational Preamble before Frontmatter or Code block\n  const preambleMatch = currentContent.match(/^([\\s\\S]*?)(?:```(?:markdown|marp|md)?\\s*\\n|---\\s*\\n)/i);\n  if (preambleMatch && preambleMatch[1].trim().length > 0) {\n    const preamble = preambleMatch[1].trim();\n    issues.push({\n      type: 'PREAMBLE',\n      severity: 'WARNING',\n      message: `Conversational preamble detected: \"${preamble.slice(0, 50)}...\"`,\n      autoFixable: true\n    });\n    currentContent = currentContent.slice(preambleMatch[1].length).trim();\n    fixedCount++;\n  }\n\n  // 2. Strip Outer Code Fences (```markdown ... ```)\n  const codeBlockMatch = currentContent.match(/^```(?:markdown|marp|md)?\\s*\\n([\\s\\S]*?)\\n```([\\s\\S]*)$/i);\n  if (codeBlockMatch) {\n    issues.push({\n      type: 'CODE_FENCE',\n      severity: 'WARNING',\n      message: 'Document was wrapped in outer markdown code fence',\n      autoFixable: true\n    });\n    const inner = codeBlockMatch[1].trim();\n    const postamble = (codeBlockMatch[2] || '').trim();\n    if (postamble.length > 0) {\n      issues.push({\n        type: 'POSTAMBLE',\n        severity: 'WARNING',\n        message: `Conversational postamble detected: \"${postamble.slice(0, 50)}...\"`,\n        autoFixable: true\n      });\n      fixedCount++;\n    }\n    currentContent = inner;\n    fixedCount++;\n  }\n\n  // 3. Strip Conversational Postamble after end of document (if not handled by code fence)\n  const conversationalPhrases = [\n    /(\\n\\s*(?:Hy vọng|Trên đây là|Chúc bạn|Nếu bạn cần|Hope this helps|Let me know if you need|Here is the complete|This concludes)[\\s\\S]*$)/i,\n    /(\\n\\s*---\\s*\\n\\s*(?:Tài liệu được soạn thảo bởi|Generated by|AI Assistant)[\\s\\S]*$)/i\n  ];\n  for (const pattern of conversationalPhrases) {\n    if (pattern.test(currentContent)) {\n      const match = currentContent.match(pattern);\n      if (match) {\n        issues.push({\n          type: 'POSTAMBLE',\n          severity: 'WARNING',\n          message: `Conversational postamble stripped: \"${match[0].trim().slice(0, 50)}...\"`,\n          autoFixable: true\n        });\n        currentContent = currentContent.replace(pattern, '').trim();\n        fixedCount++;\n      }\n    }\n  }\n\n  // 4. Frontmatter Integrity Validation\n  const frontmatterMatch = currentContent.trim().match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n  if (!frontmatterMatch) {\n    issues.push({\n      line: 1,\n      type: 'FRONTMATTER',\n      severity: 'ERROR',\n      message: 'Missing standard YAML frontmatter opening/closing markers (---)',\n      autoFixable: false\n    });\n  } else {\n    const fm = frontmatterMatch[1];\n    if (!fm.includes('title:') && !fm.includes('id:')) {\n      issues.push({\n        type: 'FRONTMATTER',\n        severity: 'WARNING',\n        message: 'Frontmatter missing \"title:\" or \"id:\" property',\n        autoFixable: false\n      });\n    }\n    if (!fm.includes('type:')) {\n      issues.push({\n        type: 'FRONTMATTER',\n        severity: 'WARNING',\n        message: 'Frontmatter missing \"type:\" property',\n        autoFixable: false\n      });\n    }\n    // Canonical schema enforcement (from curriculum-kit/docs/refs/templates/)\n    const typeMatch = fm.match(/^type:\\s*\"?([A-Z_0-9]+)\"?/m);\n    const artifactType = typeMatch?.[1];\n    // SLIDE uses marp frontmatter, not standard schema — skip schema check\n    const isMarpSlide = fm.includes('marp:');\n    if (!isMarpSlide && artifactType && artifactType !== 'STATUS') {\n      if (!fm.includes('created_by:')) {\n        issues.push({\n          type: 'FRONTMATTER',\n          severity: 'WARNING',\n          message: 'Frontmatter missing \"created_by:\" — expected \"Curriculum OS Builder\"',\n          autoFixable: false\n        });\n      }\n      if (!fm.includes('phase:')) {\n        issues.push({\n          type: 'FRONTMATTER',\n          severity: 'WARNING',\n          message: 'Frontmatter missing \"phase:\" field (e.g. P1, P2, P3)',\n          autoFixable: false\n        });\n      }\n      if (!fm.includes('deliverable:')) {\n        issues.push({\n          type: 'FRONTMATTER',\n          severity: 'WARNING',\n          message: 'Frontmatter missing \"deliverable:\" field (e.g. P3-T2 for ACT, P2-T08 for QUIZ)',\n          autoFixable: false\n        });\n      }\n      if (!fm.includes('version:')) {\n        issues.push({\n          type: 'FRONTMATTER',\n          severity: 'WARNING',\n          message: 'Frontmatter missing \"version:\" field (e.g. \"v1.0\")',\n          autoFixable: false\n        });\n      }\n      if (!fm.includes('date:')) {\n        issues.push({\n          type: 'FRONTMATTER',\n          severity: 'WARNING',\n          message: 'Frontmatter missing \"date:\" field',\n          autoFixable: false\n        });\n      }\n    }\n  }\n\n\n  // 5. Placeholder & Stub Detection (Exclude starter code comments inside ``` ... ```)\n  const proseWithoutCode = currentContent.replace(/```[\\s\\S]*?```/g, '');\n  const placeholderPatterns = [\n    /\\b(TODO:\\s*Viết|TBD|FIXME|PLACEHOLDER|LOREM IPSUM)\\b/i,\n    /\\[Chưa điền\\]|\\[Cần bổ sung\\]|\\[Insert here\\]|\\[Placeholder\\]/i,\n    /<TODO[\\s\\S]*?>/i\n  ];\n  placeholderPatterns.forEach(pattern => {\n    if (pattern.test(proseWithoutCode)) {\n      issues.push({\n        type: 'PLACEHOLDER',\n        severity: 'ERROR',\n        message: `Contains unfinished placeholder or stub matching pattern: ${pattern.source}`,\n        autoFixable: false\n      });\n    }\n  });\n\n  // 6. Markdown Table Validation & Auto-fix\n  const tableResult = validateMarkdownTables(currentContent);\n  if (tableResult.issues.length > 0) {\n    issues.push(...tableResult.issues);\n    currentContent = tableResult.fixedContent;\n    fixedCount += tableResult.issues.length;\n  }\n\n  // 7. Mermaid Block Syntax Validation\n  const mermaidMatches = Array.from(currentContent.matchAll(/```mermaid\\s*\\n([\\s\\S]*?)\\n```/g));\n  for (const m of mermaidMatches) {\n    const mermaidCode = m[1];\n    const validation = validateMermaidSyntax(mermaidCode);\n    if (!validation.valid) {\n      issues.push({\n        type: 'MERMAID',\n        severity: 'ERROR',\n        message: `Mermaid Syntax Error: ${validation.error}`,\n        autoFixable: false\n      });\n    }\n  }\n\n  // 8. Math LaTeX Dollar Matching\n  const doubleDollarCount = (currentContent.match(/\\$\\$/g) || []).length;\n  if (doubleDollarCount % 2 !== 0) {\n    issues.push({\n      type: 'MATH',\n      severity: 'ERROR',\n      message: 'Unmatched block math delimiters ($$)',\n      autoFixable: false\n    });\n  }\n\n  // 9. Scan and auto-fix empty code fences (```lang\\n\\s*``` with 0 actual content)\n  const emptyFenceRe = /```[a-zA-Z0-9_\\-]*\\r?\\n\\s*```\\r?\\n?/g;\n  let emptyFenceMatch: RegExpExecArray | null;\n  while ((emptyFenceMatch = emptyFenceRe.exec(currentContent)) !== null) {\n    issues.push({\n      type: 'EMPTY_CODE_FENCE',\n      severity: 'WARNING',\n      message: 'Empty code fence detected and removed (0 lines of code content)',\n      autoFixable: true\n    });\n    fixedCount++;\n  }\n  if (issues.some(i => i.type === 'EMPTY_CODE_FENCE')) {\n    currentContent = currentContent.replace(/```[a-zA-Z0-9_\\-]*\\r?\\n\\s*```\\r?\\n?/g, '');\n  }\n\n  const hasErrors = issues.some(i => i.severity === 'ERROR');\n\n  return {\n    filePath,\n    isValid: !hasErrors,\n    issues,\n    autoFixedContent: currentContent,\n    fixedCount\n  };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @thanh01.pmt/curriculum-kit — Lesson Flow Ingestor\n// Extracts the canonical pedagogical sequence from LESSON_xxx.md\n// Supports 5E, EDP, PBL, CRA, and Custom Frameworks without hardcoding\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ParsedActivityRow {\n  seq: number;\n  phase: string;\n  activityType: string;\n  actor: string;\n  purpose: string;\n  studentAction: string;\n  teacherMove: string;\n  /** P49 G4: canonical Output/Evidence column (template col 8). */\n  outputEvidence: string;\n  /** P49 G4: LO references parsed from the LO column, e.g. [\"LO1\",\"LO2\"]. */\n  lo: string[];\n  time: string;\n  artifactContract: string;\n}\n\nexport interface ParsedLessonPhase {\n  phaseName: string;\n  title: string;\n  timing?: string;\n  content: string;\n  codeSnippets: string[];\n  mermaidDiagrams: string[];\n}\n\nexport interface ParsedLessonFlow {\n  lessonId: string;\n  lessonTitle: string;\n  pedagogicalModel: string;\n  estimatedDuration: string;\n  slideContract?: string;\n  activities: ParsedActivityRow[];\n  phases: ParsedLessonPhase[];\n  rawContent: string;\n}\n\n/**\n * Parses a canonical LESSON markdown document to extract the pedagogical flow,\n * activity sequence, and instructional moves.\n */\nimport { stripHeadingKey } from '../services/templateLoader';\n\nexport function parseLessonFlow(lessonMarkdown: string): ParsedLessonFlow {\n  const result: ParsedLessonFlow = {\n    lessonId: '',\n    lessonTitle: '',\n    pedagogicalModel: '5e',\n    estimatedDuration: '90 mins',\n    activities: [],\n    phases: [],\n    rawContent: lessonMarkdown\n  };\n\n  if (!lessonMarkdown || typeof lessonMarkdown !== 'string') {\n    return result;\n  }\n\n  // 1. Parse Frontmatter\n  const fmMatch = lessonMarkdown.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n  if (fmMatch) {\n    const fm = fmMatch[1];\n    const idMatch = fm.match(/id:\\s*[\"']?([^\"'\\n]+)[\"']?/i);\n    if (idMatch) result.lessonId = idMatch[1].trim();\n\n    const titleMatch = fm.match(/title:\\s*[\"']?([^\"'\\n]+)[\"']?/i);\n    if (titleMatch) result.lessonTitle = titleMatch[1].trim();\n\n    const typeMatch = fm.match(/type:\\s*[\"']?([^\"'\\n]+)[\"']?/i);\n    if (typeMatch) {\n      const t = typeMatch[1].toLowerCase();\n      if (t.includes('edp')) result.pedagogicalModel = 'edp';\n      else if (t.includes('pbl')) result.pedagogicalModel = 'pbl';\n      else if (t.includes('cra')) result.pedagogicalModel = 'cra';\n      else if (t.includes('5e')) result.pedagogicalModel = '5e';\n      else result.pedagogicalModel = typeMatch[1].trim();\n    }\n  }\n\n  // 2. Parse Duration\n  const durMatch = lessonMarkdown.match(/Estimated Duration:\\s*([^\\n]+)/i);\n  if (durMatch) result.estimatedDuration = durMatch[1].trim();\n\n  // Prompt-audit S-2: title may live in the H1 instead of frontmatter\n  // (template variants put `# LESSON [XX]: <title>` in the body only).\n  if (!result.lessonTitle) {\n    const h1 = lessonMarkdown.match(/^#\\s+(?:LESSON[^:]*:\\s*)?(.+)$/m);\n    if (h1 && h1[1]) result.lessonTitle = h1[1].replace(/\\*+/g, '').trim();\n  }\n\n  // 3. Parse Artifact Contract for SLIDE\n  const contractMatch = lessonMarkdown.match(/SLIDE must visualize:?\\s*([^\\n]+)/i);\n  if (contractMatch) result.slideContract = contractMatch[1].trim();\n\n  // 4. Parse Activity Sequence Table\n  const actSeqSectionMatch = lessonMarkdown.match(/###\\s*(?:\\d+\\.\\s*)?Activity Sequence[\\s\\S]*?(?=(?:###|\\n##\\s+|$))/i);\n  if (actSeqSectionMatch) {\n    const tableText = actSeqSectionMatch[0];\n    const lines = tableText.split('\\n');\n    let inTable = false;\n    let headerParsed = false;\n\n    for (const line of lines) {\n      const trimmed = line.trim();\n      if (trimmed.startsWith('|') && trimmed.endsWith('|')) {\n        if (!inTable) {\n          inTable = true;\n          continue; // header row\n        }\n        if (trimmed.includes('---')) {\n          headerParsed = true;\n          continue; // separator\n        }\n        if (headerParsed) {\n          const cells = trimmed.split('|').map(c => c.trim()).filter((_, idx, arr) => idx > 0 && idx < arr.length - 1);\n          if (cells.length >= 7) {\n            const seqNum = parseInt(cells[0], 10) || result.activities.length + 1;\n            result.activities.push({\n              seq: seqNum,\n              phase: cells[1] || `Phase ${seqNum}`,\n              activityType: cells[2] || '',\n              actor: cells[3] || '',\n              purpose: cells[4] || '',\n              studentAction: cells[5] || '',\n              teacherMove: cells[6] || '',\n              outputEvidence: cells[7] || '',\n              lo: (cells[8] || '').replace(/\\*/g, '').split(/[,;/\\s]+/).map((s) => s.trim()).filter(Boolean),\n              time: cells[9] || cells[cells.length - 2] || '',\n              artifactContract: cells[cells.length - 1] || ''\n            });\n          }\n        }\n      } else if (inTable && trimmed.length > 0 && !trimmed.startsWith('>')) {\n        inTable = false;\n      }\n    }\n  }\n\n  // 5. Parse Lesson Flow Phases (Section B).\n  //\n  // Bốn template ship bốn tên cho section này: \"B. Lesson Flow\" (en),\n  // \"B. Dòng Bài học\" (5E), \"B. Tiến trình Bài học\" (EDP/GENERAL). Regex cũ chỉ khớp\n  // tiêu đề tiếng Anh, nên với 3 template còn lại `flowSection` rơi về TOÀN BỘ file và\n  // nuốt luôn section A + C — đo được: 11 \"phase\" cho template EDP, 14 cho file thật.\n  //\n  // Cách duy nhất đúng là quét heading theo CẤP ĐỘ, không so chuỗi:\n  //   H2 \"B. …\"  → bắt đầu section B\n  //   H3         → một phase\n  //   H4+        → nằm TRONG phase đó, không phải phase mới (đo: CREATE có 6 bước H4,\n  //               regex cũ cắt ở H4 đầu tiên nên chỉ còn 123 chars thay vì 3.434)\n  //   H2 kế tiếp → hết section B\n  const lines = lessonMarkdown.split('\\n');\n  const headings: { idx: number; depth: number; text: string }[] = [];\n  {\n    let inFence = false;\n    for (let i = 0; i < lines.length; i++) {\n      if (/^\\s*```/.test(lines[i])) { inFence = !inFence; continue; }\n      if (inFence) continue;\n      const m = lines[i].match(/^(#{1,6})\\s+(.+)$/);\n      if (m) headings.push({ idx: i, depth: m[1].length, text: m[2].trim() });\n    }\n  }\n\n  // Heading thật có thể bị vò trang trí phía trước: \"[REQUIRED] B. Lesson Flow\",\n  // \"[OPTIONAL] B. Tiến trình Bài học\", hay \"BÀI HỌC 01\". Vì vậy bỏ ký tự đánh dấu và\n  // whitespace trước khi so \"B\" — chỉ so cấp độ + mẫu \"B.\" là đủ, không so nguyên văn.\n  const isSectionB = (text: string) =>\n    /^(?:\\[[^\\]]*\\]\\s*)*B\\s*[.)\\s]/i.test(text.trim());\n\n  const flowHeading = headings.find(\n    (h) => h.depth === 2 && isSectionB(h.text)\n  );\n  const sectionEnd = flowHeading\n    ? (headings.find((h) => h.idx > flowHeading.idx && h.depth <= 2)?.idx ?? lines.length)\n    : lines.length;\n  const phaseHeadings = flowHeading\n    ? headings.filter(\n        (h) =>\n          h.idx > flowHeading.idx &&\n          h.idx < sectionEnd &&\n          h.depth === 3\n      )\n    : [];\n\n  // Không có section B đúng hình dạng: lùi về hành vi cũ (coi phần còn lại của file là flow)\n  // để không mất dữ liệu, nhưng chỉ khi thực sự không tìm thấy heading nào.\n  const usablePhases =\n    flowHeading && phaseHeadings.length > 0\n      ? phaseHeadings\n      : headings\n          .filter((h) => h.depth === 3)\n          .map((h) => ({ ...h, text: h.text.replace(/^\\d+\\.\\s*/, '') }));\n\n  for (let p = 0; p < usablePhases.length; p++) {\n    const head = usablePhases[p];\n    const bodyStart = head.idx + 1;\n    // Kết thúc ở heading CÙNG cấp kế tiếp (một phase mới), hoặc cuối section B.\n    const nextHead =\n      p + 1 < usablePhases.length ? usablePhases[p + 1].idx : sectionEnd;\n    const bodyEnd = flowHeading\n      ? Math.min(nextHead, sectionEnd)\n      : nextHead;\n\n    // Không cần Math.min(nextHead, sectionEnd): phaseHeadings đã lọc `idx < sectionEnd`\n    // nên nextHead của phase cuối luôn nằm trong section B. Trước đây có Math.min ở đây và\n    // nó là dead code — mutation bỏ đi không đổi hành vi, đã kiểm.\n    const headingText = head.text.trim();\n    // Legacy artifacts still carry the timing inside the heading\n    // (`### 1. ENGAGE — [X mins]`): peel it off and keep it as `timing`.\n    const tailMatch = headingText.match(/[—–-]\\s*\\[?([^\\]—–]+)\\]?\\s*$/);\n    const tail = tailMatch?.[1]?.trim() ?? '';\n    const rawPhaseName = stripHeadingKey(\n      tailMatch && /mins?/i.test(tail)\n        ? headingText.slice(0, tailMatch.index).trim()\n        : headingText.replace(/^\\d+\\.\\s*/, '')\n    );\n    let content = lines.slice(bodyStart, bodyEnd).join('\\n').trim();\n    let timing: string | undefined;\n    const durMatch = content.match(/^>?\\s*\\**Duration:?\\**\\s*([~0-9][^\\n]*)/i);\n    if (durMatch) {\n      timing = durMatch[1].trim();\n      content = content.replace(/^>?\\s*\\**Duration:?\\**\\s*[^\\n]*\\n?/i, '').trim();\n    } else if (tail && /mins?/i.test(tail)) {\n      timing = tail;\n    }\n\n    // Extract code snippets inside this phase\n    const codeSnippets: string[] = [];\n    const codeRegex = /```(?:[a-zA-Z0-9_\\-]+)?\\s*\\n([\\s\\S]*?)```/g;\n    let cMatch: RegExpExecArray | null;\n    while ((cMatch = codeRegex.exec(content)) !== null) {\n      if (!cMatch[1].includes('graph TD') && !cMatch[1].includes('graph LR')) {\n        codeSnippets.push(cMatch[1].trim());\n      }\n    }\n\n    // Extract Mermaid diagrams\n    const mermaidDiagrams: string[] = [];\n    const mermaidRegex = /```mermaid\\s*\\n([\\s\\S]*?)```/g;\n    let mMatch: RegExpExecArray | null;\n    while ((mMatch = mermaidRegex.exec(content)) !== null) {\n      mermaidDiagrams.push(mMatch[1].trim());\n    }\n\n    result.phases.push({\n      phaseName: rawPhaseName,\n      title: rawPhaseName,\n      timing,\n      content,\n      codeSnippets,\n      mermaidDiagrams\n    });\n  }\n\n  return result;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @thanh01.pmt/curriculum-kit — Slide Blueprint Prompt (Phase 1 Planning)\n// Maps the canonical LESSON pedagogical flow into an organic, flow-driven slide outline\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ParsedLessonFlow } from '../../parsers/lessonFlowParser.js';\n\nexport interface SlideBlueprintItem {\n  slideIndex: number;\n  clusterId: number;\n  clusterTitle: string;\n  lessonPhase: string;\n  layoutId: string;\n  /**\n   * DEPRECATED (kit 1.5.44, option C unified registry): the bespoke skeletons\n   * ARE layoutIds now. Kept for backward compatibility with persisted\n   * blueprints; normalizeBlueprintItems collapses it into layoutId.\n   */\n  layoutSkeleton?: string;\n  /**\n   * The slide's headline ASSERTION (high-quality-slides Phase 3 gate): one\n   * declarative sentence ≤12 words — \"Commit verification takes one hash\",\n   * not \"Git Commit\". Empty title-style headlines are the #1 slop tell.\n   */\n  headlineAssertion?: string;\n  /**\n   * The slide's ONE intended visual (high-quality-slides Phase 3): chart /\n   * diagram / photo / icon set / typographic treatment / code walkthrough.\n   * Forces the art-director decision before any markup exists.\n   */\n  intendedVisual?: string;\n  title: string;\n  pedagogicalGoal: string;\n  contentFocus: string[];\n  codeSnippetIntent?: string;\n  visualIntent?: string;\n}\n\nexport interface BuildSlideBlueprintPromptParams {\n  lessonFlow: ParsedLessonFlow;\n  targetSlideCount?: number;\n  stylePresetName?: string;\n  /** Canonical PRODUCT_SPEC block — the blueprint decides deck-wide content\n   *  (titles, code intents), so it MUST see the same binding platform/versions\n   *  as every other artifact (prompt audit S-1: blueprint had ZERO ground\n   *  truth and inherited any LESSON drift unchecked). */\n  productSpecBlock?: string;\n  /** Caller-supplied REQUIRED slide outline (kit 1.5.60). When present, the\n   *  blueprint MUST map every item to at least one slide, in the given order,\n   *  and MUST NOT invent phases outside it. Titles stay free — the outline\n   *  constrains STRUCTURE (coverage + order), not wording. Absent → the\n   *  blueprint self-plans from the lesson flow as before (standalone\n   *  artifacts without a LESSON still work). */\n  requiredOutline?: string[];\n}\n\nexport function buildSlideBlueprintPrompt(params: BuildSlideBlueprintPromptParams): string {\n  const { lessonFlow, targetSlideCount, stylePresetName = 'Blue Professional', productSpecBlock, requiredOutline } = params;\n\n  const activitiesSummary = lessonFlow.activities.map(a => \n    `Seq ${a.seq} [${a.phase}]: ${a.purpose} (Teacher: ${a.teacherMove} | Student: ${a.studentAction} | Time: ${a.time})`\n  ).join('\\n');\n\n  const phasesSummary = lessonFlow.phases.map(p => \n    `Phase \"${p.phaseName}\" (${p.timing || 'Standard'}):\\n${p.content.slice(0, 500)}...`\n  ).join('\\n\\n');\n\n  const countGuidance = targetSlideCount \n    ? `The target is approximately ${targetSlideCount} slides — a reference point, NOT a hard cap. Let the lesson's own structure decide: every SECTION needs its own knowledge-intro slide and activity slide(s), and sections differ in activity type and content length. Plan exactly as many slides as the structure demands; going a few above the target is correct when the lesson has more sections.`\n    : `DENSITY DIRECTIVE (RC 2026-09-23 — STRICT): one slide covers 2–4 minutes of lesson time, never more. A 60–90 minute lesson therefore yields **18–30 slides**; a 13-slide deck for a 76-minute lesson is a FAILURE of coverage. Every instructional move in the activity sequence (each concept explanation, each code walkthrough step, each worked example, each discussion prompt, each checkpoint) earns its own slide. Split multi-part explanations across consecutive slides instead of packing one slide.`;\n\n  const outputGuidance = targetSlideCount\n    ? `Output ONLY a valid JSON array of slide objects — approximately ${targetSlideCount}, or slightly more when the lesson's section structure demands it.`\n    : `Output ONLY a valid JSON array of objects (one object per planned slide).`;\n\n  const outlineBlock = requiredOutline?.length\n    ? `\\n### 📐 REQUIRED SLIDE OUTLINE (BINDING STRUCTURE — kit 1.5.60):\nThe caller has supplied a REQUIRED outline derived from the canonical LESSON's\nsection headings. This is a HARD STRUCTURAL CONSTRAINT, not a suggestion:\n- Every outline item MUST be covered by at least one slide, IN THE GIVEN ORDER\n  (a single large item may expand into several consecutive slides).\n- Do NOT invent phases/sections that are not in the outline and not in the\n  LESSON flow above.\n- Slide TITLES remain free — the outline constrains coverage and order, not\n  wording. Use the item text as the slide's lessonPhase/clusterTitle anchor.\n- ${lessonFlow.pedagogicalModel.toUpperCase()} framing applies WITHIN each outline item's slides.\nREQUIRED OUTLINE (${requiredOutline.length} items, in order):\n${requiredOutline.map((t, i) => `${i + 1}. ${t}`).join('\\n')}\n`\n    : '';\n\n  return `\nYou are @illustrator, Chief Slide Architect.\nYour task is to analyze the canonical LESSON plan (\"${lessonFlow.lessonTitle}\") and architect an authoritative, high-fidelity **SLIDE BLUEPRINT** (a slide-by-slide presentation deck outline for this single lesson).\nIMPORTANT: Do NOT output a course outline or lessons list. You are designing presentation SLIDES for this lesson.\n${countGuidance}\n\n### 🏛️ PEDAGOGICAL GROUND TRUTH (FROM CANONICAL LESSON):\n- Lesson Title: \"${lessonFlow.lessonTitle}\"\n- Pedagogical Framework: \"${lessonFlow.pedagogicalModel.toUpperCase()}\"\n- Target Duration: ${lessonFlow.estimatedDuration}\n- Active Visual Style: \"${stylePresetName}\"\n${lessonFlow.slideContract ? `- Slide Artifact Contract: \"${lessonFlow.slideContract}\"` : ''}\n${productSpecBlock ? `\n${productSpecBlock}\n` : ''}${outlineBlock}\n### 🗺️ CANONICAL ACTIVITY SEQUENCE:\n${activitiesSummary || 'Standard phased sequence'}\n\n### 📖 LESSON FLOW EXCERPT:\n${phasesSummary || lessonFlow.rawContent.slice(0, 3000)}\n\n---\n\n### 🎯 ARCHITECTURAL RULES (STRICTLY INVARIANT):\n1. **ORGANIC PEDAGOGICAL FIDELITY (1-TO-1 PROJECTION)**:\n   - The slide sequence MUST follow the EXACT flow of the LESSON phases (${lessonFlow.pedagogicalModel.toUpperCase()}).\n   - The number of slides is determined by the substance of the lesson — do NOT stretch thin content or cram rich multi-step labs into too few slides.\n   - Do NOT invent artificial phases that do not exist in the lesson plan.\n   - For example:\n     * If 5E: Engage -> Explore -> Explain -> Elaborate -> Evaluate.\n     * If EDP: Ask/Problem -> Imagine & Plan -> Create & Prototype -> Test & Debug -> Improve & Share.\n     * If PBL: Driving Question -> Inquiry -> Milestone Sprint -> Review & Exhibition.\n\n2. **CHUNKY CLUSTERS (4 TO 6 SLIDES PER CLUSTER)**:\n   - Partition the slides into natural clusters corresponding to the major pedagogical transitions in the lesson.\n   - Each cluster MUST contain 4 to 6 slides to ensure downstream token generation remains focused, high-fidelity, and non-repetitive.\n\n3. **SEMANTIC LAYOUT SLOTS (CHOOSE FROM THE SKELETON POOL — 19 DETERMINISTIC LAYOUTS)**:\n   Use one of these valid layoutIds for each slide. Every layout below renders\n   mechanically from a designer-made skeleton — whatever you pick is ALWAYS\n   realizable downstream with pixel-perfect geometry. (The old freeform preset\n   ids like split-concept-code / two-columns-compare / checkpoint-quiz are\n   RETIRED from planning — do NOT emit them.)\n   - \\`cover-editorial\\`: deck opener — asymmetric hero, giant title over a clipped accent panel.\n   - \\`section-divider\\`: chapter/phase break ONLY — oversized ghost numeral (\"01\", \"02\") + assertion. ALWAYS supply ghostNum. Do NOT use mid-topic.\n   - \\`agenda-grid\\`: menu/roadmap — 2-col numbered grid of 4–6 items.\n   - \\`quote-hero\\`: a single quotation as the hero, oversized quote mark.\n   - \\`data-strip\\`: KPI moment — 3–4 big quantitative metric tiles (numbers/percentages/counts ≤6 chars). NEVER use for CLI commands, code lines, or long prose.\n   - \\`closing-cta\\`: final slide — assertion + action chips.\n   - \\`metrics-cards\\`: 3–4 quantitative metric cards (short value ≤6 chars + label + context). NEVER use for commands or text-heavy explanations.\n   - \\`timeline-horizontal\\`: 3–5 step horizontal track with numbered circles.\n   - \\`detail-2col\\`: 2–4 titled bullet blocks in a grid (great for role comparison like Driver vs Navigator, workflows, or dual pillars).\n   - \\`split-insights\\`: numbered insights left, takeaway highlight panel right.\n   - \\`comparison-bars\\`: horizontal bar chart comparison (label + pct + value).\n   - \\`stats-dashboard\\`: 3 stat cells + an interpretation panel.\n   - \\`process-flow\\`: 2–4 arrowed flow boxes.\n   - \\`code-walkthrough\\`: code panel left, numbered step-by-step walkthrough right. MUST have BOTH code AND 2–5 sequential step explanations. If no steps, use \\`split-insights\\`.\n   - \\`phase-pentad\\`: exactly 5 phase cards (5E: Engage/Explore/Explain/Elaborate/Evaluate).\n   - \\`iterate-loop\\`: cycle stages around a loop hub (EDP iterate).\n   - \\`milestone-rubric\\`: Bronze/Silver/Gold rubric table (PBL milestones).\n   - \\`spec-sheet\\`: component/spec/pins spec table (robotics, wiring).\n   - \\`chart-blocks\\`: bar chart comparison — label + height + value per bar.\n\n   LAYOUT VARIETY RULES (STRICTLY INVARIANT — the renderer builds every slide\n   mechanically from its layoutId, so a monotonous blueprint IS a monotonous\n   deck; measured: slot decks shipped 10–16 of 26 slides as \\`split-concept-code\\`\n   because the model defaulted to the safest template):\n   - Maximum **2 CONSECUTIVE slides with the same layoutId** — after two in a\n     row, the next slide MUST switch to a different layoutId.\n   - No layoutId may cover **more than 40% of the deck**.\n   - Every cluster of 4–6 slides MUST use **at least 2 distinct layoutIds** and\n     MUST contain at least one \\`data-strip\\`, \\`metrics-cards\\`, \\`stats-dashboard\\`\n     or \\`comparison-bars\\` (a number worth remembering) — a cluster with\n     neither is a wall of prose.\n   - Slide 1 is \\`cover-editorial\\`; the final slide is \\`closing-cta\\`.\n   - Choose the layout from the CONTENT (a comparison → detail-2col or\n     comparison-bars, a sequence → timeline-horizontal or process-flow, a\n     single striking number → data-strip or metrics-cards), never from habit.\n\n4. **ASSERTION HEADLINES + INTENDED VISUAL (per-slide art direction)**:\n   For EVERY slide, write:\n   - \\`headlineAssertion\\`: ONE declarative sentence (≤12 words) that states\n     what the slide CLAIMS — \"Commit verification takes one hash\", NOT \"Git\n     Commit\". A title-style headline with no verb is a failure.\n   - \\`intendedVisual\\`: the ONE visual form that carries the slide — \"terminal\n     mockup of git init\", \"before/after comparison cards\", \"big number + label\",\n     \"4-step arrowed flow\", \"annotated code walkthrough\".\n   These force the art-director decision BEFORE any slide is authored.\n\n---\n\n### 📤 OUTPUT FORMAT:\n${outputGuidance} Do NOT include markdown text outside the JSON.\nFormat:\n\\`\\`\\`json\n[\n  {\n    \"slideIndex\": 1,\n    \"clusterId\": 1,\n    \"clusterTitle\": \"Opening & Hook\",\n    \"lessonPhase\": \"Engage\",\n    \"layoutId\": \"cover-editorial\",\n    \"headlineAssertion\": \"One declarative sentence this slide claims\",\n    \"intendedVisual\": \"The ONE visual form that carries the slide\",\n    \"title\": \"Title of Slide 1\",\n    \"pedagogicalGoal\": \"Specific learning goal of this slide\",\n    \"contentFocus\": [\"Bullet 1 focus\", \"Bullet 2 focus\"],\n    \"codeSnippetIntent\": \"Description of code snippet to show, if any\",\n    \"visualIntent\": \"Description of visual diagram to display, if any\"\n  }\n]\n\\`\\`\\`\n`.trim();\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @thanh01.pmt/curriculum-kit — Slide VISION judge + repair wiring\n//\n// The perceptual half of slide QA (2026-09-28 aesthetic audit): the scanline\n// layoutQa measures geometry; this judge LOOKS at the rendered slide (pk\n// runSlideVisionQa hands us a PNG) and flags the AI-slop failure modes geometry\n// cannot see — text-only bodies with no designed container, centered body\n// text, dead bands, overflow. The verdicts feed the existing bespoke repair\n// turn, mirroring the layout-QA loop (verdicts in, per-slide repair out).\n//\n// Transport: the AI SDK's model via streamText with an image part — any\n// vision-capable model on the router pool. A judge failure is NON-FATAL (the\n// deck keeps whatever the geometric QA certified) — vision QA is an upgrade,\n// never a gate that can brick a run.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { streamText } from 'ai';\nimport { getAIModel, type ModelResolutionOptions } from '../ai/provider-factory.js';\nimport { extractJsonArray } from './slideProductionWorkflow.js';\n\nexport interface VisionJudgeIssue {\n  code: string;\n  detail: string;\n}\n\n/**\n * Build a pk-compatible VisionQaJudge from the kit's model resolution. The\n * rubric text ships with pk (VISION_QA_RUBRIC) — kept in sync there so the\n * host could also run its own judge.\n */\nexport function buildSlideVisionJudge(modelOptions?: ModelResolutionOptions) {\n  return async (ctx: { slideIndex: number; title?: string; png: Buffer }): Promise<VisionJudgeIssue[]> => {\n    const model = getAIModel(modelOptions);\n    const base64 = ctx.png.toString('base64');\n    const prompt = `${'Judge this 1920x1080 presentation slide as a design art director.'}\n${ctx.title ? `Slide title (context): \"${ctx.title}\"` : ''}\nFlag EXACTLY these failure modes (JSON array of {code, detail}); return [] when none apply:\n1. \"text-only-no-container\" — the body is plain paragraphs/lists with NO visual container (no card/panel/tile/border-box/table/quote-block/code block). A slide must show at least one designed container beside the heading.\n2. \"centered-body-text\" — body paragraphs (not the title) are center-aligned across the full width. Titles may center; body text must not.\n3. \"dead-band\" — a visible empty band taller than about 1/4 of the slide height.\n4. \"overflow\" — text clipped at the stage edge or colliding blocks.\nRespond with ONLY a JSON array: [{\"code\":\"...\",\"detail\":\"one line\"}] (empty array if the slide passes).`;\n\n    const result = streamText({\n      model,\n      messages: [\n        {\n          role: 'user',\n          content: [\n            { type: 'text', text: prompt },\n            { type: 'image', image: new Uint8Array(ctx.png) },\n          ],\n        } as any,\n      ],\n      maxOutputTokens: 2000,\n      temperature: 0,\n    });\n    const raw = await result.text;\n    const ex = extractJsonArray(raw);\n    if (ex.error || !Array.isArray(ex.value)) return [];\n    const issues: VisionJudgeIssue[] = [];\n    for (const item of ex.value as any[]) {\n      const code = typeof item?.code === 'string' ? item.code : '';\n      const detail = typeof item?.detail === 'string' ? item.detail : '';\n      if (code && detail) issues.push({ code, detail });\n    }\n    return issues.slice(0, 4);\n  };\n}\n\n/**\n * Build the vision REPAIR prompt for a batch of flagged slides — same shape as\n * buildBespokeRepairPrompt (violations quoted verbatim, previous markup given),\n * but the violations come from the judge's eyes, not the scanline.\n */\nexport function buildVisionRepairPrompt(params: {\n  failing: Array<{ slideNumber: number; title: string; html: string; issues: VisionJudgeIssue[] }>;\n  language: string;\n}): { systemPrompt: string; userPrompt: string } {\n  const systemPrompt = `You are @illustrator repairing slides that a vision judge flagged for COMPOSITION failures (not content failures).\n\nHARD CONTRACT (any violation fails the slide):\n1. ONE self-contained HTML fragment per slide on a fixed 1920x1080 stage.\n2. Utility classes + theme CSS variables only (--bg, --text, --primary, --accent, --font-display, --font-body); no <script>, no external URLs, no per-slide <style> beyond a tiny one-off block.\n3. Exactly one prominent h1/h2 heading; real content only, no placeholders.\n4. PRESERVE the slide's visible text and language (\"${params.language}\") EXACTLY — this is a COMPOSITION repair; the copy stays, the layout changes.\n\nREPAIR PLAYBOOK per failure code:\n- text-only-no-container: wrap the body content in a designed container (card with border/rounded corners and padding, tile with accent top border, or a 2-col grid of such cards). Never plain stacked paragraphs.\n- centered-body-text: switch the body container to left-aligned (text-left) with a max-width column; only the title may center.\n- dead-band: scale type/spacing up and stretch the main block (flex:1) so content occupies the full height.\n- overflow: reduce the least-important content or tighten spacing so nothing clips.`;\n\n  const userPrompt = params.failing\n    .map(\n      (f) => `### REPAIR TURN — slide ${f.slideNumber}: \"${f.title}\"\n\n### VISION JUDGE VERDICTS:\n${f.issues.map((i) => `- [${i.code}] ${i.detail}`).join('\\n')}\n\n### PREVIOUS MARKUP (repair this markup):\n\\`\\`\\`html\n${f.html}\n\\`\\`\\``\n    )\n    .join('\\n\\n---\\n\\n');\n\n  const tail = `\\n\\n### OUTPUT:\\nA single JSON array with EXACTLY ${params.failing.length} objects, same order as above:\\n\\`\\`\\`json\\n[{\"id\": \"slide-${params.failing[0]?.slideNumber ?? 1}\", \"title\": \"<unchanged>\", \"html\": \"<repaired markup>\", \"notes\": \"<unchanged>\"}]\\n\\`\\`\\``;\n\n  return { systemPrompt, userPrompt: userPrompt + tail };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @thanh01.pmt/curriculum-kit — Slide Batch Prompt (Phase 2 Chunky Generation)\n// Generates detailed, high-fidelity slides for a single cluster (4-6 slides)\n// Injects the authoritative Frontend-Slides Skill context and lesson ground truth\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { SlideBlueprintItem } from './slideBlueprintPrompt.js';\nimport type { ParsedLessonFlow } from '../../parsers/lessonFlowParser.js';\nimport { buildSlideOutputSchemaSection } from '@thanh01.pmt/presentation-kit/ai';\nimport type { HtmlLayoutPresetId } from '@thanh01.pmt/presentation-kit';\n\nexport interface BuildSlideBatchPromptParams {\n  clusterId: number;\n  clusterTitle: string;\n  clusterSlides: SlideBlueprintItem[];\n  lessonFlow: ParsedLessonFlow;\n  lessonExcerpt: string;\n  skillPrompt: string;\n  language?: string;\n  languageDirective?: string;\n  /** DEPRECATED (prompt audit S-4): markdown SLC heading directives do not\n   *  apply to JSON slide output — kept only for backward-compatible callers.\n   *  No longer interpolated into the system prompt. */\n  headingDirective?: string;\n  /** Ground-truth context injected into the system prompt (see groundContext doc). */\n  groundContext?: string;\n  /** Design tokens of the active template (palette/type/signature) — same brief\n   *  the bespoke prompt gets, so slot batches stay on-theme across lượt. */\n  designBrief?: string;\n  /** Deck density (frontend-slides): drives how much of each slot budget the\n   *  model should use — speaker decks project, reading decks are read. */\n  density?: 'speaker' | 'reading';\n  /** Canonical few-shot examples and slot contracts for bespoke/bl-* skeletons in this batch. */\n  slotsPrompt?: string;\n}\n\nexport function buildSlideBatchPrompt(params: BuildSlideBatchPromptParams): {\n  systemPrompt: string;\n  userPrompt: string;\n} {\n  const {\n    clusterId,\n    clusterTitle,\n    clusterSlides,\n    lessonFlow,\n    lessonExcerpt,\n    skillPrompt,\n    language = 'Vietnamese',\n    languageDirective = '',\n    headingDirective: _headingDirective = '', // deprecated — see interface doc\n    groundContext = '',\n    designBrief = '',\n    density = 'speaker',\n    slotsPrompt = '',\n  } = params;\n\n  const slidesSpec = clusterSlides.map(s => `\n- Slide ${s.slideIndex} [Phase: ${s.lessonPhase}] -> Layout: \"${s.layoutId}\"\n  Title: \"${s.title}\"\n  Pedagogical Goal: ${s.pedagogicalGoal}\n  Key Bullet Targets: ${s.contentFocus.join('; ')}\n  ${s.codeSnippetIntent ? `Code Focus: ${s.codeSnippetIntent}` : ''}\n  ${s.visualIntent ? `Visual Focus: ${s.visualIntent}` : ''}\n`).join('\\n');\n\n  const systemPrompt = `\n${skillPrompt}\n\n${designBrief ? `---\n### ACTIVE DESIGN BRIEF (keep every slide visually consistent with the rest of the deck):\n${designBrief}\n\n---` : ''}\n${groundContext ? `---\n### PROJECT GROUND CONTEXT (framework, style guide, glossary, canonical knowledge — author from these):\n${groundContext}\n\n---` : ''}\n### OPERATIONAL GROUND RULES FOR CHUNK GENERATION:\n${languageDirective}\n0. **LANGUAGE IS NOT NEGOTIABLE (measured 2026-09-28: a slot batch ignored this and shipped 0/26 Vietnamese slides)**: ALL visible text (titles, slot text, bullets) AND presenter notes MUST be written in \"${language}\" with correct diacritics — the language line in the OUTPUT block is a reminder, not the instruction. Never answer in English unless the lesson text itself quotes it.\n1. **FOCUS ON CLUSTER ${clusterId}: \"${clusterTitle}\"**:\n   Generate EXACTLY the ${clusterSlides.length} slides requested in the user prompt.\n2. **ZERO ABBREVIATION / NO \"// TODO\"**:\n   All code snippets MUST be real, fully authored, compilable code relevant to ${lessonFlow.lessonTitle}. Never write placeholders, stubs, or \"<CODE>\".\n3. **PRESENTER NOTES = TEACHER'S LIVE CUE SIGNALS (Tam Thiết Luật)**:\n   Every slide object MUST have a \"notes\" field: 1–3 concise sentences (30–60 words) in spoken register (văn nói) describing what the TEACHER SAYS & DOES while this slide is on screen — concrete cue signals, key questions, and demo actions grounded in the lesson's activity sequence above. Bold key signal phrases with **key phrases** so the teacher grasps the cue at a glance in presenter view. NEVER repeat on-screen text and do NOT use robotic meta-templates.\n4. **CONTENT DENSITY (what \"enough\" means)**:\n   - The OUTPUT SCHEMA states a word FLOOR (≥N) and CEILING (≤N) per slot — land INSIDE the band. A 3-word desc under a full-size card reads as an empty box; under-fill is flagged as a defect exactly like overflow.\n   - Bullets/points are complete thoughts clipped tight: use the per-slot word/item budgets of the OUTPUT SCHEMA as ceilings${\n     density === 'reading'\n       ? ', and land at ~60–75% of them (this deck is READ on screen).'\n       : ', and land at ~40–60% of them (this deck is PROJECTED — bigger type, fewer words; the detail lives in the speaker notes).'\n   }\n   - NEVER write meta text (\"This slide shows…\", \"In this section we will…\", \"Chúng ta sẽ…\") — the slide IS the message.\n   - No emoji in slide content. Prefer concrete commands, numbers and names over adjectives.\n   - Every list item must teach ONE thing; if an item needs two sentences, split or cut it.\n   - IMAGE slots: when a layout declares an \"image\" or \"images\" slot, ALWAYS fill it with a short English stock-photo search query describing ONE concrete scene (subject + setting, e.g. \"students building robot arm classroom\"). Never a URL, never base64 — a real photo is searched and embedded automatically.\n5. **OUTPUT FORMAT**:\n   Output ONLY a valid JSON array of ${clusterSlides.length} slide objects.\n`.trim();\n\n  const userPrompt = `\n### LESSON GROUND TRUTH:\n- Lesson Title: \"${lessonFlow.lessonTitle}\"\n- Target Duration: ${lessonFlow.estimatedDuration}\n- Pedagogy: \"${lessonFlow.pedagogicalModel.toUpperCase()}\"\n- Language: \"${language}\" — every string you emit (titles, slot text, bullets, notes) MUST be in this language with correct diacritics.\n\n### LESSON PHASE CONTENT (SOURCE OF TRUTH):\n${lessonExcerpt || lessonFlow.rawContent.slice(0, 4000)}\n\n---\n\n### REQUIRED SLIDES TO GENERATE FOR THIS CLUSTER:\n${slidesSpec}\n\n---\n\n### OUTPUT SCHEMA:\nOutput a single JSON array of ${clusterSlides.length} slide objects. Every slide has the envelope\n{ \"id\", \"layoutId\", \"title\", \"slots\", \"notes\" } — slots follow the CANONICAL contract of that\nslide's layoutId (never the old flat lead/bullets/card1Title shape):\n\n${buildSlideOutputSchemaSection(clusterSlides.map((s) => s.layoutId as HtmlLayoutPresetId))}\n${slotsPrompt ? `\\n---\\n${slotsPrompt}` : ''}\n\nEnvelope example (for a slide using detail-2col):\n\\`\\`\\`json\n[\n  {\n    \"id\": \"slide-${clusterSlides[0]?.slideIndex || 1}\",\n    \"layoutId\": \"${clusterSlides[0]?.layoutId || 'detail-2col'}\",\n    \"title\": \"${clusterSlides[0]?.title || 'Slide Title'}\",\n    \"slots\": { \"...\": \"fill per the ${clusterSlides[0]?.layoutId || 'detail-2col'} contract above\" },\n    \"notes\": \"1–3 sentence teacher activity description grounded in the lesson.\"\n  }\n]\n\\`\\`\\`\n`.trim();\n\n  return { systemPrompt, userPrompt };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @thanh01.pmt/curriculum-kit — Bespoke Slide Authoring Prompt (frontend-slides mode)\n//\n// In bespoke mode the model OWNS the slide design: it authors HTML/CSS per slide\n// against the chosen template's design brief, inside the deck's fixed 1920×1080\n// stage. This is how the frontend-slides skill works — as opposed to slot-filling\n// into 8 fixed layout recipes, which makes every deck look alike.\n//\n// The prompt states the contract the compiler actually enforces (see\n// presentation-kit html-engine/sanitize.ts): a self-contained fragment, no\n// scripts, no off-box assets, a real h1/h2, theme tokens via CSS variables.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { SlideBlueprintItem } from './slideBlueprintPrompt.js';\nimport type { ParsedLessonFlow } from '../../parsers/lessonFlowParser.js';\n\nexport interface BuildBespokePromptParams {\n  batchIndex: number;\n  clusterTitle: string;\n  batchItems: SlideBlueprintItem[];\n  lessonFlow: ParsedLessonFlow;\n  lessonExcerpt: string;\n  /** frontend-slides skill prompt (design system + HTML contract). */\n  skillPrompt: string;\n  /** Design tokens of the active template: palette, type scale, signature elements. */\n  designBrief: string;\n  /**\n   * EXACT class vocabulary the deck's shared stylesheet defines (pk ≥0.5.3\n   * buildUtilityVocabularyPrompt). Measured on L01 bespoke 1.5.33: with only a\n   * hinted vocabulary, 24% of authored class usages were dead classes. Empty\n   * on older pk — the hint text then degrades gracefully.\n   */\n  utilityVocabulary?: string;\n  /**\n   * Designer-made layout skeleton vocabulary (pk ≥0.5.7\n   * buildBespokeLayoutVocabulary): 6 pre-balanced compositions the blueprint\n   * may assign and the authoring turn fills. The model never composes from\n   * scratch when a skeleton fits — the measured degeneration (8/26 slides\n   * centered-<p> stacks, dead bands ≥316px) is exactly what this removes.\n   * Empty on older pk — degrades gracefully.\n   */\n  layoutSkeletons?: string;\n  language?: string;\n  languageDirective?: string;\n  groundContext?: string;\n}\n\n/** CSS variables the deck shell exposes to authored markup. */\nexport const BESPOKE_THEME_TOKENS =\n  '--bg, --bg-secondary, --primary, --accent, --text, --text-muted, --border, --font-display, --font-body, --font-code';\n\nfunction slidesSpec(items: SlideBlueprintItem[]): string {\n  return items\n    .map(\n      (s) => `\n- Slide ${s.slideIndex} [Phase: ${s.lessonPhase}] -> REQUIRED ID: \"slide-${s.slideIndex}\"\n  Title: \"${s.title}\"\n  Layout: ${s.layoutId || '(choose one that fits the content)'}\n  ${s.layoutSkeleton ? `Layout Skeleton: \"${s.layoutSkeleton}\" — SLOTS MODE: return {\"id\": \"slide-${s.slideIndex}\", \"skeleton\": \"${s.layoutSkeleton}\", \"slots\": {…}} per the FILL-SLOTS CONTRACT — never author markup for this slide.` : ''}\n  ${s.headlineAssertion ? `Headline Assertion: \"${s.headlineAssertion}\" — the h1/h2 must STATE this claim (not a topic label).` : ''}\n  ${s.intendedVisual ? `Intended Visual: ${s.intendedVisual} — this ONE visual form carries the slide; build it.` : ''}\n  Pedagogical Goal: ${s.pedagogicalGoal}\n  Content to teach: ${s.contentFocus.join('; ') || '(derive from the lesson phase)'}\n  ${s.codeSnippetIntent ? `Code to show: ${s.codeSnippetIntent}` : ''}\n  ${s.visualIntent ? `Visual idea: ${s.visualIntent}` : ''}\n  ${s.slideIndex === 1 || /cover/i.test(s.layoutId) ? 'COVER COMPOSE: this is the deck cover — apply HARD CONTRACT rule 11 (full-bleed hero, no dead middle band).' : ''}`\n    )\n    .join('\\n');\n}\n\nfunction hardConstraints(itemCount: number): string {\n  return `\n### HARD CONTRACT (a violation throws the slide away — the compiler enforces this):\n0. GLOBAL SLIDE ID INTEGRITY: Every slide object MUST preserve its exact global ID from the brief (e.g. \"slide-5\", \"slide-6\"). NEVER reset the ID counter to \"slide-1\" for this batch.\n1. ONE self-contained HTML fragment per slide. The deck places it on a fixed\n   1920×1080 stage, so design at that size (absolute/relative units, no\n   responsive breakpoints, no viewport units for layout).\n2. NO <script>, <iframe>, <object>, <embed>, <form>, <input>, <button>,\n   <textarea>, <select>, <link>, <meta>, <base>, and NO on* event attributes.\n3. MARKUP-THIN ON THE SHARED SYSTEM (kit 1.5.32): the deck shell injects a\n   global utility stylesheet for EVERY slide — flex/grid/gap/spacing (p-*, px-*,\n   py-*, mt-*, mb-*, gap-*), typography (text-sm … text-8xl, font-semibold,\n   font-bold, text-center, leading-display),   theme colors (text-primary,\n   text-muted, bg-transparent, border-t/border-b …), surfaces (rounded-*2xl,\n   shadow-lg, flex-1, items-center, justify-between, space-y-*, grid\n   grid-cols-N, w-*, h-*) and .reveal for entrance animation. Compose markup\n   with those classes + theme CSS variables (--bg, --text, --primary, --accent,\n   --font-display…). When a SHARED UTILITY VOCABULARY section is present below,\n   it is the EXACT list of defined classes — compose ONLY from that list; any\n   class outside it silently does nothing, and that vocabulary OVERRIDES the\n   skill's generic \"inline scoped CSS\" wording (the skill describes standalone\n   decks, not this shared-shell one). DO NOT author a per-slide <style> block: duplicated CSS\n   re-ships the design system on every slide (measured: 54.5% of output tokens),\n   creates size drift between slides, and even drifts fonts off-theme.\n   Only exception: a tiny scoped block ≤200 chars for a genuinely one-off\n   visual (a keyframe, a decorative pattern) — validator enforces this.\n   NO off-box resources: no external URLs, no Google Fonts, no remote images;\n   inline SVG is fine. Never patch <html>/<body>/<section class=\"slide-page\"> —\n   that structure belongs to the deck shell.\n4. Design with the theme's CSS variables (${BESPOKE_THEME_TOKENS}) instead of\n   hardcoding brand colors, so the deck can be re-themed.\n5. Every slide MUST contain an <h1> or <h2> carrying its title, and enough real\n   content to teach the phase — no padding, no placeholder text, no \"TODO\".\n6. Keep each slide under 6000 characters of HTML/CSS.\n7. DISTINCTIVE, NOT TEMPLATE-Y: this is a lesson deck, not a business deck. Vary\n   composition per slide (full-bleed statement, split diagram/code, annotated\n   code panel, comparison, step sequence, checkpoint) and give each phase a\n   deliberate visual idea. Never emit the same card-grid on every slide.\n8. Output EXACTLY ${itemCount} slide objects — same order as the brief.\n9. NO decorative ::before/::after pseudo-elements that are absolutely positioned\n   and rotated/translated (clock hands, spindles, watermark strokes) — they\n   overlap the text they decorate (a stopwatch hand struck through \"2.0s\" in a\n   real deck). Draw decorations as their own sized element next to the text,\n   or as an inline SVG inside a fixed box.\n10. FILL THE STAGE VERTICALLY: the composition must occupy the full 1080px\n   height — no empty vertical band taller than ~150px between blocks. Never\n   bottom-anchor content under a header: justify-content:space-between on a\n   full-height root with only a few children pools ALL leftover height into\n   one hole (measured 430–530px dead bands in a real deck). Light content:\n   scale type/spacing up, or center the whole composition as a hero; give the\n   main content block flex:1 to absorb the remaining height.\n11. COVER SLIDES (slide 1 / any cover-editorial layout): compose a full-bleed hero\n   that occupies the full 1080px height — NEVER a short title block pinned top\n   plus a meta/footer band pinned bottom with an empty middle between them\n   (measured on a real cover: 454px dead band between the title grid ending at\n   y442 and the bottom band starting at y896). Fill the middle with the\n   composition itself: vertically center the title block, scale display type\n   up, extend the content grid downward, or add an oversized decorative\n   element INSIDE its own sized box. Decorative frames are never a substitute\n   for absent content, and absolutely-positioned bottom bands must sit close\n   beneath the main content, not pinned far from it.\n12. TYPOGRAPHIC SCALE & BREATHING ROOM: body text ≥24px (target 28px),\n   label/eyebrow text ≥14px, card padding ≥24px. NEVER squeeze font sizes down\n   to fit more text (measured on a real deck: median body size 16–18px = 57%\n   of the skill's 28px standard on 10/14 slides, card padding min 0px on\n   8/14). Fill the stage by growing the type scale, spacing, and composition —\n   fewer, larger elements beat many cramped ones. A validator lint flags any\n   slide with ≥30% of its font-size declarations below 16px, and any bordered\n   card with <16px padding.\n13. NO EMOJI ANYWHERE in slide markup, titles or notes — no icon emoji\n   (⏱ 🎯 🛠 💡 ✍️), no decorative emoji, no emoji bullets. Icons that matter\n   are drawn as inline SVG; everything else is typography and composition.\n\n### ✅ SELF-REVIEW (run EVERY rule against EACH slide before you return —\nfix violations, then re-check; a slide failing any of these is discarded):\n1. ID: every id matches its brief exactly (global \"slide-N\", no reset counter).\n2. FORM: EVERY slide carries {skeleton, slots} — zero markup, zero html field,\n   zero placeholder.\n3. SLOT COUNTS: every named slot present; array slots meet the stated counts\n   (e.g. \"4–6 items\" means ≥4 objects), KPI/value slots ≤6 chars, no empty region.\n4. HIERARCHY: no invented class names, no style= attributes, no external URLs.\n5. VERTICAL BUDGET: the renderer owns geometry — your job is slot DENSITY.\n   Long titles wrap 2–3 lines (still ≤80 chars so the head class stays 56px);\n   text-heavy slots (desc, bullets) stay ≤40 words so grids never overflow.\n6. DENSITY: real teaching content — no wall-of-text over ~40 words in any\n   slot, no 2-word stubs; language = ${'{'}language{'}'} throughout with correct diacritics.\n7. VISUAL VARIETY: this batch does not repeat one composition card-grid;\n   each slide has its deliberate visual idea from the brief's intendedVisual.\n8. NO emoji, no <script>/<form>/<input>, no per-slide <style> block, no\n   deck-level structure (html/body/section.slide-page).\n9. NOTES: teacher activity in spoken register, ≤60 words, **key cues** bolded;\n   not a repetition of on-screen text.`;\n}\n\nexport function buildBespokeSlidesPrompt(params: BuildBespokePromptParams): {\n  systemPrompt: string;\n  userPrompt: string;\n} {\n  const {\n    batchIndex,\n    clusterTitle,\n    batchItems,\n    lessonFlow,\n    lessonExcerpt,\n    skillPrompt,\n    designBrief,\n    utilityVocabulary,\n    layoutSkeletons,\n    language = 'Vietnamese',\n    languageDirective = '',\n    groundContext = '',\n  } = params;\n\n    const systemPrompt = `\n${skillPrompt}\n\n---\n### ACTIVE DESIGN BRIEF (author strictly within this design system):\n${designBrief || '(use the skill’s default style preset)'}\n${utilityVocabulary ? `\\n---\\n${utilityVocabulary}\\n` : ''}\n${layoutSkeletons ? `\\n---\\n${layoutSkeletons}\\n` : ''}\n---\n${groundContext ? `### PROJECT GROUND CONTEXT (framework, style guide, glossary — author from these):\\n${groundContext}\\n\\n---\\n` : ''}### OPERATIONAL GROUND RULES:\n${languageDirective}\n- You are authoring NGUỒN HỌC LIỆU (\"${lessonFlow.lessonTitle}\") slides as raw HTML/CSS.\n- Language: \"${language}\" — ALL visible text AND presenter notes MUST be written in this language with correct diacritics. Do not mix in English titles or English notes unless the lesson itself quotes them.\n${hardConstraints(batchItems.length)}\n`.trim();\n\n  const userPrompt = `\n### LESSON GROUND TRUTH:\n- Lesson Title: \"${lessonFlow.lessonTitle}\"\n- Target Duration: ${lessonFlow.estimatedDuration}\n- Pedagogy: \"${lessonFlow.pedagogicalModel.toUpperCase()}\"\n\n### LESSON PHASE CONTENT (SOURCE OF TRUTH):\n${lessonExcerpt || lessonFlow.rawContent.slice(0, 4000)}\n\n---\n\n### SLIDES TO AUTHOR (bundle ${batchIndex}: \"${clusterTitle}\"):\n${slidesSpec(batchItems)}\n\n---\n\n### OUTPUT FORMAT (JSON only, no prose outside the JSON):\nEVERY slide is SLOTS-MODE (the blueprint assigns a designer-made skeleton to each\nslide — there is NO freeform form in this pipeline; kit 1.5.51, a mimic slide\nwas measured breaking code highlighting, overflow caps and slot padding):\n\\`\\`\\`json\n[\n  {\n    \"id\": \"slide-${batchItems[0]?.slideIndex || 1}\",\n    \"title\": \"${batchItems[0]?.title || 'Slide title'}\",\n    \"skeleton\": \"${batchItems[0]?.layoutSkeleton || batchItems[0]?.layoutId || 'agenda-grid'}\",\n    \"slots\": { ...per the FILL-SLOTS CONTRACT section... },\n    \"notes\": \"...\"\n  }\n]\n\\`\\`\\`\nReturn {skeleton, slots} — NEVER an \\`html\\` field. Authored markup for a\nskeleton slide is discarded by the normalizer and burns the batch in repair.\nIf no skeleton seems to fit the content, pick the CLOSEST one and fill its\nslots — the 19 skeletons cover every teaching shape (concept → detail-2col,\nsequence → timeline-horizontal/process-flow, numbers → data-strip/metrics-cards,\ncomparison → comparison-bars, code → code-walkthrough, quote → quote-hero).\nNOTES CONTRACT (Tam Thiết Luật): notes describe the teacher's LIVE activity & spoken cue signals for THIS slide (facilitation, questioning, demo actions) in spoken register (văn nói) grounded in the LESSON excerpt above. 1–3 concise sentences, ≤60 words. Bold key cue phrases with **key phrases** for instant glancing in presenter view. Do NOT repeat the slide's on-screen text and do NOT emit robotic meta-templates.\n`.trim();\n\n  return { systemPrompt, userPrompt };\n}\n\nexport interface BuildBespokeRepairParams extends BuildBespokePromptParams {\n  /** Only the slides that failed validation, with their previous markup. */\n  failing: Array<{ item: SlideBlueprintItem; html: string; violations: string[] }>;\n}\n\n/**\n * Repair turn: re-asks ONLY for the slides that violated the contract, quoting\n * the exact violations. Cheaper than re-authoring the bundle, and it keeps the\n * repair loop bounded (the caller allows a fixed number of rounds).\n */\nexport function buildBespokeRepairPrompt(params: BuildBespokeRepairParams): {\n  systemPrompt: string;\n  userPrompt: string;\n} {\n  const base = buildBespokeSlidesPrompt({ ...params, batchItems: params.failing.map((f) => f.item) });\n\n  const userPrompt = `\n### REPAIR TURN — ${params.failing.length} slide(s) from bundle ${params.batchIndex} violated the hard contract.\n\n${params.failing\n  .map(\n    (f) => `--- Slide ${f.item.slideIndex}: \"${f.item.title}\"\nVIOLATIONS (fix ALL of them):\n${f.violations.map((v) => `- ${v}`).join('\\n')}\n${f.item.slideIndex === 1 || /cover/i.test(f.item.layoutId) ? 'COVER COMPOSE: this is the deck cover — apply HARD CONTRACT rule 11 (full-bleed hero, no dead middle band).' : ''}\nPREVIOUS MARKUP (rewrite it completely, do not patch it):\n${f.html}`\n  )\n  .join('\\n\\n')}\n\n---\n\n### OUTPUT FORMAT (JSON only):\nReturn a JSON array with EXACTLY ${params.failing.length} slide object(s) — the same ids, in the same order, with corrected \\`slots\\` (or corrected \\`html\\` for the 8 freeform legacy layouts) and unchanged \\`notes\\` (plus the 3-part presenter notes if they were missing).\n`.trim();\n\n  return { systemPrompt: base.systemPrompt, userPrompt };\n}\n","/**\n * Media Types — image generation, image search, video search cho học liệu.\n * Mục tiêu: mọi artifact instruction step-by-step / slide đều có minh họa phù hợp,\n * sinh bằng AI (Gemini/GPT image) HOẶC tìm kiếm ảnh/video thật có license phù hợp.\n */\n\nexport type MediaProvider = 'openai' | 'gemini';\n/** Default = 'openai' (gpt-image-1): infographic quality preferred. */\n\nexport interface GeneratedImage {\n  /** Base64-encoded image data (không kèm prefix data:) */\n  base64: string;\n  mimeType: string;\n  /** Provider dùng để sinh (audit/debug) */\n  provider: string;\n  /** Prompt đã được dùng (sau khi enrich theo ngữ cảnh) */\n  prompt: string;\n  revisedPrompt?: string;\n}\n\nexport interface StockImage {\n  url: string;\n  thumbnailUrl?: string;\n  width?: number;\n  height?: number;\n  photographer?: string;\n  source: string;\n  license: string;\n  pageUrl?: string;\n  altText?: string;\n}\n\nexport interface StockVideo {\n  url: string;\n  thumbnailUrl?: string;\n  durationSeconds?: number;\n  width?: number;\n  height?: number;\n  source: string;\n  license: string;\n  pageUrl?: string;\n}\n\nexport interface GenerateImageOptions {\n  /** Mô tả minh họa cần sinh */\n  prompt: string;\n  /** Ngữ cảnh bài học để enrich prompt (concept, grade band, style guide excerpt) */\n  context?: {\n    lessonTitle?: string;\n    concept?: string;\n    gradeBand?: [number, number] | number;\n    pedagogy?: string;\n    styleGuideExcerpt?: string;\n    language?: string;\n  };\n  /** Tỷ lệ khung: 16:9 cho slide, 4:3/1:1 cho worksheet */\n  aspectRatio?: '1:1' | '16:9' | '4:3' | '3:4';\n  /** Phong cách hình: phù hợp giáo dục, rõ ràng, an toàn cho học sinh */\n  style?: 'educational-diagram' | 'realistic-photo' | 'flat-illustration' | 'technical-schematic';\n  provider?: MediaProvider;\n  /** API key override (nếu không dùng env) */\n  apiKey?: string;\n  /** Timeout tổng cho request sinh ảnh (mặc định 420_000ms = 7 phút) */\n  timeoutMs?: number;\n}\n\nexport interface SearchImageOptions {\n  query: string;\n  perPage?: number;\n  orientation?: 'landscape' | 'portrait' | 'square';\n  apiKey?: string;\n}\n\nexport interface SearchVideoOptions {\n  query: string;\n  perPage?: number;\n  apiKey?: string;\n}\n\nexport class MediaError extends Error {\n  constructor(message: string, public readonly provider?: string, public readonly status?: number) {\n    super(message);\n    this.name = 'MediaError';\n  }\n}\n\n/** Enrich prompt gốc với ngữ cảnh sư phạm → prompt sinh ảnh chất lượng, nhất quán phong cách */\nexport function buildImagePrompt(options: GenerateImageOptions): string {\n  const { prompt, context, style = 'educational-diagram' } = options;\n  const parts: string[] = [];\n  const styleMap: Record<string, string> = {\n    'educational-diagram': 'clean educational diagram, labeled parts, high contrast, suitable for K-12 textbook',\n    'realistic-photo': 'realistic photograph, natural lighting, educational context',\n    'flat-illustration': 'flat vector illustration, friendly shapes, modern educational style',\n    'technical-schematic': 'precise technical schematic, wiring-style clarity, engineering drawing conventions',\n  };\n  parts.push(prompt);\n  if (context?.concept) parts.push(`Subject concept: ${context.concept}`);\n  if (context?.lessonTitle) parts.push(`From lesson: ${context.lessonTitle}`);\n  if (context?.gradeBand) {\n    const band = Array.isArray(context.gradeBand) ? context.gradeBand : [context.gradeBand, context.gradeBand];\n    parts.push(`Audience: grade ${band[0]}-${band[1]} students, age-appropriate, no scary or unsafe imagery`);\n  }\n  if (context?.styleGuideExcerpt) parts.push(`Visual style guide: ${context.styleGuideExcerpt.slice(0, 200)}`);\n  parts.push(styleMap[style] || styleMap['educational-diagram']);\n  if (options.aspectRatio === '16:9') parts.push('wide 16:9 composition');\n  return parts.join('. ');\n}","import { MediaError, SearchImageOptions, SearchVideoOptions, StockImage, StockVideo } from './types';\n\n/**\n * Stock Media Search — tìm ảnh/video minh họa THẬT có license mở (Pexels).\n * Dùng khi: không cần sinh AI, muốn ảnh thật của phần cứng (ESP32, breadboard…),\n * hoặc muốn video demo quá trình thực tế cho step-by-step instructions.\n * API key: PEXELS_API_KEY (miễn phí tại pexels.com/api).\n */\n\nexport async function searchEducationalImages(options: SearchImageOptions): Promise<StockImage[]> {\n  const key = options.apiKey || process.env.PEXELS_API_KEY || '';\n  if (!key) throw new MediaError('Pexels API key missing. Set PEXELS_API_KEY.', 'pexels');\n  const params = new URLSearchParams({\n    query: options.query,\n    per_page: String(options.perPage ?? 6),\n    orientation: options.orientation || 'landscape',\n  });\n  const res = await fetch(`https://api.pexels.com/v1/search?${params}`, {\n    headers: { Authorization: key },\n    signal: AbortSignal.timeout(30_000),\n  });\n  if (!res.ok) {\n    throw new MediaError(`Pexels image search ${res.status}`, 'pexels', res.status);\n  }\n  const data: any = await res.json();\n  return (data?.photos || []).map((p: any) => ({\n    url: p.src?.large2x || p.src?.large || p.src?.original,\n    thumbnailUrl: p.src?.medium,\n    width: p.width,\n    height: p.height,\n    photographer: p.photographer,\n    source: 'pexels',\n    license: 'Pexels License (free to use, attribution appreciated)',\n    pageUrl: p.url,\n    altText: p.alt,\n  }));\n}\n\n/**\n * Pixabay — kho ảnh dự phòng khi Pexels trống/lỗi (mỗi kho có catalog khác nhau,\n * query tiếng Anh hẹp hay miss trên một kho). Map kết quả về cùng shape StockImage.\n */\nexport async function searchPixabayImages(options: SearchImageOptions): Promise<StockImage[]> {\n  const key = options.apiKey || process.env.PIXABAY_API_KEY || '';\n  if (!key) throw new MediaError('Pixabay API key missing. Set PIXABAY_API_KEY.', 'pixabay');\n  const params = new URLSearchParams({\n    key,\n    q: options.query,\n    image_type: 'photo',\n    per_page: String(options.perPage ?? 6),\n    safesearch: 'true',\n  });\n  const res = await fetch(`https://pixabay.com/api/?${params}`, {\n    signal: AbortSignal.timeout(30_000),\n  });\n  if (!res.ok) {\n    throw new MediaError(`Pixabay image search ${res.status}`, 'pixabay', res.status);\n  }\n  const data: any = await res.json();\n  return (data?.hits || []).map((h: any) => ({\n    url: h.largeImageURL || h.webformatURL,\n    thumbnailUrl: h.webformatURL,\n    width: h.imageWidth,\n    height: h.imageHeight,\n    photographer: h.user,\n    source: 'pixabay',\n    license: 'Pixabay Content License (free to use)',\n    pageUrl: h.pageURL,\n    altText: h.tags,\n  }));\n}\n\n/**\n * Search-first với fallback: Pexels → Pixabay. Trả về [] (không throw) khi cả\n * hai kho đều không có ảnh khớp — caller tự quyết định fallback tiếp theo.\n */\nexport async function searchStockImage(query: string, apiKeyOverrides?: { pexels?: string; pixabay?: string }): Promise<StockImage | null> {\n  for (const attempt of [\n    () => searchEducationalImages({ query, perPage: 3, apiKey: apiKeyOverrides?.pexels }),\n    () => searchPixabayImages({ query, perPage: 3, apiKey: apiKeyOverrides?.pixabay }),\n  ]) {\n    try {\n      const images = await attempt();\n      if (images[0]?.url) return images[0];\n    } catch {\n      // Kho lỗi/quota — thử kho kế tiếp.\n    }\n  }\n  return null;\n}\n\nexport async function searchEducationalVideos(options: SearchVideoOptions): Promise<StockVideo[]> {\n  const key = options.apiKey || process.env.PEXELS_API_KEY || '';\n  if (!key) throw new MediaError('Pexels API key missing. Set PEXELS_API_KEY.', 'pexels');\n  const params = new URLSearchParams({\n    query: options.query,\n    per_page: String(options.perPage ?? 4),\n    orientation: 'landscape',\n  });\n  const res = await fetch(`https://api.pexels.com/videos/search?${params}`, {\n    headers: { Authorization: key },\n    signal: AbortSignal.timeout(30_000),\n  });\n  if (!res.ok) {\n    throw new MediaError(`Pexels video search ${res.status}`, 'pexels', res.status);\n  }\n  const data: any = await res.json();\n  return (data?.videos || []).map((v: any) => {\n    const files = v.video_files || [];\n    const best = files.filter((f: any) => f.quality === 'hd').sort((a: any, b: any) => (a.width || 0) - (b.width || 0))[0] || files[0];\n    return {\n      url: best?.link,\n      thumbnailUrl: v.image,\n      durationSeconds: v.duration,\n      width: best?.width,\n      height: best?.height,\n      source: 'pexels',\n      license: 'Pexels License (free to use, attribution appreciated)',\n      pageUrl: v.url,\n    };\n  });\n}","import { GeneratedImage, MediaError, GenerateImageOptions, buildImagePrompt } from './types';\n\n/**\n * Image Generation Providers\n * — gemini: Gemini 2.x image generation (generateContent với responseModalities IMAGE)\n * — openai: gpt-image-1 (images/generations endpoint, b64_json)\n * Cả hai trả về GeneratedImage chuẩn — caller không cần biết provider nào.\n */\n\nfunction resolveApiKey(options: GenerateImageOptions): { provider: string; key: string } {\n  const provider = options.provider || 'openai';\n  const key = options.apiKey\n    || (provider === 'openai' ? process.env.OPENAI_API_KEY : undefined)\n    || (provider === 'gemini' ? (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) : undefined)\n    || '';\n  if (!key) {\n    throw new MediaError(`API key missing for image provider '${provider}'. Set GEMINI_API_KEY or OPENAI_API_KEY.`, provider);\n  }\n  return { provider, key };\n}\n\nfunction resolveImageTimeout(options: GenerateImageOptions): number {\n  const envTimeout = Number(process.env.IMAGE_GEN_TIMEOUT_MS || process.env.ARTIFACT_STREAM_TOTAL_TIMEOUT_MS);\n  return Number.isFinite(options.timeoutMs) && options.timeoutMs! > 0\n    ? options.timeoutMs!\n    : (Number.isFinite(envTimeout) && envTimeout > 0 ? envTimeout : 420_000);\n}\n\nasync function generateWithGemini(options: GenerateImageOptions, key: string): Promise<GeneratedImage> {\n  const finalPrompt = buildImagePrompt(options);\n  const model = 'gemini-2.0-flash-exp'; // image generation capable\n  const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${key}`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({\n      contents: [{ parts: [{ text: finalPrompt }] }],\n      generationConfig: { responseModalities: ['TEXT', 'IMAGE'] },\n    }),\n    signal: AbortSignal.timeout(resolveImageTimeout(options)),\n  });\n  if (!res.ok) {\n    const body = await res.text().catch(() => '');\n    throw new MediaError(`Gemini image API ${res.status}: ${body.slice(0, 300)}`, 'gemini', res.status);\n  }\n  const data: any = await res.json();\n  const parts = data?.candidates?.[0]?.content?.parts || [];\n  const imagePart = parts.find((p: any) => p.inlineData?.data);\n  if (!imagePart) {\n    throw new MediaError('Gemini returned no image part (may have refused prompt).', 'gemini');\n  }\n  const textPart = parts.find((p: any) => p.text);\n  return {\n    base64: imagePart.inlineData.data,\n    mimeType: imagePart.inlineData.mimeType || 'image/png',\n    provider: 'gemini',\n    prompt: finalPrompt,\n    revisedPrompt: textPart?.text,\n  };\n}\n\nasync function generateWithOpenAI(options: GenerateImageOptions, key: string): Promise<GeneratedImage> {\n  const finalPrompt = buildImagePrompt(options);\n  const sizeMap: Record<string, string> = { '1:1': '1024x1024', '16:9': '1536x1024', '4:3': '1024x1024', '3:4': '1024x1536' };\n  const res = await fetch('https://api.openai.com/v1/images/generations', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${key}` },\n    body: JSON.stringify({\n      model: 'gpt-image-1',\n      prompt: finalPrompt,\n      size: sizeMap[options.aspectRatio || '1:1'] || '1024x1024',\n      n: 1,\n    }),\n    signal: AbortSignal.timeout(resolveImageTimeout(options)),\n  });\n  if (!res.ok) {\n    const body = await res.text().catch(() => '');\n    throw new MediaError(`OpenAI image API ${res.status}: ${body.slice(0, 300)}`, 'openai', res.status);\n  }\n  const data: any = await res.json();\n  const item = data?.data?.[0];\n  if (!item?.b64_json) {\n    throw new MediaError('OpenAI returned no image data.', 'openai');\n  }\n  return {\n    base64: item.b64_json,\n    mimeType: 'image/png',\n    provider: 'openai',\n    prompt: finalPrompt,\n    revisedPrompt: item.revised_prompt,\n  };\n}\n\n/**\n * Sinh ảnh minh họa cho học liệu. Provider mặc định: gemini.\n * Prompt tự động enrich với ngữ cảnh sư phạm (grade band, style guide, khái niệm bài học).\n */\nexport async function generateEducationalImage(options: GenerateImageOptions): Promise<GeneratedImage> {\n  const { provider, key } = resolveApiKey(options);\n  if (provider === 'openai') return generateWithOpenAI(options, key);\n  return generateWithGemini(options, key);\n}","// ═══════════════════════════════════════════════════════════════════════════════\n// Slide image fulfilment — cầu nối giữa slide deck JSON và nguồn ảnh minh họa.\n//\n// Model chỉ viết SEARCH QUERY ngắn (slot \"image\"/\"images\") — KHÔNG bao giờ\n// URL/base64. Thang nguồn ảnh (mẫu orchestrate.ts):\n//   1. SEARCH kho ảnh thật (Pexels → Pixabay) — không tốn quota gen\n//   2. GEN bằng AI (gpt-image-1 / Gemini, media/imageProviders.ts) — chỉ cho\n//      slot search-miss, giới hạn maxGenImages\n// Mọi ảnh (search lẫn gen) được nhúng data-URI ngay trong deck JSON — URL ngoài\n// phá promise \"deck tự chứa\" (presentation-kit findExternalReferences sẽ flag).\n//\n// Không bao giờ chặn pipeline: mọi lỗi (key thiếu, mạng, 4xx) → slot giữ\n// nguyên query, layout preset tự fallback về phiên bản không ảnh.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { searchStockImage } from './stockSearch.js';\nimport { generateEducationalImage } from './imageProviders.js';\nimport type { MediaProvider } from './types.js';\n\n/** data-URI tối đa vẫn chấp nhận nhúng (~1.5MB base64) — vượt thì bỏ, giữ query. */\nconst MAX_EMBED_CHARS = 1_500_000;\n\nasync function downloadAsDataUri(url: string): Promise<string | null> {\n  const res = await fetch(url, { signal: AbortSignal.timeout(30_000) });\n  if (!res.ok) return null;\n  const mime = res.headers.get('content-type') || 'image/jpeg';\n  if (!mime.startsWith('image/')) return null;\n  const buf = Buffer.from(await res.arrayBuffer());\n  if (buf.length === 0) return null;\n  const dataUri = `data:${mime};base64,${buf.toString('base64')}`;\n  return dataUri.length > MAX_EMBED_CHARS ? null : dataUri;\n}\n\n/** Gen AI tràn ký tự/timeout → nhúng chữ ký data-URI rất dài phá deck — chặn trước. */\nfunction generatedToDataUri(base64: string, mimeType: string): string | null {\n  const dataUri = `data:${mimeType};base64,${base64}`;\n  return dataUri.length > MAX_EMBED_CHARS ? null : dataUri;\n}\n\n/** Lỗi gen do key/quota sai (401/403/429) — tắt nhánh gen luôn, đừng đốt timeout từng slot. */\nfunction isAuthLikeError(err: unknown): boolean {\n  const msg = String((err as any)?.message || err || '');\n  return /\\b40[13]\\b|\\b429\\b|unauthorized|forbidden|api[_\\s-]?key/i.test(msg);\n}\n\nfunction resolveProvider(opts: { provider?: MediaProvider; openai?: string; gemini?: string }): { provider: MediaProvider; key: string } | null {\n  const provider = opts.provider || 'openai';\n  const key = opts.openai && provider === 'openai' ? opts.openai\n    : opts.gemini && provider === 'gemini' ? opts.gemini\n    : provider === 'openai' ? (process.env.OPENAI_API_KEY || '')\n    : (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY || '');\n  return key ? { provider, key } : null;\n}\n\n/**\n * Điền mọi image slot của deck.\n * Pha 1: query → photo stock (Pexels→Pixabay) → data-URI cho TẤT CẢ slot.\n * Pha 2: slot còn lại (search miss/lỗi) → gen AI (mặc định openai gpt-image-1,\n *        gemini nếu key đó mới có) với quota maxGenImages.\n * Mutate deckJson tại chỗ (slide.slots.image / slots.images[i] thành data-URI).\n * Idempotent: slot đã là data-URI/`<svg`/URL http được giữ nguyên — re-run an toàn.\n */\nexport async function fulfillSlideImageSlots(\n  deckJson: { slides?: any[] },\n  opts: {\n    onProgress?: (msg: string) => void;\n    maxImages?: number;\n    /** Số ảnh AI GEN tối đa/deck (search không tốn quota). Mặc định 3. */\n    maxGenImages?: number;\n    apiKeyOverrides?: { pexels?: string; pixabay?: string; openai?: string; gemini?: string };\n    /** Provider gen AI khi pha 2 chạy (mặc định openai → gpt-image-1). */\n    genProvider?: MediaProvider;\n    /** Ngữ cảnh enrich prompt gen (đi thẳng vào buildImagePrompt). */\n    genContext?: { lessonTitle?: string; concept?: string; gradeBand?: [number, number] | number };\n  } = {}\n): Promise<{ filled: number; failed: number; genUsed: number }> {\n  const slides = Array.isArray(deckJson?.slides) ? deckJson.slides : [];\n  const maxImages = opts.maxImages ?? 8; // ponytail: cap cứng vì deck 1920px chỉ đẹp với vài ảnh; tăng khi có gallery\n  const maxGen = opts.maxGenImages ?? 3;\n  let filled = 0;\n  let failed = 0;\n  let genUsed = 0;\n\n  const slotsByRef: Array<{ get: () => any; set: (v: any) => void; query: string; filled: boolean }> = [];\n  for (const slide of slides) {\n    if (!slide || typeof slide !== 'object') continue;\n    const slots = slide.slots && typeof slide.slots === 'object' ? slide.slots : (slide.slots = {});\n\n    const isQuery = (v: any) => typeof v === 'string' && v.trim() && !/^(data:|<svg|https?:\\/\\/)/.test(v.trim());\n    // The model is free to put content top-level or in slots (the normalizer\n    // merges both) — fill the image back exactly where the query was found.\n    if (isQuery(slots.image)) {\n      slotsByRef.push({ get: () => slots.image, set: (v) => { slots.image = v; }, query: String(slots.image).trim(), filled: false });\n    } else if (isQuery(slide.image)) {\n      slotsByRef.push({ get: () => slide.image, set: (v) => { slide.image = v; }, query: String(slide.image).trim(), filled: false });\n    }\n    const images = Array.isArray(slots.images) ? slots.images : Array.isArray(slide.images) ? slide.images : null;\n    if (images) {\n      images.forEach((q: any, i: number) => {\n        if (!isQuery(q)) return;\n        slotsByRef.push({ get: () => q, set: (v) => { images[i] = v; }, query: String(q).trim(), filled: false });\n      });\n    }\n  }\n\n  // ── PHA 0: ICON (0 mạng, 0 quota) — mọi slot tên icon*/object field `icon`\n  // còn giữ QUERY string được thay bằng inline SVG từ thư viện vendored\n  // (Phosphor bold, 1512 icons, keyword tag-search — see node/iconSearch.ts).\n  // Phải chạy TRƯỚC photo phases: icon slots không thuộc image quota.\n  try {\n    // Specifier assembled at runtime on purpose (same pattern as\n    // slideProductionWorkflow): a static /node import drags child_process into\n    // webpack client bundles when this module is reachable from app code.\n    const nodeEntry = '@thanh01.pmt/presentation-kit' + '/node';\n    const { searchIcons } = await import(/* @vite-ignore */ nodeEntry);\n    let iconHits = 0;\n    const fillIcon = (obj: any, key: string) => {\n      const v = obj[key];\n      if (typeof v !== 'string' || !v.trim() || /^(<svg|data:|https?:)/.test(v.trim())) return;\n      const [svg] = searchIcons(v.trim(), 1);\n      if (svg) {\n        obj[key] = svg;\n        iconHits += 1;\n        opts.onProgress?.(`🧩  Icon \"${v.trim()}\" ← thư viện (inline SVG).`);\n      }\n    };\n    for (const slide of slides) {\n      if (!slide || typeof slide !== 'object') continue;\n      const s: any = slide;\n      // Solo icon slots (line-icon keyword queries, same contract as item\n      // icons). The model may place them top-level OR in slots (the normalizer\n      // merges both) — fill exactly where the query was found.\n      for (const container of [s, s.slots]) {\n        if (!container || typeof container !== 'object') continue;\n        fillIcon(container, 'icon');\n        for (const key of ['coverIcon', 'metricIcon', 'summaryIcon']) fillIcon(container, key);\n      }\n      for (const container of [s.slots, s]) {\n        if (!container || typeof container !== 'object') continue;\n        for (const key of ['cards', 'steps', 'options', 'questions']) {\n          const arr = container[key];\n          if (!Array.isArray(arr)) continue;\n          for (const item of arr) {\n            if (!item || typeof item !== 'object') continue;\n            fillIcon(item, 'icon');\n            // Quiz multi-question form: each question carries its own options\n            // list — those option icons are part of the same contract.\n            if (Array.isArray((item as any).options)) {\n              for (const opt of (item as any).options) {\n                if (opt && typeof opt === 'object') fillIcon(opt, 'icon');\n              }\n            }\n          }\n        }\n      }\n    }\n    if (iconHits > 0) opts.onProgress?.(`🧩  Đã nhúng ${iconHits} icon từ thư viện.`);\n  } catch (err: any) {\n    console.warn('[slideImages] icon fulfilment skipped:', err?.message || err);\n  }\n\n  // ── PHA 1: SEARCH kho ảnh cho TẤT CẢ slots (search không tốn quota gen) ──\n  for (const entry of slotsByRef) {\n    if (filled + failed >= maxImages) break;\n    try {\n      opts.onProgress?.(`🖼️  Tìm ảnh stock: \"${entry.query}\"…`);\n      const photo = await searchStockImage(entry.query, opts.apiKeyOverrides);\n      if (photo?.url) {\n        const dataUri = await downloadAsDataUri(photo.url);\n        if (dataUri) {\n          entry.set(dataUri);\n          entry.filled = true;\n          filled += 1;\n          opts.onProgress?.(`✅  Ảnh \"${entry.query}\" ← ${photo.source}${photo.photographer ? ` (© ${photo.photographer})` : ''}`);\n          continue;\n        }\n      }\n      opts.onProgress?.(`📷  Không có ảnh stock khớp \"${entry.query}\" — sẽ thử gen AI nếu còn quota.`);\n    } catch (err: any) {\n      opts.onProgress?.(`📷  Search lỗi cho \"${entry.query}\" (${err?.message || err}) — sẽ thử gen AI nếu còn quota.`);\n    }\n  }\n\n  // ── PHA 2: GEN AI chỉ cho search-miss, giới hạn maxGenImages ──────────────\n  const misses = slotsByRef.filter((e) => !e.filled);\n  if (misses.length > 0) {\n    const provider = resolveProvider({ provider: opts.genProvider, openai: opts.apiKeyOverrides?.openai, gemini: opts.apiKeyOverrides?.gemini });\n    if (!provider) {\n      for (const entry of misses) {\n        failed += 1;\n        opts.onProgress?.(`📷  \"${entry.query}\": không có key gen AI — slide giữ layout không ảnh.`);\n      }\n      return { filled, failed, genUsed };\n    }\n\n    let genDisabled = false;\n    for (const entry of misses) {\n      if (filled + failed >= maxImages) break;\n      if (genUsed >= maxGen) {\n        failed += 1;\n        opts.onProgress?.(`📷  \"${entry.query}\": vượt quota gen (${maxGen}) — slide giữ layout không ảnh.`);\n        continue;\n      }\n      try {\n        opts.onProgress?.(`🎨  Gen ảnh AI (${provider.provider}): \"${entry.query}\"…`);\n        const image = await generateEducationalImage({\n          prompt: entry.query,\n          aspectRatio: '16:9',\n          style: 'flat-illustration',\n          provider: provider.provider,\n          apiKey: provider.key,\n          context: { ...opts.genContext, concept: opts.genContext?.concept || entry.query },\n        });\n        const dataUri = generatedToDataUri(image.base64, image.mimeType);\n        if (!dataUri) {\n          failed += 1;\n          opts.onProgress?.(`⚠️  Ảnh gen \"${entry.query}\" quá lớn để nhúng — slide giữ layout không ảnh.`);\n          continue;\n        }\n        entry.set(dataUri);\n        filled += 1;\n        genUsed += 1;\n        opts.onProgress?.(`✅  Ảnh gen \"${entry.query}\" ← ${image.provider}`);\n      } catch (err: any) {\n        failed += 1;\n        if (isAuthLikeError(err)) genDisabled = true;\n        opts.onProgress?.(`⚠️  Gen \"${entry.query}\" thất bại: ${err?.message || err} — slide giữ layout không ảnh.`);\n        if (genDisabled) {\n          for (const rest of misses.slice(misses.indexOf(entry) + 1)) {\n            failed += 1;\n            opts.onProgress?.(`📷  \"${rest.query}\": bỏ qua phần gen còn lại (key/thẻ bị từ chối).`);\n          }\n          break;\n        }\n      }\n    }\n  }\n\n  return { filled, failed, genUsed };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// iconRepair.ts — repair-pass cho icon slot mà model BỎ TRỐNG.\n//\n// PHA 0 của fulfillSlideImageSlots chỉ chuyển QUERY → SVG: slot model không viết\n// gì thì không gì fill được (audit:deck gọi là \"model bỏ trống\"). Pass này chạy\n// TRƯỚC fulfil: detect slot trống (cùng walk với audit-slide-deck.ts), gọi LLM\n// MỘT lần cho toàn deck xin query ngắn, ghi vào slots — rồi PHA 0 (idempotent)\n// biến query thành inline SVG lúc compile. Best-effort như phần còn lại của\n// pipeline ảnh: mọi lỗi → log + bỏ qua, không bao giờ chặn compile.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { streamText } from 'ai';\nimport { jsonrepair } from 'jsonrepair';\nimport { getAIModel, type ModelResolutionOptions } from '../ai/provider-factory.js';\n\nconst SOLO_ICON_BY_LAYOUT: Record<string, string[]> = {\n  'hero-cover': ['coverIcon'],\n  'metric-callout': ['metricIcon'],\n  'summary-takeaways': ['summaryIcon'],\n};\nconst ITEM_CONTAINERS = ['cards', 'steps', 'options', 'questions'] as const;\n\n/** Slot icon đã đủ điều kiện: query (PHA 0 sẽ fill) hoặc SVG/URL (đã fill). */\nconst isSet = (v: unknown) => typeof v === 'string' && v.trim().length > 0;\n\nexport interface IconRepairTarget {\n  /** Index 1-based trong deck, chỉ để báo cáo + prompt context. */\n  slideIndex: number;\n  /** Đường dẫn kiểu audit: \"slide 3 options[1].icon\". */\n  path: string;\n  /** Ngữ cảnh ngắn cho LLM chọn icon đúng nghĩa. */\n  context: string;\n  /** Ghi query vào đúng chỗ model đáng lẽ viết (slots merge cả top-level). */\n  set: (query: string) => void;\n}\n\n/** ponytail: cap 24 target — 1 deck 15 slide hiếm khi trống quá nửa; vượt thì chỉ sửa 24 cái đầu, nâng khi thấy cần. */\nexport const MAX_ICON_REPAIRS = 24;\n\n/**\n * Thu thập mọi slot icon đủ điều kiện nhưng đang TRỐNG (không query, không SVG).\n * Pure: chỉ đọc + trả setter, chưa gọi mạng — unit-test được.\n */\nexport function collectEmptyIconSlots(deck: { slides?: any[] }): IconRepairTarget[] {\n  const targets: IconRepairTarget[] = [];\n  (deck?.slides || []).forEach((slide: any, idx: number) => {\n    if (!slide || typeof slide !== 'object') return;\n    const si = idx + 1;\n    const slots = slide.slots && typeof slide.slots === 'object' ? slide.slots : (slide.slots = {});\n\n    for (const key of SOLO_ICON_BY_LAYOUT[slide.layoutId] || []) {\n      if (isSet(slots[key]) || isSet(slide[key])) continue;\n      targets.push({\n        slideIndex: si,\n        path: `slide ${si} ${key}`,\n        context: `layout=${slide.layoutId} title=\"${slide.title ?? ''}\"`,\n        set: (q) => { slots[key] = q; },\n      });\n    }\n\n    for (const container of ITEM_CONTAINERS) {\n      for (const arr of [slots[container], slide[container]]) {\n        if (!Array.isArray(arr)) continue;\n        arr.forEach((item: any, i: number) => {\n          if (!item || typeof item !== 'object' || isSet(item.icon)) return;\n          const what = item.question || item.title || item.text || item.label || '';\n          targets.push({\n            slideIndex: si,\n            path: `slide ${si} ${container}[${i}].icon`,\n            context: `layout=${slide.layoutId} title=\"${slide.title ?? ''}\" item=\"${String(what).slice(0, 80)}\"`,\n            set: (q) => { item.icon = q; },\n          });\n        });\n        break; // model chỉ đặt 1 chỗ (slots HOẶC top-level) — không đoán 2 lần\n      }\n    }\n  });\n  return targets.slice(0, MAX_ICON_REPAIRS);\n}\n\nfunction extractJsonArrayLoose(raw: string): unknown {\n  const text = raw.replace(/<think>[\\s\\S]*?<\\/think>/gi, '').trim();\n  const start = text.indexOf('[');\n  const end = text.lastIndexOf(']');\n  if (start < 0 || end <= start) throw new Error('no JSON array span in repair output');\n  const span = text.slice(start, end + 1);\n  try {\n    return JSON.parse(span);\n  } catch {\n    return JSON.parse(jsonrepair(span));\n  }\n}\n\nconst sanitizeQuery = (v: unknown): string => {\n  if (typeof v !== 'string') return '';\n  const q = v.replace(/\\s+/g, ' ').replace(/[\"'`]/g, '').trim().slice(0, 60);\n  return q && !/^(<svg|data:|https?:)/i.test(q) ? q : '';\n};\n\nexport interface IconRepairResult {\n  /** Số slot trống được model ghi query (đợi PHA 0 chuyển thành SVG). */\n  repaired: number;\n  /** Tổng slot trống phát hiện được. */\n  missing: number;\n}\n\n/**\n * Một lần gọi LLM cho toàn deck: xin query icon cho từng slot trống (đánh số,\n * trả mảng cùng thứ tự — không match theo path nên không vỡ với model drift).\n * Không bao giờ throw: LLM hỏng / output lệch → giữ slot trống, layout tự\n * render không icon (cùng fallback với việc không có pass này).\n */\nexport async function repairEmptyIconSlots(\n  deck: { slides?: any[] },\n  opts: { modelOptions?: ModelResolutionOptions; onProgress?: (msg: string) => void } = {}\n): Promise<IconRepairResult> {\n  const targets = collectEmptyIconSlots(deck);\n  if (targets.length === 0) return { repaired: 0, missing: 0 };\n  opts.onProgress?.(`🧩  Repair-pass: ${targets.length} icon slot bị bỏ trống — xin LLM bổ sung query…`);\n\n  const list = targets\n    .map((t, i) => `${i + 1}. [${t.path}] ${t.context}`)\n    .join('\\n');\n  const prompt = `You assign icon keyword queries for a slide-deck icon library (Phosphor-style, keyword tag search, ENGLISH).\nFor each numbered element below, choose ONE concrete icon query: 1-3 English words, a concrete noun/verb (e.g. \"lightbulb\", \"chat bubbles\", \"shield check\", \" magnifying glass\").\nRules: EVERY entry is REQUIRED — never empty, never a description, only the icon keyword query.\n\nElements:\n${list}\n\nReturn ONLY a JSON array of ${targets.length} strings, in the same order.`;\n\n  const model = getAIModel(opts.modelOptions);\n  const stream = streamText({ model, prompt, maxOutputTokens: 4096 });\n  const text = await stream.text;\n  const parsed = extractJsonArrayLoose(text);\n  if (!Array.isArray(parsed)) throw new Error('repair output is not an array');\n\n  let repaired = 0;\n  targets.forEach((t, i) => {\n    const q = sanitizeQuery(parsed[i]);\n    if (!q) {\n      opts.onProgress?.(`⚠️  ${t.path}: repair không đưa được query — giữ slot trống.`);\n      return;\n    }\n    t.set(q);\n    repaired += 1;\n    opts.onProgress?.(`🧩  ${t.path}: \"${q}\" ← repair-pass.`);\n  });\n  return { repaired, missing: targets.length };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @thanh01.pmt/curriculum-kit — Slide Output Budget & Batch Packing\n//\n// WHY THIS EXISTS (measured 2026-09-19, 9router `fast-reasoning`):\n// the alias is a ROTATING POOL of backends whose output ceilings differ —\n//   poolside/laguna-s-2.1        → 32_000\n//   nvidia/nemotron-3-ultra-550b → 64_000\n//   gemini-3.8-flash             → 65_536\n// So a request asking for 65_536 tokens succeeds or dies depending on which\n// backend the balancer picked, and a single \"author the whole deck in one call\"\n// is a coin flip: 23 slides × (slots + notes + code) is ~30k+ tokens.\n//\n// STRATEGY: plan every call against the FLOOR of the pool (32k), never the\n// ceiling. Per-call work is packed by ESTIMATED OUTPUT TOKENS, content-ordered\n// and cluster-aware, and each call carries a HARD `maxOutputTokens` cap — so an\n// underestimating heuristic can only cost an extra split, never an oversized\n// request. Truncated batches (finish_reason: 'length') are halved and retried.\n//\n// ponytail: the estimator is a character heuristic (Vietnamese + code ≈ 3.2\n// chars/token) with a 30% safety margin. Ceiling is bounded by the hard cap,\n// not by the estimate; upgrade path = feed observed `completionTokens` back per\n// batch to calibrate the ratio.\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Lowest output ceiling observed across the router pool. Never ask for more. */\nexport const MODEL_OUTPUT_FLOOR_TOKENS = 32_000;\n\n/** Fraction of the floor we are willing to request (estimates are heuristics). */\nexport const OUTPUT_SAFETY_RATIO = 0.75;\n\n/** Hard request cap for any single slide-authoring call: 32k × 0.75 = 24_000. */\nexport const SLIDE_CALL_OUTPUT_BUDGET = Math.floor(MODEL_OUTPUT_FLOOR_TOKENS * OUTPUT_SAFETY_RATIO);\n\n/** Characters per output token for Vietnamese prose + code + JSON scaffolding. */\nexport const CHARS_PER_TOKEN = 3.2;\n\n/**\n * Scaffolding one slide carries beyond its visible text: JSON field names,\n * layout ids, quoting/escaping, and (in html mode) markup + CSS declarations.\n * Calibrated against the measured failure — a 23-slide slot-mode deck in one\n * call emitted exactly 32_000 completion tokens (the pool floor) and truncated,\n * i.e. ~1.4k output tokens per slide. Slot scaffolding alone is ~700 of that;\n * authored HTML costs more.\n */\nconst PER_SLIDE_SCAFFOLD_TOKENS = 700;\nconst PER_SLIDE_HTML_SCAFFOLD_TOKENS = 900;\n/** Presenter notes are mandatory (≥80 chars) and the biggest variable cost. */\nconst NOTES_BASE_TOKENS = 80;\n/**\n * Floor for html-mode BLUEPRINT estimates (slide.html not authored yet).\n * Measured 2026-09-21 (run U03_M03_L01, kit 1.5.15): layout-dense authored HTML\n * ran ~1.1–1.6k tokens/slide while the prose heuristic planned ~790 — 14 slides\n * packed into one 15.5k-token call, truncated at the 22.4k×(32k-floor) cap, and\n * burned the whole retry ladder. Layout-heavy composition (header/body/footer\n * markup + per-slide <style>) never comes cheap; below this floor the estimate\n * is fiction, so clamp it and let the packer split. Calls that RE-author an\n * existing slide (repair path) pass real html and keep the exact char-based\n * estimate — the floor applies only before the markup exists.\n */\nconst MIN_PER_SLIDE_HTML_TOKENS = 2000;\n/**\n * Cold-start floor for html-mode slides whose blueprint carries a code intent.\n * Measured 2026-09-23 (run U01_M01_L02, Swift syntax deck): 4 code slides packed\n * at the 2k prose floor truncated at the 22.4k cap TWICE (real ≥5.6k/slide — the\n * author expands `codeSnippetIntent: \"Show View protocol\"` into a full annotated\n * listing, far longer than the intent text). 6000 puts a code slide at its\n * observed lower bound, so the packer caps code batches at 3 and the first\n * attempt fits; split remains the safety net for outliers.\n */\nexport const CODE_HEAVY_HTML_FLOOR_TOKENS = 6000;\n\nexport type SlideAuthoringMode = 'slots' | 'html';\n\nexport function estimateTokens(text: unknown): number {\n  if (text === undefined || text === null) return 0;\n  const value = Array.isArray(text) ? text.join(' ') : String(text);\n  const trimmed = value.trim();\n  if (!trimmed) return 0;\n  return Math.ceil(trimmed.length / CHARS_PER_TOKEN);\n}\n\n/** Minimal shape both the blueprint and generated slide objects satisfy. */\nexport interface EstimatableSlide {\n  title?: string;\n  layoutId?: string;\n  notes?: string;\n  bullets?: unknown;\n  points?: unknown;\n  contentFocus?: unknown;\n  code?: string;\n  html?: string;\n  [key: string]: unknown;\n}\n\n/**\n * Estimated OUTPUT tokens for authoring one slide.\n *\n * `html` mode is the frontend-slides path (model writes markup + CSS), which is\n * markedly more expensive per word than slot JSON — hence the different weights.\n */\nexport function estimateSlideAuthoringTokens(\n  slide: EstimatableSlide,\n  mode: SlideAuthoringMode = 'slots'\n): number {\n  if (mode === 'html' && typeof slide.html === 'string' && slide.html.trim()) {\n    // Authored markup is already produced: cost is its own composition.\n    return estimateTokens(slide.html) + PER_SLIDE_SCAFFOLD_TOKENS;\n  }\n\n  const bullets = ([] as unknown[])\n    .concat((slide.bullets as unknown[]) ?? [])\n    .concat((slide.points as unknown[]) ?? [])\n    .concat((slide.contentFocus as unknown[]) ?? [])\n    // Blueprint-only fields: they do not exist on the finished slide but they\n    // are exactly what the authoring call must turn into content, so they drive\n    // the estimate at packing time.\n    .concat((slide.codeSnippetIntent as unknown[]) ?? [])\n    .concat((slide.visualIntent as unknown[]) ?? [])\n    .concat((slide.pedagogicalGoal as unknown[]) ?? []);\n\n  const bulletTokens = bullets.reduce<number>((sum, b) => {\n    if (b && typeof b === 'object') {\n      return sum + estimateTokens(JSON.stringify(b));\n    }\n    return sum + estimateTokens(b);\n  }, 0);\n\n  const codeTokens = estimateTokens(slide.code);\n  const notesTokens = NOTES_BASE_TOKENS + estimateTokens(slide.notes);\n  const titleTokens = estimateTokens(slide.title);\n  const scaffold = mode === 'html' ? PER_SLIDE_HTML_SCAFFOLD_TOKENS : PER_SLIDE_SCAFFOLD_TOKENS;\n\n  const base = titleTokens + bulletTokens + codeTokens + notesTokens + scaffold;\n  // Cold-start floor: see MIN_PER_SLIDE_HTML_TOKENS / CODE_HEAVY_HTML_FLOOR_TOKENS.\n  // Repair calls carry real html and are handled by the char branch above —\n  // they are never floored.\n  if (mode !== 'html') return base;\n  const codeIntent = slide.codeSnippetIntent;\n  const hasCodeIntent =\n    (typeof codeIntent === 'string' && codeIntent.trim().length > 0) ||\n    (Array.isArray(codeIntent) && codeIntent.length > 0);\n  const floor = hasCodeIntent ? CODE_HEAVY_HTML_FLOOR_TOKENS : MIN_PER_SLIDE_HTML_TOKENS;\n  return Math.max(base, floor);\n}\n\nexport interface SlideBatch<T> {\n  /** 1-based position of this batch in the deck request order. */\n  index: number;\n  items: T[];\n  estimatedTokens: number;\n  /** Blueprint clusters touched by this batch (a merged batch has several). */\n  clusterIds: number[];\n  /** True when the batch is only part of the content cluster it came from. */\n  splitFromCluster: boolean;\n  /** True when ONE item already exceeds the budget on its own. */\n  oversized: boolean;\n}\n\nexport interface PackSlideBatchesOptions<T> {\n  estimate: (item: T) => number;\n  budgetTokens?: number;\n  /** Content grouping (blueprint cluster id) — kept intact when it fits. */\n  clusterIdOf?: (item: T) => number | undefined;\n  /**\n   * Hard per-call slide cap ON TOP of the token budget. The token estimate is\n   * a heuristic (even calibrated), so one more deterministic bound keeps a\n   * whole-deck-in-one-call plan from ever re-appearing when a lesson's slides\n   * are prose-light. Budget still applies — the cap can only shrink a batch.\n   */\n  maxSlidesPerTurn?: number;\n}\n\n/**\n * Packs slides into generation batches.\n *\n * ORDER FIRST, BUDGET AS A CEILING: batches are packed greedily in deck order\n * — adjacent slides share one call whenever the combined ESTIMATE fits the\n * budget, regardless of blueprint cluster boundaries. Clusters are metadata\n * (reporting + repair hints), not call boundaries: with a 22.4k budget and\n * ~1.5–5k tokens per slide, one call comfortably carries 2–3 clusters, and\n * every extra call is another dice roll against the flaky router. A call is\n * split only when the budget says so, never merely because a cluster ends.\n * Order is always preserved, and no batch can exceed the budget.\n */\nexport function packSlideBatches<T>(\n  items: T[],\n  options: PackSlideBatchesOptions<T>\n): SlideBatch<T>[] {\n  const budget = options.budgetTokens ?? SLIDE_CALL_OUTPUT_BUDGET;\n  const clusterOf = options.clusterIdOf;\n\n  // Per-cluster totals — used to flag batches that hold only PART of a\n  // cluster (the old split signal), while whole clusters may now share a\n  // batch with their neighbours.\n  const totalOf = new Map<number | undefined, number>();\n  for (const item of items) {\n    const key = clusterOf?.(item);\n    totalOf.set(key, (totalOf.get(key) ?? 0) + 1);\n  }\n\n  const batches: SlideBatch<T>[] = [];\n  let batch: T[] = [];\n  let batchTokens = 0;\n\n  const flush = () => {\n    if (batch.length === 0) return;\n    const counts = new Map<number | undefined, number>();\n    for (const item of batch) {\n      const key = clusterOf?.(item);\n      counts.set(key, (counts.get(key) ?? 0) + 1);\n    }\n    const clusterIds = [...counts.keys()].filter((v): v is number => v !== undefined);\n    batches.push({\n      index: batches.length + 1,\n      items: batch,\n      estimatedTokens: batchTokens,\n      clusterIds,\n      splitFromCluster: clusterIds.some((id) => (totalOf.get(id) ?? 0) > (counts.get(id) ?? 0)),\n      oversized: batch.length === 1 && batchTokens > budget,\n    });\n    batch = [];\n    batchTokens = 0;\n  };\n\n  const slideCap = options.maxSlidesPerTurn;\n  for (const item of items) {\n    const cost = Math.max(1, options.estimate(item));\n    if (batch.length > 0 && (batchTokens + cost > budget || (slideCap !== undefined && batch.length >= slideCap))) flush();\n    batch.push(item);\n    batchTokens += cost;\n  }\n  flush();\n\n  return batches;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Self-calibration: the char→token ratio above is a heuristic with a known\n// ceiling (ponytail note at top). The packer can do better for free — every\n// authoring call reports its real `completionTokens`, and the ratio between\n// that and the heuristic estimate is exactly the correction factor. An EMA\n// (α=0.3) absorbs per-backend variance from the rotating router pool while\n// still tracking drift; the correction is clamped to [0.5, 2] so one wild\n// call can never push estimates outside the budget invariant's safety zone.\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** EMA smoothing factor for the calibration ratio. */\nexport const CALIBRATION_ALPHA = 0.3;\n/** Correction clamp — keeps the invariant meaningful under one wild sample. */\nexport const CALIBRATION_RATIO_CLAMP: [number, number] = [0.5, 2];\n\nexport interface CalibrationState {\n  /** Current correction ratio applied on top of the heuristic estimate. */\n  ratio: number;\n  /** Observed (heuristic estimate, real completionTokens) samples so far. */\n  samples: number;\n}\n\n/**\n * Creates a stateful token estimator that starts as the static heuristic and\n * corrects itself with each observed call. Feed `observe` with the batch's\n * heuristic estimate and the call's real completionTokens (from the usage\n * event); `estimateFor` returns the calibrated per-item estimate.\n */\nexport function createCalibratedEstimator(): {\n  state: CalibrationState;\n  estimateFor: (heuristicTokens: number) => number;\n  observe: (heuristicEstimate: number, realCompletionTokens: number) => void;\n} {\n  const state: CalibrationState = { ratio: 1, samples: 0 };\n  const clamp = (r: number) =>\n    Math.min(CALIBRATION_RATIO_CLAMP[1], Math.max(CALIBRATION_RATIO_CLAMP[0], r));\n  return {\n    state,\n    estimateFor: (heuristicTokens: number) => Math.ceil(heuristicTokens * state.ratio),\n    observe(heuristicEstimate, realCompletionTokens) {\n      if (!Number.isFinite(realCompletionTokens) || realCompletionTokens <= 0) return;\n      const observed = clamp(realCompletionTokens / Math.max(1, heuristicEstimate));\n      const next = CALIBRATION_ALPHA * observed + (1 - CALIBRATION_ALPHA) * state.ratio;\n      state.ratio = clamp(next);\n      state.samples += 1;\n    },\n  };\n}\n\n/**\n * Splits a batch in half for a truncation retry (`finish_reason: 'length'` or an\n * empty/partial answer). Returns [] for a single item, which is the floor of\n * the strategy — that call must be re-asked with tighter content, not split.\n */\nexport function splitBatchInHalf<T>(batch: SlideBatch<T>): SlideBatch<T>[] {\n  if (batch.items.length < 2) return [];\n  const mid = Math.ceil(batch.items.length / 2);\n  const halves = [batch.items.slice(0, mid), batch.items.slice(mid)];\n  return halves.map((items, i) => ({\n    index: batch.index,\n    items,\n    estimatedTokens: Math.ceil(batch.estimatedTokens / 2),\n    clusterIds: batch.clusterIds,\n    splitFromCluster: true,\n    oversized: i === 0 ? batch.oversized : false,\n  }));\n}\n\n/** Hard invariant: no request may ever be planned above the pool floor. */\nexport function assertBatchWithinBudget<T>(batch: SlideBatch<T>, budget = SLIDE_CALL_OUTPUT_BUDGET): void {\n  if (budget > MODEL_OUTPUT_FLOOR_TOKENS) {\n    throw new Error(\n      `slide output budget ${budget} exceeds the router pool floor ${MODEL_OUTPUT_FLOOR_TOKENS} — ` +\n        `a 32k backend would truncate this request`\n    );\n  }\n  if (batch.estimatedTokens > budget && batch.items.length > 1) {\n    throw new Error(\n      `slide batch ${batch.index} estimates ${batch.estimatedTokens} tokens > budget ${budget} with ${batch.items.length} items — pack it into smaller batches`\n    );\n  }\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Slide Audit & Verification Utilities\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { SlideBlueprintItem } from '../../ai/prompts/slideBlueprintPrompt.js';\n\nexport interface FirstPassSlideAudit {\n  id: string;\n  layoutId?: string;\n  html: string;\n  lint: { valid: boolean; hardIssues: string[]; compositionIssues: string[] };\n  geometry: { available: boolean; deadBand: number; atY: number } | null;\n  verdict: 'hard-fail' | 'true-positive' | 'lint-overreach' | 'clean';\n}\n\n/**\n * Pure audit builder: join first-pass markup + full-enforcement lint verdicts\n * + first-pass scanline geometry into the overreach/true-positive split.\n * Tolerates legacy validators (≤0.3.5) that only return `issues` + `compositionOnly`.\n */\nexport function buildFirstPassAudit(\n  firstPass: Array<{ id: string; html: string; layoutId?: string }>,\n  validate: (html: string) => { valid: boolean; issues: string[]; hardIssues?: string[]; compositionIssues?: string[] },\n  geometry: { available: boolean; issues: Array<{ slideIndex: number; deadBand: number; atY: number }> } | null\n): FirstPassSlideAudit[] {\n  const geoById = new Map(\n    geometry?.available ? geometry.issues.map((i) => [String(i.slideIndex), i] as const) : []\n  );\n  return firstPass.map((s, idx) => {\n    const v = validate(s.html || '');\n    const legacy = v as { issues: string[]; compositionOnly?: boolean };\n    const hardIssues = v.hardIssues ?? (legacy.compositionOnly ? [] : legacy.issues);\n    const compositionIssues = v.compositionIssues ?? (legacy.compositionOnly ? legacy.issues : []);\n    const geo = geoById.get(String(idx + 1)) ?? geoById.get(String(s.id).replace(/\\D/g, ''));\n    const verdict: FirstPassSlideAudit['verdict'] =\n      hardIssues.length > 0\n        ? 'hard-fail'\n        : geo && geo.deadBand >= 400\n          ? 'true-positive'\n          : compositionIssues.length > 0\n            ? 'lint-overreach'\n            : 'clean';\n    return {\n      id: s.id,\n      layoutId: s.layoutId,\n      html: s.html || '',\n      lint: { valid: v.valid, hardIssues, compositionIssues },\n      geometry: geo ? { available: true, deadBand: geo.deadBand, atY: geo.atY } : null,\n      verdict,\n    };\n  });\n}\n\n/** Thrown when the hybrid engine exhausts its attempts; triggers chunked fallback. */\nexport class HybridPipelineError extends Error {}\n\n/**\n * Thrown when the hybrid engine falls back to the chunked pipeline MID-FLIGHT\n * (budget guard, truncated full-deck call, guardrail exhaustion) AFTER a valid\n * blueprint exists. Carries that blueprint so the fallback keeps the deck-wide\n * layout assignment instead of re-rolling it with a fresh blueprint call.\n */\nexport class HybridFallbackSignal extends Error {\n  constructor(message: string, readonly blueprint: SlideBlueprintItem[]) {\n    super(message);\n    this.name = 'HybridFallbackSignal';\n  }\n}\n\n/**\n * Hybrid guardrails: semantic validation with corrective feedback.\n */\nexport function validateHybridDeckSlides(slides: any[], blueprint: SlideBlueprintItem[]): string[] {\n  const v: string[] = [];\n  if (blueprint.length > 0 && slides.length !== blueprint.length) {\n    v.push(`slide count mismatch: got ${slides.length}, blueprint requires ${blueprint.length}`);\n  }\n  slides.forEach((s, i) => {\n    const n = i + 1;\n    const expected = blueprint[i]?.layoutId;\n    if (expected && s?.layoutId !== expected) {\n      v.push(`slide ${n}: layoutId \"${s?.layoutId}\" does not match blueprint \"${expected}\" — use the blueprint's layoutId exactly (deck-wide variety was planned there)`);\n    }\n    const title = typeof s?.title === 'string' ? s.title : '';\n    if (!title.trim()) v.push(`slide ${n}: missing/empty title`);\n    else if (title.length > 150) v.push(`slide ${n}: title too long (${title.length} chars, max 150) — repetition-loop guard`);\n    const notes = typeof s?.notes === 'string' ? s.notes.trim() : '';\n    if (notes.length < 80) v.push(`slide ${n}: presenter notes missing or too short (${notes.length} chars, min 80)`);\n    const code = s?.slots?.code;\n    if (typeof code === 'string') {\n      if (code.length > 6000) v.push(`slide ${n}: code block too long (${code.length} chars, max 6000)`);\n      if (/\\/\\/\\s*TODO|<CODE>|your code here/i.test(code)) v.push(`slide ${n}: placeholder code detected (TODO/<CODE>)`);\n    }\n  });\n  return v.slice(0, 10);\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// JSON Extraction & Repair Utilities for Slide LLM Responses\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { jsonrepair } from 'jsonrepair';\n\nexport interface ExtractedJson {\n  value?: unknown;\n  error?: string;\n  head?: string;\n  tail?: string;\n}\n\n/**\n * Re-escape unescaped double quotes inside JSON string values.\n *\n * A quote is a genuine string DELIMITER only when the next significant\n * character (skipping whitespace) is one of , } ] : — otherwise it is part\n * of the string content (an HTML attribute quote, a Vietnamese quotation\n * mark, …) and gets escaped. Assumes `jsonrepair` already failed, i.e. the\n * span is structurally ambiguous and this heuristic is the last resort.\n * Idempotent on valid JSON: every close there is already followed by a\n * structural char, so the walk reproduces the input byte-for-byte.\n */\nexport function requoteUnescapedQuotes(span: string): string {\n  let out = '';\n  let inStr = false;\n  let esc = false;\n  const n = span.length;\n  for (let i = 0; i < n; i++) {\n    const ch = span[i];\n    if (inStr) {\n      if (esc) { out += ch; esc = false; continue; }\n      if (ch === '\\\\') { out += ch; esc = true; continue; }\n      if (ch === '\"') {\n        let j = i + 1;\n        while (j < n && /\\s/.test(span[j])) j++;\n        const next = span[j];\n        if (next === ',' || next === '}' || next === ']' || next === ':' || j >= n) {\n          inStr = false; // genuine close\n          out += ch;\n        } else {\n          out += '\\\\\"'; // content quote\n        }\n        continue;\n      }\n      out += ch;\n      continue;\n    }\n    if (ch === '\"') inStr = true;\n    out += ch;\n  }\n  return out;\n}\n\n/**\n * Extract a JSON array from reasoning models that may include markdown fences,\n * <think> blocks, or unescaped HTML attributes.\n */\nexport function extractJsonArray(raw: string | undefined | null): ExtractedJson {\n  if (!raw) return { error: 'empty response' };\n  let text = raw.replace(/<think>[\\s\\S]*?<\\/think>/gi, '').trim();\n  text = text.replace(/^```(?:json)?\\s*/m, '').replace(/```\\s*$/m, '').trim();\n  const start = text.indexOf('[');\n  const end = text.lastIndexOf(']');\n  if (start < 0 || end <= start) {\n    return {\n      error: 'no JSON array span found',\n      head: text.slice(0, 300),\n      tail: text.slice(-300),\n    };\n  }\n  const span = text.slice(start, end + 1);\n  try {\n    return { value: JSON.parse(span) };\n  } catch {\n    // fallthrough to repair\n  }\n  try {\n    return { value: JSON.parse(jsonrepair(span)) };\n  } catch {\n    // fallthrough to targeted unescaped-quote repair\n  }\n  try {\n    const reQuoted = requoteUnescapedQuotes(span);\n    if (reQuoted !== span) {\n      return { value: JSON.parse(reQuoted) };\n    }\n  } catch {\n    // fallthrough to honest error\n  }\n  return {\n    error: 'JSON.parse/jsonrepair/escape-repair failed',\n    head: text.slice(0, 300),\n    tail: text.slice(-300),\n  };\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Slide Batch Normalization & Blueprint Utilities\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { SlideBlueprintItem } from '../../ai/prompts/slideBlueprintPrompt.js';\n\nexport const SLOTS_MODE_LAYOUTS = new Set<string>([\n  'cover-editorial',\n  'section-divider',\n  'agenda-grid',\n  'quote-hero',\n  'data-strip',\n  'closing-cta',\n  'metrics-cards',\n  'timeline-horizontal',\n  'detail-2col',\n  'split-insights',\n  'comparison-bars',\n  'stats-dashboard',\n  'process-flow',\n  'code-walkthrough',\n  'phase-pentad',\n  'iterate-loop',\n  'milestone-rubric',\n  'spec-sheet',\n  'chart-blocks',\n]);\n\n/**\n * Normalize model shape-drift: id → canonical \"slide-N\"; missing title backfilled\n * from blueprint items matched by index, falling back to positional order.\n * Materializes {skeleton, slots} markup through renderSkeleton deterministically.\n */\nexport function makeSlideNormalizer(\n  items: Array<Record<string, any>>,\n  renderSkeleton?: (id: string, slots: Record<string, any>) => string\n) {\n  return (s: any, idx: number) => {\n    const rawN = String(s.id ?? '').replace(/\\D/g, '');\n    // Try matching by explicit slideIndex first\n    let matchedItem = items.find((i: any) => String(i.slideIndex) === rawN);\n    // If model emitted local index (e.g. 1..4 for batch of 5..8) or no index, map by batch positional order\n    if (!matchedItem && items[idx]) {\n      matchedItem = items[idx];\n    }\n\n    const targetIndex = matchedItem?.slideIndex ?? (rawN ? Number(rawN) : idx + 1);\n    s.id = `slide-${targetIndex}`;\n\n    if (!s.title || s.title === 'Slide' || s.title === 'Slide title') {\n      s.title = matchedItem?.title || `Slide ${targetIndex}`;\n    }\n\n    // Synchronize layoutId and skeleton from matched blueprint item\n    if (matchedItem) {\n      if (!s.layoutId && matchedItem.layoutId) s.layoutId = matchedItem.layoutId;\n      if (!s.skeleton && matchedItem.layoutSkeleton) s.skeleton = matchedItem.layoutSkeleton;\n      if (!s.skeleton && SLOTS_MODE_LAYOUTS.has(String(s.layoutId || matchedItem.layoutId))) {\n        s.skeleton = String(s.layoutId || matchedItem.layoutId);\n      }\n    }\n\n    // Harvest flat slots if model emitted them at root level instead of inside .slots\n    if (!s.slots || typeof s.slots !== 'object' || Object.keys(s.slots).length === 0) {\n      const reservedKeys = new Set(['id', 'title', 'layoutId', 'skeleton', 'html', 'notes', 'lessonPhase', 'slideIndex']);\n      const extractedSlots: Record<string, any> = {};\n      for (const [k, v] of Object.entries(s)) {\n        if (!reservedKeys.has(k) && v !== undefined && k !== 'slots') {\n          extractedSlots[k] = v;\n        }\n      }\n      if (Object.keys(extractedSlots).length > 0) {\n        s.slots = extractedSlots;\n      } else {\n        s.slots = s.slots || {};\n      }\n    }\n\n    // Materialize HTML from skeleton if html is missing. AND (pk 0.5.19/kit\n    // 1.5.51, measured on L01 1.5.50: ALL 24 slides came back freeform-authored\n    // mimicking bl-* markup — a phantom \"freeform\" form the SLOTS prompt never\n    // taught): when the blueprint DID assign a slots-mode skeleton and the\n    // model returned markup anyway, DISCARD the mimicry and render from slots.\n    // The renderer owns the geometry — an authored look-alike drifts (missing\n    // <code class=language-*> broke the Shiki line-number gutter; an 88-char\n    // 56px title overflowed the tile grid). Re-rendering here also makes the\n    // mimicry gate below vacuous for these slides: html === expected by build.\n    const layoutId = String(s.layoutId || s.skeleton || matchedItem?.layoutSkeleton || matchedItem?.layoutId || '');\n    const isSlotsMode = s.skeleton || SLOTS_MODE_LAYOUTS.has(layoutId);\n    if (\n      isSlotsMode &&\n      String(s.html || '').trim() &&\n      typeof renderSkeleton === 'function' &&\n      SLOTS_MODE_LAYOUTS.has(String(s.skeleton || layoutId)) &&\n      s.slots && typeof s.slots === 'object' && Object.keys(s.slots).length > 0\n    ) {\n      const skeletonId = String(s.skeleton || layoutId);\n      const rendered = String(renderSkeleton(skeletonId, s.slots || {}) || '').trim();\n      if (rendered) s.html = rendered;\n    }\n    if (!String(s.html || '').trim() && s.skeleton && typeof renderSkeleton === 'function') {\n      s.html = renderSkeleton(String(s.skeleton), s.slots || {});\n    }\n    return s;\n  };\n}\n\n/**\n * Slot-requirement gate (fail-closed): delegates to presentation-kit's\n * `validateLayoutSlots` (loaded by the workflow via `presentationKitCore`),\n * so the contract checked here is THE registry contract, not a parallel copy.\n * `validate` is injected to keep this module dependency-free for unit tests.\n * Returns ONE consolidated violation string (or undefined when the slide passes\n * / the gate is unavailable), matching the mimicry detector's shape.\n */\nexport function layoutSlotIssue(\n  s: any,\n  item: SlideBlueprintItem | undefined,\n  validate?: (layoutId: string, slots: Record<string, any>) => string[]\n): string | undefined {\n  const layoutId = String(item?.layoutId || s?.layoutId || '');\n  if (!layoutId || !SLOTS_MODE_LAYOUTS.has(layoutId)) return undefined;\n  if (typeof validate !== 'function') return undefined;\n  const issues = validate(layoutId, s?.slots || {});\n  return issues.length > 0\n    ? `slot contract violation for \\`${layoutId}\\`: ${issues.join('; ')} — fill EVERY slot to the stated counts, then re-emit {skeleton, slots}`\n    : undefined;\n}\n\n/**\n * Skeleton-mimicry detector (fail-closed): a slots-mode slide whose html is NOT\n * the deterministic renderer's output is a mimicry attempt. Backstop only —\n * makeSlideNormalizer re-renders slots-mode markup through the renderer since\n * kit 1.5.51, so this fires when slots were missing/empty (nothing to render\n * from) and the model shipped authored markup anyway.\n */\nexport function skeletonMimicryIssue(\n  s: any,\n  item: SlideBlueprintItem | undefined,\n  renderSkeleton?: (id: string, slots: Record<string, any>) => string\n): string | undefined {\n  const layoutId = String(item?.layoutId || s?.layoutId || '');\n  if (!layoutId || !SLOTS_MODE_LAYOUTS.has(layoutId)) return undefined;\n  const html = String(s?.html || '').trim();\n  if (!html) return undefined;\n  if (typeof renderSkeleton !== 'function') return undefined;\n  const expected = String(renderSkeleton(layoutId, s?.slots || {}) || '').trim();\n  if (!expected) return undefined;\n  return html === expected\n    ? undefined\n    : 'skeleton slide html is not the deterministic renderer output — return {skeleton, slots}, never authored markup (SLOTS MODE)';\n}\nconst LAYOUT_ALIASES: Record<string, string> = {\n  'tiered-practice-3cards': 'milestone-rubric',\n  'tiered-practice': 'milestone-rubric',\n  'agenda-timeline': 'timeline-horizontal',\n  'code-explainer': 'code-walkthrough',\n  'quote-highlight': 'quote-hero',\n  'quiz-checkpoint': 'checkpoint-quiz',\n  'takeaways-summary': 'summary-takeaways',\n  'two-column-split': 'detail-2col',\n  'title-hero': 'hero-cover',\n  'metrics-3-card': 'metrics-cards',\n  // NOTE: the 8 freeform preset ids (hero-cover, split-concept-code, …) are\n  // NOT aliased — they left the blueprint PROMPT pool (kit 1.5.48) but remain\n  // valid registry layouts, so a persisted legacy blueprint still renders.\n};\n\n/**\n * Normalizes blueprint items, assigning cluster IDs, sequential indices, and layout skeletons.\n */\nexport function normalizeBlueprintItems(items: Array<Record<string, any>>): SlideBlueprintItem[] {\n  return items\n    .sort((a, b) => (a.slideIndex ?? 0) - (b.slideIndex ?? 0))\n    .map((item, idx) => {\n      let layoutId = String(item.layoutId || '').trim();\n      if (LAYOUT_ALIASES[layoutId]) {\n        layoutId = LAYOUT_ALIASES[layoutId];\n      }\n      if (item.layoutSkeleton && SLOTS_MODE_LAYOUTS.has(String(item.layoutSkeleton))) {\n        layoutId = String(item.layoutSkeleton);\n      }\n      if (!layoutId) {\n        layoutId = idx === 0 ? 'cover-editorial' : 'detail-2col';\n      }\n      const layoutSkeleton = SLOTS_MODE_LAYOUTS.has(layoutId) ? layoutId : undefined;\n      return ({\n        slideIndex: idx + 1,\n        clusterId: item.clusterId ?? Math.floor(idx / 5) + 1,\n        clusterTitle: item.clusterTitle || 'Cluster',\n        lessonPhase: item.lessonPhase || 'Content',\n        layoutId,\n        layoutSkeleton,\n        headlineAssertion: item.headlineAssertion ?? undefined,\n        intendedVisual: item.intendedVisual ?? undefined,\n        title: item.title,\n        pedagogicalGoal: item.pedagogicalGoal || '',\n        contentFocus: item.contentFocus || [],\n        codeSnippetIntent: item.codeSnippetIntent ?? undefined,\n        visualIntent: item.visualIntent ?? undefined,\n      }) as SlideBlueprintItem;\n    }) as SlideBlueprintItem[];\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @thanh01.pmt/curriculum-kit — Slide Production Workflow Orchestrator\n//\n// ENGINE SELECTION (v3 — validated by live server experiments, 2026-09-13):\n//\n//   PRIMARY — 'hybrid' (2-call pipeline, default):\n//     Call 1: Blueprint (organic slide plan over the pedagogical flow)\n//     Call 2: Full-deck authoring following the blueprint EXACTLY\n//     Uses `generateText` + manual JSON extraction (<think> strip, span find,\n//     trailing-comma repair) instead of `generateObject`, which proved flaky\n//     on some gateways (intermittent \"could not parse\" on nemotron-ultra).\n//     Server experiment: 275s, 22/22 slides, notes 22/22, 0 pathological,\n//     ~16k output tokens — vs chunked 1129s, 22→12 slides, 3 pathological.\n//\n//   FALLBACK — 'chunked' (3-step pipeline, opt-in or automatic):\n//     Step 1 Blueprint → Step 2 Chunky cluster batches (4-6 slides) →\n//     Step 3 Normalization + compile. Uses `generateObject` primary with the\n//     legacy streamRunner + jsonrepair as inner fallback. Per-cluster p-retry.\n//\n//   SHARED GUARANTEES (both engines):\n//     - NO PLACEHOLDERS: permanent failure THROWS — never emits fake slides.\n//     - Guardrails (hybrid): exact slide count vs blueprint, title length cap,\n//       mandatory presenter notes (≥80 chars), code length cap, no TODO/<CODE>.\n//     - Nullable-tolerant schemas (`.nullish()`) — models legitimately emit\n//       `null` for optional fields (verified against nemotron-ultra).\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { z } from 'zod';\nimport { generateObject, streamText } from 'ai';\nimport pRetry, { AbortError } from 'p-retry';\nimport { parseLessonFlow, type ParsedLessonFlow } from '../parsers/lessonFlowParser.js';\nimport { buildSlideBlueprintPrompt, type SlideBlueprintItem } from '../ai/prompts/slideBlueprintPrompt.js';\nimport { buildSlideVisionJudge } from './slideVisionJudge.js';\nimport { buildSlideBatchPrompt } from '../ai/prompts/slideBatchPrompt.js';\nimport {\n  buildBespokeSlidesPrompt,\n  buildBespokeRepairPrompt,\n} from '../ai/prompts/slideBespokePrompt.js';\nimport { getAIModel, type ModelResolutionOptions } from '../ai/provider-factory.js';\nimport { runCurriculumAIInference, type ChunkType } from '../ai/streamRunner.js';\nimport { jsonrepair } from 'jsonrepair';\nimport { fulfillSlideImageSlots } from '../media/slideImages.js';\nimport { repairEmptyIconSlots } from '../media/iconRepair.js';\nimport {\n  SLIDE_CALL_OUTPUT_BUDGET,\n  assertBatchWithinBudget,\n  estimateSlideAuthoringTokens,\n  packSlideBatches,\n  createCalibratedEstimator,\n  splitBatchInHalf,\n  type SlideBatch,\n} from './slideBudget.js';\nimport {\n  type FirstPassSlideAudit,\n  buildFirstPassAudit,\n  HybridPipelineError,\n  HybridFallbackSignal,\n  validateHybridDeckSlides,\n} from './utils/slideAuditUtils.js';\nimport {\n  type ExtractedJson,\n  extractJsonArray,\n  requoteUnescapedQuotes,\n} from './utils/jsonExtractionUtils.js';\nimport {\n  SLOTS_MODE_LAYOUTS,\n  makeSlideNormalizer,\n  skeletonMimicryIssue,\n  layoutSlotIssue,\n  normalizeBlueprintItems,\n} from './utils/slideBatchUtils.js';\n\nexport {\n  type FirstPassSlideAudit,\n  buildFirstPassAudit,\n  HybridPipelineError,\n  HybridFallbackSignal,\n  validateHybridDeckSlides,\n  type ExtractedJson,\n  extractJsonArray,\n  requoteUnescapedQuotes,\n  SLOTS_MODE_LAYOUTS,\n  makeSlideNormalizer,\n  skeletonMimicryIssue,\n  normalizeBlueprintItems,\n};\n\n// ─── Zod Schemas (strict structured-output contracts) ─────────────────────────\n\n// Option C (unified layout registry): ONE layout vocabulary for all engines.\n// The enum is derived from presentation-kit's registry at runtime when the\n// unified export exists (pk ≥0.5.11); older pk falls back to the 8 presets —\n// in both cases the blueprint can no longer emit a layoutId the deck cannot\n// render (the 1.5.42 enum-nuke failure class).\nconst LEGACY_LAYOUT_IDS = [\n  'hero-cover',\n  'split-concept-code',\n  'two-columns-compare',\n  'three-cards-grid',\n  'timeline-steps',\n  'metric-callout',\n  'checkpoint-quiz',\n  'summary-takeaways',\n] as const;\n\n/** Accepts any layout id — the unified pool is validated downstream by the\n *  registry-backed contract validator, not by a stale enum here. */\nconst LayoutIdField = z.string().min(1);\n\nexport const SlideBlueprintItemSchema = z.object({\n  slideIndex: z.number().int().min(1),\n  clusterId: z.number().int().min(1).nullish().default(1),\n  clusterTitle: z.string().nullish().default('Cluster'),\n  lessonPhase: z.string().nullish().default('Content'),\n  layoutId: LayoutIdField,\n  // Bespoke layout skeleton (pk ≥0.5.7). Optional, free-form: an unknown id\n  // must not nuke the blueprint — the authoring turn just ignores it.\n  layoutSkeleton: z.string().nullish(),\n  // Art-direction assertions (kit 1.5.41): declarative headline + intended\n  // visual form, decided at blueprint time (high-quality-slides Phase 3).\n  headlineAssertion: z.string().nullish(),\n  intendedVisual: z.string().nullish(),\n  title: z.string().min(1),\n  pedagogicalGoal: z.string().nullish().default(''),\n  contentFocus: z.array(z.string()).nullish().default([]),\n  codeSnippetIntent: z.string().nullish(),\n  visualIntent: z.string().nullish(),\n});\n\nexport const SlideBlueprintArraySchema = z.array(SlideBlueprintItemSchema);\n\nexport const GeneratedSlideSchema = z.object({\n  // Same drift gemini showed on 2026-09-21 hit the chunked path live (2026-09-25,\n  // free pool): `\"id\": 9` as a NUMBER failed the whole 10-slide batch at Zod and\n  // forced a wasteful split. Accept string|number and normalize after parse —\n  // same contract as BespokeSlideSchema below.\n  id: z.union([z.string(), z.number()]).transform(String).nullish(),\n  layoutId: z.string().min(1),\n  title: z.string().min(1),\n  slots: z.record(z.any()).nullish().default({}),\n  notes: z.string().nullish().default(''),\n});\n\nexport const GeneratedSlideArraySchema = z.array(GeneratedSlideSchema);\n\n// ─── Hybrid engine schemas (nullable-tolerant + guardrail caps) ───────────────\n// `.nullish()` everywhere a model may legitimately emit `null` (verified:\n// nemotron-ultra returns `codeSnippetIntent: null` in ~2/3 blueprint calls).\n\nexport const HybridBlueprintItemSchema = z.object({\n  slideIndex: z.number().int().min(1),\n  clusterId: z.number().int().min(1).nullish(),\n  clusterTitle: z.string().nullish(),\n  lessonPhase: z.string().nullish(),\n  layoutId: LayoutIdField,\n  title: z.string().min(1).max(300),\n  pedagogicalGoal: z.string().nullish().default(''),\n  contentFocus: z.array(z.string()).nullish().default([]),\n  codeSnippetIntent: z.string().nullish(),\n  visualIntent: z.string().nullish(),\n});\n\nexport const HybridBlueprintArraySchema = z.array(HybridBlueprintItemSchema);\n\nexport const HybridDeckSlideSchema = z.object({\n  id: z.string().nullish(),\n  layoutId: z.string().min(1),\n  title: z.string().min(1).max(300),\n  slots: z.record(z.any()).nullish().default({}),\n  notes: z.string().nullish().default(''),\n})\n  // The model legitimately emits slot keys FLAT on the root (kicker, items,\n  // cards… — observed live 2026-09-30) instead of inside `slots`. Without\n  // passthrough, zod strips them at parse time and every downstream renderer\n  // receives an empty bag → blank hybrid decks. Kept via passthrough; the\n  // flat keys are harvested back into `slots` at Step-3 normalization.\n  .passthrough();\n\nexport const HybridDeckSlideArraySchema = z.array(HybridDeckSlideSchema);\n\n// ─── Bespoke engine schema (authored HTML per slide) ──────────────────────────\n// The model owns the markup; `html` is validated by presentation-kit's\n// sanitizer/validator (fail-closed) rather than by zod shape alone.\n\nexport const BespokeSlideSchema = z.object({\n  // gemini-3.8-flash (observed live, 2026-09-21) emits `id: 1` instead of\n  // \"slide-1\" and drops `title` entirely — shape-drift that failed 15/15\n  // parses and pushed two production runs into the slot fallback. Accept the\n  // drift here and normalize after parse; the html contract still belongs to\n  // the presentation-kit validator (fail-closed).\n  id: z.union([z.string(), z.number()]).transform(String).nullish(),\n  title: z.string().min(1).max(300).nullish(),\n  // Fill-slots form (pk 0.5.11): skeleton slides return {skeleton, slots} and\n  // the compiler renders deterministically — geometry never passes through the\n  // model. Exactly one of html / skeleton must survive normalization.\n  skeleton: z.string().min(1).nullish(),\n  slots: z.record(z.any()).nullish().default({}),\n  html: z.string().nullish(),\n  notes: z.string().nullish().default(''),\n});\n\nexport const BespokeSlideArraySchema = z.array(BespokeSlideSchema);\n\n// ─── Public options / result ──────────────────────────────────────────────────\n\nexport type SlideEngine = 'hybrid' | 'chunked' | 'bespoke';\n\nexport interface SlideProductionWorkflowOptions {\n  lessonMarkdown: string;\n  lessonCode: string;\n  lessonTitle: string;\n  targetSlideCount?: number;\n  stylePresetId?: string;\n  /** Brand color (hex, e.g. \"#00503f\"): a full deck theme is generated from it\n   *  (Oklch lightness math, deterministic) and takes precedence over the style\n   *  preset's colors. Persisted as a theme OBJECT in deck.json.theme so every\n   *  recompile stays on-brand. */\n  brandColor?: string;\n  language?: string;\n  languageDirective?: string;\n  headingDirective?: string;\n  /**\n   * Ground-truth context (framework, style guide, glossary, GROUND TRUTH KX+RefPack,\n   * session slice, horizon, symbol registry) injected into the PRIMARY system prompt\n   * of every authoring call — hybrid full-deck and chunked batches alike.\n   * Without it, only the legacy raw-fetch fallback sees this context.\n   * Deliberately EXCLUDES the canonical lesson excerpt: lesson phase content is\n   * already injected into user prompts via parseLessonFlow (no duplication).\n   */\n  groundContext?: string;\n  /** Canonical PRODUCT_SPEC block (prompt audit S-1): injected into the\n   *  blueprint prompt so deck-wide content decisions see binding platform/\n   *  version facts even though the blueprint call carries no groundContext. */\n  productSpecBlock?: string;\n  /** Caller-supplied REQUIRED slide outline (kit 1.5.60): ordered section\n   *  titles the deck MUST cover, in order. Present → blueprint maps every\n   *  item to ≥1 slide in order (structure constraint; titles stay free).\n   *  Absent → blueprint self-plans from the lesson flow (standalone slides\n   *  without a LESSON keep working). */\n  slidesOutline?: string[];\n  satelliteContext?: any;\n  /** Vercel AI SDK model resolution options (provider/model/apiKey). */\n  modelOptions?: ModelResolutionOptions;\n  /**\n   * Which engine to run.\n   *   'hybrid'   — blueprint + the WHOLE deck in one call (only allowed when the\n   *                estimate fits the 32k pool floor; otherwise auto-falls back).\n   *   'chunked'  — blueprint + budget-packed batches of SLOT slides.\n   *   'bespoke'  — blueprint + budget-packed batches of AUTHORED HTML slides\n   *                (frontend-slides mode: the model designs each slide). Falls\n   *                back to 'chunked' when authoring cannot produce valid slides.\n   */\n  engine?: SlideEngine;\n  /** Content density (frontend-slides skill): 'speaker' upsizes type for\n   *  keynote-style decks; 'reading' (default) keeps the neutral scale. */\n  density?: 'speaker' | 'reading';\n  /** Repair rounds for contract-violating bespoke slides before the batch is\n   *  treated as failed (default 1). */\n  bespokeRepairRounds?: number;\n  /** Max attempts per inference unit (blueprint / each cluster / full deck). Default 3. */\n  maxRetries?: number;\n  /** Unused reserved knob of the legacy hybrid planner — do not extend. */\n  minTurnsPerCluster?: number;\n  /** Max output tokens for hybrid generateText calls. Default 65536. */\n  maxOutputTokens?: number;\n  /**\n   * Hard cap on slides per authoring call, ON TOP of the token budget\n   * (default 8 for the bespoke HTML engine, 10 otherwise — see packRemaining).\n   * The token estimator is a heuristic even after calibration, so a\n   * prose-light blueprint can otherwise plan a 12-14-slide single call that\n   * truncates (observed: 14 slides in one call, finish=length, whole retry\n   * ladder burned). Lower it for very dense layouts; a value below 1 is\n   * clamped to 1.\n   */\n  maxSlidesPerTurn?: number;\n  /** When true, ALSO allows the legacy raw-fetch runner as a structured-output\n   *  fallback after generateObject fails. Default FALSE (telemetry mandate,\n   *  2026-09-14): the raw path is invisible to the unified OpenTelemetry →\n   *  Langfuse trace, so it must never run unless explicitly opted in. When\n   *  enabled, pass runnerOptions.customInference so the fallback stays traced\n   *  (and satisfies CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE=1). */\n  allowLegacyFallback?: boolean;\n  runnerOptions?: any;\n  onProgress?: (agent: string, message: string, meta?: any) => void;\n}\n\nexport interface SlideProductionWorkflowResult {\n  deckJson: any;\n  compiledHtml?: string;\n  markdownWrapper: string;\n  blueprint: SlideBlueprintItem[];\n  slideCount: number;\n  /** Which engine actually produced the deck (hybrid may fall back to chunked). */\n  engine: SlideEngine;\n  /** Bespoke only: per-slide audit of the FIRST authoring pass, captured\n   *  before any repair replaced the markup (also mirrored into\n   *  deckJson.audit.firstPass so persisted artifacts carry it). */\n  firstPassAudit?: FirstPassSlideAudit[];\n}\n\n// ─── Inference adapters ────────────────────────────────────────────────────────\n\n/**\n * Normalize the AI SDK's usage shape and forward it through onProgress in the\n * kit's canonical usage contract (`JSON.stringify({ promptTokens,\n * completionTokens, totalTokens, reasoningTokens })` + `meta.type = 'usage'`).\n *\n * 5-Whys RC-telemetry (2026-09-13): the slide workflow never emitted usage, so\n * the app-side queue recorded inputTokens=0/outputTokens=0 for every SLIDE\n * execution. AI SDK v5+ renames the fields (inputTokens/outputTokens) — read\n * both shapes defensively.\n */\nexport function emitUsage(\n  usage: { promptTokens?: number; completionTokens?: number; inputTokens?: number; outputTokens?: number; totalTokens?: number; reasoningTokens?: number } | undefined,\n  onProgress?: (agent: string, message: string, meta?: any) => void\n): void {\n  if (!onProgress || !usage) return;\n  const promptTokens = usage.promptTokens ?? usage.inputTokens ?? 0;\n  const completionTokens = usage.completionTokens ?? usage.outputTokens ?? 0;\n  if (promptTokens === 0 && completionTokens === 0) return;\n  onProgress('@illustrator', JSON.stringify({\n    promptTokens,\n    completionTokens,\n    totalTokens: usage.totalTokens ?? promptTokens + completionTokens,\n    reasoningTokens: usage.reasoningTokens ?? 0,\n  }), { type: 'usage' });\n}\n\n/**\n * Thrown by inferTextJson the moment a call comes back finish=length\n * (truncation). Kit 1.5.33: a truncation is deterministic for a given batch\n * size — retrying verbatim re-burns the full token budget (measured: 3 × 5-8\n * min per over-budget batch) before any split. Owners of the call convert\n * this into an immediate split-in-half (batch loops) or an early pipeline\n * fallback (hybrid full-deck call). Never leak past the workflow boundary —\n * every throw site catches it.\n */\nexport class SplitBatchSignal extends Error {\n  constructor(label: string) {\n    super(`SPLIT_BATCH: output truncated (finish=length) at ${label}`);\n    this.name = 'SplitBatchSignal';\n  }\n}\n\n/**\n * DENSITY DIRECTIVE (RC 2026-09-23): 2–4 minutes of lesson time per slide.\n * Derives the blueprint target from the lesson's stated duration; 15 stays as\n * the unknown-duration fallback. Exported for tests.\n */\nexport function deriveTargetSlideCountFromLesson(lessonMarkdown: string): number {\n  const md = String(lessonMarkdown || '');\n  const m =\n    md.match(/(?:Target Duration|Duration)[^\\d]{0,40}(\\d{2,3})\\s*(?:mins?|phút)/i) ||\n    md.match(/(\\d{2,3})\\s*(?:mins?|phút)/i);\n  const minutes = m ? parseInt(m[1] ?? '', 10) : NaN;\n  if (!Number.isFinite(minutes) || minutes <= 0) return 15;\n  return Math.min(30, Math.max(12, Math.round(minutes / 3.5)));\n}\n\n/** Text-mode inference: generateText → extract JSON → schema validation. */\nasync function inferTextJson<T>(\n  schema: z.ZodType<T>,\n  systemPrompt: string,\n  userPrompt: string,\n  options: SlideProductionWorkflowOptions,\n  label: string\n): Promise<T | null> {\n  const model = getAIModel(options.modelOptions);\n  // Never plan above the router pool's FLOOR (32k) — see slideBudget.ts. A 64k\n  // ceiling is only luck of the balancer, so the cap is the floor, always.\n  const budget = options.maxOutputTokens ?? SLIDE_CALL_OUTPUT_BUDGET;\n  // PRIMARY transport: streamText. RC 2026-09-23: generateText non-stream via\n  // 9router dies on Cloudflare 524 when the backend thinks >100s before the\n  // first byte (SLIDE blueprint killed U01_M01_L01 ×3). Streaming keeps bytes\n  // flowing, so CF never fires the 100s idle window.\n  try {\n    const stream = streamText({\n      model,\n      system: systemPrompt || undefined,\n      prompt: userPrompt,\n      maxOutputTokens: budget,\n    });\n    const text = await stream.text;\n    const finishReason = await stream.finishReason;\n    const usage = await stream.usage;\n    if (finishReason === 'length') {\n      console.warn(\n        `[SlideProductionWorkflow] ${label}: output TRUNCATED at ${budget} tokens (finish=length) — the answer is incomplete, splitting this batch will fix it.`\n      );\n      // Kit 1.5.33: say it, then DO it. Retrying an over-budget prompt verbatim\n      // burns 5–8 min per attempt (measured twice in production: bespoke batch\n      // ×3 + repair batch ×3, all truncated identically) before the caller's\n      // split logic ever sees the failure. A truncation is deterministic given\n      // the batch size — split immediately (owner: authorBatchesWithSplit or\n      // the hybrid author loop, which handle the signal), and give the next\n      // transport a real chance on non-truncation failures.\n      throw new SplitBatchSignal(label);\n    }\n    emitUsage(usage, options.onProgress);\n    const extracted = extractJsonArray(text);\n    if (!('value' in extracted) || extracted.value === undefined) {\n      console.warn(\n        `[SlideProductionWorkflow] ${label}: JSON extraction failed (${extracted.error}); finish=${finishReason}`,\n        extracted.head ? `head=${String(extracted.head).slice(0, 150)}` : ''\n      );\n      return null;\n    }\n    const validated = schema.safeParse(extracted.value);\n    if (validated.success) return validated.data;\n    console.warn(`[SlideProductionWorkflow] ${label}: output failed schema validation:`, validated.error?.message);\n    return null;\n  } catch (err: any) {\n    console.warn(`[SlideProductionWorkflow] ${label}: streamText failed:`, err?.message || err);\n    return null;\n  }\n}\n\n/** Structured-output inference: streamText+extract primary, generateObject fallback (transport RC 2026-09-23), legacy runner opt-in. */\nasync function inferStructured<T>(\n  schema: z.ZodType<T>,\n  systemPrompt: string,\n  userPrompt: string,\n  options: SlideProductionWorkflowOptions,\n  label: string\n): Promise<T | null> {\n  // PRIMARY: stream-text + extractJsonArray (same schema). RC 2026-09-23:\n  // generateObject is non-stream — via 9router it dies on Cloudflare 524 when\n  // the backend thinks >100s before the first byte (SLIDE blueprint for\n  // U01_M01_L01 failed ×3 with 524/HTML pages). Streaming keeps bytes flowing\n  // and parses the JSON out of the text; authoring turns already run this way.\n  const viaText = await inferTextJson(schema, systemPrompt, userPrompt, options, label);\n  if (viaText) return viaText;\n\n  // FALLBACK 1: Vercel AI SDK structured output (non-stream — only viable when\n  // the backend answers fast enough to dodge the gateway's 524 window).\n  try {\n    const model = getAIModel(options.modelOptions);\n    const { object, usage } = await generateObject({\n      model,\n      schema,\n      system: systemPrompt || undefined,\n      prompt: userPrompt,\n      // Same floor-capped budget as the text path: an uncapped structured call\n      // is what let a 32k backend truncate the blueprint mid-JSON.\n      maxOutputTokens: options.maxOutputTokens ?? SLIDE_CALL_OUTPUT_BUDGET,\n    } as any);\n    emitUsage(usage, options.onProgress);\n    // Defensive re-validation: generateObject normally guarantees schema\n    // conformance, but guard against provider/gateway quirks that emit\n    // schema-invalid payloads (missing required fields, hallucinated enums).\n    const validated = schema.safeParse(object);\n    if (validated.success) return validated.data;\n    console.warn(\n      `[SlideProductionWorkflow] AI SDK output failed schema validation for ${label}:`,\n      validated.error?.message\n    );\n  } catch (aiSdkErr: any) {\n    console.warn(`[SlideProductionWorkflow] AI SDK generateObject failed for ${label}:`, aiSdkErr?.message || aiSdkErr);\n  }\n\n  // FALLBACK 2: legacy raw-fetch streaming runner + jsonrepair. OPT-IN ONLY\n  // (telemetry mandate): default OFF because the raw-fetch path emits no\n  // OpenTelemetry spans and would silently escape the unified Langfuse trace.\n  // Prompt-audit S-3 dedup: systemPrompt already carries groundContext (the\n  // full commonContext). Passing satelliteContext here as well DUPLICATED the\n  // entire commonContext + canonical LESSON excerpt (32k prompt, ~half redun-\n  // dant). The structured prompts are self-contained — pass no projectContext.\n  if (options.allowLegacyFallback !== true) return null;\n  try {\n    const messages = [\n      { role: 'user' as const, content: [systemPrompt, userPrompt].filter(Boolean).join('\\n\\n') },\n    ];\n    const raw = await runCurriculumAIInference(messages, '', options.runnerOptions, (token, type) => {\n      // Legacy fallback runner already emits the canonical usage JSON on the\n      // 'usage' chunk type — forward it through onProgress untouched.\n      if (type === 'usage') options.onProgress?.('@illustrator', token, { type: 'usage' });\n    });\n    const fenceMatch = raw.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n    const candidate = (fenceMatch ? fenceMatch[1] : raw).trim();\n    let parsed: unknown;\n    try {\n      parsed = JSON.parse(candidate);\n    } catch {\n      parsed = JSON.parse(jsonrepair(candidate));\n    }\n    const result = schema.safeParse(parsed);\n    if (result.success) return result.data;\n    console.warn(`[SlideProductionWorkflow] Legacy fallback output failed schema validation for ${label}:`, result.error?.message);\n    return null;\n  } catch (legacyErr: any) {\n    console.warn(`[SlideProductionWorkflow] Legacy fallback failed for ${label}:`, legacyErr?.message || legacyErr);\n    return null;\n  }\n}\n\n// ─── Shared helpers ────────────────────────────────────────────────────────────\n\nexport interface ContractTiers {\n  hard: string[];\n  composition: string[];\n}\n\n/**\n * Split a validator result into tier-1 hard violations (always gate) and\n * tier-2 composition lints (dead-band heuristics). Tolerates legacy\n * presentation-kit ≤0.3.5 results that only carry `issues` +\n * `compositionOnly`.\n */\nexport function classifyContractViolations(v: {\n  valid: boolean;\n  issues: string[];\n  hardIssues?: string[];\n  compositionIssues?: string[];\n  compositionOnly?: boolean;\n}): ContractTiers {\n  if (v.hardIssues || v.compositionIssues) {\n    return { hard: v.hardIssues ?? [], composition: v.compositionIssues ?? [] };\n  }\n  return {\n    hard: v.compositionOnly ? [] : v.issues,\n    composition: v.compositionOnly ? v.issues : [],\n  };\n}\n\ninterface HybridPipelineOutput {\n  slides: any[];\n  blueprint: SlideBlueprintItem[];\n}\n\n/** Build the full-deck authoring prompts (hybrid Call 2). */\nfunction buildHybridDeckPrompts(params: {\n  lessonFlow: ParsedLessonFlow;\n  blueprint: SlideBlueprintItem[];\n  skillPrompt: string;\n  language: string;\n  languageDirective: string;\n  headingDirective: string;\n  groundContext?: string;\n  buildSlotsPrompt?: (subset?: any[]) => string;\n}): { systemPrompt: string; userPrompt: string } {\n  const { lessonFlow, blueprint, skillPrompt, language, languageDirective, headingDirective, groundContext, buildSlotsPrompt } = params;\n\n  const blueprintText = JSON.stringify(\n    blueprint.map((s) => ({\n      slideIndex: s.slideIndex,\n      lessonPhase: s.lessonPhase,\n      layoutId: s.layoutId,\n      title: s.title,\n      pedagogicalGoal: s.pedagogicalGoal,\n      contentFocus: s.contentFocus,\n      codeSnippetIntent: s.codeSnippetIntent ?? undefined,\n      visualIntent: s.visualIntent ?? undefined,\n    })),\n    null,\n    1\n  );\n\n  const phasesContent =\n    lessonFlow.phases.length > 0\n      ? lessonFlow.phases.map((p) => `### ${p.phaseName}\\n${p.content}`).join('\\n\\n')\n      : lessonFlow.rawContent;\n\n  const uniqueLayoutIds = Array.from(new Set(blueprint.map((s) => s.layoutId).filter(Boolean)));\n  const slotsPrompt = typeof buildSlotsPrompt === 'function' ? buildSlotsPrompt(uniqueLayoutIds) : '';\n\n  const systemPrompt = [\n    skillPrompt,\n    groundContext || '',\n    languageDirective,\n    headingDirective,\n    slotsPrompt,\n    `\n### OPERATIONAL GROUND RULES (FULL-DECK AUTHORING):\n1. **EXACT COUNT: author EXACTLY ${blueprint.length} slide objects — ONE per blueprint item, SAME ORDER, SAME layoutId.** Do NOT merge, skip, reorder, or add slides.\n1b. **LAYOUT LOCK: slide i uses the EXACT layoutId of blueprint item i.** The deck's layout variety was planned deck-wide — switching layouts breaks it and the render will fail the slide.\n2. **ZERO ABBREVIATION / NO \"// TODO\"**: All code snippets MUST be real, fully authored, compilable code relevant to \"${lessonFlow.lessonTitle}\". Never write placeholders, stubs, or \"<CODE>\".\n3. **MANDATORY 3-PART PRESENTER NOTES ON EVERY SLIDE (120+ chars)**: SCRIPT (60-90s spoken talk track with an intuitive analogy), COLD CALL / CHECK (one targeted understanding question), SCAFFOLDING / GOTCHA (one common misconception or bug).\n4. Titles must be < 100 characters — never repeat or loop text.\n5. Output ONLY the JSON array. No prose, no markdown fences.\n`.trim(),\n  ]\n    .filter(Boolean)\n    .join('\\n\\n');\n\n  const userPrompt = `\n### BLUEPRINT (${blueprint.length} slides — AUTHOR ALL OF THEM, in this exact order):\n${blueprintText}\n\n### LESSON GROUND TRUTH:\n- Lesson Title: \"${lessonFlow.lessonTitle}\"\n- Target Duration: ${lessonFlow.estimatedDuration}\n- Pedagogy: \"${lessonFlow.pedagogicalModel.toUpperCase()}\"\n- Language: \"${language}\"\n\n### LESSON PHASE CONTENT (SOURCE OF TRUTH FOR REAL CONTENT):\n${phasesContent.slice(0, 16000)}\n\n---\n\n### OUTPUT:\nA single JSON array of exactly ${blueprint.length} slide objects:\n\\`\\`\\`json\n[\n  {\n    \"id\": \"slide-1\",\n    \"layoutId\": \"${blueprint[0]?.layoutId || 'hero-cover'}\",\n    \"title\": \"${(blueprint[0]?.title || 'Slide Title').replace(/\"/g, \"'\")}\",\n    \"slots\": { \"...layout-specific slots with REAL content...\" },\n    \"notes\": \"SCRIPT: ...\\\\nCOLD CALL: ...\\\\nSCAFFOLDING: ...\"\n  }\n]\n\\`\\`\\`\n`.trim();\n\n  return { systemPrompt, userPrompt };\n}\n\n/**\n * HYBRID ENGINE — 2-call pipeline (server-validated 2026-09-13).\n * Throws HybridPipelineError when either call permanently fails, so the\n * caller can fall back to the chunked pipeline.\n */\nasync function runHybridPipeline(ctx: {\n  lessonFlow: ParsedLessonFlow;\n  blueprintPrompt: string;\n  skillPrompt: string;\n  stylePresetId: string;\n  language: string;\n  languageDirective: string;\n  headingDirective: string;\n  maxRetries: number;\n  options: SlideProductionWorkflowOptions;\n  onProgress?: SlideProductionWorkflowOptions['onProgress'];\n  buildSlotsPrompt?: (subset?: any[]) => string;\n}): Promise<HybridPipelineOutput> {\n  const { lessonFlow, blueprintPrompt, skillPrompt, language, languageDirective, headingDirective, maxRetries, options, onProgress, buildSlotsPrompt } = ctx;\n\n  // ── HYBRID CALL 1: Blueprint (text mode + extraction) ───────────────────────\n  let blueprint: SlideBlueprintItem[] | null = null;\n  for (let attempt = 1; attempt <= maxRetries && !blueprint; attempt++) {\n    onProgress?.('@illustrator', `[1/4] Lập Dàn ý Slides — hybrid blueprint (lần ${attempt}/${maxRetries})...`);\n    try {\n      const parsed = await inferTextJson(HybridBlueprintArraySchema, '', blueprintPrompt, options, `hybrid-blueprint#${attempt}`);\n      if (parsed && parsed.length > 0) {\n        blueprint = normalizeBlueprintItems(parsed as any);\n      } else if (attempt < maxRetries) {\n        onProgress?.('@illustrator', `⚠️ Hybrid blueprint lần ${attempt}/${maxRetries} lỗi — thử lại...`, { type: 'warning' });\n      }\n    } catch (err) {\n      // A truncated blueprint call re-burns the whole budget on retry (the\n      // prompt is unchanged) — bail out NOW into the per-cluster pipeline,\n      // which packs the same content under the budget (kit 1.5.33).\n      if (err instanceof SplitBatchSignal) {\n        onProgress?.('@illustrator', `✂️ Blueprint bị cắt ở trần token — chuyển ngay sang pipeline per-cluster...`, { type: 'warning' });\n        throw err;\n      }\n      if (attempt < maxRetries) {\n        onProgress?.('@illustrator', `⚠️ Hybrid blueprint lần ${attempt}/${maxRetries} lỗi — thử lại...`, { type: 'warning' });\n      }\n    }\n  }\n  if (!blueprint || blueprint.length === 0) {\n    throw new HybridPipelineError(`blueprint failed after ${maxRetries} attempts`);\n  }\n  // ── BUDGET GUARD ────────────────────────────────────────────────────────────\n  // Hybrid authors EVERY slide in one call. That is only legitimate when the\n  // estimate fits the router pool's floor (32k); above it the call is a\n  // guaranteed truncation (observed live: 23 slides emitted exactly 32_000\n  // tokens and cut off mid-JSON). Falling through to the per-batch pipeline is\n  // the fix — retrying the same oversized call never is.\n  const deckEstimate = blueprint.reduce(\n    (sum, item) => sum + estimateSlideAuthoringTokens(item as any, 'slots'),\n    0\n  );\n  if (deckEstimate > SLIDE_CALL_OUTPUT_BUDGET) {\n    throw new HybridFallbackSignal(\n      `deck needs ~${deckEstimate} output tokens in one call > safe budget ${SLIDE_CALL_OUTPUT_BUDGET} ` +\n        `(pool floor ${32_000}) — switching to per-batch authoring`,\n      blueprint\n    );\n  }\n\n  onProgress?.('@illustrator', `[1/4] Dàn ý ${blueprint.length} slides hoàn tất — chuyển sang authoring toàn deck...`);\n\n  // ── HYBRID CALL 2: Full-deck authoring with corrective-feedback retry ───────\n  const { systemPrompt, userPrompt } = buildHybridDeckPrompts({\n    lessonFlow,\n    blueprint,\n    skillPrompt,\n    language,\n    languageDirective,\n    headingDirective,\n    groundContext: options.groundContext,\n    buildSlotsPrompt,\n  });\n\n  let slides: any[] | null = null;\n  let lastViolations: string[] = [];\n  for (let attempt = 1; attempt <= maxRetries && !slides; attempt++) {\n    onProgress?.('@illustrator', `[2/4] Sinh chi tiết toàn bộ ${blueprint.length} slides trong 1 lần gọi (lần ${attempt}/${maxRetries})...`);\n    const feedback =\n      attempt > 1 && lastViolations.length > 0\n        ? `\\n\\n### ⚠️ PREVIOUS ATTEMPT REJECTED — fix these violations:\\n${lastViolations.map((x) => '- ' + x).join('\\n')}\\nReturn exactly ${blueprint.length} slides, same order as the blueprint.`\n        : '';\n    let parsed: any[] | null = null;\n    try {\n      parsed = await inferTextJson(HybridDeckSlideArraySchema, systemPrompt, userPrompt + feedback, options, `hybrid-author#${attempt}`);\n    } catch (err) {\n      // Truncated full-deck call: retrying verbatim re-burns the whole budget\n      // (kit 1.5.33) — fall back to the per-cluster pipeline immediately.\n      if (err instanceof SplitBatchSignal) {\n        onProgress?.('@illustrator', `✂️ Authoring toàn deck bị cắt ở trần token — chuyển sang pipeline per-cluster...`, { type: 'warning' });\n        throw new HybridFallbackSignal('full-deck authoring truncated at the output ceiling', blueprint);\n      }\n      parsed = null;\n    }\n    if (!parsed || parsed.length === 0) {\n      lastViolations = ['Output missing, empty, or not a valid JSON array of slide objects'];\n    } else {\n      const violations = validateHybridDeckSlides(parsed as any[], blueprint);\n      if (violations.length === 0) {\n        slides = parsed as any[];\n        break;\n      }\n      lastViolations = violations;\n    }\n    if (attempt < maxRetries) {\n      onProgress?.('@illustrator', `⚠️ Deck authoring lần ${attempt}/${maxRetries} vi phạm guardrails — retry với corrective feedback...`, {\n        type: 'warning',\n        violations: lastViolations,\n      });\n    }\n  }\n  if (!slides) {\n    throw new HybridFallbackSignal(\n      `deck authoring failed after ${maxRetries} attempts. Last violations: ${lastViolations.slice(0, 3).join('; ')}`,\n      blueprint\n    );\n  }\n\n  return { slides, blueprint };\n}\n\n/**\n * Runs every batch through `authorOne`, and when a batch permanently fails\n * (truncation, provider error, contract violations) SPLITS IT IN HALF and\n * retries each half — a single slide is the floor. Shared by the slot and\n * bespoke pipelines so the resilience contract cannot drift between them.\n */\n/** Exported for tests (truncation-split pin). */\nexport async function authorBatchesWithSplit(\n  batches: SlideBatch<SlideBlueprintItem>[],\n  authorOne: (batch: SlideBatch<SlideBlueprintItem>, depth: number) => Promise<any[]>,\n  onProgress?: SlideProductionWorkflowOptions['onProgress'],\n  /** After a batch lands, optionally re-plan the queue (self-calibration). */\n  afterBatch?: (batch: SlideBatch<SlideBlueprintItem>, slides: any[]) => SlideBatch<SlideBlueprintItem>[] | null\n): Promise<{ slides: any[]; failed: Array<{ index: number; clusterIds: number[] }> }> {\n  const slides: any[] = [];\n  const failed: Array<{ index: number; clusterIds: number[] }> = [];\n\n  const run = async (batch: SlideBatch<SlideBlueprintItem>, depth: number): Promise<any[]> => {\n    assertBatchWithinBudget(batch);\n    try {\n      return await authorOne(batch, depth);\n    } catch (err: any) {\n      // Kit 1.5.33: a SplitBatchSignal means the call was truncated — splitting\n      // immediately is the fix (no point retrying the same oversized prompt).\n      const truncated = err instanceof SplitBatchSignal;\n      const halves = splitBatchInHalf(batch);\n      if (halves.length === 0) throw err;\n      onProgress?.(\n        '@illustrator',\n        truncated\n          ? `✂️ Lượt ${batch.index} (${batch.items.length} slides) bị cắt ở trần token — chia đôi NGAY thành ${halves[0].items.length}+${halves[1].items.length} thay vì retry cùng lượt quá cỡ...`\n          : `⚠️ Lượt ${batch.index} (${batch.items.length} slides, ~${batch.estimatedTokens} token) thất bại — chia đôi thành ${halves[0].items.length}+${halves[1].items.length} và thử lại...`,\n        { type: 'warning' }\n      );\n      const first = await run(halves[0], depth + 1);\n      const second = await run(halves[1], depth + 1);\n      return [...first, ...second];\n    }\n  };\n\n  const queue: SlideBatch<SlideBlueprintItem>[] = [...batches];\n  // Replan cap (fail-closed): the afterBatch self-calibration re-packs the\n  // remaining items after every landed batch. If the model keeps returning\n  // slides other than the ones requested (wrong ids), completedItems never\n  // fills and the queue regrows FOREVER — each round rebuilds the ~17KB\n  // authoring prompt. Measured in vitest: 12,496 prompt rebuilds ≈ 194MB of\n  // strings in one synchronous microtask cascade → worker OOM (heap snapshot:\n  // 143MB of 'ACTIVE DESIGN BRIEF' + 51MB of 'LESSON GROUND TRUTH' copies).\n  // Healthy runs re-pack each remaining item about once, so 3× the planned\n  // items is a generous ceiling that never fires in production.\n  const plannedItems = batches.reduce((n, b) => n + b.items.length, 0);\n  const replanItemBudget = plannedItems * 3;\n  let replannedItems = 0;\n  for (let qi = 0; qi < queue.length; qi++) {\n    const batch = queue[qi];\n    onProgress?.(\n      '@illustrator',\n      `[2/4] Sinh chi tiết lượt ${batch.index}/${queue.length}: ${batch.items.length} slides (~${batch.estimatedTokens} token output)...`\n    );\n    try {\n      const produced = await run(batch, 0);\n      slides.push(...produced);\n      const replan = afterBatch?.(batch, produced);\n      // A re-plan REPLACES the rest of the queue (the calibrated packing covers\n      // every not-yet-produced item); appending would duplicate slides.\n      // Cap: past the budget the model is clearly not producing the requested\n      // slides — stop re-planning (keep the queue as-is) instead of looping.\n      if (replan && replan.length > 0 && replannedItems <= replanItemBudget) {\n        replannedItems += replan.reduce((n, b) => n + b.items.length, 0);\n        queue.splice(qi + 1, queue.length - qi - 1, ...replan);\n      } else if (replan && replan.length > 0) {\n        // Cap hit: the model keeps producing slides other than the requested\n        // ones — stop re-planning (keep the queue as-is) instead of looping.\n        onProgress?.(\n          '@illustrator',\n          `⚠️ Replan vượt trần (${replannedItems}/${replanItemBudget} item) — model không sản xuất đúng slide yêu cầu. Dừng tự cân bằng, chạy nốt hàng đợi hiện tại.`,\n          { type: 'warning' }\n        );\n        queue.splice(qi + 1, queue.length - qi - 1);\n      } else if (replan) {\n        queue.splice(qi + 1, queue.length - qi - 1);\n      }\n    } catch (err: any) {\n      // Quality gate: never synthesize placeholder slides.\n      failed.push({ index: batch.index, clusterIds: batch.clusterIds });\n      console.error(\n        `[SlideProductionWorkflow] Batch ${batch.index} permanently failed after retries (and no split left):`,\n        err?.message || err\n      );\n    }\n  }\n\n  return { slides, failed };\n}\n\nfunction describeFailedBatches(\n  failed: Array<{ index: number; clusterIds: number[] }>,\n  total: number,\n  maxRetries: number\n): string {\n  // Name the content cluster(s) too: with budget-driven batches a cluster can\n  // span several batches, and the operator needs to know WHICH lesson chunk is\n  // missing, not just which request index died.\n  const names = failed\n    .map((b) => `batch: ${b.index}${b.clusterIds.length ? `, cluster: ${b.clusterIds.join('/')}` : ''}`)\n    .join('; ');\n  return (\n    `Failed to generate ${failed.length}/${total} batch(es) (${names}) after ${maxRetries} attempts each. ` +\n    `Aborting to prevent placeholder/degraded slide output. Review provider keys/model availability and retry.`\n  );\n}\n\n// ─── Bespoke pipeline (authored HTML per slide) ────────────────────────────────\n\ninterface BespokePipelineContext {\n  blueprintPrompt: string;\n  skillPrompt: string;\n  designBrief: string;\n  /** Exact class vocabulary of the shared stylesheet (pk ≥0.5.3), '' when unavailable. */\n  utilityVocabulary: string;\n  /** Fill-slots skeleton renderer (pk ≥0.5.11). Undefined on older pk —\n   *  skeleton slides then fall back to freeform authoring for those slides. */\n  renderSkeleton?: (id: string, slots: Record<string, any>) => string;\n  /** Slot-requirement gate (pk ≥0.5.17): flags under-filled slots-mode slides\n   *  (missing required slot, items < minItems) before layout-QA sees them. */\n  validateLayoutSlots?: (layoutId: string, slots: Record<string, any>) => string[];\n  /** Designer-made layout skeleton vocabulary (pk ≥0.5.7), '' when unavailable. */\n  layoutSkeletons: string;\n  /** Optional factory to build layout skeleton prompt scoped to specific layouts (pk ≥0.5.16). */\n  buildSlotsPrompt?: (subset?: any[]) => string;\n  lessonFlow: ParsedLessonFlow;\n  language: string;\n  languageDirective: string;\n  maxRetries: number;\n  repairRounds: number;\n  options: SlideProductionWorkflowOptions;\n  onProgress?: SlideProductionWorkflowOptions['onProgress'];\n  /** presentation-kit contract validator — bespoke mode is fail-closed without it. */\n  validate: (html: string, opts?: { waiveCompositionLints?: boolean }) => {\n    valid: boolean;\n    issues: string[];\n    hardIssues?: string[];\n    compositionIssues?: string[];\n    compositionOnly?: boolean;\n  };\n  /**\n   * Optional headless layout QA (presentation-kit /node, ≥0.3.3). Undefined =\n   * skip (old kit or no Chrome) — capability-detect, never hard-require.\n   */\n  layoutQa?: (\n    slides: Array<{ html: string }>\n  ) => Promise<{\n    available: boolean;\n    issues: Array<{ slideIndex: number; deadBand: number; atY: number }>;\n    error?: string;\n  }>;\n  /**\n   * Optional vision QA (pk ≥0.5.8 /node): screenshots each slide and calls a\n   * VLM judge (kit-supplied). Undefined = skip — capability-detect, never\n   * hard-require. Judge errors are non-fatal per slide.\n   */\n  visionQa?: (\n    slides: Array<{ html: string; title?: string }>\n  ) => Promise<{\n    available: boolean;\n    issues: Array<{ slideIndex: number; code: string; detail: string }>;\n    error?: string;\n  }>;\n}\n\n/**\n * frontend-slides mode: one blueprint call, then budget-packed batches in which\n * the model authors HTML/CSS per slide. Every slide must pass\n * presentation-kit's contract validator; violators get a bounded repair turn,\n * and a batch that still fails is split (see authorBatchesWithSplit).\n */\n/** Resolves the per-call slide cap: option > engine default (bespoke 4, chunked 6); clamped ≥1.\n *  RC 2026-09-23: bespoke 8 hit the 22.4k output ceiling head-first (real HTML ≈2.8k\n *  tokens/slide vs 2k estimate) — 3 full-length truncated attempts per batch burned\n *  ~70k tokens before the split safety net fired. 4 slides/batch keeps a batch under\n *  the ceiling on the first attempt; split remains the safety net for outliers.\n *  RC 2026-09-25: chunked got the same lesson live — 10 slots/lượt on the free\n *  pool looped on slide 1, burned 22.4k tokens, and jsonrepair fused the runoff\n *  into a 14k-word title. 6 matches the 4-6 slide cluster philosophy AND keeps\n *  a slots batch (~700 scaffold + prose + notes/slide) clear of the ceiling. */\nfunction resolveMaxSlidesPerTurn(options: SlideProductionWorkflowOptions): number {\n  const raw = options.maxSlidesPerTurn ?? (options.engine === 'bespoke' ? 4 : 6);\n  return Math.max(1, Math.floor(raw));\n}\n\nasync function runBespokePipeline(ctx: BespokePipelineContext): Promise<{\n  blueprint: SlideBlueprintItem[];\n  slides: any[];\n  firstPassAudit?: FirstPassSlideAudit[];\n}> {\n  const { options, onProgress, maxRetries, repairRounds, lessonFlow } = ctx;\n\n  // ── STEP 1: blueprint (content plan only — no slots, no layout choice) ──────\n  const blueprint = await pRetry(\n    async () => {\n      let items: any[] | null = null;\n      try {\n        items = await inferStructured(\n          SlideBlueprintArraySchema,\n          '',\n          ctx.blueprintPrompt,\n          options,\n          'bespoke-blueprint'\n        );\n      } catch (err) {\n        // Truncated blueprint: a verbatim retry re-burns the budget (1.5.33).\n        // Abort pRetry; the caller falls back to the next engine.\n        if (err instanceof SplitBatchSignal) throw new AbortError(err);\n        throw err;\n      }\n      if (!items || items.length === 0) throw new Error('Blueprint generation returned empty or schema-invalid output');\n      return normalizeBlueprintItems(items as any);\n    },\n    {\n      retries: maxRetries - 1,\n      onFailedAttempt: (err) => {\n        onProgress?.('@illustrator', `⚠️ Blueprint bespoke lần ${err.attemptNumber}/${maxRetries} lỗi — thử lại...`, {\n          type: 'warning',\n        });\n      },\n    }\n  );\n\n  const calibrator = createCalibratedEstimator();\n  const heuristicOf = new Map<SlideBlueprintItem, number>();\n  const heuristicSumOf = (batch: SlideBatch<SlideBlueprintItem>): number =>\n    batch.items.reduce(\n      (sum, item) => sum + (heuristicOf.get(item) ?? estimateSlideAuthoringTokens(item as any, 'html')),\n      0\n    );\n  const packRemaining = (doneItems: Set<SlideBlueprintItem>): SlideBatch<SlideBlueprintItem>[] => {\n    const remaining = blueprint.filter((item) => !doneItems.has(item));\n    if (remaining.length === 0) return [];\n    return packSlideBatches(remaining, {\n      estimate: (item) => {\n        const h = estimateSlideAuthoringTokens(item as any, 'html');\n        heuristicOf.set(item, h);\n        return calibrator.estimateFor(h);\n      },\n      clusterIdOf: (item) => (item as any).clusterId,\n      maxSlidesPerTurn,\n    });\n  };\n  /** Resolves the per-call slide cap (option > engine default; clamped ≥1). */\n  const maxSlidesPerTurn = resolveMaxSlidesPerTurn(options);\n\n  const completedItems = new Set<SlideBlueprintItem>();\n  /** Real completionTokens of the authorOne call currently in flight. */\n  let inflightUsageTokens = 0;\n  /** First authoring pass per slide, captured BEFORE any repair replaced the\n   *  markup — the raw material for the lint-overreach vs true-hole audit. */\n  const firstPassById = new Map<string, { id: string; html: string; layoutId?: string }>();\n  let batches = packRemaining(completedItems);\n  onProgress?.(\n    '@illustrator',\n    `[2/4] ${blueprint.length} slides → ${batches.length} lượt tự viết HTML (mỗi lượt ≤ ${SLIDE_CALL_OUTPUT_BUDGET} token)...`\n  );\n\n  const excerptFor = (items: SlideBlueprintItem[]): string => {\n    const phaseNames = new Set(items.map((s) => s.lessonPhase.toLowerCase()));\n    const matching = lessonFlow.phases.filter((p) => phaseNames.has(p.phaseName.toLowerCase()));\n    return matching.length > 0\n      ? matching.map((p) => `### ${p.phaseName}\\n${p.content}`).join('\\n\\n')\n      : lessonFlow.rawContent.slice(0, 3500);\n  };\n\n  const authorOne = async (batch: SlideBatch<SlideBlueprintItem>): Promise<any[]> => {\n    const batchSkeletonIds = Array.from(\n      new Set(\n        batch.items\n          .map((s: any) => s.layoutSkeleton || s.layoutId)\n          .filter(Boolean)\n      )\n    ) as any[];\n\n    const batchLayoutSkeletons = typeof ctx.buildSlotsPrompt === 'function' && batchSkeletonIds.length > 0\n      ? ctx.buildSlotsPrompt(batchSkeletonIds)\n      : ctx.layoutSkeletons;\n\n    const promptParams = {\n      batchIndex: batch.index,\n      clusterTitle: (batch.items[0] as any)?.clusterTitle || `Giai đoạn ${batch.index}`,\n      batchItems: batch.items,\n      lessonFlow,\n      lessonExcerpt: excerptFor(batch.items),\n      skillPrompt: ctx.skillPrompt,\n      designBrief: ctx.designBrief,\n      utilityVocabulary: ctx.utilityVocabulary,\n      layoutSkeletons: batchLayoutSkeletons,\n      language: ctx.language,\n      languageDirective: ctx.languageDirective,\n      groundContext: options.groundContext,\n    };\n\n    let slides: any[] = [];\n    let lastFailure = 'authoring returned nothing';\n\n    // Tap usage events so the batch loop can calibrate the estimator against\n    // REAL completionTokens (repairs/splits included — tolerated by the EMA).\n    const tappedOptions: SlideProductionWorkflowOptions = {\n      ...options,\n      onProgress: (agent, message, meta) => {\n        if (meta?.type === 'usage') {\n          try { inflightUsageTokens += JSON.parse(message).completionTokens || 0; } catch { /* malformed usage event */ }\n        }\n        options.onProgress?.(agent, message, meta);\n      },\n    };\n\n    for (let attempt = 1; attempt <= maxRetries && slides.length === 0; attempt++) {\n      const { systemPrompt, userPrompt } = buildBespokeSlidesPrompt(promptParams);\n      let parsed: any[] | null = null;\n      try {\n        parsed = await inferTextJson(\n          BespokeSlideArraySchema,\n          systemPrompt,\n          userPrompt,\n          tappedOptions,\n          `bespoke-batch-${batch.index}#${attempt}`\n        );\n      } catch (err) {\n        // Truncated call → the SPLIT is the retry (kit 1.5.33). Re-throw the\n        // signal: authorBatchesWithSplit splits this batch in half right now\n        // instead of letting attempts 2..N re-burn the full budget verbatim.\n        if (err instanceof SplitBatchSignal) throw err;\n        parsed = null;\n      }\n      if (!parsed || parsed.length === 0) {\n        lastFailure = 'empty or schema-invalid slide output';\n        continue;\n      }\n\n      // Normalize at both consumption points of this loop (parse + repair\n      // merge) — see makeSlideNormalizer for why this must be unconditional.\n      parsed.forEach(makeSlideNormalizer(batch.items, ctx.renderSkeleton));\n      // Capture the first authoring pass before any repair can replace it.\n      for (const s of parsed) firstPassById.set(String(s.id), { id: String(s.id), html: String(s.html || ''), layoutId: (batch.items.find((i: any) => String(i.slideIndex) === String(s.id).replace(/\\D/g, '')) || batch.items[0])?.layoutId });\n\n      // ── Contract validation ─────────────────────────────────────────────\n      // Hard rules fail closed. Composition lints are NUDGE-ONLY when the\n      // scanline QA will measure the deck afterwards (run F: 4/6 composition\n      // flags were lint overreach — geometry clean) and hard-gating when it\n      // won't (no harness = no geometric ground truth = keep fail-closed).\n      const qaWillRun = Boolean(ctx.layoutQa);\n      const failing = parsed\n        .map((s: any) => {\n          const tiers = classifyContractViolations(ctx.validate(s.html || ''));\n          const blocking = qaWillRun ? tiers.hard : [...tiers.hard, ...tiers.composition];\n          // SLOTS MODE fail-closed: a slots-mode slide whose html is not the\n          // renderer's output is mimicry — hard-block it into the repair turn.\n          const item = batch.items.find((i) => String(i.slideIndex) === String(s.id)?.replace(/\\D/g, '')) || batch.items[0];\n          const mimicry = skeletonMimicryIssue(s, item, ctx.renderSkeleton);\n          if (mimicry) blocking.push(mimicry);\n          // Slot-requirement gate: a \"4–6 items\" layout filled with 1 item is\n          // a hole — block it into repair BEFORE layout-QA measures it.\n          const slotIssue = layoutSlotIssue(s, item, ctx.validateLayoutSlots);\n          if (slotIssue) blocking.push(slotIssue);\n          return {\n            item,\n            slide: s,\n            violations: blocking,\n            compositionOnly: blocking.length === 0 && tiers.composition.length > 0,\n          };\n        })\n        .filter((entry) => entry.violations.length > 0);\n\n      if (failing.length === 0) {\n        slides = parsed as any[];\n        break;\n      }\n\n      // ── Repair turn: only the violators, quoting the exact violations ──────\n      let repaired: any[] | null = null;\n      for (let round = 1; round <= repairRounds && !repaired; round++) {\n        onProgress?.(\n          '@illustrator',\n          `⚠️ ${failing.length}/${parsed.length} slide vi phạm hợp đồng — lượt sửa ${round}/${repairRounds}: ${snippetOf(failing[0].violations)}`,\n          { type: 'warning', violations: failing.flatMap((f) => f.violations) }\n        );\n        const repair = buildBespokeRepairPrompt({\n          ...promptParams,\n          failing: failing.map((f) => ({ item: f.item, html: String(f.slide.html || ''), violations: f.violations })),\n        });\n        const fixed = await inferTextJson(\n          BespokeSlideArraySchema,\n          repair.systemPrompt,\n          repair.userPrompt,\n          tappedOptions,\n          `bespoke-batch-${batch.index}-repair${round}`\n        );\n        if (!fixed || fixed.length === 0) continue;\n        fixed.forEach(makeSlideNormalizer(batch.items, ctx.renderSkeleton));\n        // Same tier policy as the first gate: with QA downstream, composition\n        // lints stay nudges — a repair that fixes the hard rules but still\n        // carries a (possibly overreaching) lint is accepted and left to the\n        // geometric ground truth to judge.\n        const stillBad = fixed.filter((s: any) => {\n          const tiers = classifyContractViolations(ctx.validate(s.html || ''));\n          const blocking = qaWillRun ? tiers.hard : [...tiers.hard, ...tiers.composition];\n          const item = batch.items.find((i) => String(i.slideIndex) === String(s.id)?.replace(/\\D/g, '')) || batch.items[0];\n          const mimicry = skeletonMimicryIssue(s, item, ctx.renderSkeleton);\n          if (mimicry) blocking.push(mimicry);\n          return blocking.length > 0;\n        });\n        if (stillBad.length === 0) {\n          // Merge repaired slides back over the originals by id.\n          const fixedById = new Map(fixed.map((s: any) => [String(s.id), s]));\n          repaired = parsed.map((s: any) => fixedById.get(String(s.id)) || s);\n        }\n      }\n\n      if (repaired) {\n        slides = repaired;\n        break;\n      }\n      lastFailure = `${failing.length} slide(s) violated the HTML contract: ${snippetOf(failing[0].violations)}`;\n    }\n\n    if (slides.length === 0) throw new Error(`bespoke batch ${batch.index} failed — ${lastFailure}`);\n    return slides;\n  };\n\n  const { slides: authoredSlides, failed } = await authorBatchesWithSplit(\n    batches,\n    authorOne,\n    onProgress,\n    (batch, produced) => {\n      for (const s of produced) {\n        const n = String((s as any)?.id ?? '').replace(/\\D/g, '');\n        const item = blueprint.find((b) => String(b.slideIndex) === n);\n        if (item) completedItems.add(item);\n      }\n      calibrator.observe(heuristicSumOf(batch), inflightUsageTokens);\n      inflightUsageTokens = 0;\n      const replan = packRemaining(completedItems);\n      if (replan.length === 0) return null;\n      onProgress?.(\n        '@illustrator',\n        `[2/4] calibrating: ratio ×${calibrator.state.ratio.toFixed(2)} (n=${calibrator.state.samples}) → còn ${replan.length} lượt`\n      );\n      return replan;\n    }\n  );\n  if (failed.length > 0) {\n    throw new Error(`[SlideProductionWorkflow] ${describeFailedBatches(failed, batches.length, maxRetries)}`);\n  }\n\n  // ── STEP 3.5: post-authoring layout QA (headless scanline, 0 LLM token) ────\n  // The per-slide contract validator sees markup, not geometry — multi-column\n  // and footer-band dead bands pass it (ADR-0009 ceiling, measured 4/15 on a\n  // real deck). When the harness is available, measure the REAL layout and\n  // give flagged slides one repair turn; if repair fails, ship anyway and\n  // report — a deck with a known hole beats no deck.\n  let slides: any[] = authoredSlides;\n  // Audit of the FIRST pass: full-enforcement lint + scanline geometry on the\n  // pre-repair markup, so lint overreach vs a real hole stays measurable after\n  // repairs replace the originals (runs E/U02: batch repair fixed 13/13 and\n  // 10/10 lint before anyone measured the first pass).\n  let firstPassAudit: FirstPassSlideAudit[] | undefined;\n  if (ctx.layoutQa && firstPassById.size > 0) {\n    try {\n      const firstPassList = [...firstPassById.values()];\n      const fpGeo = await ctx.layoutQa(firstPassList.map((s) => ({ html: s.html })));\n      firstPassAudit = buildFirstPassAudit(firstPassList, ctx.validate, fpGeo.available ? fpGeo : null);\n      const count = (v: FirstPassSlideAudit['verdict']) => firstPassAudit!.filter((a) => a.verdict === v).length;\n      onProgress?.('@illustrator', `[layout-qa] first-pass audit: ${count('true-positive')} lỗ thật, ${count('lint-overreach')} lint overreach, ${count('hard-fail')} hard-fail, ${count('clean')} sạch`);\n    } catch (fpErr: any) {\n      console.warn('[SlideProductionWorkflow] first-pass QA error (non-fatal):', fpErr?.message || fpErr);\n    }\n  }\n  if (ctx.layoutQa && slides.length > 0) {\n    try {\n      const qa = await ctx.layoutQa(slides.map((s: any) => ({ html: String(s.html || '') })));\n      if (!qa.available) {\n        onProgress?.('@illustrator', '[layout-qa] harness unavailable — skip (deck không bị chặn)', { type: 'warning' });\n      } else if (qa.issues.length > 0) {\n        const detail = qa.issues.map((i) => `s${i.slideIndex}:${i.deadBand}px@${i.atY}`).join(' ');\n        onProgress?.('@illustrator', `⚠️ Layout QA: ${qa.issues.length}/${slides.length} slide có dead band ≥400px (${detail}) — lượt sửa hình học...`, {\n          type: 'warning',\n          violations: qa.issues.map((i) => `dead band ${i.deadBand}px at y=${i.atY}`),\n        });\n        const qaById = new Map(qa.issues.map((i) => [i.slideIndex, i]));\n        const flagged = slides\n          .map((s: any, idx: number) => ({ s, item: blueprint.find((b) => String(b.slideIndex) === String(s.id ?? '').replace(/\\D/g, '')) || blueprint[idx] || s, n: idx + 1, issue: qaById.get(idx + 1) }))\n          .filter((e: any) => e.issue);\n        // The repair output carries the FULL recomposed markup of every flagged\n        // slide — packing N flags into one call can blow the output budget\n        // (run U03: 6 flags ≈ 35k tokens > 22.4k cap → finish=length → JSON cut\n        // mid-array → extraction failed → ALL 6 slides shipped unrepaired, even\n        // though one call would have fit each chunk fine). Pack repair calls by\n        // the same budget logic as authoring; each chunk is independent — a\n        // failed chunk keeps ITS slides' originals (fail-safe per chunk), not\n        // the whole turn.\n        const probe = ctx.validate('<h1>t</h1><p>' + 'probe '.repeat(30) + '</p>');\n        const supportsTierOpts = typeof (probe as any).hardIssues !== 'undefined';\n        const hardIssuesOf = (html: string): string[] => {\n          const v = supportsTierOpts\n            ? ctx.validate(html || '', { waiveCompositionLints: true } as any)\n            : ctx.validate(html || '');\n          return supportsTierOpts\n            ? ((v as any).hardIssues as string[])\n            : classifyContractViolations(v).hard;\n        };\n        const repairedIds = new Set<string>();\n        const rejected: string[] = [];\n        const repairBatches = packSlideBatches(flagged, {\n          // The repair rewrites the full markup of each slide: estimate from the\n          // CURRENT html (what the model must re-emit), plus scaffold.\n          estimate: (e: any) => estimateSlideAuthoringTokens({ html: String(e.s.html || '') } as any, 'html'),\n          // Kit 1.5.43 hotfix (L01 1.5.42 regen, measured): budget packing alone\n          // batched 16 repair slides into ONE call → truncation at the 22.4k\n          // ceiling → split → per-slide JSON failures. Cap at 4 like the author\n          // turns — the same rule that keeps authoring batches alive.\n          maxSlidesPerTurn: 4,\n        });\n        for (const rBatch of repairBatches) {\n          const chunk = rBatch.items;\n          const repair = buildBespokeRepairPrompt({\n            batchIndex: 0,\n            clusterTitle: 'Layout repair',\n            batchItems: chunk.map((e: any) => e.s),\n            lessonFlow,\n            lessonExcerpt: '',\n            skillPrompt: ctx.skillPrompt,\n            designBrief: ctx.designBrief,\n            utilityVocabulary: ctx.utilityVocabulary,\n            language: ctx.language,\n            languageDirective: ctx.languageDirective,\n            groundContext: options.groundContext,\n            failing: chunk.map((e: any) => ({\n              item: e.item,\n              html: String(e.s.html || ''),\n              violations: [\n                `LAYOUT GEOMETRY: rendered at the real 1920×1080 stage, the largest content-free horizontal band is ${e.issue!.deadBand}px tall starting at y=${e.issue!.atY} (threshold 400px). Rearrange so no empty band exceeds ~150px: give the main block flex:1, scale type/spacing up, or center the composition as a hero. Do NOT just add more text — recompose the existing content.`,\n              ],\n            })),\n          });\n          let fixedChunk: any[] | null = null;\n          try {\n            fixedChunk = await inferTextJson(\n              BespokeSlideArraySchema,\n              repair.systemPrompt,\n              repair.userPrompt,\n              options,\n              `bespoke-layout-qa-repair#${rBatch.index}(${chunk.length} slides)`\n            );\n          } catch (err) {\n            // Truncated repair chunk (1.5.33): the per-slide salvage loop below\n            // IS the split — treat as empty and let it run.\n            if (!(err instanceof SplitBatchSignal)) throw err;\n            fixedChunk = null;\n          }\n          if (!fixedChunk || fixedChunk.length === 0) {\n            // The batch answer came back empty/truncated (observed 2026-09-27,\n            // swift-for-dummy L01: a 3-slide repair hit the 22.4k output cap,\n            // finish=length, JSON cut mid-array → extraction failed → ALL 3\n            // slides shipped unrepaired). The truncation warning says\n            // \"splitting this batch will fix it\" — do exactly that: one slide\n            // per call, each far below the output budget.\n            let salvaged = 0;\n            for (const e of chunk) {\n              const single = buildBespokeRepairPrompt({\n                batchIndex: 0,\n                clusterTitle: 'Layout repair (single-slide fallback)',\n                batchItems: [e.s],\n                lessonFlow,\n                lessonExcerpt: '',\n                skillPrompt: ctx.skillPrompt,\n                designBrief: ctx.designBrief,\n                utilityVocabulary: ctx.utilityVocabulary,\n                layoutSkeletons: typeof ctx.buildSlotsPrompt === 'function'\n                  ? ctx.buildSlotsPrompt([e.item?.layoutSkeleton || e.item?.layoutId].filter(Boolean) as any)\n                  : ctx.layoutSkeletons,\n                language: ctx.language,\n                languageDirective: ctx.languageDirective,\n                groundContext: options.groundContext,\n                failing: [\n                  {\n                    item: e.item,\n                    html: String(e.s.html || ''),\n                    violations: [\n                      `LAYOUT GEOMETRY: rendered at the real 1920×1080 stage, the largest content-free horizontal band is ${e.issue!.deadBand}px tall starting at y=${e.issue!.atY} (threshold 400px). Rearrange so no empty band exceeds ~150px: give the main block flex:1, scale type/spacing up, or center the composition as a hero. Do NOT just add more text — recompose the existing content.`,\n                    ],\n                  },\n                ],\n              });\n              let one: any[] | null = null;\n              try {\n                one = await inferTextJson(\n                  BespokeSlideArraySchema,\n                  single.systemPrompt,\n                  single.userPrompt,\n                  options,\n                  `bespoke-layout-qa-repair#${rBatch.index}.s${String(e.s.id).replace(/\\D/g, '')}(1 slide)`\n                );\n              } catch (err) {\n                // Single-slide repair cannot be split further — a truncation\n                // here just means this slide keeps its original (fail-safe).\n                if (!(err instanceof SplitBatchSignal)) throw err;\n                one = null;\n              }\n              if (!one || one.length === 0) continue;\n              one.forEach(makeSlideNormalizer([e.item], ctx.renderSkeleton));\n              const okOne = one.filter((s: any) => hardIssuesOf(String(s.html || '')).length === 0);\n              if (okOne.length === 0) continue;\n              const byIdOne = new Map(okOne.map((s: any) => [String(s.id), s]));\n              slides = slides.map((s: any) => byIdOne.get(String(s.id)) || s);\n              okOne.forEach((s: any) => repairedIds.add(String(s.id)));\n              salvaged += okOne.length;\n            }\n            onProgress?.(\n              '@illustrator',\n              salvaged > 0\n                ? `[layout-qa] lượt sửa ${rBatch.index} bị cắt ngưỡng output — đã tách lẻ: ${salvaged}/${chunk.length} slide được sửa`\n                : `[layout-qa] lượt sửa ${rBatch.index}/${repairBatches.length} không nhận được bản sửa — ${chunk.length} slide giữ bản gốc`,\n              salvaged > 0 ? undefined : { type: 'warning' },\n            );\n            continue;\n          }\n          // Same shape-drift normalization as the batch path — the merge below\n          // is keyed on `slide-N`; a numeric id would silently no-op it and the\n          // recomposed markup would never reach the deck (observed run C:\n          // repair accepted, re-measure unchanged 4/15, 2026-09-21).\n          fixedChunk.forEach(makeSlideNormalizer(chunk.map((e: any) => e.item), ctx.renderSkeleton));\n          // Acceptance gate for the GEOMETRY repair turn — two explicit tiers\n          // (pk ≥0.3.6): tier-1 hard rules (stage/scoping, sanitization,\n          // self-containment, hierarchy, size) still fail closed — the repair\n          // is forbidden from breaking those. Tier-2 composition lints\n          // (space-between / stretched-card) are WAIVED via the validator's\n          // explicit mode: the turn is asked to change exactly that\n          // composition, so gating on it is self-defeating (2/2 production\n          // repairs rejected, 2026-09-21). Whether the recompose actually\n          // removed the dead band is decided by the re-measured scanline QA\n          // below — the geometric ground truth — never by the heuristic.\n          // Legacy validator (≤0.3.5, no tier fields) falls back to the\n          // compositionOnly flag — same semantics.\n          const bad = fixedChunk\n            .map((s: any) => {\n              const v = supportsTierOpts\n                ? ctx.validate(s.html || '', { waiveCompositionLints: true } as any)\n                : ctx.validate(s.html || '');\n              const issues = supportsTierOpts\n                ? ([...(v as any).hardIssues as string[]] as string[])\n                : [...classifyContractViolations(v).hard];\n              // SLOTS MODE fail-closed: the repair turn must also hand back\n              // renderer-owned markup — a recomposed mimicry never ships.\n              const bp = blueprint.find((b) => String(b.slideIndex) === String(s.id)?.replace(/\\D/g, ''));\n              const mimicry = skeletonMimicryIssue(s, bp, ctx.renderSkeleton);\n              if (mimicry) issues.push(mimicry);\n              return { s, issues };\n            })\n            .filter(({ issues }) => issues.length > 0);\n          if (bad.length > 0) {\n            const detail = bad\n              .map(({ s, issues }) => `s${String(s.id).replace(/\\D/g, '')}: ${issues[0]}`)\n              .join('; ')\n              .slice(0, 240);\n            onProgress?.('@illustrator', `[layout-qa] lượt sửa ${rBatch.index}/${repairBatches.length} vi phạm hợp đồng cứng — ${bad.length}/${chunk.length} slide giữ bản gốc (${detail})`, { type: 'warning' });\n          }\n          // Merge the ACCEPTED subset of this chunk; rejected slides keep their\n          // originals (per-chunk fail-safe, never all-or-nothing).\n          const okIds = new Set(fixedChunk.filter((s: any) => !bad.some((b: any) => String(b.s.id) === String(s.id))).map((s: any) => String(s.id)));\n          const byId = new Map(fixedChunk.filter((s: any) => okIds.has(String(s.id))).map((s: any) => [String(s.id), s]));\n          slides = slides.map((s: any) => byId.get(String(s.id)) || s);\n          okIds.forEach((id) => repairedIds.add(id));\n        }\n        if (repairedIds.size > 0) {\n          // Re-measure: report what the repair actually bought us.\n          const qa2 = await ctx.layoutQa(slides.map((s: any) => ({ html: String(s.html || '') })));\n          const still = qa2.available ? qa2.issues.length : -1;\n          // REBUILD the first-pass audit from the CURRENT (post-repair) markup:\n          // the stored verdicts describe the PRE-repair pass, so a successful\n          // repair must clear their hard-fail flags — otherwise a downstream\n          // gate would reject a deck the harness just certified healthy\n          // (2026-09-27). Clean slides keep their (unchanged) 'clean' verdicts.\n          if (firstPassAudit) {\n            const stillBad = new Set(qa2.available ? qa2.issues.map((i) => i.slideIndex) : []);\n            const repairedById = new Set(repairedIds);\n            firstPassAudit = firstPassAudit.map((a) => {\n              const idx = parseInt(String(a.id).replace(/\\D/g, ''), 10);\n              if (!repairedById.has(String(a.id))) return a;\n              const htmlNow = String(slides.find((s: any) => String(s.id) === String(a.id))?.html || '');\n              const issuesNow = hardIssuesOf(htmlNow);\n              if (issuesNow.length > 0 || stillBad.has(idx)) return { ...a, verdict: 'hard-fail' as const };\n              return { ...a, verdict: 'clean' as const };\n            });\n          }\n          onProgress?.(\n            '@illustrator',\n            still === 0\n              ? `[layout-qa] sửa xong: ${repairedIds.size}/${flagged.length} slide được sửa, 0/${slides.length} còn dead band ≥400px`\n              : still > 0\n                ? `[layout-qa] sửa xong: ${repairedIds.size}/${flagged.length} slide được sửa, còn ${still}/${slides.length} slide vượt ngưỡng (đã report, deck vẫn xuất)`\n                : `[layout-qa] sửa xong (không đo lại được — harness lỗi)`\n          );\n        } else {\n          onProgress?.('@illustrator', `[layout-qa] không có bản sửa nào được chấp nhận — giữ nguyên deck, report kèm deck`, { type: 'warning' });\n        }\n      } else {\n        onProgress?.('@illustrator', `[layout-qa] 0/${slides.length} slide có dead band ≥400px — sạch`);\n      }\n    } catch (qaErr: any) {\n      console.warn('[SlideProductionWorkflow] layout QA error (non-fatal):', qaErr?.message || qaErr);\n      onProgress?.('@illustrator', `⚠️ layout QA lỗi (không chặn deck): ${String(qaErr?.message || qaErr).slice(0, 120)}`, { type: 'warning' });\n    }\n  }\n\n  // ── Vision QA + composition repair (pk ≥0.5.8, capability-detect) ──────────\n  // The scanline QA measures geometry; this pass LOOKS at each slide and flags\n  // what geometry cannot see (text-only bodies, centered body text, dead\n  // bands, overflow). Judge/repair failures are non-fatal — the deck keeps\n  // whatever passed before. One repair round, batched per flag batch of 4.\n  if (ctx.visionQa) {\n    try {\n      onProgress?.('@illustrator', `[vision-qa] Đánh giá bố cục ${slides.length} slide bằng vision judge...`);\n      const vqa = await ctx.visionQa(slides.map((s: any) => ({ html: String(s.html || ''), title: String(s.title || '') })));\n      const flagged = (vqa.available ? vqa.issues : []).filter((i) => i.code !== 'judge-error' && i.code !== 'harness-error');\n      if (flagged.length > 0) {\n        onProgress?.('@illustrator', `[vision-qa] ${flagged.length} vấn đề thị giác trên ${new Set(flagged.map((i) => i.slideIndex)).size} slide — lượt sửa bố cục...`, { type: 'warning' });\n        const bySlide = new Map<number, Array<{ code: string; detail: string }>>();\n        for (const i of flagged) {\n          const list = bySlide.get(i.slideIndex) || [];\n          list.push({ code: i.code, detail: i.detail });\n          bySlide.set(i.slideIndex, list);\n        }\n        const entries = [...bySlide.entries()].sort((a, b) => a[0] - b[0]);\n        let repairedCount = 0;\n        for (let start = 0; start < entries.length; start += 4) {\n          const chunk = entries.slice(start, start + 4);\n          const failing = chunk.map(([slideNumber, issues]) => ({\n            slideNumber,\n            title: String(slides[slideNumber - 1]?.title || `Slide ${slideNumber}`),\n            html: String(slides[slideNumber - 1]?.html || ''),\n            issues,\n          }));\n          try {\n            const { buildVisionRepairPrompt } = await import('./slideVisionJudge.js');\n            const { systemPrompt, userPrompt } = buildVisionRepairPrompt({ failing, language: ctx.language });\n            const fixed = await inferTextJson(\n              BespokeSlideArraySchema,\n              systemPrompt,\n              userPrompt,\n              options,\n              `bespoke-vision-repair#${chunk[0][0]}`\n            );\n            if (!fixed || fixed.length === 0) continue;\n            for (const s of fixed as any[]) {\n              // Materialize fill-slots repairs too (same contract as authoring).\n              if (!String(s.html || '').trim() && s.skeleton && ctx.renderSkeleton) {\n                s.html = ctx.renderSkeleton(String(s.skeleton), s.slots || {});\n              }\n              // pk 0.5.19/kit 1.5.51: a slots-mode repair that came back as\n              // authored markup re-renders through the renderer when slots are\n              // present — the same normalization the authoring path applies.\n              else if (\n                String(s.html || '').trim() &&\n                s.skeleton &&\n                SLOTS_MODE_LAYOUTS.has(String(s.skeleton)) &&\n                s.slots && typeof s.slots === 'object' && Object.keys(s.slots).length > 0 &&\n                typeof ctx.renderSkeleton === 'function'\n              ) {\n                const rerendered = String(ctx.renderSkeleton(String(s.skeleton), s.slots || {}) || '').trim();\n                if (rerendered) s.html = rerendered;\n              }\n              const n = parseInt(String(s.id || '').replace(/\\D/g, ''), 10);\n              if (!Number.isFinite(n) || n < 1 || n > slides.length) continue;\n              const hard = ctx.validate(String(s.html || ''), { waiveCompositionLints: true });\n              const hardIssues = [...((hard as any).hardIssues ?? [])] as string[];\n              // SLOTS MODE fail-closed: a vision repair must not smuggle authored\n              // markup into a renderer-owned slide either.\n              const vp = blueprint.find((b) => String(b.slideIndex) === String(s.id || '').replace(/\\D/g, ''));\n              const vMimicry = skeletonMimicryIssue(s, vp, ctx.renderSkeleton);\n              if (vMimicry) hardIssues.push(vMimicry);\n              if (hardIssues.length > 0) continue; // never accept a contract-breaking repair\n              slides[n - 1] = { ...slides[n - 1], html: String(s.html || '') };\n              repairedCount++;\n            }\n          } catch (repErr: any) {\n            if (!(repErr instanceof SplitBatchSignal)) {\n              console.warn('[SlideProductionWorkflow] vision repair batch failed (non-fatal):', repErr?.message || repErr);\n            }\n          }\n        }\n        onProgress?.('@illustrator', `[vision-qa] sửa xong: ${repairedCount}/${bySlide.size} slide được sửa bố cục (deck vẫn xuất)`);\n      } else {\n        onProgress?.('@illustrator', `[vision-qa] 0 vấn đề bố cục — sạch`);\n      }\n    } catch (vErr: any) {\n      console.warn('[SlideProductionWorkflow] vision QA error (non-fatal):', vErr?.message || vErr);\n      onProgress?.('@illustrator', `⚠️ vision QA lỗi (không chặn deck): ${String(vErr?.message || vErr).slice(0, 120)}`, { type: 'warning' });\n    }\n  }\n\n  return { blueprint, slides, firstPassAudit };\n}\n\nfunction snippetOf(violations: string[]): string {\n  const joined = violations.join('; ');\n  return joined.length > 200 ? `${joined.slice(0, 200)}…` : joined;\n}\n\n/**\n * Renders the active template's design tokens as a prompt brief. Bespoke\n * authoring must stay inside the template's design system (palette, type\n * pairing, signature elements) — that is what separates a designed deck from\n * model default styling.\n */\nfunction buildDesignBrief(preset: any, stylePresetId: string): string {\n  if (!preset) return '';\n  const colors = preset.colors || {};\n  const type = preset.typography || {};\n  const lines = [\n    `Template: ${preset.name || stylePresetId}${preset.vibe ? ` — ${preset.vibe}` : ''}`,\n    preset.scheme ? `Scheme: ${preset.scheme} (design for this contrast)` : '',\n    `Palette: background ${colors.bg || '—'}, text ${colors.text || '—'}, primary ${colors.primary || '—'}, accent ${colors.accent || '—'}`,\n    `Typography: display ${type.display || '—'} | body ${type.body || '—'} | mono ${type.mono || 'monospace'}`,\n    (preset.signatureElements || []).length > 0\n      ? `Signature design elements (use them, they are what makes this template itself):\\n- ${(preset.signatureElements || []).join('\\n- ')}`\n      : '',\n  ];\n  return lines.filter(Boolean).join('\\n');\n}\n\n// ─── Main workflow ─────────────────────────────────────────────────────────────\n\nexport async function executeSlideProductionWorkflow(\n  options: SlideProductionWorkflowOptions\n): Promise<SlideProductionWorkflowResult> {\n  const {\n    lessonCode,\n    lessonTitle,\n    targetSlideCount,\n    stylePresetId = 'blue-professional',\n    language = 'Vietnamese',\n    languageDirective = '',\n    headingDirective = '',\n    maxRetries = 3,\n    onProgress,\n  } = options;\n  // targetSlideCount is a HINT for the blueprint prompt, never a hard cap — a\n  // lesson's slide count must follow its own section/activity structure (a\n  // section needs intro + activity slides; activities differ in length). The\n  // default 15 only exists to bound wall-clock on long lessons; the blueprint\n  // prompt may legitimately plan a few more when the lesson has more sections.\n  // Issue (2026-09-27, swift-for-dummy L01/L02): the pinned default 15\n  // delivered 15-slide decks for 90-minute lessons whose own DENSITY DIRECTIVE\n  // demands 18–30 (2–4 min per slide). When the caller doesn't pass a target,\n  // derive it from the lesson's stated duration instead of pinning.\n  const effectiveTargetSlideCount =\n    targetSlideCount ?? deriveTargetSlideCountFromLesson(options.lessonMarkdown ?? '');\n  const engineRequested: SlideEngine = options.engine ?? 'hybrid';\n\n  // Import presentation-kit skills and core dynamically (peer package)\n  let presentationKitSkills: any = null;\n  let presentationKitCore: any = null;\n  let presentationKitAi: any = null;\n  let presentationKitVersion = 'unknown';\n  // The catch blocks log: a silently swallowed resolution error here (e.g. an\n  // older pinned presentation-kit) degrades the deck to slot layouts with no\n  // visible reason — the exact failure that hid the bespoke engine for a while.\n  try {\n    presentationKitSkills = await import('@thanh01.pmt/presentation-kit/skills');\n  } catch (e: any) {\n    console.warn(\n      '[SlideProductionWorkflow] presentation-kit/skills unavailable — style presets/skill prompt disabled:',\n      e?.code || e?.message || e\n    );\n  }\n  try {\n    presentationKitCore = await import('@thanh01.pmt/presentation-kit');\n    presentationKitVersion = presentationKitCore.KIT_VERSION || presentationKitCore.VERSION || 'unknown';\n  } catch (e: any) {\n    console.warn(\n      '[SlideProductionWorkflow] presentation-kit unavailable — HTML compile falls back to plain markup:',\n      e?.code || e?.message || e\n    );\n  }\n  try {\n    // Deck contract helpers (prompt schema / validator / sample deck). Optional:\n    // older kit versions may not ship the /ai subpath yet.\n    presentationKitAi = await import('@thanh01.pmt/presentation-kit/ai');\n  } catch {\n    presentationKitAi = null;\n  }\n\n  // Brand theme (0 LLM): ONE brand hex → full theme via the kit's Oklch\n  // lightness-math generator. Stamped as a theme OBJECT into deckJson.theme\n  // (resolveHtmlTheme accepts objects) so every compile path — standalone,\n  // fallback, and any later recompile of the persisted deck — stays on-brand.\n  let brandTheme: any = null;\n  if (options.brandColor && presentationKitCore?.generateBrandTheme) {\n    try {\n      brandTheme = presentationKitCore.generateBrandTheme({ brand: options.brandColor });\n      onProgress?.('@illustrator', `🎨 Brand theme: palette sinh từ ${options.brandColor} (${brandTheme.name}, ${brandTheme.scheme}).`);\n    } catch (err: any) {\n      console.warn('[SlideProductionWorkflow] brandColor ignored (invalid hex?):', err?.message || err);\n    }\n  }\n\n  const lessonFlow: ParsedLessonFlow = parseLessonFlow(options.lessonMarkdown);\n  const getStylePreset = presentationKitSkills?.getStylePreset;\n  const stylePreset = getStylePreset ? getStylePreset(stylePresetId) : { name: 'Blue Professional' };\n  const skillPrompt = presentationKitSkills?.getFrontendSlidesSkillPrompt\n    ? presentationKitSkills.getFrontendSlidesSkillPrompt({ stylePresetId })\n    : '';\n\n  const blueprintPrompt = buildSlideBlueprintPrompt({\n    lessonFlow,\n    targetSlideCount: effectiveTargetSlideCount,\n    stylePresetName: stylePreset?.name || 'Blue Professional',\n    productSpecBlock: options.productSpecBlock,\n    requiredOutline: options.slidesOutline,\n  });\n\n  let blueprintItems: SlideBlueprintItem[];\n  let allGeneratedSlides: any[];\n  let engineUsed: SlideEngine = engineRequested;\n\n  // ── BESPOKE ENGINE (frontend-slides mode) ────────────────────────────────────\n  // The model authors HTML/CSS per slide. Fail-closed: the contract validator is\n  // presentation-kit's, and without it (older kit) bespoke MUST NOT run — an\n  // unvalidated authored deck cannot be trusted. Failure degrades to the slot\n  // pipeline rather than losing the lesson.\n  // Optional headless layout QA (presentation-kit ≥0.3.3): capability-detect\n  // through the same runtime specifier pattern as compileStandaloneHtmlDeck.\n  let runSlideLayoutQa: any = null;\n  let runSlideVisionQa: any = null;\n  let renderSkeleton: any = null;\n  try {\n    const nodeEntry = '@thanh01.pmt/presentation-kit' + '/node';\n    const kitNode: any = await import(/* @vite-ignore */ nodeEntry);\n    if (typeof kitNode?.runSlideLayoutQa === 'function') runSlideLayoutQa = kitNode.runSlideLayoutQa;\n    if (typeof kitNode?.runSlideVisionQa === 'function') runSlideVisionQa = kitNode.runSlideVisionQa;\n    // Fill-slots materializer (pk ≥0.5.11). The bespoke prompt shows the JSON\n    // {skeleton, slots} form for EVERY slide, so the model returns it for\n    // preset-layout slides too — but renderBespokeSkeleton only knows the 19\n    // skeleton ids and returns '' for preset ids (measured live on L01\n    // 1.5.45: every such slide failed the contract as \"slide html is empty\"\n    // and burned the batch in repair loops). The unified registry's slots\n    // backend (renderLayoutSlots) covers the 8 presets, so the fallback makes\n    // ALL {skeleton, slots} slides materialize deterministically.\n    if (typeof kitNode?.renderBespokeSkeleton === 'function') {\n      const renderSkeletonHtml = kitNode.renderBespokeSkeleton;\n      const renderPresetSlots = typeof kitNode?.renderLayoutSlots === 'function' ? kitNode.renderLayoutSlots : null;\n      // renderLayoutSlots needs a theme object (only exported from the root\n      // entry, which presentationKitCore already imports above). Resolve it\n      // LAZILY inside the closure: vitest's automock throws on ANY property\n      // access it doesn't define, and this block must survive that (see the\n      // capability-detect note above) — only the preset fallback may die, not\n      // the bespoke renderer the mimicry gate depends on.\n      renderSkeleton = (id: string, slots: Record<string, any>) => {\n        const bespoke = renderSkeletonHtml(id, slots);\n        if (bespoke) return bespoke;\n        try {\n          const resolveTheme = (presentationKitCore as any)?.resolveHtmlTheme;\n          return renderPresetSlots && typeof resolveTheme === 'function'\n            ? renderPresetSlots(id, slots, resolveTheme()) || ''\n            : '';\n        } catch {\n          return ''; // pk root unavailable (test mock) — validator catches the empty html\n        }\n      };\n    }\n  } catch {\n    // Older presentation-kit — QA silently unavailable.\n  }\n\n  let bespokeResult: { blueprint: SlideBlueprintItem[]; slides: any[]; firstPassAudit?: FirstPassSlideAudit[] } | null = null;\n  if (engineRequested === 'bespoke') {\n    const validate = presentationKitCore?.validateBespokeSlideHtml;\n    if (typeof validate !== 'function') {\n      console.warn(\n        '[SlideProductionWorkflow] bespoke engine requires presentation-kit with validateBespokeSlideHtml — falling back to the slot pipeline.'\n      );\n      onProgress?.('@illustrator', '⚠️ presentation-kit chưa hỗ trợ slide HTML tự viết — dùng pipeline slot...', {\n        type: 'warning',\n      });\n    } else {\n      try {\n        bespokeResult = await runBespokePipeline({\n          blueprintPrompt,\n          skillPrompt,\n          designBrief: buildDesignBrief(stylePreset, stylePresetId),\n          // Capability-detect with try/catch, not typeof: vitest's automock\n          // throws on ANY property access it doesn't define, which would trip\n          // the bespoke → slot fallback for a purely cosmetic prompt upgrade.\n          utilityVocabulary: await (async () => {\n            try {\n              const build = presentationKitCore?.buildUtilityVocabularyPrompt;\n              return typeof build === 'function' ? build() : '';\n            } catch {\n              return '';\n            }\n          })(),\n          layoutSkeletons: await (async () => {\n            try {\n              // Option C (pk ≥0.5.11 unified registry): the fill-slots contract\n              // is the bespoke backend for slots-mode layouts. The legacy markup-\n              // mimicry vocabulary is dead — it taught the model to author HTML\n              // for layouts the deterministic renderer now owns.\n              const build = presentationKitCore?.buildBespokeSkeletonSlotsPrompt;\n              return typeof build === 'function' ? build() : '';\n            } catch {\n              return '';\n            }\n          })(),\n          buildSlotsPrompt: (subset?: any[]) => {\n            try {\n              const build = presentationKitCore?.buildLayoutPromptDefinition || presentationKitCore?.buildBespokeSkeletonSlotsPrompt;\n              return typeof build === 'function' ? build(subset) : '';\n            } catch {\n              return '';\n            }\n          },\n          renderSkeleton: renderSkeleton || undefined,\n          // Lazy try/catch like renderSkeleton above: vitest's automock throws\n          // on property access it doesn't define — the gate must vanish, not kill bespoke.\n          validateLayoutSlots: (() => {\n            try {\n              const fn = (presentationKitCore as any)?.validateLayoutSlots;\n              return typeof fn === 'function' ? fn.bind(presentationKitCore) : undefined;\n            } catch {\n              return undefined;\n            }\n          })(),\n          lessonFlow,\n          language,\n          languageDirective,\n          maxRetries,\n          repairRounds: options.bespokeRepairRounds ?? 1,\n          options,\n          onProgress,\n          validate: (html: string, opts?: { waiveCompositionLints?: boolean }) =>\n            (validate as any)(html, opts),\n          layoutQa: runSlideLayoutQa\n            ? (slideList: Array<{ html: string }>) =>\n                runSlideLayoutQa(slideList, { threshold: 400 })\n            : undefined,\n          visionQa: runSlideVisionQa\n            ? (slideList: Array<{ html: string; title?: string }>) =>\n                runSlideVisionQa(slideList, {\n                  judge: buildSlideVisionJudge(options.modelOptions),\n                })\n            : undefined,\n        });\n      } catch (bespokeErr: any) {\n        console.warn(\n          `[SlideProductionWorkflow] Bespoke engine failed: ${bespokeErr?.message || bespokeErr} — falling back to the slot pipeline.`\n        );\n        onProgress?.('@illustrator', '⚠️ Engine tự viết HTML lỗi — chuyển sang pipeline slot (theo cụm)...', {\n          type: 'warning',\n        });\n      }\n    }\n  }\n\n  const hybridResult = bespokeResult\n    ? null\n    : engineRequested === 'hybrid'\n      ? await runHybridPipeline({\n          lessonFlow,\n          blueprintPrompt,\n          skillPrompt,\n          stylePresetId,\n          language,\n          languageDirective,\n          headingDirective,\n          maxRetries,\n          options,\n          onProgress,\n          buildSlotsPrompt: (subset?: any[]) => {\n            try {\n              const build = presentationKitCore?.buildLayoutPromptDefinition || presentationKitCore?.buildBespokeSkeletonSlotsPrompt;\n              return typeof build === 'function' ? build(subset) : '';\n            } catch {\n              return '';\n            }\n          },\n        }).catch((hybridErr: any) => {\n          // Hybrid exhausted its attempts → automatic chunked fallback. A\n          // mid-flight fallback (HybridFallbackSignal) carries the validated\n          // blueprint — the chunked path below must reuse it, not re-roll it.\n          if (hybridErr instanceof HybridFallbackSignal) {\n            console.warn(`[SlideProductionWorkflow] Hybrid engine fell back: ${hybridErr.message} — blueprint salvaged (${hybridErr.blueprint.length} slides).`);\n            onProgress?.('@illustrator', `♻️ Hybrid chuyển per-cluster — giữ dàn ý đã duyệt (${hybridErr.blueprint.length} slides)...`);\n            return { slides: [], blueprint: hybridErr.blueprint } as HybridPipelineOutput;\n          }\n          console.warn(`[SlideProductionWorkflow] Hybrid engine failed: ${hybridErr?.message || hybridErr} — falling back to chunked pipeline.`);\n          onProgress?.('@illustrator', `⚠️ Hybrid engine lỗi — chuyển sang chunked pipeline (per-cluster)...`, { type: 'warning' });\n          return null;\n        })\n      : null;\n\n  if (bespokeResult) {\n    blueprintItems = bespokeResult.blueprint;\n    engineUsed = 'bespoke';\n    allGeneratedSlides = bespokeResult.slides.map((s: any, idx: number) => ({\n      id: s.id || `slide-${idx + 1}`,\n      title: s.title,\n      html: s.html,\n      notes: s.notes || '',\n    }));\n  } else if (hybridResult && hybridResult.slides.length > 0) {\n    // (slides.length > 0: a mid-flight hybrid fallback salvages the blueprint\n    // but no slides — that case routes into the chunked branch below.)\n    blueprintItems = hybridResult.blueprint;\n    // Keep the WHOLE slide object: the hybrid contract allows flat slot keys on\n    // the root (the deck model emits `kicker`, `items`, `cards`… outside\n    // `slots` — observed live 2026-09-30). Picking fields here silently dropped\n    // them and Step-3 materialization rendered empty shells.\n    allGeneratedSlides = hybridResult.slides.map((s, idx) => ({\n      ...s,\n      id: s.id || `slide-${idx + 1}`,\n      title: s.title,\n      slots: s.slots || {},\n      notes: s.notes || '',\n    }));\n  } else {\n    engineUsed = 'chunked';\n\n    // ─────────────────────────────────────────────────────────────────────────\n    // CHUNKED STEP 1: Ingest Lesson Flow & Generate Blueprint\n    // ─────────────────────────────────────────────────────────────────────────\n    const countLabel = `${effectiveTargetSlideCount} `;\n    onProgress?.('@illustrator', `[1/4] Phân tích mạch bài giảng LESSON & Lập Dàn ý ${countLabel}Slides...`);\n\n    blueprintItems = hybridResult?.blueprint?.length\n      ? hybridResult.blueprint // kit 1.5.38: a mid-flight hybrid fallback carries its validated blueprint — reuse it (keeps the deck-wide layout assignment, saves one blueprint call)\n      : await pRetry(\n      async () => {\n        let items: any[] | null = null;\n        try {\n          items = await inferStructured(\n            SlideBlueprintArraySchema,\n            '',\n            blueprintPrompt,\n            options,\n            'blueprint'\n          );\n        } catch (err) {\n          // Truncated blueprint: a verbatim retry re-burns the budget (1.5.33).\n          // Abort pRetry; the engine fallback chain takes over.\n          if (err instanceof SplitBatchSignal) throw new AbortError(err);\n          throw err;\n        }\n        if (!items || items.length === 0) {\n          throw new Error('Blueprint generation returned empty or schema-invalid output');\n        }\n        // Normalize indexes + clusters\n        return normalizeBlueprintItems(items as any);\n      },\n      {\n        retries: maxRetries - 1,\n        onFailedAttempt: (err) => {\n          onProgress?.('@illustrator', `⚠️ Blueprint attempt ${err.attemptNumber}/${maxRetries} failed — retrying...`, {\n            type: 'warning',\n          });\n        },\n      }\n    );\n\n    // ─────────────────────────────────────────────────────────────────────────\n    // CHUNKED STEP 2: Partition into Clusters and Generate in Chunky Batches\n    // ─────────────────────────────────────────────────────────────────────────\n    // ── BUDGET-PACKED BATCHES ────────────────────────────────────────────────\n    // Batch size is driven by ESTIMATED OUTPUT TOKENS, not a fixed slide count:\n    // a 4-6 slide cluster can still ask for more than a 32k backend will return\n    // (code + presenter notes are expensive). Content order and blueprint\n    // clusters are preserved; a cluster too big for one call is split.\n    const batches = packSlideBatches(blueprintItems, {\n      estimate: (item) => estimateSlideAuthoringTokens(item as any, 'slots'),\n      clusterIdOf: (item) => (item as any).clusterId,\n      maxSlidesPerTurn: resolveMaxSlidesPerTurn(options),\n    });\n    if (batches.length > 1) {\n      onProgress?.('@illustrator', `[2/4] ${blueprintItems.length} slides → ${batches.length} lượt sinh (mỗi lượt ≤ ${SLIDE_CALL_OUTPUT_BUDGET} token output)...`);\n    }\n\n    allGeneratedSlides = [];\n\n    const authorBatch = async (batch: SlideBatch<SlideBlueprintItem>, depth: number): Promise<any[]> => {\n      const clusterList = batch.clusterIds.length > 0 ? batch.clusterIds.join(',') : String(batch.index);\n      const clusterTitle = (batch.items[0] as any)?.clusterTitle || `Giai đoạn ${batch.index}`;\n      const phaseNames = new Set(batch.items.map((s) => s.lessonPhase.toLowerCase()));\n      const matchingPhases = lessonFlow.phases.filter((p) => phaseNames.has(p.phaseName.toLowerCase()));\n      const lessonExcerpt = matchingPhases.length > 0\n        ? matchingPhases.map((p) => `### ${p.phaseName}\\n${p.content}`).join('\\n\\n')\n        : lessonFlow.rawContent.slice(0, 3500);\n\n      const clusterLayoutIds = Array.from(new Set(batch.items.map((s) => s.layoutId).filter(Boolean)));\n      const slotsPrompt = (() => {\n        try {\n          const fn = presentationKitCore?.buildLayoutPromptDefinition || presentationKitCore?.buildBespokeSkeletonSlotsPrompt;\n          return typeof fn === 'function' ? fn(clusterLayoutIds) : '';\n        } catch {\n          return '';\n        }\n      })();\n\n      const { systemPrompt, userPrompt } = buildSlideBatchPrompt({\n        clusterId: batch.index,\n        clusterTitle,\n        clusterSlides: batch.items,\n        lessonFlow,\n        lessonExcerpt,\n        skillPrompt,\n        language,\n        languageDirective,\n        headingDirective,\n        groundContext: options.groundContext,\n        designBrief: buildDesignBrief(stylePreset, stylePresetId),\n        density: options.density,\n        slotsPrompt,\n      });\n\n      try {\n        // Per-batch schema: GeneratedSlideArraySchema + a decode-time budget\n        // refinement driven by the preset contracts (presentation-kit ≥0.4).\n        // A slide grossly over/under its slot budgets fails HERE — the pRetry\n        // loop re-asks with the schema issues in the error message — instead of\n        // being discovered by the post-hoc audit after the whole deck landed.\n        // Tolerance 3 keeps free-pool small drift from nuking a whole batch.\n        const budgetRefine = presentationKitAi?.isSlideWithinBudget\n          ? (s: any) => presentationKitAi.isSlideWithinBudget(s, 3)\n          : undefined;\n        const batchSchema = budgetRefine\n          ? GeneratedSlideArraySchema.superRefine((slidesArr, ctx) => {\n              slidesArr.forEach((slide, idx) => {\n                if (!budgetRefine(slide)) {\n                  ctx.addIssue({\n                    code: z.ZodIssueCode.custom,\n                    path: [idx],\n                    message: `slide ${idx + 1} violates its ${slide.layoutId} slot budgets (fill floors, respect ceilings) — see the OUTPUT SCHEMA word bands`,\n                  });\n                }\n              });\n            })\n          : GeneratedSlideArraySchema;\n        return await pRetry(\n          async () => {\n            let slides: any[] | null = null;\n            try {\n              slides = await inferStructured(\n                batchSchema,\n                systemPrompt,\n                userPrompt,\n                options,\n                `batch-${batch.index}${depth > 0 ? `-d${depth}` : ''}-clusters[${clusterList}]`\n              );\n            } catch (err) {\n              // Truncated call (finish=length) → retrying verbatim re-burns the\n              // whole budget (kit 1.5.33): abort the pRetry loop NOW; the outer\n              // authorBatchesWithSplit splits this batch in half immediately.\n              if (err instanceof SplitBatchSignal) {\n                onProgress?.('@illustrator', `✂️ Lượt ${batch.index} bị cắt ở trần token — chia đôi ngay thay vì retry...`, { type: 'warning' });\n                throw new AbortError(err);\n              }\n              throw err;\n            }\n            if (!slides || slides.length === 0) {\n              throw new Error(`Batch ${batch.index} returned empty or schema-invalid output`);\n            }\n            return slides;\n          },\n          {\n            retries: maxRetries - 1,\n            onFailedAttempt: (err) => {\n              onProgress?.('@illustrator', `⚠️ Lượt ${batch.index} lần ${err.attemptNumber}/${maxRetries} lỗi — retry riêng lượt này...`, {\n                type: 'warning',\n              });\n            },\n          }\n        );\n      } catch (err) {\n        // Halving is the caller's job (authorBatchesWithSplit) — surface the\n        // SplitBatchSignal as-is so the halving happens without further delay.\n        throw err;\n      }\n    };\n\n    // Budget strategy's safety net (shared with the bespoke engine): a batch that\n    // permanently fails is split in half and each half retried.\n    const { slides: generated, failed } = await authorBatchesWithSplit(batches, authorBatch, onProgress);\n    allGeneratedSlides = generated;\n    if (failed.length > 0) {\n      throw new Error(`[SlideProductionWorkflow] ${describeFailedBatches(failed, batches.length, maxRetries)}`);\n    }\n  }\n\n  // ───────────────────────────────────────────────────────────────────────────\n  // STEP 3 (shared): Deck Normalization, Assembly & HTML Compilation (0 LLM)\n  // ───────────────────────────────────────────────────────────────────────────\n  onProgress?.('@illustrator', `[3/4] Chuẩn hóa bố cục và biên dịch 1920×1080 Stage Deck (${allGeneratedSlides.length} slides)...`);\n\n  const normalizer = presentationKitCore?.normalizeSlideSlots;\n  const normalizedSlides = allGeneratedSlides.map((s, idx) => {\n    const base = normalizer ? normalizer(s) : s;\n    if (!base.id) base.id = `slide-${idx + 1}`;\n    // pk's normalizeSlideSlots FLATTENS {slots:{...}} onto the root and deletes\n    // the slots key — the returned object IS the slot bag. Point base.slots back\n    // at it BEFORE materializing, or the renderer receives an empty bag and\n    // emits shell markup with every slot empty (hybrid decks rendered blank,\n    // 2026-09-30). The merge order keeps legacy in-slide slot keys winning.\n    if (!base.slots || typeof base.slots !== 'object' || Object.keys(base.slots).length === 0) {\n      const reserved = new Set(['id', 'title', 'layoutId', 'skeleton', 'html', 'notes', 'slots']);\n      const flatSlots: Record<string, any> = {};\n      for (const [k, v] of Object.entries(base)) {\n        if (!reserved.has(k) && v !== undefined) flatSlots[k] = v;\n      }\n      if (Object.keys(flatSlots).length > 0) base.slots = flatSlots;\n      else base.slots = {};\n    }\n    // The renderer reads heading text from slots.title, but pk's normalizer\n    // strips the slide title from the slot bag. Backfill it — an empty <h1>\n    // on a non-bespoke slide is a shipped defect (verified live 2026-09-30:\n    // 17/18 hybrid slides rendered with full slot content but empty heads).\n    if (SLOTS_MODE_LAYOUTS.has(String(base.layoutId)) && typeof base.title === 'string' && base.title.trim()) {\n      base.slots = { ...base.slots, title: base.title };\n    }\n    // Option C: a slots-mode layoutId with no html yet is materialized HERE too\n    // (non-bespoke paths and repair merges), so every downstream consumer —\n    // contract audit, image/icon fulfilment, compilation — sees markup.\n    if (typeof base.html !== 'string' || !base.html.trim()) {\n      const item = blueprintItems[idx];\n      const skeleton = SLOTS_MODE_LAYOUTS.has(String(base.layoutId || item?.layoutId))\n        ? String(base.layoutId || item?.layoutId)\n        : null;\n      if (skeleton && typeof renderSkeleton === 'function') {\n        base.html = renderSkeleton(skeleton, base.slots || {});\n      }\n    }\n    return base;\n  });\n\n  const firstPassAudit = bespokeResult?.firstPassAudit;\n  const deckJson = {\n    id: `deck-${lessonCode}`,\n    title: lessonTitle,\n    theme: brandTheme || stylePresetId,\n    density: options.density,\n    // Renderer contract stamp: lets tooling detect decks compiled by an older\n    // engine (recompile-after-upgrade, like the 2026-09-25 CSS fixes required).\n    engineVersion: presentationKitVersion,\n    slides: normalizedSlides,\n    ...(firstPassAudit ? { audit: { firstPass: firstPassAudit } } : {}),\n  };\n\n  // ── Deck contract audit (0 LLM): the unified layout registry is the single\n  // source of truth. Missing required slots = defect to surface now; budget\n  // overflow = warning (the prompt's budgets are advisory, the renderer clamps).\n  try {\n    const { validateDeckAgainstPresets } = presentationKitAi;\n    const contractIssues = validateDeckAgainstPresets(deckJson as any);\n    if (contractIssues.length > 0) {\n      const errors = contractIssues.filter((i: any) => i.rule === 'MISSING_REQUIRED_SLOT' || i.rule === 'UNKNOWN_LAYOUT');\n      const warnings = contractIssues.filter((i: any) => i.rule.startsWith('OVER_BUDGET') || i.rule.startsWith('UNDER_BUDGET'));\n      if (errors.length > 0) {\n        onProgress?.('@illustrator', `[3/4] ⚠️ Deck contract: ${errors.length} lỗi cấu trúc — ${errors.slice(0, 3).map((i: any) => `slide ${i.slideIndex}: ${i.message}`).join('; ')}`);\n      }\n      if (warnings.length > 0) {\n        onProgress?.('@illustrator', `[3/4] 📏 Deck contract: ${warnings.length} vượt budget nội dung — ${warnings.slice(0, 3).map((i: any) => `slide ${i.slideIndex}: ${i.message}`).join('; ')}`);\n        // Calibration tripwire: đo live 2026-09-25 (free pool, tiếng Việt) —\n        // model đếm từ dày hơn tiếng Anh nên 60% slides overshoot 2–13 từ là\n        // NOISE, không phải lệch calibration (renderer wrap tốt, C3b chứng minh).\n        // Ngưỡng 65%: chỉ bắn khi gần như toàn bộ deck lệch cùng chiều.\n        const badSlides = new Set(warnings.map((i: any) => i.slideIndex));\n        if (badSlides.size > Math.max(3, deckJson.slides.length * 0.65)) {\n          onProgress?.('@illustrator', `[3/4] ⚠️ ${badSlides.size}/${deckJson.slides.length} slides vượt budget — prompt word-budget có thể lệch calibration với model hiện tại.`);\n        }\n      }\n      (deckJson as any).audit = { ...(deckJson.audit || {}), contract: contractIssues };\n\n      // ── Auto-repair: ONE bounded LLM round for budget-flagged slides ──────\n      // The audit messages already carry the fix (\"is 14 words (budget 10) —\n      // trim ~4\"); re-authoring ONLY the flagged slides through the standard\n      // batch prompt (as a single synthetic cluster) reuses the canonical slot\n      // contract instead of inventing a new prompt shape. Merge policy:\n      // per-slot accept-the-repair only when the new content lands closer to\n      // its budget than the old — a repair turn is model output too, it can\n      // miss. Max 1 round by design: diminishing returns, wall-clock guard.\n      const repairable = contractIssues.filter(\n        (i: any) => (i.rule === 'OVER_BUDGET_WORDS' || i.rule === 'UNDER_BUDGET_WORDS') && typeof i.slideIndex === 'number'\n      );\n      const repairIdx = [...new Set(repairable.map((i: any) => i.slideIndex))] as number[];\n      // Guard 0.6 deck (was ½): live run 2026-09-25 hit 60% flagged and got\n      // skipped — exactly the case repair is for (mild per-slide overshoot,\n      // one batch call fixes). Above 0.6 it IS calibration drift; tripwire wins.\n      if (repairIdx.length > 0 && repairIdx.length <= Math.ceil(normalizedSlides.length * 0.6) && presentationKitAi) {\n        try {\n          onProgress?.('@illustrator', `[3/4] 🔁 Auto-repair: gửi lại ${repairIdx.length} slides vượt/thiếu budget (1 vòng)...`);\n          const flagged = repairIdx.map((n) => ({ slide: normalizedSlides[n - 1], issues: repairable.filter((i: any) => i.slideIndex === n) }));\n          const blueprintItems = flagged.map(({ slide, issues }, k) => ({\n            slideIndex: k + 1,\n            clusterId: 1,\n            clusterTitle: 'Budget repair',\n            lessonPhase: (slide as any).lessonPhase || 'Content',\n            layoutId: (slide as any).layoutId,\n            title: (slide as any).title,\n            pedagogicalGoal: `REPAIR this slide's own content. Preserve its language, meaning and TEACHING INTENT; change ONLY the length. Current audit: ${issues.map((i: any) => i.message).join(' | ')}.`,\n            contentFocus: [] as string[],\n            codeSnippetIntent: (slide as any)?.slots?.code ? 'Keep the existing code exactly as-is.' : undefined,\n            visualIntent: undefined,\n          }));\n          const repairLayoutIds = Array.from(new Set(blueprintItems.map((s) => s.layoutId).filter(Boolean)));\n          const slotsPrompt = (() => {\n            try {\n              const fn = presentationKitCore?.buildLayoutPromptDefinition || presentationKitCore?.buildBespokeSkeletonSlotsPrompt;\n              return typeof fn === 'function' ? fn(repairLayoutIds) : '';\n            } catch {\n              return '';\n            }\n          })();\n\n          const { systemPrompt, userPrompt } = buildSlideBatchPrompt({\n            clusterId: 1,\n            clusterTitle: 'Budget repair',\n            clusterSlides: blueprintItems as any,\n            lessonFlow,\n            lessonExcerpt: flagged.map(({ slide }) => JSON.stringify({ title: (slide as any).title, slots: (slide as any).slots })).join('\\n'),\n            skillPrompt,\n            language,\n            languageDirective,\n            groundContext: options.groundContext,\n            designBrief: buildDesignBrief(stylePreset, stylePresetId),\n            density: options.density,\n            slotsPrompt,\n          });\n          let repaired: any[] | null = null;\n          try {\n            repaired = await inferStructured(GeneratedSlideArraySchema, systemPrompt, userPrompt, options, 'budget-repair');\n          } catch (err) {\n            // Best-effort repair turn (1.5.33): a truncation just skips the\n            // repair; the oversized slides keep their originals.\n            if (!(err instanceof SplitBatchSignal)) throw err;\n            repaired = null;\n          }\n          if (Array.isArray(repaired) && repaired.length > 0) {\n            // Accept a repaired slide only when it carries FEWER budget issues\n            // than the original — the repair turn is model output too.\n            const issueCount = (slide: any) => {\n              try {\n                const probe = { slides: [slide] } as any;\n                return presentationKitAi.validateDeckAgainstPresets(probe).filter(\n                  (i: any) => i.rule === 'OVER_BUDGET_WORDS' || i.rule === 'UNDER_BUDGET_WORDS'\n                ).length;\n              } catch { return Infinity; }\n            };\n            let accepted = 0;\n            for (let k = 0; k < flagged.length; k++) {\n              const cand = repaired[k];\n              if (!cand || cand.layoutId !== flagged[k].slide.layoutId) continue;\n              const before = issueCount(flagged[k].slide);\n              const after = issueCount({ ...flagged[k].slide, slots: cand.slots || {} });\n              if (after < before) {\n                flagged[k].slide.slots = cand.slots;\n                accepted += 1;\n              }\n            }\n            onProgress?.('@illustrator', `[3/4] 🔁 Auto-repair: nhận ${accepted}/${flagged.length} slide sửa (validator chấm gần budget hơn).`);\n          } else {\n            onProgress?.('@illustrator', `[3/4] 🔁 Auto-repair: không nhận được bản sửa — giữ nội dung hiện tại.`, { type: 'warning' });\n          }\n        } catch (repairErr: any) {\n          console.warn('[SlideProductionWorkflow] budget auto-repair failed (kept current content):', repairErr?.message || repairErr);\n        }\n      }\n    }\n  } catch {\n    // Contract validation must never block compilation.\n  }\n\n  // ── Icon repair-pass (1 LLM call): slot icon model bỏ trống thì PHA 0 của\n  // fulfil không có gì để fill — xin LLM viết query trước, rồi PHA 0 (idempotent)\n  // biến query thành SVG. Best-effort, never blocking.\n  try {\n    const iconRepair = await repairEmptyIconSlots(deckJson as any, {\n      modelOptions: options.modelOptions,\n      onProgress: (msg) => onProgress?.('@illustrator', msg),\n    });\n    if (iconRepair.repaired > 0) {\n      onProgress?.('@illustrator', `[3/4] 🔧 Icon repair-pass: ghi query cho ${iconRepair.repaired}/${iconRepair.missing} slot bỏ trống.`);\n    }\n  } catch (err: any) {\n    console.warn('[SlideProductionWorkflow] icon repair-pass skipped:', err?.message || err);\n  }\n\n  // ── Image fulfilment (0 LLM): slide image slots carry SEARCH QUERIES — find\n  // real stock photos (Pexels→Pixabay), download, inline as data-URI so the\n  // deck stays self-contained (findExternalReferences must stay empty).\n  // Never blocking: no key / network error / no hit → slot keeps its query and\n  // the preset renders the no-image layout. Also idempotent for re-runs.\n  try {\n    const imgResult = await fulfillSlideImageSlots(deckJson as any, {\n      onProgress: (msg) => onProgress?.('@illustrator', msg),\n      genContext: { lessonTitle: lessonTitle },\n    });\n    if (imgResult.filled > 0) {\n      onProgress?.('@illustrator', `[3/4] 🖼️  Đã nhúng ${imgResult.filled} ảnh stock vào deck (tự chứa, không URL ngoài).`);\n    }\n  } catch (err: any) {\n    console.warn('[SlideProductionWorkflow] image fulfilment skipped:', err?.message || err);\n  }\n\n  let compiledHtml: string | undefined;\n  try {\n    let compiled: any = null;\n    // PREFERRED: the Node-only standalone compiler — embeds the fonts and\n    // inlines the layout utilities, so the deck renders with its real\n    // typography and layout on a machine with NO network (a learner opening an\n    // exported artifact, an air-gapped classroom, or a CSP-blocked iframe).\n    try {\n      // Specifier is assembled at runtime ON PURPOSE: the /node entry is an\n      // OPTIONAL capability (presentation-kit ≥ this release). A static import\n      // would make bundlers fail the whole module against an older kit, when the\n      // correct behaviour is to fall through to the link-based compiler.\n      const nodeEntry = '@thanh01.pmt/presentation-kit' + '/node';\n      const kitNode: any = await import(/* @vite-ignore */ nodeEntry);\n      // Prefer the async variant: same self-contained deck plus Shiki token\n      // colours. Without it every code card shipped unhighlighted.\n      if (typeof kitNode?.compileStandaloneHtmlDeckAsync === 'function') {\n        compiled = await kitNode.compileStandaloneHtmlDeckAsync(deckJson, { density: options.density });\n      } else if (typeof kitNode?.compileStandaloneHtmlDeck === 'function') {\n        compiled = kitNode.compileStandaloneHtmlDeck(deckJson, { density: options.density });\n      }\n    } catch {\n      // Older presentation-kit without the /node entry — fall through.\n    }\n    // Fallbacks (only when the standalone path is unavailable): async compiler\n    // (Shiki highlighting), then the sync one.\n    if (!compiled?.html && typeof presentationKitCore?.compileHtmlDeckAsync === 'function') {\n      compiled = await presentationKitCore.compileHtmlDeckAsync(deckJson);\n    }\n    if (!compiled?.html && typeof presentationKitCore?.compileHtmlDeck === 'function') {\n      compiled = presentationKitCore.compileHtmlDeck(deckJson);\n    }\n    if (compiled?.html) {\n      compiledHtml = compiled.html;\n      if (Array.isArray(compiled.embeddedFonts) && compiled.embeddedFonts.length > 0) {\n        onProgress?.('@illustrator', `[4/4] Deck tự chứa: nhúng font ${compiled.embeddedFonts.join(', ')}, không phụ thuộc mạng.`);\n      }\n    }\n  } catch (compErr: any) {\n    console.warn(`[SlideProductionWorkflow] Failed compiling HTML deck:`, compErr?.message || compErr);\n  }\n\n  const markdownWrapper = `---\nid: \"SLIDE_${lessonCode}\"\ntitle: \"${lessonTitle}\"\ntype: \"SLIDE\"\nformat: \"html-deck\"\nengine: \"html\"\nphase: \"P2\"\ndeliverable: \"P2-T09\"\nversion: \"v2.0\"\ndate: \"${new Date().toISOString().split('T')[0]}\"\n---\n\n\\`\\`\\`json\n${JSON.stringify(deckJson, null, 2)}\n\\`\\`\\`\n`;\n\n  onProgress?.('@illustrator', `[4/4] Hoàn tất bộ trình chiếu HTML đạt chuẩn Fixed 16:9 Stage!`);\n\n  return {\n    deckJson,\n    compiledHtml,\n    markdownWrapper,\n    blueprint: blueprintItems,\n    slideCount: normalizedSlides.length,\n    engine: engineUsed,\n    ...(firstPassAudit ? { firstPassAudit } : {}),\n  };\n}\n","import { z } from 'zod';\n\n// ─── Shared sub-schemas ───────────────────────────────────────────────────────\n\nexport const LearningObjectiveRowSchema = z.object({\n  code: z.string().describe('LO code, e.g. \"LO1\"'),\n  objective: z.string().describe('Bloom-tagged learning objective'),\n  evidence: z.string().describe('Observable student evidence / output'),\n  successCriteria: z.string().describe('Measurable pass/fail condition'),\n  /**\n   * Standards anchors (Phase 1: optional). Format: \"statementId\" or\n   * \"packId:statementId\", e.g. \"csta-k12-2017:1B-AP-10\". IDs MUST exist in an\n   * adopted Framework Pack — the Standards Coverage Gate resolves and audits them.\n   */\n  standardRefs: z.array(z.string()).optional().default([]).describe('Anchoring standard statement IDs from adopted Framework Packs'),\n  /** Ontora knowledge-tree anchors, e.g. \"ontora:WHILE_LOOP\" (optional, Phase 1). */\n  conceptRefs: z.array(z.string()).optional().default([]).describe('Anchoring ontora concept codes, e.g. \"ontora:FOR_LOOP\"'),\n});\n\nexport const ActivitySeqRowSchema = z.object({\n  seq: z.coerce.number().int(),\n  phase: z.string().describe('EDP or 5E phase label'),\n  activityType: z.string().describe('e.g. \"Mini-lecture\", \"Brainstorming\", \"Hands-on Coding\"'),\n  actor: z.string().describe('\"Teacher\" | \"Students\" | \"Teacher + Students\"'),\n  purpose: z.string().describe('Why this activity is done'),\n  studentAction: z.string(),\n  teacherMove: z.string(),\n  outputEvidence: z.string(),\n  lo: z.array(z.string()).describe('e.g. [\"LO1\",\"LO2\"]'),\n  durationMinutes: z.coerce.number().default(10),\n  artifactContract: z.string().describe('Satellite artifact(s) linked, e.g. \"SLIDE_U03_M01_L13\"'),\n});\n\nexport const ResourceMapRowSchema = z.object({\n  resourceType: z.string().describe('\"Slide Deck\" | \"Handout\" | \"Starter Code\" | \"Lab Tools\" | etc.'),\n  identifier: z.string(),\n  description: z.string(),\n  location: z.string().default(''),\n});\n\nexport const AssessmentMapRowSchema = z.object({\n  form: z.string().describe('\"Formative Checkpoint\" | \"Summative Assessment\" | \"Peer Feedback\"'),\n  when: z.string().describe('When in the sequence this is assessed'),\n  tool: z.string().describe('Assessment tool or artifact used'),\n  criteria: z.string(),\n  performanceLevels: z.string().default(''),\n  remediationPath: z.string().default(''),\n});\n\nexport const ArtifactContractRowSchema = z.object({\n  artifactId: z.string(),\n  artifactType: z.string(),\n  description: z.string(),\n  requiredSections: z.string().default(''),\n  format: z.string().default(''),\n  owner: z.string().default(''),\n});\n\nexport const LessonFlowPhaseSchema = z.object({\n  phase: z.string().describe('Phase title, e.g. \"ASK\", \"ENGAGE\", \"PLAN\"'),\n  durationMinutes: z.coerce.number(),\n  content: z.string().describe('Full narrative content of this phase (teacher actions, student actions, code, outputs)'),\n});\n\nexport const TroubleshootingRowSchema = z.object({\n  issue: z.string(),\n  potentialCause: z.string(),\n  solution: z.string(),\n});\n\n// ─── Shared base for both Lesson models ──────────────────────────────────────\n\nconst LessonBaseSchema = z.object({\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().default('en'),\n  estimatedDuration: z.string().describe('e.g. \"90 minutes\"'),\n  projectObjective: z.string(),\n  materials: z.string().default(''),\n  learningObjectives: z.array(LearningObjectiveRowSchema).min(1),\n  activitySequence: z.array(ActivitySeqRowSchema).min(1),\n  resourceMap: z.array(ResourceMapRowSchema).default([]),\n  assessmentMap: z.array(AssessmentMapRowSchema).default([]),\n  artifactContract: z.array(ArtifactContractRowSchema).default([]),\n  lessonFlow: z.array(LessonFlowPhaseSchema).min(1),\n  teacherNotes: z.string().optional().default(''),\n  troubleshooting: z.array(TroubleshootingRowSchema).default([]),\n});\n\n// ─── LESSON_EDP: Engineering Design Process ───────────────────────────────────\n\n/**\n * Lesson Plan Schema — EDP (Engineering Design Process) Model\n * Template: LESSON_EDP_template.md\n * Phases: Ask → Imagine → Plan → Create → Test & Improve → Share & Evaluate\n */\nexport const EDPPhaseEnum = z.enum([\n  'Ask',\n  'Imagine',\n  'Plan',\n  'Create',\n  'Test & Improve',\n  'Share & Evaluate',\n]);\n\nexport const LessonPlanEDPSchema = LessonBaseSchema.extend({\n  artifactType: z.literal('LESSON_EDP').default('LESSON_EDP'),\n});\n\nexport type LessonPlanEDP = z.infer<typeof LessonPlanEDPSchema>;\n\n// ─── LESSON_5E: 5E Instructional Model ──────────────────────────────────────\n\n/**\n * Lesson Plan Schema — 5E Instructional Model\n * Template: LESSON_5E_template.md\n * Phases: Engage → Explore → Explain → Elaborate → Evaluate\n */\nexport const FiveEPhaseEnum = z.enum([\n  'Engage',\n  'Explore',\n  'Explain',\n  'Elaborate',\n  'Evaluate',\n]);\n\n/** Additional 5E-specific Lesson Flow fields */\nexport const FiveEFlowPhaseSchema = LessonFlowPhaseSchema.extend({\n  hookScenario: z.string().optional().describe('Hook story/roleplay for Engage phase (5E-specific)'),\n  openQuestion: z.string().optional().describe('Explicit guiding question posed to class'),\n  visualIllustration: z.string().optional().describe('Mermaid diagram, code, or JSON snippet for Explain phase'),\n  tieredScaffolding: z.object({\n    bronze: z.string().default(''),\n    silver: z.string().default(''),\n    gold: z.string().default(''),\n  }).optional(),\n  exitTicketQuestions: z.array(z.string()).optional(),\n});\n\nexport const LessonPlan5ESchema = LessonBaseSchema.extend({\n  artifactType: z.literal('LESSON_5E').default('LESSON_5E'),\n  lessonFlow: z.array(FiveEFlowPhaseSchema).min(1),\n  keywords: z.array(z.string()).default([]),\n}).omit({ lessonFlow: true }).extend({\n  lessonFlow: z.array(FiveEFlowPhaseSchema).min(1),\n});\n\nexport type LessonPlan5E = z.infer<typeof LessonPlan5ESchema>;\n\n// ─── Legacy LESSON schema (kept for backward compatibility) ──────────────────\n\nexport const CoreConceptSchema = z.object({\n  name: z.string(),\n  analogy: z.string().default(''),\n  technicalDepth: z.string().default(''),\n  comparisonTable: z.object({\n    headers: z.array(z.string()),\n    rows: z.array(z.array(z.string())),\n  }).optional(),\n  formulaOrRule: z.string().optional().default(''),\n});\n\nexport const LessonSectionSchema = z.object({\n  title: z.string(),\n  durationMinutes: z.coerce.number().default(15),\n  teacherActions: z.string().default(''),\n  studentActions: z.string().default(''),\n  analogies: z.array(z.string()).optional().default([]),\n  formativeCheck: z.string().optional().default(''),\n});\n\n/**\n * @deprecated Use LessonPlanEDPSchema or LessonPlan5ESchema instead.\n * Kept for backward compatibility with existing data.\n */\nexport const LessonPlanSchema = z.object({\n  artifactType: z.literal('LESSON').default('LESSON'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().default('vi'),\n  topic: z.string().default('General Topic'),\n  targetGradeOrAudience: z.string().default('Learners'),\n  overview: z.string(),\n  learningObjectives: z.array(z.object({\n    code: z.string().default('LO'),\n    name: z.string().optional().default(''),\n    description: z.string(),\n    bloomLevel: z.string().default('understand'),\n    successCriteria: z.string().optional().default(''),\n    standardRefs: z.array(z.string()).optional(),\n    conceptRefs: z.array(z.string()).optional(),\n  })).default([]),\n  prerequisites: z.string().optional().default(''),\n  materialsSummary: z.string().optional().default(''),\n  keywords: z.array(z.string()).optional().default([]),\n  hookTitle: z.string().optional().default(''),\n  hookScenario: z.string().default(''),\n  hookQuestions: z.array(z.string()).optional().default([]),\n  coreConcepts: z.array(CoreConceptSchema).optional().default([]),\n  guidedPractice: z.object({\n    title: z.string().default(''),\n    explanation: z.string().default(''),\n    codeSnippet: z.string().default(''),\n    codeLanguage: z.string().default('typescript'),\n    mermaidDiagram: z.string().optional().default(''),\n  }).optional(),\n  independentPractice: z.object({\n    title: z.string().default(''),\n    description: z.string().default(''),\n  }).optional(),\n  differentiation: z.object({\n    bronzeTier: z.string().default(''),\n    silverTier: z.string().default(''),\n    goldTier: z.string().default(''),\n  }).default({ bronzeTier: '', silverTier: '', goldTier: '' }),\n  sections: z.array(LessonSectionSchema).min(1),\n  exitTicket: z.object({\n    questionStem: z.string(),\n    expectedAnswerOrRubric: z.string().default(''),\n    metacognitivePrompt: z.string().default(''),\n  }),\n  teacherNotes: z.object({\n    commonPitfalls: z.array(z.string()).default([]),\n    troubleshootingMatrix: z.array(TroubleshootingRowSchema).default([]),\n    extensionNotes: z.string().optional().default(''),\n  }).optional().default({ commonPitfalls: [], troubleshootingMatrix: [], extensionNotes: '' }),\n});\n\nexport type LessonPlan = z.infer<typeof LessonPlanSchema>;\nexport type CoreConcept = z.infer<typeof CoreConceptSchema>;\nexport type TroubleshootingRow = z.infer<typeof TroubleshootingRowSchema>;\nexport type ActivitySeqRow = z.infer<typeof ActivitySeqRowSchema>;\nexport type LessonFlowPhase = z.infer<typeof LessonFlowPhaseSchema>;\nexport type LearningObjectiveRow = z.infer<typeof LearningObjectiveRowSchema>;\nexport type ResourceMapRow = z.infer<typeof ResourceMapRowSchema>;\nexport type AssessmentMapRow = z.infer<typeof AssessmentMapRowSchema>;\nexport type ArtifactContractRow = z.infer<typeof ArtifactContractRowSchema>;\n","import { z } from 'zod';\n\n/**\n * Activity Lab Schema — Hands-on Step-by-Step Inquiry-Based Practical Lab\n * Ported from /Users/tonypham/MEGA/ai-platform/my-mcp/_templates/ACT_template.md\n */\nexport const ActivityStepSchema = z.object({\n  stepNumber: z.coerce.number().default(1),\n  title: z.string().describe('Short descriptive title of this step'),\n  durationMinutes: z.coerce.number().default(10).describe('Estimated duration for this step'),\n  teacherInstructions: z.string().default('').describe('Guidance and checkpoint tips for the teacher'),\n  studentInstructions: z.string().describe('Direct, clear, actionable step-by-step instructions for students'),\n  checkpoint: z.string().optional().default('').describe('Clear observable checkpoint or success indicator for this step'),\n});\n\nexport const ComputationalThinkingSchema = z.object({\n  problemStatement: z.string().describe('Tình huống thực tế đầy thách thức cần giải quyết'),\n  decomposition: z.array(z.string()).describe('Các bước phân rã bài toán lớn thành các phần nhỏ'),\n  algorithmDesign: z.string().describe('Thiết kế luồng thuật toán và xử lý dữ liệu trước khi code'),\n});\n\nexport const ActiveLearningWorkflowSchema = z.object({\n  phase1Planning: z.object({\n    durationMinutes: z.coerce.number().default(15),\n    studentTask: z.string().describe('Vẽ sơ đồ, thiết kế luồng trên giấy/bảng trước khi gõ phím'),\n    teacherAction: z.string().describe('Quan sát và đặt câu hỏi gợi mở (Inquiry questions)'),\n    inquiryQuestions: z.array(z.string()).default([]),\n  }),\n  phase2Implementation: z.object({\n    durationMinutes: z.coerce.number().default(40),\n    studentTask: z.string().describe('Hiện thực hóa giải pháp qua code hoặc lắp ráp phần cứng'),\n    teacherAction: z.string().describe('Hỗ trợ khi học sinh bị tắc > 5 phút, tránh làm hộ'),\n    codeOrCommands: z.array(z.string()).default([]),\n  }),\n  phase3Debugging: z.object({\n    durationMinutes: z.coerce.number().default(15),\n    testingSteps: z.string().describe('Quy trình chạy thử nghiệm và kiểm tra đầu ra'),\n    errorAnalysis: z.string().describe('Phân tích mã lỗi và tự gỡ lỗi dựa trên bảng Troubleshooting'),\n  }),\n});\n\nexport const ActivityLabSchema = z.object({\n  artifactType: z.literal('ACT').default('ACT'),\n  lessonId: z.string().describe('Matching lesson identifier'),\n  title: z.string().describe('Activity title'),\n  language: z.string().default('vi').describe('Language code of the content, e.g. \"vi\" or \"en\"'),\n  objective: z.string().describe('Core hands-on objective of the activity'),\n  totalDurationMinutes: z.coerce.number().default(60).describe('Total estimated duration of the activity'),\n  \n  // 1. Computational Thinking Focus\n  computationalThinking: ComputationalThinkingSchema.optional(),\n\n  // 2. Bill of Materials (BOM)\n  materialsBOM: z.object({\n    hardware: z.array(z.string()).default([]).describe('Hardware boards, components, sensors, or devices required (bọc trong <!-- [HARDWARE_BOM] -->)'),\n    software: z.array(z.string()).default([]).describe('IDE, compilers, browser tools, libraries, or simulators required'),\n    consumables: z.array(z.string()).default([]).describe('Paper, pens, wires, or disposable items'),\n    otherResources: z.array(z.string()).default([]).describe('Worksheets, handouts, or reference links'),\n  }),\n\n  // 3. Constraints & Safety\n  safetyWarnings: z.array(z.string()).default([]).describe('Essential safety cautions, electrical warnings, or common hazards'),\n  designConstraints: z.array(z.string()).default([]).describe('Design constraints to stimulate creative problem solving'),\n  teacherTips: z.array(z.string()).default([]).describe('Pedagogical facilitation tips, troubleshooting tricks'),\n\n  // 4. Workflow (Phases or Steps)\n  activeLearningWorkflow: ActiveLearningWorkflowSchema.optional(),\n  steps: z.array(ActivityStepSchema).default([]).describe('Step-by-step procedure of the activity'),\n\n  // 5. Differentiation (3-Tier)\n  differentiation3Tier: z.object({\n    bronzeTier: z.string().default('').describe('Nhiệm vụ nền tảng cơ bản'),\n    silverTier: z.string().default('').describe('Nhiệm vụ ứng dụng logic nâng cao'),\n    goldTier: z.string().default('').describe('Thử thách sáng tạo mở rộng'),\n  }).optional(),\n  scaffoldingSupport: z.string().default('').describe('How to simplify for struggling students'),\n  levelUpExtension: z.string().default('').describe('Extension task for students who finish early'),\n\n  // 6. Reflection\n  reflectionQuestion: z.string().optional().default('').describe('Câu hỏi phản tư kích thích tư duy phản biện'),\n});\n\nexport type ActivityLab = z.infer<typeof ActivityLabSchema>;\nexport type ComputationalThinking = z.infer<typeof ComputationalThinkingSchema>;\nexport type ActiveLearningWorkflow = z.infer<typeof ActiveLearningWorkflowSchema>;\n","import { z } from 'zod';\n\n/**\n * Code Lab Schema — Executable Source Code, Starters, Solutions & Test Cases\n * Ported from /Users/tonypham/MEGA/ai-platform/my-mcp/_templates/LAB_TEMPLATE.md\n */\nexport const CodeSnippetSchema = z.object({\n  filename: z.string().describe('Filename with extension, e.g. main.py, App.swift, solution.ts'),\n  language: z.string().describe('Programming language identifier, e.g. python, swift, typescript, cpp'),\n  purpose: z.enum(['starter', 'solution', 'test_runner', 'scaffold']).describe('Role of this code file'),\n  content: z.string().describe('Complete, clean, runnable source code with standardized comments and docstrings'),\n  explanation: z.string().default('').describe('Explanation of key algorithmic blocks and syntax nuances'),\n});\n\nexport const LabTierTaskSchema = z.object({\n  mins: z.coerce.number().default(15),\n  objective: z.string().describe('Mục tiêu của tầng nhiệm vụ'),\n  task: z.string().describe('Mô tả nhiệm vụ cụ thể'),\n  requirement: z.string().describe('Tiêu chí hoàn thành bắt buộc'),\n});\n\nexport const CodeLabSchema = z.object({\n  artifactType: z.literal('CODE').default('CODE'),\n  lessonId: z.string().describe('Matching lesson identifier'),\n  title: z.string().describe('Code Lab title'),\n  language: z.string().default('vi').describe('Language code for human explanations, e.g. \"vi\" or \"en\"'),\n  techStack: z.array(z.string()).default([]).describe('Technologies used, e.g. [\"Python\", \"PyTorch\"] or [\"Swift\", \"SwiftUI\"]'),\n  \n  // 1. Environment & Setup\n  environmentSetup: z.object({\n    languageFramework: z.string().default(''),\n    ideEditor: z.string().default(''),\n    requiredLibraries: z.array(z.string()).default([]),\n    hardwareOrEnvConnection: z.string().optional().default(''),\n  }).optional(),\n\n  // 2. 3-Tier Differentiation Tasks\n  threeTierTasks: z.object({\n    bronze: LabTierTaskSchema,\n    silver: LabTierTaskSchema,\n    gold: LabTierTaskSchema,\n  }).optional(),\n\n  // 3. Verified Runnable Code Snippets (bọc trong <!-- [SME_MANDATE] -->)\n  starterCode: CodeSnippetSchema.describe('Starter code provided to the learner with fill-in markers or skeletons'),\n  solutionCode: CodeSnippetSchema.describe('Complete verified reference solution code'),\n  testCases: z.array(\n    z.object({\n      description: z.string().describe('What this test case verifies'),\n      input: z.string().optional().default('').describe('Input or mock parameters'),\n      expectedOutput: z.string().describe('Expected return value, output, or UI state'),\n    })\n  ).default([]).describe('Automated verification tests or validation checks'),\n\n  // 4. Troubleshooting & Debugging Matrix\n  troubleshootingMatrix: z.array(\n    z.object({\n      issue: z.string().describe('Hiện tượng lỗi runtime/compile'),\n      potentialCause: z.string().describe('Nguyên nhân tiềm ẩn'),\n      solution: z.string().describe('Giải pháp khắc phục dứt điểm'),\n    })\n  ).default([]),\n  commonBugsAndFixes: z.array(\n    z.object({\n      bugDescription: z.string().describe('Common error message or logical pitfall'),\n      solutionHint: z.string().describe('How to diagnose and fix it'),\n    })\n  ).default([]),\n\n  // 5. Submission Checklist\n  submissionChecklist: z.array(z.string()).default([]).describe('Danh mục kiểm tra hoàn thành nộp bài'),\n});\n\nexport type CodeLab = z.infer<typeof CodeLabSchema>;\nexport type CodeSnippet = z.infer<typeof CodeSnippetSchema>;\nexport type LabTierTask = z.infer<typeof LabTierTaskSchema>;\n","import { z } from 'zod';\n\n// ─── Worksheet Item ───────────────────────────────────────────────────────────\n\nexport const WorksheetItemTypeEnum = z.enum([\n  'fill_blank',         // Fill in the blanks sentence/table\n  'multiple_choice',    // Select the correct option\n  'matching',           // Match left column to right column\n  'short_answer',       // Open-ended text response\n  'code_trace',         // Trace through code and write output\n  'diagram_fill',       // Complete a circuit/flow diagram\n  'true_false',         // True or False statement\n  'ordering',           // Arrange steps/phases in correct order\n]);\n\nexport const WorksheetItemSchema = z.object({\n  itemNumber: z.coerce.number().int().default(1),\n  itemType: WorksheetItemTypeEnum,\n  prompt: z.string().describe('The question, fill-in stem, or task instruction'),\n  starterContent: z.string().optional().describe(\n    'Pre-filled content: code with blanks, table skeleton, diagram description, or matching columns'\n  ),\n  options: z.array(z.string()).optional().describe('Options for multiple_choice / true_false items'),\n  answerKey: z.string().optional().describe('Expected answer for teacher use'),\n  checkpointRequired: z.boolean().default(false).describe(\n    'If true, student must get teacher sign-off before proceeding'\n  ),\n});\n\n// ─── Worksheet Part ───────────────────────────────────────────────────────────\n\nexport const WorksheetPartSchema = z.object({\n  partNumber: z.coerce.number().int(),\n  partTitle: z.string().describe('e.g. \"Knowledge Check\", \"Guided Practice\", \"Concept Tracing\", \"Reflection\"'),\n  objective: z.string().optional().default(''),\n  items: z.array(WorksheetItemSchema).min(1),\n  checkpointInstruction: z.string().optional().describe(\n    'Instruction shown at the end of this part, e.g. \"☐ Hoàn thành Part 1 — Xin giáo viên kiểm tra\"'\n  ),\n});\n\n// ─── Full Worksheet ───────────────────────────────────────────────────────────\n\n/**\n * Worksheet Schema — Student-Facing Guided Practice Document\n * Template: WKS_template.md\n * Sections: Knowledge Check → Guided Practice → Reflection\n * (Actual lessons expand to 4-5 parts with circuit/code tasks)\n */\nexport const WorksheetSchema = z.object({\n  artifactType: z.literal('WKS').default('WKS'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().default('en'),\n\n  // Student header fields\n  studentName: z.string().optional().default(''),\n  classLabel: z.string().optional().default(''),\n\n  // Main content: array of Parts (Part 1: Knowledge Check, Part 2: Guided Practice, etc.)\n  parts: z.array(WorksheetPartSchema).min(1),\n\n  // Reflection / Computational Thinking prompts (Part 3 in template, standalone)\n  reflectionPrompts: z.array(z.string()).default([]),\n});\n\nexport type Worksheet = z.infer<typeof WorksheetSchema>;\nexport type WorksheetPart = z.infer<typeof WorksheetPartSchema>;\nexport type WorksheetItem = z.infer<typeof WorksheetItemSchema>;\n","import { z } from 'zod';\n\n/**\n * Handout Schema — Student-Facing Quick-Reference Cheat Sheet (5-Second Rule)\n * Ported from /Users/tonypham/MEGA/ai-platform/my-mcp/_templates/HANDOUT_template.md\n */\nexport const HandoutSectionSchema = z.object({\n  heading: z.string().describe('Short descriptive section heading (Max 3 levels)'),\n  summaryPoints: z.array(z.string()).describe('Scannable bullet points in second-person voice (You will...)'),\n  codeSnippet: z.string().optional().describe('Essential copy-paste ready syntax or command'),\n  tableData: z.object({\n    headers: z.array(z.string()),\n    rows: z.array(z.array(z.string())),\n  }).optional().describe('Structured table for comparisons or hardware pinouts'),\n  calloutBox: z.object({\n    type: z.string().default('key_formula'),\n    title: z.string(),\n    content: z.string(),\n  }).optional(),\n});\n\nexport const HandoutSchema = z.object({\n  artifactType: z.literal('HANDOUT').default('HANDOUT'),\n  lessonId: z.string().describe('Matching lesson identifier'),\n  title: z.string().describe('Handout title'),\n  language: z.string().default('vi').describe('Language code of the content, e.g. \"vi\" or \"en\"'),\n  tagline: z.string().default('').describe('1-sentence core takeaway'),\n\n  // 1. Core Concepts Summary\n  coreConceptsSummary: z.array(\n    z.object({\n      concept: z.string().describe('Tên khái niệm'),\n      definition: z.string().describe('Định nghĩa ngắn gọn, chuẩn 5-second'),\n    })\n  ).default([]),\n\n  // 2. Syntax & Configs Table\n  syntaxTable: z.array(\n    z.object({\n      syntax: z.string().describe('Cú pháp lệnh hoặc tên Node/Config'),\n      meaning: z.string().describe('Ý nghĩa & chức năng'),\n      example: z.string().describe('Ví dụ code hoặc cấu hình mẫu'),\n    })\n  ).default([]),\n\n  // 3. General 3-Step Problem Solving Procedure\n  problemSolvingProcedure: z.object({\n    step1Trigger: z.string().default('Xác định input/trigger kích hoạt'),\n    step2Logic: z.string().default('Xử lý logic, tính toán hoặc lọc dữ liệu'),\n    step3Output: z.string().default('Xuất kết quả, cập nhật trạng thái hoặc gửi cảnh báo'),\n  }).optional().default({\n    step1Trigger: 'Xác định input/trigger kích hoạt',\n    step2Logic: 'Xử lý logic, tính toán hoặc lọc dữ liệu',\n    step3Output: 'Xuất kết quả, cập nhật trạng thái hoặc gửi cảnh báo',\n  }),\n\n  // 4. Pro Tips\n  proTips: z.array(z.string()).default([]).describe('Mẹo thực chiến hữu ích'),\n\n  // 5. Sections & Glossary (Backward Compatibility)\n  sections: z.array(HandoutSectionSchema).default([]).describe('Scannable reference sections'),\n  glossary: z.array(\n    z.object({\n      term: z.string().describe('Technical term or acronym'),\n      definition: z.string().describe('Plain, jargon-free explanation'),\n    })\n  ).default([]).describe('Zero-jargon glossary of terms introduced in this lesson'),\n});\n\nexport type Handout = z.infer<typeof HandoutSchema>;\nexport type HandoutSection = z.infer<typeof HandoutSectionSchema>;\n","import { z } from 'zod';\n\n/**\n * Slide Deck Schema — Dynamic Micro-Pedagogy Marp Presentation Deck\n * Dynamic Sizing: 4-6 slides per core concept + opening/closing anchors (9-25+ slides)\n */\nexport const MarpSlideSchema = z.object({\n  slideNumber: z.number().int().min(1).max(60),\n  slideType: z.enum([\n    'title',\n    'agenda',\n    'review',\n    'hook',\n    'concept_def',\n    'concept_visual',\n    'concept_compare',\n    'concept_check',\n    'concept_recap',\n    'code_demo',\n    'guided_practice',\n    'activity_intro',\n    'activity_steps',\n    'checkpoint',\n    'exit_ticket',\n    'summary_next',\n    'custom',\n  ]),\n  title: z.string().describe('Slide title or headline'),\n  bloomTag: z.enum(['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create', 'None']).default('None'),\n  bulletPoints: z.array(z.string()).max(6).describe('Concise bullet points, max 15 words each'),\n  codeSnippet: z.string().optional().describe('Formatted fenced code block for demo'),\n  diagramMermaid: z.string().optional().describe('Mermaid diagram definition for visual concepts'),\n  presenterNotes: z.string().optional().describe('Teacher speaker notes hidden in presentation mode'),\n});\n\nexport const SlideDeckSchema = z.object({\n  artifactType: z.literal('SLIDE').default('SLIDE'),\n  lessonId: z.string().describe('Matching lesson identifier'),\n  title: z.string().describe('Presentation title'),\n  language: z.string().describe('Language code of the content, e.g. \"vi\" or \"en\"'),\n  marpTheme: z.string().default('gaia'),\n  slides: z.array(MarpSlideSchema).min(6).max(60).describe('Sequential Marp slides scaled dynamically by knowledge volume'),\n});\n\nexport type MarpSlide = z.infer<typeof MarpSlideSchema>;\nexport type SlideDeck = z.infer<typeof SlideDeckSchema>;\n","import { z } from 'zod';\n\n// ─── Teaching Script Phase ────────────────────────────────────────────────────\n\nexport const TeachingScriptPhaseSchema = z.object({\n  phase: z.string().describe(\n    'Phase label from GUIDE template: \"Hook / Engage\" | \"Explore / Core Concepts\" | \"Elaborate / Hands-on Activity\" | \"Evaluate / Wrap-up\"'\n  ),\n  durationRange: z.string().describe('e.g. \"5-10 minutes\"'),\n  delivery: z.string().describe('Real-world story, demo, analogy, or inquiry activity'),\n  keyPoints: z.string().describe('What to emphasize; what to skip if running late'),\n  quickCheckQuestions: z.array(z.string()).default([]).describe('2-3 rapid comprehension check questions'),\n  classroomManagement: z.string().optional().describe('Grouping, device management, seating'),\n  facilitation: z.string().optional().describe('When to intervene vs. let students struggle productively'),\n  proTips: z.string().optional().describe('Experience-based tips for this specific activity'),\n});\n\n// ─── Misconception entry ─────────────────────────────────────────────────────\n\nexport const MisconceptionSchema = z.object({\n  misconception: z.string().describe('What students often wrongly assume or confuse'),\n  counterStrategy: z.string().describe('How the teacher should explain or demonstrate the truth'),\n});\n\n// ─── Troubleshooting entry ────────────────────────────────────────────────────\n\nexport const TroubleshootingEntrySchema = z.object({\n  symptom: z.string().describe('Error message or hardware failure symptom'),\n  rootCause: z.string().describe('Why this occurs'),\n  solution: z.string().describe('Exact step to fix it'),\n});\n\n// ─── Scoring Rubric row ───────────────────────────────────────────────────────\n\nexport const ScoringRubricRowSchema = z.object({\n  criteriaName: z.string(),\n  meetsStandard: z.string().describe('Description of acceptable student performance'),\n  exceedsStandard: z.string().describe('Description of advanced mastery'),\n});\n\n// ─── Teacher Guide ────────────────────────────────────────────────────────────\n\n/**\n * Teacher Guide Schema — Pedagogical Facilitation Script\n * Template: GUIDE_template.md\n * Sections:\n *   1. Objectives & Preparation\n *   2. Teaching Script & Progression (Hook → Explore → Elaborate → Evaluate)\n *   3. Troubleshooting & FAQs\n *   4. Assessment & Differentiation Tips\n */\nexport const TeacherGuideSchema = z.object({\n  artifactType: z.literal('GUIDE').default('GUIDE'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().default('en'),\n\n  // 1. Objectives & Preparation\n  pedagogicalRationale: z.string().describe('The main instructional goal — mindset shift, not just knowledge'),\n  commonMisconceptions: z.array(MisconceptionSchema).min(1),\n  technicalChecklist: z.array(z.string()).default([]).describe(\n    'Software/hardware to install; links to have open before class'\n  ),\n\n  // 2. Teaching Script & Progression\n  teachingScript: z.array(TeachingScriptPhaseSchema).min(1).describe(\n    'Ordered phases: Hook/Engage → Explore/Core Concepts → Elaborate/Hands-on → Evaluate/Wrap-up'\n  ),\n\n  // 3. Troubleshooting & FAQs\n  troubleshootingGuide: z.array(TroubleshootingEntrySchema).min(1),\n\n  // 4. Assessment & Differentiation\n  scoringRubric: z.array(ScoringRubricRowSchema).default([]),\n  differentiationTips: z.object({\n    proficient: z.string().describe('Minimum threshold description for proficiency'),\n    advanced: z.string().describe('Extension tasks / Peer mentoring opportunities'),\n    enrichmentQuestion: z.string().optional().describe('1-2 deep-thinking questions for gifted students'),\n  }).optional(),\n});\n\nexport type TeacherGuide = z.infer<typeof TeacherGuideSchema>;\nexport type TeachingScriptPhase = z.infer<typeof TeachingScriptPhaseSchema>;\nexport type TroubleshootingEntry = z.infer<typeof TroubleshootingEntrySchema>;\nexport type Misconception = z.infer<typeof MisconceptionSchema>;\n","import { z } from 'zod';\n\n/**\n * Extension Schema — Advanced Challenges & Novel Context Problems\n */\nexport const ExtensionChallengeSchema = z.object({\n  challengeNumber: z.number().int().min(1),\n  title: z.string().describe('Catchy title for the extension project'),\n  contextDescription: z.string().describe('Novel real-world context for applying the skill'),\n  taskDescription: z.string().describe('Specific goal and requirements of the challenge'),\n  expectedDeliverable: z.string().describe('What the student produces (code, prototype, report)'),\n  hintOrGuidance: z.string().optional().describe('Open-ended exploration prompt'),\n});\n\nexport const ExtensionSchema = z.object({\n  artifactType: z.literal('EXT').default('EXT'),\n  lessonId: z.string().describe('Matching lesson identifier'),\n  title: z.string().describe('Extension title'),\n  language: z.string().describe('Language code of the content, e.g. \"vi\" or \"en\"'),\n  coreLearningObjectivePreserved: z.string().describe('The core LO that this challenge extends'),\n  challenges: z.array(ExtensionChallengeSchema).min(2).describe('At least 2 diverse extension challenges'),\n});\n\nexport type Extension = z.infer<typeof ExtensionSchema>;\n","import { z } from 'zod';\n\n/**\n * LLM-as-Judge Schema — Pedagogical & Technical Quality Audit Report\n */\nexport const QualityAuditVerdictSchema = z.enum(['PASS', 'NEEDS_REVISION', 'FAIL']);\nexport type QualityAuditVerdict = z.infer<typeof QualityAuditVerdictSchema>;\n\nexport const JudgeCriterionSchema = z.object({\n  name: z.string().describe('Criterion name, e.g. Bloom Alignment, Code Validity, Word Count Gate, Language Adherence, Step Incrementality'),\n  passed: z.boolean(),\n  score: z.number().min(0).max(100).describe('Score out of 100'),\n  feedback: z.string().describe('Constructive feedback or citation of issues'),\n});\nexport type JudgeCriterion = z.infer<typeof JudgeCriterionSchema>;\n\n/**\n * Structured Actionable Repair Prescription:\n * Used by the closed-loop autonomous repair pipeline to patch plans deterministically.\n */\nexport const ActionableRepairActionSchema = z.enum([\n  'SPLIT_STEP',\n  'REVISE_PROVISIONING',\n  'INSERT_RECAP',\n  'ADJUST_TIME_BUDGET',\n  'SUBSTITUTE_FALLBACK',\n  'REVISE_EXIT_EVIDENCE',\n]);\nexport type ActionableRepairAction = z.infer<typeof ActionableRepairActionSchema>;\n\nexport const ActionableRepairPromptSchema = z.object({\n  action: ActionableRepairActionSchema,\n  targetId: z.string().describe('ID of the session, feature, or step requiring repair, e.g. U01_M01_L02 or F1-S3'),\n  severity: z.enum(['CRITICAL', 'WARNING', 'INFO']).default('WARNING'),\n  rationale: z.string().describe('Pedagogical or technical rationale for why this repair is mandated'),\n  instruction: z.string().describe('Exact, actionable text instruction for the planner/generator in the next turn'),\n});\nexport type ActionableRepairPrompt = z.infer<typeof ActionableRepairPromptSchema>;\n\n/**\n * Stage 1: Project Graph Engineering & Toolchain Audit Schema\n */\nexport const ProjectGraphAuditSchema = z.object({\n  schema_version: z.number().default(1),\n  projectId: z.string(),\n  overallVerdict: QualityAuditVerdictSchema,\n  totalScore: z.number().min(0).max(100),\n  toolchainFeasibility: JudgeCriterionSchema.describe('Installation friction, admin rights, IDE/compiler matrix'),\n  provisioningStrategy: JudgeCriterionSchema.describe('Clear model for heavy runtimes: Pre-installed lab, Cloud instance, or Dedicated setup'),\n  hardwareRuntimeEnvelope: JudgeCriterionSchema.describe('Memory/Flash limits, pinout conflicts, hardware platform alignment'),\n  timeToHelloWorld: JudgeCriterionSchema.describe('Student time to achieve first working feedback loop (target <= 15 mins)'),\n  actionableRepairs: z.array(ActionableRepairPromptSchema).default([]),\n});\nexport type ProjectGraphAuditReport = z.infer<typeof ProjectGraphAuditSchema>;\n\n/**\n * Stage 2: Macro-Pedagogical Curriculum Plan Audit Schema\n * Evaluates the full session sequence against real classroom friction and cognitive load.\n */\nexport const MacroPedagogyPlanAuditSchema = z.object({\n  schema_version: z.number().default(1),\n  planHash: z.string(),\n  overallVerdict: QualityAuditVerdictSchema,\n  totalScore: z.number().min(0).max(100),\n  autoApproved: z.boolean().default(false).describe('True if totalScore >= 85 and overallVerdict is PASS'),\n  stepIncrementality: JudgeCriterionSchema.describe('Single leap principle: <= 1 new syntax or 1 new algorithm per step'),\n  zpdSaturation: JudgeCriterionSchema.describe('Vygotsky ZPD: <= 2 new concepts per session (K-12) / 3 (Adults), with prior anchor'),\n  frictionAdjustedBudget: JudgeCriterionSchema.describe('Student time multiplier (2.5x): total content <= 85% session minutes'),\n  epitomeViability: JudgeCriterionSchema.describe('Reigeluth Walking Skeleton: Unit 1 produces an end-to-end runnable MVP'),\n  exitEvidenceSpecificity: JudgeCriterionSchema.describe('Tangible, measurable student deliverable for every session'),\n  actionableRepairs: z.array(ActionableRepairPromptSchema).default([]),\n  summary: z.string().describe('High-level executive evaluation summary'),\n});\nexport type MacroPedagogyPlanAuditReport = z.infer<typeof MacroPedagogyPlanAuditSchema>;\n\n/**\n * Legacy SOT / Lesson Quality Report Schema (Retained for Backward Compatibility)\n */\nexport const CurriculumQualityReportSchema = z.object({\n  targetArtifactType: z.string().describe('Type of artifact audited, e.g. LESSON, ACT, CODE, WKS, SLIDE'),\n  lessonId: z.string(),\n  overallVerdict: QualityAuditVerdictSchema,\n  totalScore: z.number().min(0).max(100),\n  languageAdherencePassed: z.boolean().describe('True if content strictly matches the requested target language'),\n  criteria: z.array(JudgeCriterionSchema).min(3),\n  actionableRepairPrompts: z.array(z.string()).default([]).describe('Concrete instruction prompts to fix detected issues in the next repair turn'),\n  structuredRepairs: z.array(ActionableRepairPromptSchema).optional(),\n});\nexport type CurriculumQualityReport = z.infer<typeof CurriculumQualityReportSchema>;\n","import { z } from 'zod';\n\n/**\n * Project Profile & General Info\n */\nexport const ProjectProfileSchema = z.object({\n  id: z.string().optional(),\n  name: z.string(),\n  version: z.string().optional(),\n  purpose: z.string().optional(),\n  project_type: z.string().optional(),\n  platform: z.array(z.string()).optional().default([]),\n  tech_stack: z.union([z.record(z.array(z.string())), z.array(z.string()), z.record(z.string())]).optional().default([]),\n  architecture: z.array(z.string()).optional().default([]),\n  source: z.object({\n    repository: z.string().optional(),\n    commit: z.string().optional(),\n    scan_dir: z.string().optional(),\n  }).optional(),\n});\n\nexport type ProjectProfile = z.infer<typeof ProjectProfileSchema>;\n\n/**\n * Product Goals & User Journeys\n */\nexport const ProductGoalSchema = z.object({\n  id: z.string(),\n  description: z.string(),\n});\n\nexport const UserJourneySchema = z.object({\n  id: z.string(),\n  name: z.string(),\n  steps: z.array(z.string()).optional().default([]),\n  requirement_ids: z.array(z.string()).optional().default([]),\n});\n\n/**\n * Project Graph Schema — Full knowledge graph of a software/hardware project\n */\nexport const ProjectGraphSchema = z.object({\n  schema_version: z.number().optional().default(3),\n  project: ProjectProfileSchema,\n  product: z.object({\n    goals: z.array(ProductGoalSchema).optional().default([]),\n    users: z.array(z.any()).optional().default([]),\n    journeys: z.array(UserJourneySchema).optional().default([]),\n    requirements: z.array(z.any()).optional().default([]),\n  }).optional().default({}),\n  features: z.array(z.object({\n    id: z.string().optional(),\n    name: z.string().optional(),\n    description: z.string().optional(),\n    components: z.array(z.string()).optional().default([]),\n    requirements: z.array(z.any()).optional().default([]),\n  })).optional().default([]),\n  capabilities: z.array(z.any()).optional().default([]),\n  architecture: z.any().optional(),\n  experience: z.any().optional(),\n  data_integration: z.any().optional(),\n  implementation: z.object({\n    files: z.array(z.any()).optional().default([]),\n    symbols: z.array(z.any()).optional().default([]),\n    modules: z.array(z.any()).optional().default([]),\n  }).optional().default({}),\n  validation: z.any().optional(),\n  evidence: z.any().optional(),\n});\n\nexport type ProjectGraph = z.infer<typeof ProjectGraphSchema>;\n","import { z } from 'zod';\n\n/**\n * Step schema matching Instructable-style tutorial format from tutorial.md\n */\nexport const InstructionStepSchema = z.object({\n  stepNumber: z.string().default('1.1').describe('e.g. \"1.1\", \"1.2\"'),\n  actionTitle: z.string().describe('Action verb title, e.g. \"Create Bonjour Discovery Browser\"'),\n  explanation: z.string().describe('Explanation of why this action is performed and how it works'),\n  targetFile: z.string().optional().default('').describe('Relative path of the target file being created or edited, e.g. \"Sources/WledLib/Discovery/BonjourBrowser.swift\"'),\n  codeSnippet: z.string().optional().default('').describe('Complete or focused code snippet following grow-by-step or snippet-per-step style'),\n  codeLanguage: z.string().optional().default('swift').describe('Language for syntax highlighting, e.g. \"swift\", \"typescript\", \"cpp\", \"bash\"'),\n  tip: z.string().optional().default('').describe('Helpful operational tip or best practice'),\n  warning: z.string().optional().default('').describe('Operational gotcha or critical warning'),\n  expectedResult: z.string().default('').describe('Explicit observable output or success condition after completing this step'),\n  imagePlaceholder: z.string().optional().default('').describe('Description of visual screenshot or diagram placeholder [IMAGE: ...]'),\n});\n\nexport const InstructionSectionSchema = z.object({\n  sectionNumber: z.coerce.number().default(1),\n  title: z.string().describe('Section title'),\n  goal: z.string().describe('What the reader achieves in this section'),\n  estimatedMinutes: z.coerce.number().default(15),\n  preflightChecks: z.array(z.string()).default([]).describe('Commands or conditions to check before starting this section'),\n  steps: z.array(InstructionStepSchema).min(1),\n  rollbackOrCleanup: z.string().optional().default('').describe('How to undo or reset state if something fails'),\n});\n\nexport const ProjectInstructionSchema = z.object({\n  artifactType: z.literal('INSTRUCTION').default('INSTRUCTION'),\n  instructionId: z.string().describe('Milestone or instruction ID, e.g. \"F0-S1\"'),\n  title: z.string().describe('Tutorial title'),\n  language: z.string().describe('Target language code, e.g. \"vi\" or \"en\"'),\n  difficulty: z.string().default('intermediate'),\n  estimatedTotalMinutes: z.coerce.number().default(45).describe('Total estimated duration in minutes'),\n  scopeMode: z.string().default('milestone'),\n  milestoneRef: z.string().optional().default('').describe('Milestone code or ID'),\n  featureRef: z.string().optional().default('').describe('Feature ID or name'),\n  techStack: z.array(z.string()).default([]).describe('List of tools, SDKs, libraries'),\n  prerequisites: z.array(z.string()).default([]).describe('Prerequisites assumed before starting'),\n  materialsAndTools: z.array(z.string()).default([]).describe('Required software, SDKs, accounts, or simulators'),\n  sections: z.array(InstructionSectionSchema).min(1),\n  verificationChecklist: z.array(z.string()).default([]).describe('Final end-to-end verification checklist to confirm working implementation'),\n});\n\nexport type InstructionStep = z.infer<typeof InstructionStepSchema>;\nexport type InstructionSection = z.infer<typeof InstructionSectionSchema>;\nexport type ProjectInstruction = z.infer<typeof ProjectInstructionSchema>;\n","import { z } from 'zod';\n\n/**\n * 3-Level Progressive Hints Schema (Concept -> Skeleton -> Full Solution)\n */\nexport const ProgressiveHintsSchema = z.object({\n  hint1Concept: z.string().describe('Level 1: Gợi ý định hướng tư duy / khái niệm cốt lõi'),\n  hint2Skeleton: z.string().describe('Level 2: Khung sườn code / method signature mẫu'),\n  hint3Solution: z.object({\n    code: z.string().describe('Level 3: Lời giải code hoàn chỉnh 100% runnable'),\n    explanation: z.string().describe('Phân tích tại sao giải pháp này tối ưu và xử lý được vấn đề'),\n  }),\n});\n\n/**\n * Self-Learner Progressive Challenge Schema\n */\nexport const SelfPacedChallengeSchema = z.object({\n  tier: z.enum(['bronze', 'silver', 'gold']),\n  title: z.string().describe('Tên thử thách'),\n  estimatedMinutes: z.coerce.number().default(15),\n  objective: z.string().describe('Mục tiêu cụ thể của thử thách'),\n  tasks: z.array(z.string()).describe('Danh sách nhiệm vụ từng bước cần làm'),\n  verifyCommand: z.string().describe('Lệnh terminal hoặc test runner để tự kiểm chứng (VD: curl... hoặc swift test)'),\n  expectedOutput: z.string().describe('Kết quả mong đợi hiển thị trên terminal khi chạy đúng'),\n  hints: ProgressiveHintsSchema,\n});\n\nexport const SelfLabSchema = z.object({\n  artifactType: z.literal('SELF_LAB').default('SELF_LAB'),\n  labId: z.string().describe('Identifier matching milestone (e.g. F0-S1)'),\n  title: z.string().describe('Lab title'),\n  language: z.string().default('vi').describe('Language code of content, e.g. \"vi\" or \"en\"'),\n  difficulty: z.enum(['beginner', 'intermediate', 'advanced']).default('intermediate'),\n  estimatedTotalMinutes: z.coerce.number().default(60),\n  techStack: z.array(z.string()).default([]),\n  \n  // Mission Briefing & Preflight\n  missionBriefing: z.string().describe('Bối cảnh kịch bản và nhiệm vụ của bài lab'),\n  preflightChecklist: z.array(z.string()).default([]).describe('Danh mục kiểm tra môi trường trước khi bắt đầu'),\n\n  // 3 Progressive Challenges (Bronze -> Silver -> Gold)\n  challenges: z.object({\n    bronze: SelfPacedChallengeSchema,\n    silver: SelfPacedChallengeSchema,\n    gold: SelfPacedChallengeSchema,\n  }),\n\n  // Troubleshooting Matrix\n  troubleshootingMatrix: z.array(\n    z.object({\n      symptom: z.string().describe('Triệu chứng hoặc thông báo lỗi'),\n      rootCause: z.string().describe('Nguyên nhân gốc rễ'),\n      exactFix: z.string().describe('Hướng dẫn sửa lỗi chính xác từng bước'),\n    })\n  ).default([]),\n\n  // Final Checklist\n  finalSubmissionChecklist: z.array(z.string()).default([]).describe('Danh mục kiểm tra hoàn thành toàn bộ bài lab'),\n});\n\nexport type SelfLab = z.infer<typeof SelfLabSchema>;\nexport type SelfPacedChallenge = z.infer<typeof SelfPacedChallengeSchema>;\nexport type ProgressiveHints = z.infer<typeof ProgressiveHintsSchema>;\n","import { z } from 'zod';\n\n// ─── Quiz Assessment Objective (per template: ## Assessment Objectives) ───────\n\nexport const AssessmentObjectiveSchema = z.object({\n  aoCode: z.string().describe('Assessment Objective code, e.g. \"AO1\"'),\n  alignedLO: z.string().describe('Matched learning objective code, e.g. \"LO1\"'),\n  bloomLevel: z.enum(['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create']),\n  objective: z.string().describe('Measurable assessment objective statement'),\n  /** Standards anchors: \"statementId\" or \"packId:statementId\" from adopted Framework Packs (Phase 1: optional). */\n  standardRefs: z.array(z.string()).optional().default([]).describe('Anchoring standard statement IDs from adopted Framework Packs'),\n});\n\n// ─── Quiz Option ─────────────────────────────────────────────────────────────\n\nexport const QuizOptionSchema = z.object({\n  id: z.string().describe('Option label: \"A\" | \"B\" | \"C\" | \"D\"'),\n  text: z.string().describe('Full text of the option (may be a table row, code snippet, or sentence)'),\n  isCorrect: z.boolean().describe('True if this option is the correct answer'),\n  explanation: z.string().describe('Detailed distractor rationale or confirmation why this is correct/incorrect'),\n});\n\n// ─── Individual Question ──────────────────────────────────────────────────────\n\nexport const DiagnosticQuestionSchema = z.object({\n  id: z.string().describe('Question ID, e.g. \"Q1\"'),\n  alignedAO: z.string().optional().describe('Matched AO code(s), e.g. \"AO1, AO2\"'),\n  // Accept both PascalCase (new) and lowercase (legacy) for backward compat\n  bloomLevel: z.enum(['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create',\n                      'remember', 'understand', 'apply', 'analyze', 'evaluate', 'create']).default('Apply'),\n  questionType: z.enum(['multiple_choice', 'code_analysis', 'matching', 'open_ended']).default('multiple_choice'),\n  // scenarioOrStem: PRIMARY field — kept for backward compat with evaluators & serializers\n  scenarioOrStem: z.string().optional().describe('Legacy combined field. Evaluators read this for stem analysis.'),\n  // scenario + stem: richer decomposition for new content (both optional)\n  scenario: z.string().optional().describe('Real-world context framing the question'),\n  stem: z.string().optional().describe('The core question prompt (new authoring standard)'),\n  codeSnippet: z.string().optional().describe('Code block for code analysis questions'),\n  codeLanguage: z.string().optional().default('cpp'),\n  options: z.array(QuizOptionSchema).min(2).max(6),\n  // correctAnswer: optional for backward compat with old fixtures (legacy used isCorrect on options)\n  correctAnswer: z.string().optional().describe('Correct option id, e.g. \"A\"'),\n  teacherNote: z.string().optional().describe('Pedagogical note for assessor/teacher only'),\n  // takeawayMessage: backward-compat alias for teacherNote\n  takeawayMessage: z.string().optional().describe('@deprecated — use teacherNote. Kept for serializer backward compat.'),\n});\n\n// ─── 4-Level Competency Rubric (per template: ## Competency Rubric) ──────────\n\nexport const CompetencyRubricRowSchema = z.object({\n  competencyDimension: z.string().describe('Competency label with linked LO, e.g. \"C1: Hardware Integration (LO1)\"'),\n  developing: z.string().describe('Level 1 — does not meet standard'),\n  proficient: z.string().describe('Level 2 — meets standard'),\n  advanced: z.string().describe('Level 3 — exceeds standard'),\n  exemplary: z.string().describe('Level 4 — outstanding mastery'),\n});\n\n// ─── Full Diagnostic Quiz ─────────────────────────────────────────────────────\n\n/**\n * Diagnostic Quiz Schema — v4.6\n * Template: QUIZ_v4.6_template.md\n * Sections: Metadata → Assessment Objectives → MCQ Bank → Code Analysis → Competency Rubric\n */\nexport const DiagnosticQuizSchema = z.object({\n  artifactType: z.literal('QUIZ'),\n  quizId: z.string().describe('Matching artifact identifier, e.g. \"QUIZ_U03_M01_L13\"'),\n  title: z.string(),\n  language: z.string().default('en').describe('\"en\" or \"vi\"'),\n  totalQuestions: z.coerce.number().optional().default(5),\n  timeAllocationMinutes: z.coerce.number().optional().default(15),\n  passingScorePct: z.coerce.number().default(80),\n\n  // Assessment Objectives table (## [REQUIRED] Assessment Objectives)\n  assessmentObjectives: z.array(AssessmentObjectiveSchema).optional().default([]),\n\n  // Question bank (## [REQUIRED] Multiple-Choice + ## [REQUIRED] Code Analysis)\n  questions: z.array(DiagnosticQuestionSchema).min(1),\n\n  // Competency Rubric (## [REQUIRED] Competency Rubric)\n  rubric: z.array(CompetencyRubricRowSchema).optional().default([]),\n});\n\n// Output types (after defaults are applied — for reading/processing parsed data)\nexport type DiagnosticQuiz = z.infer<typeof DiagnosticQuizSchema>;\nexport type DiagnosticQuestion = z.infer<typeof DiagnosticQuestionSchema>;\nexport type QuizOption = z.infer<typeof QuizOptionSchema>;\nexport type AssessmentObjective = z.infer<typeof AssessmentObjectiveSchema>;\nexport type CompetencyRubricRow = z.infer<typeof CompetencyRubricRowSchema>;\n\n// Input types (for writing/authoring — fields with defaults are optional)\nexport type DiagnosticQuizInput = z.input<typeof DiagnosticQuizSchema>;\nexport type DiagnosticQuestionInput = z.input<typeof DiagnosticQuestionSchema>;\n","import { z } from 'zod';\nimport { ProjectInstructionSchema } from './instructionSchema';\nimport { SelfLabSchema } from './selfLabSchema';\nimport { DiagnosticQuizSchema } from './diagnosticQuizSchema';\nimport { HandoutSchema } from './handoutSchema';\nimport { CodeLabSchema } from './codeLabSchema';\n\n/**\n * Self-Paced Learning Bundle Schema — Autonomous Learner Package\n */\nexport const SelfPacedBundleSchema = z.object({\n  bundleId: z.string().describe('Milestone identifier (e.g. F0-S1)'),\n  title: z.string().describe('Bundle title'),\n  language: z.string().default('vi'),\n  techStack: z.array(z.string()).default([]),\n  instruction: ProjectInstructionSchema.describe('Instructable Step-by-Step Blueprint'),\n  selfLab: SelfLabSchema.describe('Self-Paced Lab with Progressive Hints & Verification Commands'),\n  quiz: DiagnosticQuizSchema.describe('Diagnostic Quiz Kit with Comprehensive Feedback'),\n  cheatSheet: HandoutSchema.describe('5-Second Rule Reference & Syntax Cheat Sheet'),\n  codeLab: CodeLabSchema.optional().describe('Code Lab with Starter & Solution Code'),\n});\n\nexport type SelfPacedBundle = z.infer<typeof SelfPacedBundleSchema>;\n","import { z } from 'zod';\n\n// ─── Rubric Criteria Row ──────────────────────────────────────────────────────\n\nexport const RubricCriteriaSchema = z.object({\n  criteriaName: z.string().describe('Criteria label, e.g. \"Circuitry\" or \"Code Correctness\"'),\n  weightPercent: z.coerce.number().int().min(1).max(100).describe('Relative weight as integer %'),\n  excellent: z.string().describe('Level 4 — Excellent performance descriptor'),\n  proficient: z.string().describe('Level 3 — Proficient performance descriptor'),\n  developing: z.string().describe('Level 2 — Developing performance descriptor'),\n  beginning: z.string().describe('Level 1 — Beginning performance descriptor'),\n});\n\n// ─── Exit Ticket (OPTIONAL within RUBRIC) ─────────────────────────────────────\n\nexport const ExitTicketQuickItemSchema = z.object({\n  question: z.string(),\n  questionType: z.enum(['multiple_choice', 'true_false', 'short_answer', 'open_ended']),\n  answerOrScoringGuide: z.string().default(''),\n});\n\n// ─── Full Rubric ──────────────────────────────────────────────────────────────\n\n/**\n * Rubric Schema — Summative / Formative Assessment Scoring Guide\n * Template: RUBRIC_template.md\n * Sections: Assessment Overview → Rubric Table → Exit Ticket → Self-Assessment Checklist\n */\nexport const RubricSchema = z.object({\n  artifactType: z.literal('RUBRIC').default('RUBRIC'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().default('en'),\n\n  // Assessment Overview\n  assessmentType: z.enum(['Formative', 'Summative', 'Self-assessment', 'Peer-review']),\n  assessmentFormat: z.enum([\n    'Short Exercise',\n    'Exit Ticket',\n    'Practical Product',\n    'Project Presentation',\n  ]),\n  targetLOs: z.array(z.string()).describe('LO codes being assessed, e.g. [\"LO1\", \"LO2\"]'),\n  targetAudience: z.enum(['Teachers', 'Students']).default('Teachers').describe(\n    '\"Teachers\" = technical/pedagogical language; \"Students\" = simple \"I can...\" language'\n  ),\n\n  // Rubric Table (weights should sum to ~100)\n  criteria: z.array(RubricCriteriaSchema).min(1),\n\n  // Optional quick exit ticket at end of session (≤3 items)\n  exitTicket: z.array(ExitTicketQuickItemSchema).max(3).optional(),\n\n  // Student self-assessment checklist\n  selfAssessmentChecklist: z.array(z.string()).optional(),\n  selfAssessmentReflection: z.string().optional().describe(\n    'Open-ended reflection prompt, e.g. \"One thing I am most proud of is:\"'\n  ),\n});\n\nexport type Rubric = z.infer<typeof RubricSchema>;\nexport type RubricCriteria = z.infer<typeof RubricCriteriaSchema>;\n","import { z } from 'zod';\n\n// ─── Exit Ticket Parts ────────────────────────────────────────────────────────\n\nexport const ExitTicketRecallPromptSchema = z.object({\n  question: z.string().describe('Conceptual scenario or analogy comparison testing core mental model'),\n  answerAreaLabel: z.string().default('Write 1-2 concise sentences'),\n});\n\nexport const ExitTicketBugHuntSchema = z.object({\n  codeSnippet: z.string().describe('4-8 line realistic code snippet containing exactly 1 bug/missing annotation'),\n  codeLanguage: z.string().default('swift'),\n  tasks: z.array(z.string()).describe(\n    'Ordered task list, e.g. [\"Identify the Compiler/Runtime Error\", \"Write the corrected line\"]'\n  ),\n  expectedBugDescription: z.string().describe('The exact error type/message students should identify'),\n  correctedLine: z.string().describe('The single corrected line of code'),\n});\n\nexport const ExitTicketMetacognitionSchema = z.object({\n  options: z.array(z.object({\n    label: z.string().describe('\"🟢 Green\" | \"🟡 Yellow\" | \"🔴 Red\"'),\n    description: z.string().describe('e.g. \"I can build and explain to a peer without hints\"'),\n  })).default([\n    { label: '🟢 Green (Mastered)', description: 'I can build and explain this concept to a peer without any hints.' },\n    { label: '🟡 Yellow (Needs Practice)', description: 'I understand the concept but got stuck on syntax or error messages.' },\n    { label: '🔴 Red (Blocked)', description: 'I need help understanding why this architecture is used.' },\n  ]),\n  lingeringQuestion: z.string().default('What is one question you still have before leaving today\\'s lab?'),\n});\n\n// ─── Full Exit Ticket ─────────────────────────────────────────────────────────\n\n/**\n * Exit Ticket Schema — Formative End-of-Session Assessment\n * Template: EXIT_TICKET_template.md\n * Sections:\n *   Target LOs\n *   Part 1: Recall & Conceptual Anchor\n *   Part 2: Application & Bug Hunt\n *   Part 3: Metacognitive Reflection & Confidence Check\n *   Scoring & Teacher Intervention Trigger\n */\nexport const ExitTicketSchema = z.object({\n  artifactType: z.literal('EXIT_TICKET').default('EXIT_TICKET'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().default('en'),\n  estimatedMinutes: z.coerce.number().default(7),\n\n  // Target Learning Objectives\n  targetLOs: z.array(z.object({\n    code: z.string().describe('LO code, e.g. \"ULO\" or \"LO1\"'),\n    loType: z.enum(['ULO', 'CIO', 'SIO']).optional(),\n    description: z.string(),\n  })),\n\n  // Part 1: Recall & Conceptual Anchor\n  recallPrompt: ExitTicketRecallPromptSchema,\n\n  // Part 2: Application & Bug Hunt\n  applicationPrompt: ExitTicketBugHuntSchema,\n\n  // Part 3: Metacognitive Reflection\n  metacognition: ExitTicketMetacognitionSchema,\n\n  // Scoring & Intervention Trigger\n  scoringGuide: z.object({\n    proficiencyThreshold: z.string().describe('e.g. \"Green/Yellow check + Correct Bug Hunt answer\"'),\n    interventionProtocol: z.string().describe('e.g. \"If ≥25% Red, start next session with 5-min Live Debug Warm-up\"'),\n  }),\n});\n\nexport type ExitTicket = z.infer<typeof ExitTicketSchema>;\nexport type ExitTicketBugHunt = z.infer<typeof ExitTicketBugHuntSchema>;\n","import { z } from 'zod';\n\n// ─── Tier Definition ──────────────────────────────────────────────────────────\n\nexport const TierLevelEnum = z.enum(['Bronze', 'Silver', 'Gold']);\n\nexport const TierObjectiveSchema = z.object({\n  tier: TierLevelEnum,\n  bloomTarget: z.string().describe('e.g. \"Remember / Understand\" | \"Apply / Analyze\" | \"Evaluate / Create\"'),\n  scaffoldingRatio: z.string().describe('e.g. \"70% Starter Code / 30% Fill-in\"'),\n  successCriteria: z.string().describe('Condition that determines tier completion'),\n});\n\n// ─── Bronze Tier ──────────────────────────────────────────────────────────────\n\nexport const BronzeTierSchema = z.object({\n  targetAudience: z.string().default('All learners (mandatory milestone)'),\n  guidingPrompt: z.string().describe('Clear instruction with references to Handout'),\n  starterCode: z.string().default('').describe('Pre-filled boilerplate code with TODO placeholders'),\n  codeLanguage: z.string().default('swift'),\n  fillInSlots: z.array(z.object({\n    todoLabel: z.string().describe('e.g. \"TODO 1 [Bronze]\"'),\n    instruction: z.string(),\n  })).default([]),\n  verificationTest: z.string().default('testBronzeBaseline()'),\n});\n\n// ─── Silver Tier ──────────────────────────────────────────────────────────────\n\nexport const SilverTierSchema = z.object({\n  targetAudience: z.string().default('Learners who completed Bronze without mentor intervention'),\n  guidingPrompt: z.string(),\n  requirements: z.array(z.string()).min(1).describe('Numbered requirements: validation, state logic, user feedback'),\n  implementationTarget: z.string().default('').describe('Skeleton or description of what to implement'),\n  codeLanguage: z.string().default('swift'),\n  verificationTest: z.string().default('testSilverLogicAndValidation()'),\n});\n\n// ─── Gold Tier ────────────────────────────────────────────────────────────────\n\nexport const GoldTierSchema = z.object({\n  targetAudience: z.string().default('Advanced learners finished ahead of schedule'),\n  architecturalChallenge: z.string().describe('Open-ended architectural task'),\n  constraints: z.array(z.string()).min(1).describe('Hard invariants, e.g. \"zero data-race under concurrent mutations\"'),\n  verificationTest: z.string().optional().default('testGoldConcurrencySafety()'),\n});\n\n// ─── Mentor Debugging Cheatsheet ─────────────────────────────────────────────\n\nexport const MentorCheatsheetSchema = z.object({\n  bronzeStumble: z.string().default('').describe('Most common Bronze mistake'),\n  silverStumble: z.string().default('').describe('Most common Silver mistake'),\n  goldDiscussionPrompt: z.string().optional().describe('Scaling / architecture discussion question'),\n});\n\n// ─── Full Tiered Practice ─────────────────────────────────────────────────────\n\n/**\n * Tiered Practice Schema — 3-Level Differentiated Practice Lab\n * Template: TIERED_PRACTICE_template.md\n * Sections:\n *   Computational Objective & Tier Matrix\n *   Bronze Tier (Foundational Scaffolding)\n *   Silver Tier (Independent Application)\n *   Gold Tier (Enrichment & Optimization)\n *   Automated Test Verification Matrix\n *   Mentor Debugging Cheatsheet\n */\nexport const TieredPracticeSchema = z.object({\n  artifactType: z.literal('TIERED_PRACTICE').default('TIERED_PRACTICE'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().default('en'),\n\n  // Tier matrix overview\n  tierMatrix: z.array(TierObjectiveSchema).length(3).describe('One entry per tier: Bronze, Silver, Gold'),\n\n  // Tier content\n  bronze: BronzeTierSchema,\n  silver: SilverTierSchema,\n  gold: GoldTierSchema,\n\n  // Test suite reference\n  testSuiteClass: z.string().optional().describe('XCTest class name, e.g. \"AlarmSystemTestSuite\"'),\n\n  // Mentor hints\n  mentorCheatsheet: MentorCheatsheetSchema.optional(),\n});\n\nexport type TieredPractice = z.infer<typeof TieredPracticeSchema>;\nexport type BronzeTier = z.infer<typeof BronzeTierSchema>;\nexport type SilverTier = z.infer<typeof SilverTierSchema>;\nexport type GoldTier = z.infer<typeof GoldTierSchema>;\n","import { z } from 'zod';\n\n// ─── Single Bell Ringer day ───────────────────────────────────────────────────\n\nexport const BellRingerDaySchema = z.object({\n  dayLabel: z.string().describe('e.g. \"Day 1 (Monday)\" or \"Day 1\"'),\n  bloomLevel: z.enum([\n    'Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create',\n  ]).optional(),\n  promptType: z.enum([\n    'mental_model_recall',\n    'code_tracing',\n    'bug_hunt',\n    'diagram_tracing',\n    'creative_synthesis',\n    'open_reflection',\n  ]).default('open_reflection'),\n  prompt: z.string().describe('The warm-up question or task shown on projector'),\n  codeSnippet: z.string().optional().describe('Code to trace or debug'),\n  codeLanguage: z.string().optional().default('cpp'),\n  answerKey: z.string().optional().describe('Teacher-facing expected answer or rubric note'),\n});\n\n// ─── Full Bell Ringer (5-day weekly pack) ────────────────────────────────────\n\n/**\n * Bell Ringer Schema — 5-Day Weekly Warm-Up Pack\n * Template: BELL_RINGER_template.md\n * Sections: Weekly Objective → Day 1-5 prompts → Answer Key\n * Time: 3-5 min each session\n */\nexport const BellRingerSchema = z.object({\n  artifactType: z.literal('BELL_RINGER'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().optional().default('en'),\n  weeklyTheme: z.string().describe('Core concept theme for the week'),\n  routineProtocol: z.string().optional().default(\n    'Display prompt on projector as students enter. Students write in Daily Journal before class discussion.'\n  ),\n  days: z.array(BellRingerDaySchema).min(1).max(7),\n});\n\nexport type BellRinger = z.infer<typeof BellRingerSchema>;\nexport type BellRingerDay = z.infer<typeof BellRingerDaySchema>;\nexport type BellRingerInput = z.input<typeof BellRingerSchema>;\n","import { z } from 'zod';\n\n// ─── Glossary Term ────────────────────────────────────────────────────────────\n\nexport const GlossaryTermSchema = z.object({\n  termName: z.string().describe('Term in the target language'),\n  termNameEN: z.string().optional().describe('English term (for code/docs reference)'),\n  bloomLevel: z.enum(['Remember', 'Understand', 'Apply']).optional(),\n  simpleDefinition: z.string().describe('Max 2 sentences, age-appropriate, no jargon'),\n  memoryAnalogy: z.string().describe('Analogy: \"This term is like [familiar thing]...\"'),\n  realWorldExample: z.string().describe('1-3 line code snippet or 1-sentence real-world use case'),\n  codeLanguage: z.string().optional().default(''),\n  commonMistake: z.string().optional().describe('What students often confuse this with, and why'),\n  seeMore: z.array(z.string()).optional().default([]).describe('Related term names'),\n});\n\n// ─── Quick Reference Row ──────────────────────────────────────────────────────\n\nexport const GlossaryQuickRefRowSchema = z.object({\n  termEN: z.string(),\n  translation: z.string().optional().default(''),\n  bloomLevel: z.enum(['Remember', 'Understand', 'Apply']).optional(),\n  mnemonicKeywords: z.string().optional().default(''),\n});\n\n// ─── Standardized Term ────────────────────────────────────────────────────────\n\nexport const StandardizedTermRowSchema = z.object({\n  technicalTerm: z.string(),\n  note: z.string(),\n  doNotUse: z.string().optional().default(''),\n});\n\n// ─── Full Glossary ────────────────────────────────────────────────────────────\n\n/**\n * Glossary Schema — Module Vocabulary Reference\n * Template: GLOSSARY_template.md\n * Sections: Term entries (8-15 per module) → Quick Reference Table → Standardized Terms\n */\nexport const GlossarySchema = z.object({\n  artifactType: z.literal('GLOSSARY'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().optional().default('en'),\n  terms: z.array(GlossaryTermSchema).min(1).describe('Ordered from basic to advanced'),\n  quickReferenceTable: z.array(GlossaryQuickRefRowSchema).optional().default([]),\n  standardizedTerms: z.array(StandardizedTermRowSchema).optional().default([]),\n});\n\nexport type Glossary = z.infer<typeof GlossarySchema>;\nexport type GlossaryTerm = z.infer<typeof GlossaryTermSchema>;\nexport type GlossaryInput = z.input<typeof GlossarySchema>;\n","import { z } from 'zod';\n\n// ─── 9-Square Choice Activity ─────────────────────────────────────────────────\n\nexport const ChoiceSquareSchema = z.object({\n  squareNumber: z.coerce.number().int().min(1).max(9),\n  squareLabel: z.string().describe('e.g. \"Square 1: The Bug Hunter\"'),\n  category: z.enum(['analytical', 'visual_architecture', 'creative_applied']).optional(),\n  points: z.coerce.number().int().default(30),\n  isCenterMaster: z.boolean().default(false).describe('True for the mandatory center ⭐ challenge'),\n  description: z.string().describe('What the student must do'),\n  deliverable: z.string().optional().describe('What to submit, e.g. \"Pull Request diff + clean build\"'),\n  acceptanceCriteria: z.array(z.string()).optional().default([]),\n  format: z.string().optional().describe('Submission format, e.g. \"Mermaid sequenceDiagram\"'),\n});\n\n// ─── Choice Rule ─────────────────────────────────────────────────────────────\n\nexport const ChoiceRuleSchema = z.object({\n  model: z.enum(['tic_tac_toe', 'point_balance', 'custom']).default('tic_tac_toe'),\n  description: z.string().describe('How the student wins / completes the board'),\n  minimumPoints: z.coerce.number().optional().describe('Minimum points for point_balance model'),\n  mandatoryCategories: z.array(z.string()).optional().default([]),\n});\n\n// ─── Rubric Row (reused from choice board context) ────────────────────────────\n\nexport const ChoiceBoardRubricRowSchema = z.object({\n  criteriaName: z.string(),\n  exemplary: z.string(),\n  proficient: z.string(),\n  developing: z.string(),\n  beginning: z.string(),\n});\n\n// ─── Full Choice Board ────────────────────────────────────────────────────────\n\n/**\n * Choice Board Schema — 9-Square Differentiated Activity Matrix\n * Template: CHOICE_BOARD_template.md\n * Sections: Learning Goals & Rule → 9-Square Matrix → Activity Blueprints → Rubric\n */\nexport const ChoiceBoardSchema = z.object({\n  artifactType: z.literal('CHOICE_BOARD'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().optional().default('en'),\n  coreConceptAnchor: z.string().describe('All options must demonstrate mastery of this invariant'),\n  choiceRule: ChoiceRuleSchema,\n  squares: z.array(ChoiceSquareSchema).min(1).max(9),\n  rubric: z.array(ChoiceBoardRubricRowSchema).optional().default([]),\n});\n\nexport type ChoiceBoard = z.infer<typeof ChoiceBoardSchema>;\nexport type ChoiceSquare = z.infer<typeof ChoiceSquareSchema>;\nexport type ChoiceBoardInput = z.input<typeof ChoiceBoardSchema>;\n","import { z } from 'zod';\n\n// ─── Graphic Organizer Item ───────────────────────────────────────────────────\n\nexport const OrganizerTypeEnum = z.enum([\n  'mermaid_flowchart',     // Architectural data flow (graph TD/LR)\n  'mermaid_sequence',      // Sequence / message flow diagram\n  'mermaid_state',         // State machine / lifecycle diagram\n  'mermaid_er',            // Entity-relationship diagram\n  'mermaid_class',         // Class / OOP diagram\n  'venn_comparison',       // Comparative analysis (2+ sets)\n  'fill_in_text',          // ASCII/text fill-in exercise\n  'concept_map',           // Node-link concept map (freeform)\n]);\n\nexport const GraphicOrganizerItemSchema = z.object({\n  organizerNumber: z.coerce.number().int(),\n  organizerTitle: z.string().describe('e.g. \"Architectural Data Flow\" or \"State Machine & Lifecycle\"'),\n  organizerType: OrganizerTypeEnum,\n  mermaidCode: z.string().optional().describe('Raw Mermaid.js diagram definition'),\n  fillInTemplate: z.string().optional().describe('ASCII text fill-in box template'),\n  wordBank: z.array(z.string()).optional().default([]).describe('Word bank for fill-in exercises'),\n  cognitiveGoal: z.string().optional().describe('Why this diagram helps (Paivio dual-coding, etc.)'),\n  requiredLabels: z.array(z.string()).optional().default([]).describe('Items students must correctly label'),\n});\n\n// ─── Full Graphic Organizer ───────────────────────────────────────────────────\n\n/**\n * Graphic Organizer Schema — Visual Diagram-Based Learning Tool\n * Template: GRAPHIC_ORGANIZER_template.md\n * Sections: Visual Paradigm Overview → Organizer 1/2/3 → Student Fill-in Worksheet\n */\nexport const GraphicOrganizerSchema = z.object({\n  artifactType: z.literal('GRAPHIC_ORGANIZER'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().optional().default('en'),\n  cognitivePurpose: z.string().optional().describe(\n    'Cognitive design rationale, e.g. \"Dual-coding theory: spatial + verbal processing\"'\n  ),\n  organizers: z.array(GraphicOrganizerItemSchema).min(1),\n});\n\nexport type GraphicOrganizer = z.infer<typeof GraphicOrganizerSchema>;\nexport type GraphicOrganizerItem = z.infer<typeof GraphicOrganizerItemSchema>;\nexport type GraphicOrganizerInput = z.input<typeof GraphicOrganizerSchema>;\n","import { z } from 'zod';\n\n// ─── CER (Claim-Evidence-Reasoning) conclusion ───────────────────────────────\n\nexport const CERConclusionSchema = z.object({\n  claim: z.string().describe('Direct 1-sentence answer to the driving question'),\n  evidence: z.string().describe('Specific quantitative data from the collection table'),\n  reasoning: z.string().describe('Connection between evidence and the technical principle'),\n});\n\n// ─── Experimental Variable Design ────────────────────────────────────────────\n\nexport const ExperimentalDesignSchema = z.object({\n  hypothesisTemplate: z.string().describe(\n    '\"If [action], then [predicted outcome] because [rationale].\"'\n  ),\n  independentVariable: z.string().describe('The variable being manipulated'),\n  dependentVariable: z.string().describe('The variable being measured'),\n  controlVariables: z.array(z.string()).optional().default([]).describe('Constants held fixed'),\n});\n\n// ─── Science Lab ─────────────────────────────────────────────────────────────\n\n/**\n * Science Lab (CER Investigation) Schema\n * Template: SCIENCE_LAB_template.md\n * Sections: Guiding Inquiry → Hypothesis & Design → Data Protocol → CER Conclusion → Peer Review\n * Format: STEM/Code Investigation with Claim-Evidence-Reasoning framework\n */\nexport const ScienceLabSchema = z.object({\n  artifactType: z.literal('SCIENCE_LAB'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().optional().default('en'),\n  domain: z.string().optional().describe('e.g. \"Software Engineering / Concurrency\"'),\n\n  // Guiding Inquiry\n  drivingQuestion: z.string().describe('Real-world engineering driving question'),\n  engineeringPhenomenon: z.string().optional().describe('Observed phenomenon requiring explanation'),\n\n  // Hypothesis & Experimental Design\n  experimentalDesign: ExperimentalDesignSchema,\n\n  // Data Collection\n  labSetupCode: z.string().optional().describe('Instrumentation / benchmark harness code'),\n  labSetupCodeLanguage: z.string().optional().default('cpp'),\n  dataCollectionColumns: z.array(z.string()).optional().default([]).describe('Table column headers'),\n  trialCount: z.coerce.number().optional().default(4),\n\n  // CER Conclusion\n  cerTemplates: CERConclusionSchema.optional().describe('Pre-filled example or rubric for CER'),\n\n  // Peer Review\n  peerReviewProtocol: z.string().optional().describe(\n    'How groups exchange and verify each other\\'s results'\n  ),\n  reproducibilityTolerancePct: z.coerce.number().optional().default(10),\n});\n\nexport type ScienceLab = z.infer<typeof ScienceLabSchema>;\nexport type ScienceLabInput = z.input<typeof ScienceLabSchema>;\nexport type CERConclusion = z.infer<typeof CERConclusionSchema>;\n","import { z } from 'zod';\n\n// ─── Individual Rotation Station ─────────────────────────────────────────────\n\nexport const StationTypeEnum = z.enum([\n  'teacher_led',        // Station 1: Small-group guided inquiry with teacher\n  'pair_lab',           // Station 2: Collaborative hands-on pair programming\n  'digital_self_paced', // Station 3: Independent async code lab / LMS\n  'offline_modeling',   // Station 4: No-screen diagram / whiteboard activity\n  'custom',\n]);\n\nexport const RotationStationSchema = z.object({\n  stationNumber: z.coerce.number().int(),\n  stationLabel: z.string().describe('e.g. \"Station 1: Teacher-Led (Guided Inquiry)\"'),\n  stationType: StationTypeEnum,\n  goal: z.string().describe('What students achieve at this station'),\n  durationMinutes: z.coerce.number().optional().default(15),\n  teacherScriptOrInquiry: z.string().optional().describe(\n    'Teacher talking points or inquiry prompts (for teacher_led station)'\n  ),\n  studentInstructions: z.string().optional().describe('Step-by-step student task'),\n  materials: z.array(z.string()).optional().default([]),\n  successMilestone: z.string().optional().describe('Observable completion criterion'),\n  differentiationTrigger: z.string().optional().describe('What to do if students struggle'),\n});\n\n// ─── Recording Sheet Row (Student Passport) ───────────────────────────────────\n\nexport const StationRecordRowSchema = z.object({\n  stationNumber: z.coerce.number().int(),\n  taskCompleted: z.string(),\n  verificationMethod: z.string().describe('Teacher stamp, peer signature, auto-token, etc.'),\n  keyInsightPrompt: z.string().optional().default('What did you learn at this station?'),\n});\n\n// ─── Full Station Rotation Pack ───────────────────────────────────────────────\n\n/**\n * Station Rotation Schema — 4-Station Learning Pack\n * Template: STATION_ROTATION_template.md\n * Format: 4 stations × 15 min (60-75 min total) with rotation bell protocol\n * Grouping: Heterogeneous groups of 4-6 students\n */\nexport const StationRotationSchema = z.object({\n  artifactType: z.literal('STATION_ROTATION'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().optional().default('en'),\n  totalDurationMinutes: z.coerce.number().optional().default(60),\n  rotationDurationMinutes: z.coerce.number().optional().default(15),\n  transitionBufferMinutes: z.coerce.number().optional().default(2),\n  groupSize: z.string().optional().default('4-6 students'),\n  groupingStrategy: z.string().optional().default('Heterogeneous'),\n  stations: z.array(RotationStationSchema).min(2),\n  recordingSheet: z.array(StationRecordRowSchema).optional().default([]),\n});\n\nexport type StationRotation = z.infer<typeof StationRotationSchema>;\nexport type RotationStation = z.infer<typeof RotationStationSchema>;\nexport type StationRotationInput = z.input<typeof StationRotationSchema>;\n","import { z } from 'zod';\n\n// ─── Difficulty Tier Enum ─────────────────────────────────────────────────────\n\nexport const CardTierEnum = z.enum(['bronze', 'silver', 'gold']);\n\n// ─── Individual Task Card ─────────────────────────────────────────────────────\n\nexport const TaskCardSchema = z.object({\n  cardId: z.string().describe('e.g. \"CARD_01\"'),\n  cardNumber: z.coerce.number().int(),\n  setLabel: z.string().optional().describe(\n    'e.g. \"Set A: Foundational Concepts\" or \"Set B: Code Diagnosis\"'\n  ),\n  tier: CardTierEnum.optional().default('bronze'),\n  points: z.coerce.number().int().optional().default(1),\n  category: z.string().optional().describe(\n    'e.g. \"Vocabulary\", \"Code Tracing\", \"Bug Hunt\", \"Architecture\"'\n  ),\n  prompt: z.string().describe('The task / question printed on the card'),\n  codeSnippet: z.string().optional().describe('Code to trace or debug'),\n  codeLanguage: z.string().optional().default('cpp'),\n  options: z.array(z.object({\n    id: z.string(),\n    text: z.string(),\n    isCorrect: z.boolean().optional(),\n  })).optional().default([]).describe('MCQ options (if applicable)'),\n  hint: z.string().optional().describe('Student-facing hint'),\n  answerKey: z.string().describe('Teacher-facing correct answer or solution blueprint'),\n  answerPoints: z.coerce.number().int().optional().default(1),\n});\n\n// ─── Full Task Cards Deck ─────────────────────────────────────────────────────\n\n/**\n * Task Cards Schema — Printable Task Card Deck\n * Template: TASK_CARDS_template.md\n * Sets: A (Foundational), B (Debugging), C (Application/Synthesis)\n * Usage: Centers, Fast Finishers, Small Group Review, Station 4 Offline Activity\n */\nexport const TaskCardsSchema = z.object({\n  artifactType: z.literal('TASK_CARDS'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().optional().default('en'),\n  targetSkills: z.array(z.string()).optional().default([]).describe(\n    'e.g. [\"Conceptual Understanding\", \"Code Tracing\", \"Bug Hunting\"]'\n  ),\n  cardFormat: z.string().optional().default('4 cards per A4 page'),\n  scoringSystem: z.string().optional().default(\n    'Bronze (1 pt), Silver (2 pts), Gold (3 pts)'\n  ),\n  cards: z.array(TaskCardSchema).min(1),\n});\n\nexport type TaskCards = z.infer<typeof TaskCardsSchema>;\nexport type TaskCard = z.infer<typeof TaskCardSchema>;\nexport type TaskCardsInput = z.input<typeof TaskCardsSchema>;\n","import { z } from 'zod';\n\n// ─── Game Question / Challenge ────────────────────────────────────────────────\n\nexport const ReviewGameQuestionSchema = z.object({\n  questionId: z.string().optional(),\n  round: z.coerce.number().int().min(1).max(3).describe('1=Speed, 2=Code Duel, 3=Final Boss'),\n  points: z.coerce.number().int(),\n  category: z.string().optional().describe('e.g. \"Vocabulary & Syntax\", \"Mental Model\"'),\n  prompt: z.string().describe('The question or challenge shown to teams'),\n  codeSnippet: z.string().optional(),\n  codeLanguage: z.string().optional().default(''),\n  options: z.array(z.object({\n    id: z.string(),\n    text: z.string(),\n    isCorrect: z.boolean().optional(),\n  })).optional().default([]).describe('MCQ options for Round 1'),\n  answerOrExplanation: z.string().describe('Correct answer or winning explanation'),\n  timeLimit: z.coerce.number().optional().default(20).describe('Seconds'),\n  bonusMechanic: z.string().optional().describe('e.g. \"Teams can wager points\"'),\n});\n\n// ─── Kahoot/Quizizz Export Row ────────────────────────────────────────────────\n\nexport const ReviewGameExportRowSchema = z.object({\n  question: z.string(),\n  option1: z.string(),\n  option2: z.string(),\n  option3: z.string().optional().default(''),\n  option4: z.string().optional().default(''),\n  correctAnswer: z.coerce.number().int().min(1).max(4).describe('1-indexed correct option'),\n  timeLimitSec: z.coerce.number().optional().default(20),\n});\n\n// ─── Full Review Game Pack ────────────────────────────────────────────────────\n\n/**\n * Review Game Schema — Interactive Quiz Show Pack\n * Template: REVIEW_GAME_template.md\n * Format: 3 Rounds (Speed → Code Duel → Final Boss Architecture)\n * Compatible with: Kahoot, Quizizz, Jeopardy live classroom format\n */\nexport const ReviewGameSchema = z.object({\n  artifactType: z.literal('REVIEW_GAME'),\n  lessonId: z.string(),\n  title: z.string(),\n  language: z.string().optional().default('en'),\n\n  // Setup\n  format: z.string().optional().default('3 rounds, progressive difficulty, team buzzers'),\n  teamSize: z.string().optional().default('3-5 students'),\n  hasBonusWager: z.boolean().optional().default(true).describe('Teams can wager points on Round 3'),\n\n  // Questions per round\n  questions: z.array(ReviewGameQuestionSchema).min(1),\n\n  // Export-ready format for Kahoot / Quizizz\n  exportRows: z.array(ReviewGameExportRowSchema).optional().default([]),\n});\n\nexport type ReviewGame = z.infer<typeof ReviewGameSchema>;\nexport type ReviewGameQuestion = z.infer<typeof ReviewGameQuestionSchema>;\nexport type ReviewGameInput = z.input<typeof ReviewGameSchema>;\n","import { z } from 'zod';\n\n/**\n * CurriculumPlan — machine-readable SOT for curriculum planning.\n *\n * Produced by the Curriculum Planner (curriculumPlannerService) from a domain\n * planning graph (CurriculumFeed v2 or raw domain-kit graph shapes) plus\n * course constraints and policy. CURRICULUM_FRAMEWORK.md is a human-readable\n * projection of this plan; LESSON production consumes a session slice of it.\n */\n\n// [7] Canonical decision vocabularies (the ONLY legal values)\n\nexport const PrerequisiteDecisionSchema = z.enum([\n  'mastered_before_course',   // entry-level knowledge — referenced, not taught\n  'taught_in_prior_lesson',   // formally taught in an earlier session\n  'recap_in_lesson',          // re-activated at the start of this session\n  'jit_introduce_in_lesson',  // introduced just-in-time inside this session\n  'scaffolded_provide',       // not taught — supplied ready-made (scaffold)\n]);\nexport type PrerequisiteDecision = z.infer<typeof PrerequisiteDecisionSchema>;\n\nexport const ScaffoldDecisionSchema = z.enum([\n  'student_builds',\n  'provide_partial',\n  'provide_full',\n  'provide_reference',\n]);\nexport type ScaffoldDecision = z.infer<typeof ScaffoldDecisionSchema>;\n\nexport const DepthLevelSchema = z.enum(['ulo', 'cio', 'sio']);\nexport type DepthLevel = z.infer<typeof DepthLevelSchema>;\n\nexport const BloomLevelSchema = z.enum([\n  'Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create',\n]);\nexport type BloomLevel = z.infer<typeof BloomLevelSchema>;\n\nexport const EntryLevelSchema = z.enum(['beginner', 'intermediate', 'advanced']);\nexport const NodeKindSchema = z.enum(['skill', 'concept', 'product_step']);\n\n// Shared atoms\n\nconst LessonCodeSchema = z.string().regex(/^U\\d{2}_M\\d{2}_L\\d{2}$/, 'lesson code must match UXX_MYY_LZZ');\n\nconst SourceCiteSchema = z.object({\n  node_ids: z.array(z.string()).default([]),\n  concept_codes: z.array(z.string()).default([]),\n});\n\nexport const CourseObjectiveSchema = z.object({\n  id: z.string(),\n  statement: z.string().min(8),\n  bloom: BloomLevelSchema,\n  sources: SourceCiteSchema,\n});\nexport type CourseObjective = z.infer<typeof CourseObjectiveSchema>;\n\nexport const UnitPlanSchema = z.object({\n  id: z.string().regex(/^U\\d{2}$/),\n  name: z.string().min(3),\n  objectives: z.array(CourseObjectiveSchema).min(1),\n  node_ids: z.array(z.string()).min(1),\n  total_minutes: z.number().int().positive(),\n  rationale: z.string().min(3),\n  // Phases fully contained in this unit (empty for non-phase plans)\n  phase_ids: z.array(z.string()).default([]),\n  // Product completion description carried from the domain analysis (optional)\n  product_completion: z.string().default(''),\n});\nexport type UnitPlan = z.infer<typeof UnitPlanSchema>;\n\n// Session plan ([3][4][5][6] outputs)\n\nexport const DepthAssignmentSchema = z.object({\n  node_id: z.string(),\n  depth: DepthLevelSchema,\n  source: z.enum(['feed_hint', 'planner', 'escalated']),\n  // 2026-09-23 (swift-101 F5-S1): strand-guard / oversized splits continue a\n  // node across consecutive sessions. Parts are marked so consumers can\n  // distinguish a continuation from a genuine duplicate assignment.\n  part: z.number().int().min(1).optional(),\n  total_parts: z.number().int().min(2).optional(),\n  // Depth layer authored text carried from the planning node (optional)\n  depth_context: z.object({\n    ulo: z.string().default(''),\n    cio: z.string().default(''),\n    sio: z.array(z.string()).default([]),\n  }).optional(),\n  // Display name of the node for consumer prompts (optional)\n  node_name: z.string().optional(),\n});\nexport type DepthAssignment = z.infer<typeof DepthAssignmentSchema>;\n\nexport const PrerequisiteDecisionEntrySchema = z.object({\n  node_id: z.string(),\n  decision: PrerequisiteDecisionSchema,\n  reason: z.string().min(3),\n});\nexport type PrerequisiteDecisionEntry = z.infer<typeof PrerequisiteDecisionEntrySchema>;\n\nexport const ScaffoldDecisionEntrySchema = z.object({\n  item: z.string().min(1),\n  decision: ScaffoldDecisionSchema,\n  minutes_saved: z.number().int().nonnegative().default(0),\n  reason: z.string().min(3),\n});\nexport type ScaffoldDecisionEntry = z.infer<typeof ScaffoldDecisionEntrySchema>;\n\n// P50: Macro-Pedagogical Schemas (ZPD, Bruner Spiral, Walking Skeleton, Mastery Gates)\n\nexport const ZpdVerdictSchema = z.enum(['OK', 'TOO_MANY_NEW', 'NO_ZPD_BRIDGE']);\nexport type ZpdVerdict = z.infer<typeof ZpdVerdictSchema>;\n\nexport const SessionZpdStatusSchema = z.object({\n  verdict: ZpdVerdictSchema,\n  new_concept_count: z.number().int().nonnegative().default(0),\n  known_concept_count: z.number().int().nonnegative().default(0),\n  // 2026-09-19 (contract split, regen7/8 audit): keyword load lives in its\n  // OWN fields. The writer used to borrow new_concept_count as a keyword\n  // counter for concept-free sessions; judges read the field name and turned\n  // '3 keywords' into '3 new concepts' (40 judge points lost in regen7).\n  new_keyword_count: z.number().int().nonnegative().default(0),\n  known_keyword_count: z.number().int().nonnegative().default(0),\n  // ADR-0007: Cognitive load budget points (ULO=3, CIO=2, SIO=1, fallback=2)\n  cognitive_load: z.number().nonnegative().default(0),\n  issues: z.array(z.string()).default([]),\n});\nexport type SessionZpdStatus = z.infer<typeof SessionZpdStatusSchema>;\n\nexport const ConceptSpiralEncounterSchema = z.object({\n  concept_code: z.string(),\n  session_id: LessonCodeSchema,\n  encounter_index: z.number().int().positive(),\n  bloom_cap: BloomLevelSchema,\n  depth: DepthLevelSchema,\n});\nexport type ConceptSpiralEncounter = z.infer<typeof ConceptSpiralEncounterSchema>;\n\nexport const WalkingSkeletonSchema = z.object({\n  epitome_unit_id: z.string().default('U01'),\n  epitome_deliverables: z.array(z.string()).default([]),\n  elaborations: z.array(z.object({\n    unit_id: z.string(),\n    focus_area: z.string(),\n    elaborates_on: z.array(z.string()).default([]),\n  })).default([]),\n});\nexport type WalkingSkeleton = z.infer<typeof WalkingSkeletonSchema>;\n\nexport const ActivityTypeSchema = z.enum([\n  'instruction',\n  'read',\n  'watch',\n  'code',\n  'discuss',\n  'quiz',\n  'project',\n]);\nexport type ActivityType = z.infer<typeof ActivityTypeSchema>;\n\nexport const LoTimeEstimateSchema = z.object({\n  lo_id: z.string(),\n  level: z.enum(['L0', 'L1', 'L2', 'L3']),\n  basis: z.enum(['reference_class', 'bundle_template', 'activity_count', 'observed']),\n  minutes: z.object({\n    optimistic: z.number().int().nonnegative(),\n    likely: z.number().int().nonnegative(),\n    pessimistic: z.number().int().nonnegative(),\n  }),\n  confidence: z.number().min(0).max(1), // 0..1\n  activities: z.array(z.object({\n    type: ActivityTypeSchema,\n    quantity: z.number().int().nonnegative(),\n    unit_minutes: z.number().nonnegative(),\n    modifiers: z.record(z.number()).default({}),\n    counts_toward_total: z.boolean(),\n  })).optional(),\n});\nexport type LoTimeEstimate = z.infer<typeof LoTimeEstimateSchema>;\n\nexport const MasteryGateSchema = z.object({\n  phase_or_unit_id: z.string(),\n  gate_name: z.string(),\n  exit_criteria: z.array(z.string()).min(1),\n  next_unit_id: z.string(),\n  remediation: z.object({\n    trigger: z.literal('FAIL_GATE_CRITERIA'),\n    focus_minutes: z.number().int().default(15),\n    action: z.string(),\n  }),\n});\nexport type MasteryGate = z.infer<typeof MasteryGateSchema>;\n\nexport const ConceptPrerequisiteEdgeSchema = z.object({\n  concept_code: z.string(),\n  requires: z.string(),\n  source: z.enum(['MASTER_TREE', 'INFERRED', 'CONCEPT_LEVEL_PREREQ']).default('CONCEPT_LEVEL_PREREQ'),\n  confidence: z.number().min(0).max(1).default(0.8),\n  rationale: z.string().default(''),\n  structure_supported: z.boolean().default(true),\n  needs_review: z.boolean().default(false),\n  hub: z.boolean().default(false),\n});\nexport type ConceptPrerequisiteEdge = z.infer<typeof ConceptPrerequisiteEdgeSchema>;\n\nexport const PackedEntrySchema = z.object({\n  id: z.string(),\n  minutes: z.number().int().nonnegative(),\n  nominal_minutes: z.number().int().nonnegative().optional(),\n  part: z.number().int().min(1).default(1),\n  total_parts: z.number().int().min(1).default(1),\n});\nexport type PackedEntry = z.infer<typeof PackedEntrySchema>;\n\nexport const SessionPlanSchema = z.object({\n  id: LessonCodeSchema,\n  unit_id: z.string().regex(/^U\\d{2}$/),\n  order: z.number().int().positive(),\n  title: z.string().min(3),\n  // [4] Free-text session objective — no ULO/CIO/SIO mapping at this stage.\n  prose_objective: z.string().min(10),\n  node_ids: z.array(z.string()).min(1),\n  allocated_entries: z.array(PackedEntrySchema).default([]),\n  // Development phases this session contributes to (empty when the feed has no phases)\n  phase_ids: z.array(z.string()).default([]),\n  new_keywords: z.array(z.string()).default([]),\n  prerequisite_keywords: z.array(z.string()).default([]),\n  knowledge_minutes: z.number().int().nonnegative(),\n  practice_minutes: z.number().int().nonnegative(),\n  overhead_minutes: z.number().int().nonnegative(),\n  depth_assignments: z.array(DepthAssignmentSchema).min(1),\n  prerequisite_decisions: z.array(PrerequisiteDecisionEntrySchema).default([]),\n  scaffold_decisions: z.array(ScaffoldDecisionEntrySchema).default([]),\n  // What the student can demonstrate after this session — feeds exit tickets.\n  exit_evidence: z.array(z.string()).min(1),\n  differentiation: z.object({ bronze: z.string(), silver: z.string(), gold: z.string() }),\n  // P50: ZPD cognitive load status for this session\n  zpd_status: SessionZpdStatusSchema.default({\n    verdict: 'OK',\n    new_concept_count: 0,\n    known_concept_count: 0,\n    new_keyword_count: 0,\n    known_keyword_count: 0,\n    cognitive_load: 0,\n    issues: [],\n  }),\n});\nexport type SessionPlan = z.infer<typeof SessionPlanSchema>;\n\n// Root plan\n\nexport const TranslationPolicySchema = z\n  .object({\n    policy: z.enum(['after_artifact', 'end_of_unit', 'at_publish', 'native']).default('native'),\n    target_language: z.string().nullable().default(null),\n  })\n  .refine(\n    (data) => {\n      if (data.policy === 'native') {\n        return typeof data.target_language === 'string' && data.target_language.trim().length > 0;\n      }\n      return true;\n    },\n    {\n      message: \"When translation policy is 'native', target_language must be a non-empty string\",\n      path: ['target_language'],\n    }\n  );\nexport type TranslationPolicy = z.infer<typeof TranslationPolicySchema>;\n\nexport const CoverageReportSchema = z.object({\n  assigned_node_ids: z.array(z.string()),\n  unassigned_node_ids: z.array(z.string()),\n  warnings: z.array(z.string()),\n});\nexport type CoverageReport = z.infer<typeof CoverageReportSchema>;\n\nexport const PlanConstraintsSchema = z.object({\n  age_band: z.tuple([z.number().int(), z.number().int()]),\n  entry_level: EntryLevelSchema,\n  session_duration_minutes: z.number().int().positive(),\n  // Overhead (setup/recap/wrap-up) share of a session, 0..0.5.\n  overhead_ratio: z.number().min(0).max(0.5).default(0.15),\n  total_sessions: z.number().int().positive().nullable().default(null),\n  // Keywords the entry level already masters (drives mastered_before_course).\n  entry_keywords: z.array(z.string()).default([]),\n  course_goals: z.array(z.string()).default([]),\n  capstone: z.string().nullable().default(null),\n});\nexport type PlanConstraints = z.infer<typeof PlanConstraintsSchema>;\n\nexport const PlanValidationIssueSchema = z.object({\n  severity: z.enum(['error', 'warning']),\n  code: z.enum([\n    'CAPACITY_OVERFLOW',\n    'SESSION_NODE_OVERLOAD',\n    'ZPD_CONCEPT_OVERLOAD',\n    'TEACH_BEFORE_USE_VIOLATION',\n    'SPIRAL_DEPTH_MISMATCH',\n    'CAPSTONE_BUILD_DEFICIT',\n    'ASYMMETRIC_UNIT_DISTRIBUTION',\n    'TOTAL_SESSIONS_MISMATCH',\n    'SILENT_MINUTE_SHRINKAGE',\n    'MISSING_SESSION_DELIVERABLE',\n    // LO time-estimation model (plan 2026-10-09-lo-time-estimation-model-implementation-plan):\n    'BLOOM_FLOOR_MISSING',\n    'TIME_PRICE_INCONSISTENCY',\n  ]),\n  session_id: z.string().optional(),\n  unit_id: z.string().optional(),\n  message: z.string(),\n  details: z.record(z.any()).default({}),\n});\nexport type PlanValidationIssue = z.infer<typeof PlanValidationIssueSchema>;\n\nexport const PlanValidationResultSchema = z.object({\n  valid: z.boolean(),\n  status: z.enum(['passed', 'infeasible', 'warnings_only']),\n  summary: z.object({\n    total_sessions: z.number(),\n    nominal_minutes_sum: z.number(),\n    content_budget_sum: z.number(),\n    capacity_ratio: z.number(),\n    max_nodes_in_a_session: z.number(),\n    max_new_concepts_in_a_session: z.number(),\n    // Plan C3 — pooled time buffer over plan.time_estimates (√Σσ², P75 point).\n    p75_minutes_sum: z.number().default(0),\n    buffer_minutes: z.number().default(0),\n  }),\n  errors: z.array(PlanValidationIssueSchema).default([]),\n  warnings: z.array(PlanValidationIssueSchema).default([]),\n});\nexport type PlanValidationResult = z.infer<typeof PlanValidationResultSchema>;\n\nexport const CurriculumPlanSchema = z.object({\n  schema_version: z.literal(1),\n  plan_id: z.string(),\n  plan_hash: z.string(),\n  created_at: z.string(),\n  source: z.object({\n    graph_type: z.enum(['curriculum_feed', 'project_graph', 'knowledge_graph', 'hybrid_graph']),\n    feed_schema_version: z.number().nullable().default(null),\n    warnings: z.array(z.string()).default([]),\n    hallucination_count: z.number().int().nonnegative().default(0),\n  }),\n  constraints: PlanConstraintsSchema,\n  course: z.object({\n    // [1] Course-level objectives, each citing source nodes (anti-fabrication)\n    objectives: z.array(CourseObjectiveSchema).min(1),\n    capstone_ref: z.string().nullable().default(null),\n  }),\n  units: z.array(UnitPlanSchema).min(1),      // [2]\n  sessions: z.array(SessionPlanSchema).min(1), // [3][4][5][6]\n  // P50: Macro-pedagogical course structures\n  walking_skeleton: WalkingSkeletonSchema.optional(),\n  mastery_gates: z.array(MasteryGateSchema).default([]),\n  concept_spiral_progression: z.array(ConceptSpiralEncounterSchema).default([]),\n  concept_prerequisites: z.array(ConceptPrerequisiteEdgeSchema).default([]),\n  glossary_scope: z.array(z.object({\n    session_id: LessonCodeSchema,\n    terms: z.array(z.string()),\n  })),\n  translation: TranslationPolicySchema,\n  coverage_report: CoverageReportSchema,\n  approval: z.object({\n    status: z.enum(['draft', 'approved', 'infeasible']),\n    approved_at: z.string().nullable().default(null),\n    // Hash of the plan payload the approval covers — invalidation key for EXPOSITION.\n    plan_hash: z.string().nullable().default(null),\n  }),\n  validation_report: PlanValidationResultSchema.optional(),\n  // LO time estimates (L0–L3) per node — see services/loTimeEstimator.ts.\n  // optional().default([]): absent on legacy payloads, always [] after parse.\n  time_estimates: z.array(LoTimeEstimateSchema).optional().default([]),\n});\nexport type CurriculumPlan = z.infer<typeof CurriculumPlanSchema>;\n\n// Normalized planning graph (Stage 0 output, internal + feed-facing)\n\nexport const PlanningNodeSchema = z.object({\n  id: z.string(),\n  kind: NodeKindSchema,\n  name: z.string().min(1),\n  concept_codes: z.array(z.string()).default([]),\n  keywords: z.array(z.string()).default([]),\n  new_keywords: z.array(z.string()).default([]),\n  prerequisite_keywords: z.array(z.string()).default([]),\n  estimated_minutes: z.number().int().nonnegative(),\n  bloom_hint: BloomLevelSchema.nullable().default(null),\n  depth_hint: DepthLevelSchema.nullable().default(null),\n  completion_level: z.enum(['mvp', 'standard', 'stretch']).default('standard'),\n  scaffold_candidates: z.array(z.object({\n    item: z.string(),\n    reason: z.string().default(''),\n    minutes_saved: z.number().int().nonnegative().default(0),\n    suggest: ScaffoldDecisionSchema.default('provide_full'),\n  })).default([]),\n  references: z.array(z.object({\n    file: z.string(),\n    evidence: z.string().default(''),\n  })).default([]),\n  phase_id: z.string().default(''),\n  // P52/T2.1: tangible user-visible outcome projected from the graph step\n  // (checkpoint candidate for session cutting). Empty = not a checkpoint.\n  user_visible_deliverable: z.string().default(''),\n  // P52/T3.1 — depth-reconcile inputs (mirrored from the feed; optional so\n  // raw graphs without variants keep planning unchanged):\n  // • depth_variants: minutes to teach this node at each depth level (ULO ≤\n  //   CIO ≤ SIO) — the reconciler's price list for downgrades.\n  // • depth_scaffold_candidates: parallel to scaffold_candidates but acting\n  //   on DEPTH (SIO→CIO, CIO→ULO) instead of lesson time.\n  // • is_core: Master-Tree core concept — never downgraded; escalate instead.\n  depth_variants: z.object({ ulo: z.number().int().nonnegative(), cio: z.number().int().nonnegative(), sio: z.number().int().nonnegative() }).optional(),\n  depth_scaffold_candidates: z.array(z.object({\n    from_depth: DepthLevelSchema,\n    to_depth: DepthLevelSchema,\n    minutes_saved: z.number().int().nonnegative(),\n    reason: z.string().default(''),\n  })).optional(),\n  depth_context: z.object({\n    ulo: z.string().default(''),\n    cio: z.string().default(''),\n    sio: z.array(z.string()).default([]),\n  }).optional(),\n  is_core: z.boolean().default(false),\n});\nexport type PlanningNode = z.infer<typeof PlanningNodeSchema>;\n\n/** knowledge = must be understood before; task = needs the source node's output first. */\nexport const DependencyEdgeSchema = z.object({\n  from: z.string(),\n  to: z.string(),\n  kind: z.enum(['knowledge', 'task']),\n  reason: z.string().default(''),\n});\nexport type DependencyEdge = z.infer<typeof DependencyEdgeSchema>;\n\nexport const PlanningGraphSchema = z.object({\n  graph_type: z.enum(['curriculum_feed', 'project_graph', 'knowledge_graph', 'hybrid_graph']),\n  warnings: z.array(z.string()).default([]),\n  hallucination_count: z.number().int().nonnegative().default(0),\n  nodes: z.array(PlanningNodeSchema).min(1, 'planning graph must contain at least one node'),\n  edges: z.array(DependencyEdgeSchema).default([]),\n  groupings: z.array(z.object({\n    id: z.string(),\n    name: z.string(),\n    node_ids: z.array(z.string()).min(1),\n    rationale: z.string().default(''),\n  })).default([]),\n  // Progressive completion phases (from CurriculumFeed.phases). When non-empty\n  // they define units and the teaching sequence; groupings stay informational.\n  phases: z.array(z.object({\n    id: z.string(),\n    order: z.number().int().positive(),\n    name: z.string(),\n    product_completion: z.string().default(''),\n    node_ids: z.array(z.string()).min(1),\n  })).default([]),\n});\nexport type PlanningGraph = z.infer<typeof PlanningGraphSchema>;\nexport type PlanningPhase = PlanningGraph['phases'][number];\n\n// Planner input\n\nexport const PlannerInputSchema = z.object({\n  graph: z.unknown(),\n  constraints: PlanConstraintsSchema,\n  translation: TranslationPolicySchema.default({ policy: 'at_publish', target_language: null }),\n});\nexport type PlannerInput = z.infer<typeof PlannerInputSchema>;\n\n/** Validates a plan and enforces the cross-field budget invariant per session. */\nexport function validateCurriculumPlan(plan: unknown): CurriculumPlan {\n  const parsed = CurriculumPlanSchema.parse(plan);\n  for (const s of parsed.sessions) {\n    const total = s.knowledge_minutes + s.practice_minutes + s.overhead_minutes;\n    if (total > parsed.constraints.session_duration_minutes) {\n      throw new Error(\n        'Session ' + s.id + ' budget violated: ' + total + ' > ' + parsed.constraints.session_duration_minutes + ' minutes',\n      );\n    }\n  }\n  return parsed;\n}\n","import { z } from 'zod';\n\n// ─── Existing schemas ─────────────────────────────────────────────────────────\nexport * from './lessonPlanSchema';\nexport * from './activitySchema';\nexport * from './codeLabSchema';\nexport * from './worksheetSchema';\nexport * from './handoutSchema';\nexport * from './slideDeckSchema';\nexport * from './teacherGuideSchema';\nexport * from './extensionSchema';\nexport * from './judgeSchema';\nexport * from './projectGraphSchema';\nexport * from './instructionSchema';\nexport * from './selfLabSchema';\nexport * from './diagnosticQuizSchema';\nexport * from './selfPacedBundleSchema';\n\n// ─── New schemas (derived from canonical templates) ───────────────────────────\nexport * from './rubricSchema';\nexport * from './exitTicketSchema';\nexport * from './tieredPracticeSchema';\nexport * from './bellRingerSchema';\nexport * from './glossarySchema';\nexport * from './choiceBoardSchema';\nexport * from './graphicOrganizerSchema';\nexport * from './scienceLabSchema';\nexport * from './stationRotationSchema';\nexport * from './taskCardsSchema';\nexport * from './reviewGameSchema';\n\nimport { LessonPlanSchema, LessonPlanEDPSchema, LessonPlan5ESchema } from './lessonPlanSchema';\nimport { ActivityLabSchema } from './activitySchema';\nimport { CodeLabSchema } from './codeLabSchema';\nimport { WorksheetSchema } from './worksheetSchema';\nimport { HandoutSchema } from './handoutSchema';\nimport { SlideDeckSchema } from './slideDeckSchema';\nimport { TeacherGuideSchema } from './teacherGuideSchema';\nimport { ExtensionSchema } from './extensionSchema';\nimport { DiagnosticQuizSchema } from './diagnosticQuizSchema';\nimport { RubricSchema } from './rubricSchema';\nimport { ExitTicketSchema } from './exitTicketSchema';\nimport { TieredPracticeSchema } from './tieredPracticeSchema';\nimport { BellRingerSchema } from './bellRingerSchema';\nimport { GlossarySchema } from './glossarySchema';\nimport { ChoiceBoardSchema } from './choiceBoardSchema';\nimport { GraphicOrganizerSchema } from './graphicOrganizerSchema';\nimport { ScienceLabSchema } from './scienceLabSchema';\nimport { StationRotationSchema } from './stationRotationSchema';\nimport { TaskCardsSchema } from './taskCardsSchema';\nimport { ReviewGameSchema } from './reviewGameSchema';\n\n/**\n * Discriminated Union of all Curriculum Artifacts.\n * Keyed on `artifactType` literal field.\n *\n * Lesson variants:\n *  - 'LESSON'      → LessonPlanSchema (legacy, deprecated — kept for backward compat)\n *  - 'LESSON_EDP'  → LessonPlanEDPSchema (Engineering Design Process model)\n *  - 'LESSON_5E'   → LessonPlan5ESchema  (5E Instructional Model)\n */\nexport const CurriculumArtifactSchema = z.discriminatedUnion('artifactType', [\n  // ─── Lesson variants ───────────────────────────────────────────\n  LessonPlanSchema,      // 'LESSON'      — legacy (deprecated)\n  LessonPlanEDPSchema,   // 'LESSON_EDP'  — Engineering Design Process\n  LessonPlan5ESchema,    // 'LESSON_5E'   — 5E Instructional Model\n  // ─── Activity & Practice ───────────────────────────────────────\n  ActivityLabSchema,     // 'ACT'\n  TieredPracticeSchema,  // 'TIERED_PRACTICE'\n  BellRingerSchema,      // 'BELL_RINGER'\n  ChoiceBoardSchema,     // 'CHOICE_BOARD'\n  // ─── Code ─────────────────────────────────────────────────────\n  CodeLabSchema,         // 'CODE'\n  // ─── Assessment ───────────────────────────────────────────────\n  DiagnosticQuizSchema,  // 'QUIZ'\n  RubricSchema,          // 'RUBRIC'\n  ExitTicketSchema,      // 'EXIT_TICKET'\n  // ─── Student-facing resources ──────────────────────────────────\n  WorksheetSchema,       // 'WKS'\n  HandoutSchema,         // 'HANDOUT'\n  SlideDeckSchema,       // 'SLIDE'\n  TeacherGuideSchema,    // 'GUIDE'\n  ExtensionSchema,       // 'EXT'\n  GlossarySchema,        // 'GLOSSARY'\n  GraphicOrganizerSchema,// 'GRAPHIC_ORGANIZER'\n  ScienceLabSchema,      // 'SCIENCE_LAB'\n  StationRotationSchema, // 'STATION_ROTATION'\n  TaskCardsSchema,       // 'TASK_CARDS'\n  ReviewGameSchema,      // 'REVIEW_GAME'\n]);\n\nexport type CurriculumArtifact = z.infer<typeof CurriculumArtifactSchema>;\n\n/**\n * Basic Learning Objective schema from Knowledge Graph / Tree\n */\nexport const LearningObjectiveInputSchema = z.object({\n  code: z.string(),\n  name: z.string(),\n  description: z.string().optional().default(''),\n  lo_type: z.enum(['UNIVERSAL', 'CONCEPTUAL_IMPL', 'SPECIFIC_IMPL', 'ULO', 'CIO', 'SIO']).or(z.string()),\n  bloom_level: z.string().optional().default('understand'),\n  knowledge_dimension: z.string().optional().default('CONCEPTUAL'),\n  assessment: z.string().optional().default('concept-check'),\n  keyword: z.string().optional().default(''),\n  concept: z.string().optional().default(''),\n  concept_code: z.string().optional().default(''),\n  concept_name: z.string().optional().default(''),\n});\n\nexport interface LearningObjectiveInput {\n  code: string;\n  name: string;\n  description?: string;\n  lo_type?: 'UNIVERSAL' | 'CONCEPTUAL_IMPL' | 'SPECIFIC_IMPL' | 'ULO' | 'CIO' | 'SIO' | string;\n  bloom_level?: string;\n  knowledge_dimension?: string;\n  assessment?: string;\n  keyword?: string;\n  concept?: string;\n  concept_code?: string;\n  concept_name?: string;\n}\n\n/**\n * Milestone input schema matching knowledge-tree Roadmap & Learning Path JSON\n */\nexport const MilestoneInputSchema = z.object({\n  id: z.string().optional(),\n  name: z.string(),\n  description: z.string().optional().default(''),\n  feature_id: z.string().optional().default('F0'),\n  feature_name: z.string().optional().default(''),\n  concept_code: z.string().optional().default(''),\n  concept_name: z.string().optional().default(''),\n  completion_level: z.string().optional().default('base'),\n  difficulty: z.string().optional().default('Beginner'),\n  bloom_level: z.string().optional().default('Understand'),\n  tech_keywords: z.array(z.string()).optional().default([]),\n  prerequisite_concept_codes: z.array(z.string()).optional().default([]),\n  all_keywords: z.array(z.string()).optional().default([]).describe('All keywords associated with this milestone (aggregated from concepts)'),\n  new_keywords: z.array(z.string()).optional().default([]).describe('Keywords introduced for the first time at this milestone'),\n  prerequisite_keywords: z.array(z.string()).optional().default([]).describe('Keywords already introduced in earlier milestones'),\n  learning_objectives: z.array(LearningObjectiveInputSchema).optional().default([]),\n  rationale: z.string().or(z.array(z.string())).optional().default(''),\n  instruction_ref: z.string().optional(),\n  /** Canonical numeric grade band [min, max] for standards retrieval (Phase 2). */\n  grade_band: z.tuple([z.number().int(), z.number().int()]).optional(),\n});\n\nexport interface MilestoneInput {\n  id?: string;\n  name: string;\n  description?: string;\n  feature_id?: string;\n  feature_name?: string;\n  concept_code?: string;\n  concept_name?: string;\n  completion_level?: string;\n  difficulty?: string;\n  bloom_level?: string;\n  tech_keywords?: string[];\n  prerequisite_concept_codes?: string[];\n  all_keywords?: string[];\n  new_keywords?: string[];\n  prerequisite_keywords?: string[];\n  learning_objectives?: LearningObjectiveInput[];\n  rationale?: string | string[];\n  instruction_ref?: string;\n  grade_band?: [number, number];\n}\n\n/**\n * Phase input schema\n */\nexport const PhaseInputSchema = z.object({\n  phase_id: z.number().or(z.string()),\n  title: z.string().optional(),\n  phase_name: z.string().optional(),\n  description: z.string().optional().default(''),\n  target_outcome: z.string().optional(),\n  milestones: z.array(MilestoneInputSchema).default([]),\n});\n\nexport type PhaseInput = z.input<typeof PhaseInputSchema>;\n\n/**\n * Full Roadmap input schema\n */\nexport const RoadmapInputSchema = z.object({\n  project_brief: z.object({\n    name: z.string().optional(),\n    title: z.string().optional(),\n    goal: z.string().optional(),\n    description: z.string().optional().default(''),\n    tech_stack: z.array(z.string()).optional().default([]),\n    estimated_hours: z.number().optional().default(0),\n    estimated_weeks: z.number().optional().default(0),\n    target_learner: z.string().optional(),\n    audience: z.string().optional(),\n    icon: z.string().optional(),\n  }),\n  phases: z.array(PhaseInputSchema).default([]),\n});\n\nexport type RoadmapInput = z.infer<typeof RoadmapInputSchema>;\n\nexport interface ProjectRoadmap {\n  title: string;\n  goal?: string;\n  topic?: string;\n  target_language?: string;\n  target_audience?: string;\n  tech_stack?: string[];\n  milestones: MilestoneInput[];\n}\nexport * from './curriculumPlanSchema';\n","export * from './provider-factory';\nexport * from './prompts';\nexport * from './flows';\nexport * from './streamRunner';\nexport * from './tools/specialistTools';\nexport * from './modelPolicyResolver';\nexport * from './llmJudgeEngine';export * from './toolLoopTypes';\nexport * from './chatToolLoop';\n","import type { MilestoneInput } from '../../schemas';\nimport { loadAuthoringTemplate } from '../../services/templateLoader';\n\nexport interface LessonPromptInput {\n  milestone: MilestoneInput;\n  language: string;\n  topic?: string;\n  targetAudience?: string;\n  contextContinuity?: string;\n  /** Pre-rendered STANDARDS CONTEXT block (from buildStandardsContextBlock) — verbatim standard statements binding this lesson. */\n  standardsContext?: string;\n}\n\nexport function buildLessonMasterPrompt(input: LessonPromptInput): string {\n  const { milestone, language, topic, targetAudience, contextContinuity, standardsContext } = input;\n  const learningObjectives = milestone.learning_objectives || [];\n  const lessonId = milestone.id || milestone.concept_code || 'U01_M01_L01';\n\n  return `\n# ROLE & PERSONA\nYou are a Senior Educational Content Editor and Curriculum Architect (@content), expert in the 5E Instructional Model (Engage, Explore, Explain, Elaborate, Evaluate), Bloom's Revised Taxonomy, and Universal Design for Learning (UDL).\n\n# MISSION SCOPE\nBuild a deep, rigorous, and highly pedagogical Master Lesson Plan (LESSON) that strictly fulfills the target Learning Objectives across any domain (Coding, Engineering, Data, Science, Math, Business, Design, or Humanities).\n\n## IN SCOPE:\n- **Pedagogical Structure:** Use the 5E model to orchestrate active inquiry and cognitive scaffolding.\n- **Cumulative Scaffolding & Zero Duplication:**\n  - ⛔ **ANTI-DUPLICATION MANDATE:** Inspect the CUMULATIVE CONTEXT ($L_1 \\dots L_{N-1}$). You MUST NOT re-teach, re-explain, or duplicate the exact same code snippet, hardware wiring, or basic concept already taught in prior lessons (e.g. if $L_1$ already taught blinking LED on pin 13 with delay(1000), $L_2$ MUST advance to multi-LED sequencing, variable state, PWM analogWrite, or sensor input).\n  - 🔗 **CONTINUOUS STORYLINE & ANALOGIES:** Re-use and build upon the overarching narrative, character evolution, and analogies established in CONTENT_CONTINUITY.md (e.g. Mind -> Reflexes -> Hands -> Master System) instead of inventing disconnected one-off metaphors.\n- **Strict Satellite Artifact ID Contract:** All satellite deliverables referenced in the Lesson Plan MUST follow canonical naming based on **lessonId** (\"${lessonId}\"):\n  - Activity Lab: \\`ACT_${lessonId}\\`\n  - Slide Deck: \\`SLIDE_${lessonId}\\`\n  - Diagnostic Quiz: \\`QUIZ_${lessonId}\\`\n  - Teacher Guide: \\`GUIDE_${lessonId}\\`\n  - Worksheet: \\`WKS_${lessonId}\\`\n  - Student Handout: \\`HANDOUT_${lessonId}\\`\n  - Extension: \\`EXT_${lessonId}\\`\n  - ⛔ PROHIBITED: Never generate ad-hoc IDs like \\`ACT_WARMUP_01\\`, \\`SLIDE_CORE_02\\`, or \\`QUIZ_WRAPUP_05\\`.\n- **Authentic Real-World Hook:** Create a compelling, high-stakes scenario tailored to the domain:\n  - *Tech/Software/IoT:* Server outage, vaccine cold-chain failure, cybersecurity breach, logistics bottleneck.\n  - *Data/Science/Math:* Clinical trial anomaly, ecological tipping point, forecasting error, experimental anomaly.\n  - *Business/Economics/Finance:* Critical market shift, startup runway crisis, operational failure, supply chain shock.\n  - *Design/Media/Humanities:* UX accessibility collapse, public communication dilemma, historical inflection point.\n- **Relatable Analogies & Conceptual Depth:** For EVERY core concept, provide a relatable real-world analogy alongside rigorous domain explanation.\n- **Multidimensional Comparison Table:** Compare at least 3 options/approaches across 4 columns (Option, Mechanism/Principle, Trade-offs/Impact, Practical Meaning).\n- **Formulas, Rules of Thumb, or Heuristics:** Provide mathematical formulas in LaTeX (e.g. $Z = \\\\frac{x - \\\\mu}{\\\\sigma}$), scientific equations, or domain-specific decision heuristics where applicable.\n- **Visual Architecture & Flow:** Provide a valid, clean Mermaid diagram (flowchart, sequence diagram, or state machine) illustrating the conceptual flow, system architecture, or process sequence.\n- **Guided Practice Demonstration:**\n  - *For Coding/Tech Courses:* Provide complete, runnable code with line-by-line comments explaining \"Why\" not just \"How\".\n  - *For Non-Coding/Domain Courses:* Provide a structured analysis framework, step-by-step calculation, protocol template, or case study walkthrough.\n- **Formative Exit Ticket:** Formulate scenario-based questions at the Apply/Analyze Bloom level + a metacognitive self-assessment prompt.\n- **Comprehensive Teacher Notes:** Detail common student pitfalls/misconceptions and an actionable Troubleshooting/Intervention Matrix.\n\n## OUT OF SCOPE (PROHIBITED):\n- Do NOT repeat exercises, code, or circuits from prior lessons in the roadmap.\n- Do NOT invent ad-hoc artifact IDs (use only canonical IDs).\n- Do NOT write shallow, generic textbook summaries.\n- Do NOT skip analogies or provide dry, context-free definitions.\n- Do NOT omit Mermaid diagrams or comparison tables.\n- Do NOT force programming code on non-technical subjects (use domain-appropriate structured frameworks instead).\n\n# MANDATORY TEMPLATE STRUCTURE\nYou MUST generate structured data that will render directly into this exact Markdown template:\n---\n${loadAuthoringTemplate('LESSON_5E_template.md') ?? '[TEMPLATE FILE NOT FOUND: LESSON_5E_template.md]'}\n---\n\n# INPUT PARAMETERS\n- **Lesson ID:** ${milestone.id || milestone.concept_code || 'L01'}\n- **Title / Name:** ${milestone.name}\n- **Milestone Description:** ${milestone.description}\n- **Feature / Phase:** ${milestone.feature_name || milestone.feature_id || 'Core Learning'}\n- **Bloom Taxonomy Target:** ${milestone.bloom_level || 'understand'}\n- **Difficulty:** ${milestone.difficulty || 'Intermediate'}\n- **Subject / Topic:** ${topic || milestone.feature_name || 'Curriculum Subject'}\n- **Target Audience:** ${targetAudience || 'Target Learners'}\n- **Language Policy:** Output 100% in **\"${language}\"**.\n- **Learning Objectives:**\n${learningObjectives.map((lo) => `  - [${lo.lo_type || 'ULO'}] ${lo.code}: ${lo.name} (${lo.description || ''}) -> Bloom: ${lo.bloom_level || 'understand'}`).join('\\n')}\n\n${contextContinuity ? `# CUMULATIVE CONTEXT & CONTINUITY (SOURCE OF TRUTH FOR PRIOR LESSONS)\\n${contextContinuity}\\n\\n*INSTRUCTION: Build strictly on top of the above progress. DO NOT re-teach concepts already marked completed above.*` : ''}\n\n${standardsContext || ''}\n\n# REQUIRED JSON KEYS\nReturn a single valid JSON object matching the LessonPlanSchema with these exact keys:\n- \"artifactType\": \"LESSON\"\n- \"lessonId\": \"${milestone.id || 'L01'}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"topic\": \"${topic || milestone.feature_name || 'General Topic'}\"\n- \"targetGradeOrAudience\": \"${targetAudience || 'Learners'}\"\n- \"overview\": string (Pedagogical overview)\n- \"learningObjectives\": array of { \"code\": string, \"name\": string, \"description\": string, \"bloomLevel\": string, \"successCriteria\": string }\n- \"prerequisites\": string (Prior knowledge linkage)\n- \"materialsSummary\": string (Required tools / resources)\n- \"keywords\": string[] (Core domain terms introduced)\n- \"hookTitle\": string (Compelling scenario title)\n- \"hookScenario\": string (High-stakes real-world scenario)\n- \"hookQuestions\": string[] (At least 2 provocative open-ended inquiry questions)\n- \"coreConcepts\": array of { \"name\": string, \"analogy\": string, \"technicalDepth\": string, \"comparisonTable\": { \"headers\": string[], \"rows\": string[][] }, \"formulaOrRule\": string }\n- \"guidedPractice\": { \"title\": string, \"explanation\": string, \"codeSnippet\": string (Runnable code for tech courses OR structured domain template/walkthrough for non-tech), \"codeLanguage\": string (e.g. \"python\", \"typescript\", \"markdown\", \"text\"), \"mermaidDiagram\": string (Valid Mermaid diagram syntax) }\n- \"independentPractice\": { \"title\": string, \"description\": string }\n- \"differentiation\": { \"bronzeTier\": string, \"silverTier\": string, \"goldTier\": string }\n- \"sections\": array of { \"title\": string, \"durationMinutes\": number, \"teacherActions\": string, \"studentActions\": string, \"analogies\": string[], \"formativeCheck\": string }\n- \"exitTicket\": { \"questionStem\": string, \"expectedAnswerOrRubric\": string, \"metacognitivePrompt\": string }\n- \"teacherNotes\": { \"commonPitfalls\": string[], \"troubleshootingMatrix\": array of { \"issue\": string, \"potentialCause\": string, \"solution\": string }, \"extensionNotes\": string }\n`.trim();\n}\n","import type { LessonPlan } from '../../schemas';\nimport { loadAuthoringTemplate } from '../../services/templateLoader';\n\nexport interface ActivityPromptInput {\n  lesson: LessonPlan;\n  language: string;\n  hardwareBOM?: string[];\n  softwareTools?: string[];\n}\n\nexport function buildActivityPrompt(input: ActivityPromptInput): string {\n  const { lesson, language, hardwareBOM, softwareTools } = input;\n\n  const loList = lesson.learningObjectives\n    .map((lo) => `- [${lo.bloomLevel}] ${lo.code}: ${lo.name || ''} — ${lo.description}${lo.successCriteria ? ` (Evidence: ${lo.successCriteria})` : ''}`)\n    .join('\\n');\n\n  const lessonFlowSummary = (lesson.sections || [])\n    .map((s, idx) => `### Stage ${idx + 1}: ${s.title} (${s.durationMinutes} mins)\\n- Teacher Moves: ${s.teacherActions}\\n- Student Actions: ${s.studentActions}${(s.analogies || []).length > 0 ? `\\n- Analogies: ${s.analogies.join('; ')}` : ''}`)\n    .join('\\n\\n');\n\n  return `\n# ROLE & PERSONA\nYou are the **@activity** Specialist in Inquiry-Based Learning and Hands-On STEM/Software Engineering design.\n\n# MISSION SCOPE & CANONICAL CONTRACT\nTransform the exact pedagogical flow and activities from the Master Lesson Plan (LESSON) into an active, hands-on, inquiry-driven classroom lab.\n\n## STRICT CONTRACT RULES (CRITICAL):\n1. **Activity Sequence Alignment:** You MUST operationalize and expand the EXACT activity sequence and stages defined in the Master Lesson Plan. DO NOT invent an unrelated topic or activity (e.g. if the lesson is about Design Thinking, Empathy Mapping and Problem Definition, the activity MUST be an Empathy Mapping & Problem Definition lab on paper/Miro, NOT a physical hardware soldering or wiring lab).\n2. **Context-Appropriate Materials & BOM:** \n   - Only include physical hardware in \\`<!-- [HARDWARE_BOM] -->\\` if the lesson explicitly involves physical wiring or hardware setup.\n   - If the lesson is conceptual, design, or pure software, \\`hardware\\` must be empty or contain only workstation tools (e.g. \"Developer Workstation\"), while \\`consumables\\` and \\`software\\` contain paper, sticky notes, IDE, or design canvas.\n3. **Context-Appropriate Safety:** Safety warnings must strictly match what students actually do in this specific lesson (e.g. avoid electrical warnings for a paper-based design workshop).\n4. **3-Tier Differentiation:** Follow the scaffolding defined in the lesson plan:\n   - 🥉 Bronze: ${lesson.differentiation?.bronzeTier || 'Foundational core task'}\n   - 🥈 Silver: ${lesson.differentiation?.silverTier || 'Application task with additional logic'}\n   - 🥇 Gold: ${lesson.differentiation?.goldTier || 'Enrichment and creative extension'}\n\n# MANDATORY TEMPLATE STRUCTURE\nYou MUST generate data aligned with this Markdown template:\n---\n${loadAuthoringTemplate('ACT_template.md') ?? '[TEMPLATE FILE NOT FOUND: ACT_template.md]'}\n---\n\n# CANONICAL MASTER LESSON CONTEXT (SOURCE OF TRUTH)\n- **Lesson ID:** ${lesson.lessonId}\n- **Lesson Title:** ${lesson.title}\n- **Topic:** ${lesson.topic}\n- **Target Audience:** ${lesson.targetGradeOrAudience}\n- **Lesson Overview:** ${lesson.overview}\n- **Hook Scenario:** ${lesson.hookScenario}\n- **Learning Objectives:**\n${loList}\n\n- **Master Lesson Flow (Stages & Teacher/Student Actions):**\n${lessonFlowSummary}\n\n${lesson.guidedPractice ? `- **Guided Practice Context:** ${lesson.guidedPractice.title} — ${lesson.guidedPractice.explanation}` : ''}\n${lesson.materialsSummary ? `- **Lesson Materials Summary:** ${lesson.materialsSummary}` : ''}\n\n# INPUT PARAMETERS\n- **Language Policy:** Output 100% in **\"${language}\"**.\n- **Available Hardware Context:** ${(hardwareBOM || []).join(', ') || 'Developer Workstation'}\n- **Available Software Context:** ${(softwareTools || []).join(', ') || 'IDE / Design Canvas'}\n\n# REQUIRED JSON KEYS\nReturn a single JSON object matching ActivityLabSchema with these exact keys:\n- \"artifactType\": \"ACT\"\n- \"lessonId\": \"${lesson.lessonId}\"\n- \"title\": string (Must match or complement \"${lesson.title}\")\n- \"language\": \"${language}\"\n- \"objective\": string (Hands-on practical objective directly fulfilling the lesson LOs)\n- \"totalDurationMinutes\": number (e.g. 45 or 60)\n- \"computationalThinking\": { \n    \"problemStatement\": string (Authentic real-world challenge aligned with lesson hook),\n    \"decomposition\": string[] (3-4 discrete steps directly matching the lesson flow),\n    \"algorithmDesign\": string (Data flow, logic, or design framework to follow before executing)\n  }\n- \"materialsBOM\": { \n    \"hardware\": string[] (Hardware components ONLY if physical hardware is touched, else empty array []),\n    \"software\": string[] (IDEs, web tools, simulators, or design platforms),\n    \"consumables\": string[] (Paper, pens, sticky notes, wires if applicable),\n    \"otherResources\": string[] (Handout, empathy canvas, or reference docs)\n  }\n- \"safetyWarnings\": string[] (Realistic cautions matching the specific activity)\n- \"designConstraints\": string[] (Design constraints to stimulate thinking)\n- \"teacherTips\": string[] (Pedagogical facilitation tips)\n- \"activeLearningWorkflow\": {\n    \"phase1Planning\": { \"durationMinutes\": number, \"studentTask\": string, \"teacherAction\": string, \"inquiryQuestions\": string[] },\n    \"phase2Implementation\": { \"durationMinutes\": number, \"studentTask\": string, \"teacherAction\": string, \"codeOrCommands\": string[] },\n    \"phase3Debugging\": { \"durationMinutes\": number, \"testingSteps\": string, \"errorAnalysis\": string }\n  }\n- \"steps\": array of {\n    \"stepNumber\": number,\n    \"title\": string,\n    \"durationMinutes\": number,\n    \"teacherInstructions\": string,\n    \"studentInstructions\": string,\n    \"checkpoint\": string\n  } (Detailed step-by-step procedure operationalizing the lesson stages)\n- \"differentiation3Tier\": { \n    \"bronzeTier\": string, \n    \"silverTier\": string, \n    \"goldTier\": string \n  }\n- \"scaffoldingSupport\": string\n- \"levelUpExtension\": string\n- \"reflectionQuestion\": string\n`.trim();\n}\n","import type { LessonPlan, ActivityLab } from '../../schemas';\nimport { loadAuthoringTemplate } from '../../services/templateLoader';\n\nexport interface CodeLabPromptInput {\n  lesson: LessonPlan;\n  activity?: ActivityLab;\n  language: string;\n  targetTechStack?: string[];\n}\n\nexport function buildCodeLabPrompt(input: CodeLabPromptInput): string {\n  const { lesson, activity, language, targetTechStack } = input;\n  const techStackList = targetTechStack && targetTechStack.length > 0\n    ? targetTechStack\n    : ['General Programming & Engineering'];\n\n  const loList = lesson.learningObjectives\n    .map((lo) => `- [${lo.bloomLevel}] ${lo.code}: ${lo.name || ''} — ${lo.description}`)\n    .join('\\n');\n\n  return `\n# ROLE & PERSONA\nYou are the **Lead Software Architect & Engineering Instructor**, responsible for creating production-quality, runnable Code Labs with automated tests and clear debugging guidance.\n\n# MISSION SCOPE & CANONICAL CONTRACT\nGenerate complete, verified source code that satisfies the lesson objectives and operationalizes the practical tasks of this lesson.\n\n## IN SCOPE:\n- **Environment & Setup:** Specify exact language versions, required packages, IDE setups, and environment variables.\n- **3-Tier Lab Tasks:** Define progressive challenges:\n  - 🥉 **Bronze:** Basic setup, syntax correctness, clean run.\n  - 🥈 **Silver:** Core logic implementation, data transformations, error handling.\n  - 🥇 **Gold:** Advanced edge cases, optimizations, or external service integration.\n- **Verified Code:** Provide complete, runnable Starter Code (with skeleton/TODO markers) and Solution Code (with robust error handling).\n- **Troubleshooting Matrix:** Provide an actionable table with at least 3 common runtime/compilation bugs, their root cause, and exact fix.\n- **Verification Checklist:** End-to-end checks for student self-submission.\n\n# MANDATORY TEMPLATE STRUCTURE\nYou MUST generate data aligned with this Markdown template:\n---\n${loadAuthoringTemplate('LAB_TEMPLATE.md') ?? '[TEMPLATE FILE NOT FOUND: LAB_TEMPLATE.md]'}\n---\n\n# CANONICAL LESSON CONTEXT (SOURCE OF TRUTH)\n- **Lesson ID:** ${lesson.lessonId}\n- **Lesson Title:** ${lesson.title}\n- **Topic:** ${lesson.topic}\n- **Lesson Overview:** ${lesson.overview}\n- **Learning Objectives:**\n${loList}\n${lesson.guidedPractice ? `- **Lesson Guided Code:**\\n\\`\\`\\`${lesson.guidedPractice.codeLanguage}\\n${lesson.guidedPractice.codeSnippet}\\n\\`\\`\\`` : ''}\n${activity?.objective ? `- **Activity Practical Objective:** ${activity.objective}` : ''}\n\n# INPUT PARAMETERS\n- **Tech Stack:** ${techStackList.join(', ')}\n- **Language Policy:** Code comments, explanations, and instructions in **\"${language}\"**.\n\n# REQUIRED JSON KEYS\nReturn a single valid JSON object matching CodeLabSchema with these exact keys:\n- \"artifactType\": \"CODE\"\n- \"lessonId\": \"${lesson.lessonId}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"techStack\": string[]\n- \"environmentSetup\": { \"languageFramework\": string, \"ideEditor\": string, \"requiredLibraries\": string[], \"hardwareOrEnvConnection\": string }\n- \"threeTierTasks\": {\n    \"bronze\": { \"mins\": number, \"objective\": string, \"task\": string, \"requirement\": string },\n    \"silver\": { \"mins\": number, \"objective\": string, \"task\": string, \"requirement\": string },\n    \"gold\": { \"mins\": number, \"objective\": string, \"task\": string, \"requirement\": string }\n  }\n- \"starterCode\": { \"filename\": string, \"language\": string, \"purpose\": \"starter\", \"content\": string, \"explanation\": string }\n- \"solutionCode\": { \"filename\": string, \"language\": string, \"purpose\": \"solution\", \"content\": string, \"explanation\": string }\n- \"testCases\": array of { \"description\": string, \"input\": string, \"expectedOutput\": string }\n- \"troubleshootingMatrix\": array of { \"issue\": string, \"potentialCause\": string, \"solution\": string }\n- \"commonBugsAndFixes\": array of { \"bugDescription\": string, \"solutionHint\": string }\n- \"submissionChecklist\": string[]\n`.trim();\n}\n","import type { LessonPlan } from '../../schemas';\n\nexport interface WorksheetPromptInput {\n  lesson: LessonPlan;\n  language: string;\n}\n\nexport function buildWorksheetPrompt(input: WorksheetPromptInput): string {\n  const { lesson, language } = input;\n\n  return `\n# System Methodology: Guided Worksheet Design (@activity — Scaffolded Practice)\n\nYou are the **@activity** specialist designing a Guided Worksheet (WKS) based on the **Gradual Release Model** (I Do -> We Do -> You Do).\n\n## TARGET OUTPUT LANGUAGE ENFORCEMENT\n- **Target Language:** **\"${language}\"**\n- Output all instructions, questions, think-aloud reflection prompts, and checkpoints strictly in **\"${language}\"**.\n\n## MASTER LESSON CONTRACT\n- **Lesson:** ${lesson.title} (${lesson.lessonId})\n- **Objectives:** ${lesson.learningObjectives.map((lo) => lo.description).join('; ')}\n\n## REQUIREMENTS\n1. **Scaffolding Ladder:** Include exercises spanning across:\n   - Section A (⭐ Remember / Fill-in-the-blank)\n   - Section B (⭐⭐ Understand / Short answer)\n   - Section C (⭐⭐⭐ Apply / Scenario-based problem)\n   - Section D (⭐⭐⭐⭐ Analyze / Extension challenge)\n2. **Think-Aloud Prompts:** Include metacognitive reflection prompts.\n3. **Checkpoints:** Include teacher-signoff checkpoints to prevent misconceptions.\n\n# REQUIRED JSON KEYS\nReturn a single valid JSON object matching WorksheetSchema with these exact keys:\n- \"artifactType\": \"WKS\"\n- \"lessonId\": \"${lesson.lessonId}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"learningObjectivesSummary\": string[] (checklist of objectives students will achieve)\n- \"exercises\": array of {\n    \"exerciseId\": string (e.g. \"Ex1_A\", \"Ex2_B\"),\n    \"sectionTier\": \"Section_A_Remember\" | \"Section_B_Understand\" | \"Section_C_Apply\" | \"Section_D_Analyze\",\n    \"difficultyStars\": number (1 to 4),\n    \"prompt\": string,\n    \"starterSnippetOrTemplate\": string (optional code with blanks or template to complete),\n    \"answerSpaceType\": \"code_box\" | \"text_lines\" | \"multiple_choice\" | \"matching_table\",\n    \"hint\": string (optional scaffolding hint)\n  }\n- \"thinkAloudPrompts\": string[] (metacognitive reflection prompts)\n- \"checkpoints\": array of {\n    \"afterExerciseId\": string,\n    \"instruction\": string\n  }\n`.trim();\n}\n","import type { LessonPlan } from '../../schemas';\n\nexport interface HandoutPromptInput {\n  lesson: LessonPlan;\n  language: string;\n}\n\nexport function buildHandoutPrompt(input: HandoutPromptInput): string {\n  const { lesson, language } = input;\n\n  return `\n# System Methodology: Student Reference Handout (@content — Publishing Mode)\n\nYou are the **@content** specialist creating an instant-reference Student Handout following the **5-Second Rule** (scannable, concise, learner-facing).\n\n## TARGET OUTPUT LANGUAGE ENFORCEMENT\n- **Target Language:** **\"${language}\"**\n- Output all headings, bullet points, callout boxes, and glossary definitions strictly in **\"${language}\"**.\n- Use second-person voice (\"You will...\").\n\n## MASTER LESSON CONTRACT\n- **Lesson ID:** ${lesson.lessonId}\n- **Title:** ${lesson.title}\n- **Overview:** ${lesson.overview}\n\n## REQUIREMENTS\n1. **5-Second Scannability:** Max 3 heading levels, concise bullet points (<= 7 per list), bold key terms on first use.\n2. **Tables & Snippets:** Use tables for comparisons or pinouts, and clean copy-paste ready code syntax blocks.\n3. **Callout Boxes:** Include at least one Key Formula / Syntax Box, Analogy Reminder, or Common Mistake callout.\n4. **Zero-Jargon Glossary:** Define all newly introduced technical terms in plain language.\n5. **Sanitization:** Do NOT include teacher notes, Bloom tags, or answer keys in this student handout.\n\n## REQUIRED JSON KEYS\nPlease return a single JSON object matching these exact keys:\n- \"artifactType\": \"HANDOUT\"\n- \"lessonId\": \"${lesson.lessonId}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"tagline\": string (1-sentence summary in \"${language}\")\n- \"sections\": array of { \"heading\": string, \"summaryPoints\": string[], \"codeSnippet\": string, \"calloutBox\": { \"type\": \"key_formula\" | \"analogy_reminder\" | \"common_mistake\", \"title\": string, \"content\": string } }\n- \"glossary\": array of { \"term\": string, \"definition\": string }\n`.trim();\n}\n","import type { LessonPlan } from '../../schemas';\n\nexport interface SlidesPromptInput {\n  lesson: LessonPlan;\n  language: string;\n  marpTheme?: string;\n}\n\nexport function buildSlidesPrompt(input: SlidesPromptInput): string {\n  const { lesson, language, marpTheme } = input;\n  const concepts = lesson.coreConcepts || [];\n\n  return `\n# System Methodology: Marp Presentation Slides Deck (@illustrator + @content)\n\nYou are the **@illustrator + @content** presentation architect. Your mission is to produce a pedagogically structured, highly interactive Marp presentation deck built on **Chunky Micro-Cycle Learning (Learn-Apply-Validate Loops)**.\n\n## PEDAGOGICAL PHILOSOPHY (ANTI-FRONT-LOADING)\n⛔ **DO NOT DUMP THEORY ALL AT ONCE:** Never lecture through Concept 1, 2, and 3 consecutively for 30 minutes before giving students a hands-on task. This causes severe cognitive overload and passive disengagement.\n✅ **CHUNKY MICRO-LEARNING & IMMEDIATE APPLICATION:** Break the lesson into self-contained batches. For EACH concept batch, provide foundational theory, followed IMMEDIATELY by a quick hands-on micro-practice / cold-call check. Only after students master the micro-bricks do we transition into the **Integrated Advanced Hands-On Lab**.\n\n---\n\n## TARGET OUTPUT LANGUAGE ENFORCEMENT\n- **Target Language:** **\"${language}\"**\n- Output all slide titles, bullet points, diagram labels, and presenter notes in **\"${language}\"**.\n- Keep programming keywords and code syntax intact.\n\n## MASTER LESSON CONTRACT\n- **Lesson ID:** ${lesson.lessonId}\n- **Title:** ${lesson.title}\n- **Topic:** ${lesson.topic}\n- **Overview:** ${lesson.overview}\n- **Theme:** ${marpTheme || 'gaia'}\n- **Core Concepts (${concepts.length}):**\n${concepts.map((c, i) => `  ${i + 1}. **${c.name}**: ${c.technicalDepth || ''} (Analogy: ${c.analogy || ''})`).join('\\n')}\n\n---\n\n## DYNAMIC SLIDE ARCHITECTURE (CHUNKY MICRO-CYCLES)\n\n### Phase 1: Anchor Opening (~3-4 slides)\n1. **Title & Mission:** Lesson name, real-world context, and overarching build objective.\n2. **Roadmap & Agenda:** Visual journey breakdown showing the micro-milestones and timing.\n3. **Prior Knowledge Warm-up (Review):** 2 cold-call questions activating existing mental models.\n4. **Hook Scenario (Engage):** High-stakes real-world engineering problem (stakes & constraints, no solution yet).\n\n### Phase 2: Concept Micro-Cycles (Repeat this 4-6 slide loop for EACH Core Concept Batch)\nFor EACH Concept Batch ($i = 1 \\\\dots N$):\n- **Slide A: Core Definition & Mental Model** — What is it? Real-world analogy with visual clarity.\n- **Slide B: Visual Architecture / Diagram** — Mermaid sequence diagram, data flow, or component wiring.\n- **Slide C: Code Demo (I Do)** — Concise, annotated runnable snippet showing the minimal syntax.\n- **Slide D: Quick Micro-Practice / Try It Now (We Do / You Do)** — A 3-5 minute immediate interactive task for students to write/modify 3-5 lines of code at their desks.\n- **Slide E: Concept Check / Cold-Call** — 1 rapid formative check question with instant reveal.\n- **Slide F: Golden Rule / Takeaway** — 1 key takeaway, syntax rule, or anti-pattern to avoid.\n\n### Phase 3: Integrated Advanced Hands-On Lab (~3-4 slides)\n*Only after all concept micro-bricks are learned and verified do we assemble them into the comprehensive project challenge:*\n- **Advanced Challenge Briefing:** The big mission integrating all concepts together.\n- **3-Tier Differentiation:**\n  - 🥉 **Bronze:** Complete core working pipeline.\n  - 🥈 **Silver:** Error handling, resilience, and input validation.\n  - 🥇 **Gold:** Performance optimization, edge cases, and asynchronous polish.\n- **Live Execution Protocol & Gotchas:** Step-by-step workflow, debugging tips, and emergency rollback.\n\n### Phase 4: Reflection & Closing (~2-3 slides)\n- **Formative Checkpoint (Traffic Light):** 🟢 Ready / 🟡 Shaky / 🔴 Stuck with instant troubleshooting tips.\n- **Exit Ticket:** 2 technical scenario questions + 1 metacognitive reflection prompt.\n- **Summary & Next Milestone Preview:** 3 core takeaways and teaser for the next lesson.\n\n---\n\n## COMPOSITION & COGNITIVE LOAD RULES\n- **Max 6 bullet points per slide** (Miller's Law).\n- **Max 15 words per bullet point** — use fragments, code blocks, and visual tables.\n- **Code Slides:** Use fenced code blocks with language tags and line-by-line annotations.\n- **Presenter Notes:** Include detailed teacher talk tracks, cold-call prompts, and facilitation tips for every single slide.\n\n# REQUIRED JSON KEYS\nReturn a single valid JSON object matching SlideDeckSchema with these exact keys:\n- \"artifactType\": \"SLIDE\"\n- \"lessonId\": \"${lesson.lessonId}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"marpTheme\": \"${marpTheme || 'gaia'}\"\n- \"slides\": array of {\n    \"slideNumber\": number (1 to N),\n    \"slideType\": \"title\" | \"agenda\" | \"review\" | \"hook\" | \"concept_def\" | \"concept_visual\" | \"concept_compare\" | \"concept_check\" | \"concept_recap\" | \"code_demo\" | \"guided_practice\" | \"activity_intro\" | \"activity_steps\" | \"checkpoint\" | \"exit_ticket\" | \"summary_next\" | \"custom\",\n    \"title\": string (in \"${language}\"),\n    \"bloomTag\": \"Remember\" | \"Understand\" | \"Apply\" | \"Analyze\" | \"Evaluate\" | \"Create\" | \"None\",\n    \"bulletPoints\": string[] (Max 6 points, max 15 words each),\n    \"codeSnippet\": string (optional, runnable snippet),\n    \"diagramMermaid\": string (optional, valid mermaid code),\n    \"presenterNotes\": string (optional, detailed talk track)\n  }\n`.trim();\n}\n\nexport const SLIDE_CANONICAL_METHODOLOGY = `\nMANDATORY 12-14 SLIDE MICRO-CYCLE STRUCTURE (Delimited by '---'):\n1. **Slide 1 [Title & Mission]:** Real-world inquiry hook and overarching build mission\n2. **Slide 2 [Agenda & Roadmap]:** Timing and milestone breakdown table\n3. **Slide 3 [Warm-Up / Prior Knowledge]:** 2-column recall + 60-second diagnostic challenge card\n4. **Slide 4 [High-Stakes Hook Scenario]:** Authentic engineering/domain crisis card + dilemma constraint\n5. **Slide 5 [Core Concept 1: Mental Model]:** Definition, intuitive everyday analogy, and golden rule card\n6. **Slide 6 [Architecture & Visual Flow]:** Clean Mermaid diagram (flowchart or sequenceDiagram) + 3 flow steps\n7. **Slide 7 [Core Concept 2: Syntax / Mechanism Anatomy]:** Side-by-side runnable code + anatomy breakdown & syntax trap card\n8. **Slide 8 [Guided Practice: Try It Now]:** 3-minute active desk task card with starter hint and success criteria\n9. **Slide 9 [Integrated Hands-On Lab]:** 3-tier differentiated challenge cards (Bronze / Silver / Gold) + gotcha alert card\n10. **Slide 10 [Traffic Light Checkpoint & Pitfalls]:** Formative self-check cards (🟢/🟡/🔴) & diagnostic test question\n11. **Slide 11 [Exit Ticket & Metacognition]:** 2 scenario-based check questions + 1 metacognitive reflection prompt\n12. **Slide 12 [Summary & Next Steps]:** 3 core golden rules + preview card of next upcoming milestone\n\nMandatory Canvas & Presentation Invariants:\n- A slide is an INTERACTIVE PROJECTION CANVAS, NOT a textbook! Absolutely NO dense paragraphs or walls of text.\n- Follow the 6x6 rule: Maximum 4-6 bullet points per slide, maximum 8-12 words per bullet.\n- MARKDOWN-NATIVE MARKUP ONLY (kit 1.5.66/1.5.67) — do NOT emit HTML elements (\\`<div>\\`, \\`<span>\\`, inline styles) anywhere in the deck body. Layout reference (adapted from the Slidev prompt's layout system, expressed with Marp directives):\n\n  | Need | Markdown to use |\n  |---|---|\n  | Two columns | \\`<!-- _class: cols2 -->\\` on the slide's first line, then plain Markdown (CSS column-count splits the flow) |\n  | Three columns | \\`<!-- _class: cols3 -->\\` same as above |\n  | Explicit column split (≈ Slidev's \\`::right::\\`) | a \\`***\\` thematic break inside a cols2/cols3 slide = forced column break |\n  | Side-by-side comparison (roles, before/after) | a Markdown table \\`| A | B |\\` |\n  | Callout / \"card\" | a blockquote with an emoji label — \\`> 🎯 **Golden Rule:** ...\\`, \\`> ⚠️ **Gotcha:** ...\\`, \\`> ✅ **Success:** ...\\` |\n  | Tiered challenges (Bronze/Silver/Gold) | three labeled blockquotes (\\`> 🥉 ...\\`) or a table — NOT HTML |\n\n  The deck frontmatter MUST carry the matching style block (right after \\`marp: true\\`):\n    style: |\n      section.cols2 { column-count: 2; column-gap: 2.2rem; }\n      section.cols3 { column-count: 3; column-gap: 1.6rem; }\n      section.cols2 h2:first-of-type, section.cols3 h2:first-of-type { margin-top: 0; column-span: all; }\n      section.cols2 hr, section.cols3 hr { border: 0; height: 0; margin: 0; break-after: column; }\n      blockquote { border-left: 4px solid #3b5bdb; background: #f4f6fb; padding: .3em .8em; border-radius: 6px; }\n      table { font-size: 0.82em; }\n- MANDATORY PRESENTER NOTES ON EVERY SLIDE: Every slide MUST end with \\`<!-- Presenter Notes: ... -->\\` containing:\n  * SCRIPT: 60-90s teacher talk track with intuitive analogies.\n  * COLD CALL / CHECK: Specific diagnostic question to ask students.\n  * SCAFFOLDING / GOTCHA: Guidance for students who get stuck.\n  * PACING: Recommended minutes for the slide.\n- Output 100% valid Marp Markdown.\n`.trim();\n\nexport interface MarpMarkdownSlidePromptInput {\n  lessonCode: string;\n  lessonTitle: string;\n  pedagogyLabel: string;\n  templateScaffold: string;\n  languageDirective: string;\n  headingDirective: string;\n  /** Canonical LESSON phase content — the same SOURCE OF TRUTH block the\n   *  bespoke/hybrid engines receive. Kit 1.5.55: without it the marp model\n   *  drifted to a different subject entirely (L02 run 2026-09-30 authored a\n   *  Python If/Else deck for a SwiftUI layout lesson). */\n  lessonFlowExcerpt?: string;\n  /** Optional REQUIRED slide outline (kit 1.5.61): ordered section titles the\n   *  deck MUST cover in order — the same structural ground truth the HTML\n   *  engines' blueprint receives, so all three engines align on one outline.\n   *  Absent → the 12-14 slide micro-cycle template structure applies. */\n  slidesOutline?: string[];\n}\n\nexport function buildMarpMarkdownSlidePrompt(input: MarpMarkdownSlidePromptInput): string {\n  // Topic-anchoring ground truth (kit 1.5.55): the template scaffold alone let\n  // the model free-associate a familiar lesson onto it. The master title and\n  // the lesson phase content must live IN the prompt, with an explicit\n  // consistency directive — mirroring the HTML engines' ground truth block.\n  const groundTruth = input.lessonFlowExcerpt\n    ? `\n### ⛔ MASTER LESSON GROUND TRUTH (BINDING — READ BEFORE WRITING):\n- The ONLY acceptable subject of this deck is: **\"${input.lessonTitle}\"** (LESSON_${input.lessonCode}).\n- Every slide MUST teach THIS subject. Authoring a deck about any other topic,\n  language, or framework — however polished — is a hard failure.\n- Before finalizing, verify: the cover title names this lesson's actual subject;\n  every concept slide maps to a phase below; code snippets use the tools,\n  language and identifiers named in the lesson content.\n- If you cannot ground a slide in the content below, re-read it — do NOT\n  substitute a different (better-known) lesson.\n\n### LESSON PHASE CONTENT (SOURCE OF TRUTH FOR REAL CONTENT):\n${input.lessonFlowExcerpt}\n`\n    : `\n### ⛔ MASTER LESSON GROUND TRUTH (BINDING):\n- The ONLY acceptable subject of this deck is: **\"${input.lessonTitle}\"** (LESSON_${input.lessonCode}).\n- Authoring a deck about any other topic, language, or framework is a hard\n  failure — verify the cover title names this lesson's actual subject before\n  finalizing.\n`;\n\nconst outlineBlock = input.slidesOutline?.length\n    ? `\n### 📐 REQUIRED SLIDE OUTLINE (BINDING STRUCTURE — THE DECK'S SECTION SPINE):\nThis outline REPLACES the template's sample deck body and the \"MANDATORY\n12-14 SLIDE MICRO-CYCLE STRUCTURE\" — neither of them appears in this prompt\nas a structure to clone, and THIS OUTLINE WINS over any structure hint\nyou may infer. The template's slide TYPES (hook card, checkpoint, exit\nticket) may be reused WITHIN outline items.\n- Cover the outline items IN THE GIVEN ORDER; every item needs at least one\n  slide (a large item may expand into several consecutive slides).\n- Do NOT invent sections that are neither in the outline nor in the LESSON\n  phase content below.\n- Slide wording stays free — the outline binds coverage and order only.\nOUTLINE (${input.slidesOutline.length} items, in order):\n${input.slidesOutline.map((t, i) => `${i + 1}. ${t}`).join('\\n')}\n`\n    : '';\n\n  // Kit 1.5.63: with a required outline, the template's full sample-deck body\n  // (a complete 12-slide micro-cycle deck) must NOT enter the prompt — the\n  // model clones it verbatim (measured live on 1.5.61/1.5.62: the outline\n  // block lost against the sample deck even with \"supersedes\" wording). Keep\n  // only the marp frontmatter for format, and strip the mandatory-structure\n  // list from the methodology (canvas invariants stay).\n  const hasOutline = Boolean(input.slidesOutline?.length);\n  const scaffold = hasOutline\n    ? (input.templateScaffold.match(/^---[\\s\\S]*?\\n---/)?.[0] || input.templateScaffold)\n    : input.templateScaffold;\n  const methodology = hasOutline\n    ? SLIDE_CANONICAL_METHODOLOGY.replace(\n        /MANDATORY 12-14 SLIDE MICRO-CYCLE STRUCTURE[\\s\\S]*?(?=Mandatory Canvas & Presentation Invariants)/,\n        'STRUCTURE: follow the REQUIRED SLIDE OUTLINE above as the deck\\'s section spine (delimit slides with \\'---\\').\\n\\n'\n      )\n    : SLIDE_CANONICAL_METHODOLOGY;\n\n  return `You are @illustrator & @content (Pedagogical Slide Deck Presentation Specialists).\nBased on Master Lesson Plan \\`LESSON_${input.lessonCode}.md\\`, lesson context, and the MARP SLIDE TEMPLATE below, author the complete, highly engaging Marp presentation deck: \\`SLIDE_${input.lessonCode}.md\\`.\n${groundTruth}${outlineBlock}\n[MARP SLIDE TEMPLATE SCAFFOLD]:\n${scaffold}\n\n${methodology}\n\n${input.languageDirective}\n\n${input.headingDirective}`.trim();\n}\n\nexport interface HtmlDeckSlidePromptInput {\n  lessonCode: string;\n  lessonTitle: string;\n  pedagogyLabel: string;\n  languageDirective: string;\n  headingDirective: string;\n  glossaryBlock?: string;\n  customContract?: string;\n}\n\nexport function buildHtmlDeckSlidePrompt(input: HtmlDeckSlidePromptInput): string {\n  const contract = input.customContract || `## HTML SLIDE ENGINE — AGENT GENERATION CONTRACT\nYou generate structured slide decks for the LearnWell HTML Slide Presentation Engine.\nYour output MUST be a single, valid JSON object matching the Slide Deck JSON schema below.\n\n### 🎨 Available Layout Presets (Use layoutId — these are the ONLY valid ids):\n1. **hero-cover**: Title/Cover (tag, title, subtitle, author, date).\n2. **split-concept-code**: Points left, code card right (tag, title, points[], code, language, codeNote).\n3. **two-columns-compare**: Side-by-side cards (tag, title, col1Title, col1Items[], col2Title, col2Items[]).\n4. **three-cards-grid**: 3 pillar cards (tag, title, cards[{badge,title,desc}]).\n5. **timeline-steps**: Step-by-step pipeline (tag, title, steps[{stepNum,title,desc}]).\n6. **metric-callout**: Big stat slide (tag, metric, metricLabel, title, desc).\n7. **checkpoint-quiz**: Multiple choice (tag, title, question, options[{label,text,isCorrect}], explanation).\n8. **summary-takeaways**: Wrap-up (tag, title, takeaways[], nextStep).\n\n### 🎙️ Mandatory 3-Part Presenter Notes on EVERY slide:\nEvery slide MUST include notes with:\n- Talk Track: 2-3 sentences speaking script\n- Cold-Call: 1 check question\n- Scaffolding Tip: 1 analogy or hint\n\n### ⚠️ STRICT SLIDE FORMATTING INVARIANTS:\n1. Every slide MUST store its content fields inside \"slots\": { ... }. NEVER put \"title\", \"content\", or points at the top level of a slide!\n2. All code slots MUST contain real, executable, high-fidelity code. Never use placeholders like \"<CODE>\" or \"...\".\n3. All point and card slots MUST contain concrete, rich pedagogical explanations. Never use placeholder dots or empty cards.\n\n### Output JSON Format:\n\\`\\`\\`json\n{\n  \"title\": \"${input.lessonTitle}\",\n  \"theme\": \"ocean\",\n  \"slides\": [\n    {\n      \"layoutId\": \"hero-cover\",\n      \"slots\": { \"title\": \"${input.lessonTitle}\", \"subtitle\": \"...\" },\n      \"notes\": \"Talk Track: ...\\\\nCold-Call: ...\\\\nScaffolding Tip: ...\"\n    }\n  ]\n}\n\\`\\`\\``;\n\n  return `You are @illustrator & @content (Interactive HTML Slide Deck Presentation Architects).\nBased on Master Lesson Plan \\`LESSON_${input.lessonCode}.md\\`, pedagogical model (${input.pedagogyLabel}), and the HTML SLIDE ENGINE CONTRACT below, author the complete, highly engaging HTML presentation deck in JSON format: \\`SLIDE_${input.lessonCode}\\`.\n\n${contract}\n\n${input.languageDirective}\n\n${input.headingDirective}${input.glossaryBlock ? `\\n\\n${input.glossaryBlock}` : ''}\n\nOutput ONLY the raw JSON object. Do not include extra conversational text or markdown code fences.`.trim();\n}\n\n\n","import type { LessonPlan, ActivityLab } from '../../schemas';\n\nexport interface TeacherGuidePromptInput {\n  lesson: LessonPlan;\n  activity?: ActivityLab;\n  language: string;\n}\n\nexport function buildTeacherGuidePrompt(input: TeacherGuidePromptInput): string {\n  const { lesson, activity, language } = input;\n\n  return `\n# System Methodology: Teacher Facilitation Guide (@guide)\n\nYou are the **@guide** instructional coach. Your goal is to produce a practical, insightful Teacher Guide for delivering this lesson and troubleshooting student roadblocks.\n\n## TARGET OUTPUT LANGUAGE ENFORCEMENT\n- **Target Language:** **\"${language}\"**\n- Output all rationales, misconceptions, troubleshooting guides, and rubric descriptions strictly in **\"${language}\"**.\n\n## MASTER LESSON CONTRACT\n- **Lesson:** ${lesson.title} (${lesson.lessonId})\n- **Overview:** ${lesson.overview}\n- **Activity Context:** ${activity ? activity.objective : 'Standard lesson activities'}\n\n## REQUIREMENTS\n1. **Instructional Rationale:** Why this sequence works and how to guide pacing.\n2. **Common Misconceptions & Counter-Strategies:** Identify what students often confuse and provide actionable counter-explanations.\n3. **Troubleshooting Guide:** Detail at least 2 common technical bugs/symptoms, root causes, and explicit fixes.\n4. **Scoring Rubric:** Provide criteria for \"Meets Standard\" vs \"Exceeds Standard\" student performance.\n\n# REQUIRED JSON KEYS\nReturn a single valid JSON object matching TeacherGuideSchema with these exact keys:\n- \"artifactType\": \"GUIDE\"\n- \"lessonId\": \"${lesson.lessonId}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"pedagogicalRationale\": string (the instructional purpose behind this lesson flow)\n- \"commonMisconceptions\": array of {\n    \"misconception\": string (what students often wrongly assume or confuse),\n    \"counterStrategy\": string (how the teacher should explain or demonstrate the truth)\n  }\n- \"troubleshootingGuide\": array of {\n    \"symptom\": string (error message or failure symptom),\n    \"rootCause\": string (why this occurs),\n    \"solution\": string (exact step to fix it)\n  }\n- \"scoringRubric\": array of {\n    \"criteriaName\": string,\n    \"meetsStandard\": string (description of acceptable student performance),\n    \"exceedsStandard\": string (description of advanced mastery)\n  }\n`.trim();\n}\n","import type { LessonPlan, ActivityLab } from '../../schemas';\n\nexport interface ExtensionPromptInput {\n  lesson: LessonPlan;\n  activity?: ActivityLab;\n  language: string;\n}\n\nexport function buildExtensionPrompt(input: ExtensionPromptInput): string {\n  const { lesson, activity, language } = input;\n\n  return `\n# System Methodology: Extension Challenges & Novel Context (@extension)\n\nYou are the **@extension** specialist. Your mission is to design advanced, creative extension challenges that apply the lesson skills to novel real-world contexts without altering the core learning objectives.\n\n## TARGET OUTPUT LANGUAGE ENFORCEMENT\n- **Target Language:** **\"${language}\"**\n- Output challenge titles, context narratives, tasks, and guidance in **\"${language}\"**.\n\n## MASTER LESSON CONTRACT\n- **Lesson:** ${lesson.title} (${lesson.lessonId})\n- **Objectives:** ${lesson.learningObjectives.map((lo) => lo.description).join('; ')}\n- **Base Activity:** ${activity ? activity.objective : lesson.overview}\n\n## REQUIREMENTS\n1. Provide at least 2 distinct challenges (e.g. one technical optimization challenge, one authentic real-world application challenge).\n2. Keep the core learning objective preserved while increasing complexity or agency.\n3. Clearly define the expected deliverable for each challenge.\n\n# REQUIRED JSON KEYS\nReturn a single valid JSON object matching ExtensionSchema with these exact keys:\n- \"artifactType\": \"EXT\"\n- \"lessonId\": \"${lesson.lessonId}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"coreLearningObjectivePreserved\": string (the core LO extended by these challenges)\n- \"challenges\": array of {\n    \"challengeNumber\": number (1, 2, ...),\n    \"title\": string (Catchy title for the extension project),\n    \"contextDescription\": string (Novel real-world context for applying the skill),\n    \"taskDescription\": string (Specific goal and requirements of the challenge),\n    \"expectedDeliverable\": string (What the student produces: code, prototype, or report),\n    \"hintOrGuidance\": string (optional open-ended exploration prompt)\n  }\n`.trim();\n}\n","export interface JudgePromptInput {\n  targetArtifactType: string;\n  lessonId: string;\n  expectedLanguage: string;\n  targetObjectives: Array<{ code: string; description: string; bloomLevel: string }>;\n  generatedContentJson: string;\n  /**\n   * VERBATIM standard statements relevant to this artifact, keyed by canonical ID\n   * (\"packId:statementId\" -> verbatim text). Sourced from the Standards Registry.\n   * The judge compares the candidate against the REAL standard text, never memory.\n   * Optional for backward compatibility.\n   */\n  standardStatements?: Record<string, string>;\n}\n\nexport function buildJudgePrompt(input: JudgePromptInput): string {\n  const { targetArtifactType, lessonId, expectedLanguage, targetObjectives, generatedContentJson, standardStatements } = input;\n\n  return `\n# System Methodology: Multi-Agent LLM-as-Judge & Pedagogical Quality Auditor (@validator)\n\nYou are the **@validator / LLM-as-Judge** expert. Your task is to impartially and rigorously audit the generated curriculum artifact against pedagogical standards, Bloom's Taxonomy alignment, technical validity, and strict language adherence.\n\n## AUDIT TARGET\n- **Artifact Type:** ${targetArtifactType}\n- **Lesson ID:** ${lessonId}\n- **Expected Output Language:** \"${expectedLanguage}\"\n- **Target Learning Objectives:**\n${targetObjectives.map((lo) => `  - ${lo.code}: ${lo.description} (Bloom: ${lo.bloomLevel})`).join('\\n')}\n\n${standardStatements && Object.keys(standardStatements).length > 0 ? `## STANDARDS GROUND TRUTH (VERBATIM - from Standards Registry)\nThe statements below are COPIED VERBATIM from the official standards this course is bound to:\n${Object.entries(standardStatements).map(([id, text]) => `- [${id}] \"${text}\"`).join(\"\\n\")}\n\nYou MUST audit standards alignment ONLY against the statements above. If the candidate claims alignment with a standard NOT listed here, treat that claim as UNVERIFIABLE and score it down.` : \"\"}\n\n## CANDIDATE CONTENT JSON\n\\`\\`\\`json\n${generatedContentJson}\n\\`\\`\\`\n\n## EVALUATION CRITERIA & SCORING RUBRIC (TOTAL 100 POINTS)\nEvaluate the candidate artifact across these 6 dimensions:\n\n1. **Language Adherence (MANDATORY GATE - 15 pts):**\n   - 15 pts: 100% of instructions, explanations, and pedagogy strictly in \"${expectedLanguage}\". Technical keywords and code symbols preserved.\n   - 0 pts (FAIL GATE): Language contamination or wrong output language detected.\n\n2. **Bloom & Pedagogical Alignment (25 pts):**\n   - 25 pts: Cognitive depth of tasks/questions strictly fulfills the targeted Bloom levels (${targetObjectives.map(o => o.bloomLevel).join(', ')}). No superficial recall masquerading as high-level analysis.\n   - 15 pts: Minor misalignment in 1 objective or slight depth variance.\n   - 0-10 pts: Severe cognitive mismatch (e.g. asking basic definitions for an Evaluate-level objective).\n\n3. **Standards Alignment (20 pts):**\n   - 20 pts: Every learning objective and core activity demonstrably serves the VERBATIM standard statements listed in STANDARDS GROUND TRUTH above; cited statement IDs exist and are used faithfully (statement as destination, not script).\n   - 12 pts: All statements covered but 1 shows only partial fidelity (taught implicitly, or the assessment measures adjacent rather than the exact statement behavior).\n   - 5 pts: Explicit statement IDs referenced but 1+ IDs do not exist in STANDARDS GROUND TRUTH (hallucinated or stale IDs), or statements ignored while claimed as covered.\n   - 0 pts: No standards grounding at all despite STANDARDS GROUND TRUTH being present, or fabricated standard citations.\n   ${standardStatements && Object.keys(standardStatements).length > 0 ? '- NOTE: STANDARDS GROUND TRUTH IS PRESENT - this dimension is fully in scope.' : '- NOTE: No STANDARDS GROUND TRUTH provided. Award only for absence of fabricated standard citations; treat 20 pts as N/A and redistribute proportionally.'}\n\n4. **Completeness & Structural Integrity (15 pts):**\n   - 15 pts: All required schema fields are fully populated with substantive, age-appropriate content. No empty arrays, stubs, or placeholders.\n   - 8 pts: Some fields are thin or lack sufficient pedagogical detail.\n   - 0 pts: Missing critical sections.\n\n5. **Technical & Conceptual Accuracy (15 pts):**\n   - 15 pts: Code snippets, logic flows, architectural descriptions, and Mermaid diagrams are conceptually sound and valid. Every code identifier uses the REAL standard-library/API spelling of the declared stack (grounded in REFERENCE_PACK / canonical LESSON) — internal consistency with a glossary term name is NOT evidence of correctness. If \\`canonicalExposition\\` or \\`[KNOWLEDGE_EXPOSITION]\\` is provided, content strictly adheres to canonical concepts without contradicting definitions or examples.\n   - 8 pts: Minor syntax inaccuracies or unidiomatic code that does not break core concepts.\n   - 0 pts: Severe technical hallucinations, broken logic, invalid diagrams, invented casing/spelling rules for standard-library identifiers, or direct contradiction of canonical exposition knowledge.\n\n6. **Contract Consistency & Zero-Drift (10 pts):**\n   - 10 pts: Satellite artifact strictly adheres to the scope, tech stack, and objectives of Lesson ${lessonId} without introducing unrelated topics. If \\`canonicalLessonExcerpt\\` is present in candidate JSON, all satellite phases/activities strictly operationalize the master Lesson Flow and Activity Sequence without inventing divergent timelines.\n   - 0-5 pts: Scope drift, topic divergence, or disjoint activity sequence detected compared to master lesson.\n\n## VERDICT RULES\n- **PASS:** Score >= 80 AND Language Adherence = true AND Standards Alignment >= 12 (when STANDARDS GROUND TRUTH is present).\n- **NEEDS_REVISION:** Score between 60 and 79, or minor addressable flaws. Provide concrete, actionable repair prompts.\n- **FAIL:** Score < 60, Language Adherence failed, empty sections, critical technical hallucinations, or hallucinated standard IDs when STANDARDS GROUND TRUTH is present.\n\n## REQUIRED JSON KEYS\nPlease return a single JSON object matching these exact keys:\n- \"targetArtifactType\": \"${targetArtifactType}\"\n- \"lessonId\": \"${lessonId}\"\n- \"overallVerdict\": \"PASS\" | \"NEEDS_REVISION\" | \"FAIL\"\n- \"totalScore\": number (0 to 100)\n- \"languageAdherencePassed\": boolean\n- \"criteria\": array of { \"name\": string, \"passed\": boolean, \"score\": number, \"feedback\": string }\n- \"actionableRepairPrompts\": string[]\n`.trim();\n}\n\n/**\n * Stage 2: Macro-Pedagogy Curriculum Plan Judge Prompt\n */\nexport interface CurriculumPlanJudgePromptInput {\n  planJson: string;\n  briefingContext: string;\n  expectedLanguage?: string;\n  linterFindings?: Array<{ id: string; severity: string; title: string; description: string }>;\n}\n\nexport function buildCurriculumPlanJudgePrompt(input: CurriculumPlanJudgePromptInput): string {\n  const { planJson, briefingContext, expectedLanguage = 'Vietnamese', linterFindings = [] } = input;\n\n  return `\n# System Methodology: Principal Curriculum SME & Macro-Pedagogical Quality Judge (@sme_judge)\n\nYou are the **Lead Curriculum Architect & Classroom Practicum SME**. Your role is to rigorously evaluate a candidate \\`CURRICULUM_PLAN\\` (Schema v3) against empirical pedagogical science, cognitive load capacity, and real classroom delivery constraints.\n\n## COURSE BRIEFING & TARGET CONSTRAINTS\n${briefingContext}\n\n${linterFindings.length > 0 ? `## DETERMINISTIC PRE-LINT FINDINGS (0-TOKEN LINTER)\nThe deterministic structural linter detected the following issues in advance:\n${linterFindings.map((f) => `- [${f.severity}] ${f.id}: ${f.title} — ${f.description}`).join('\\n')}\nConsider these deterministic findings when scoring and issuing actionable repair prescriptions.` : ''}\n\n## CANDIDATE CURRICULUM PLAN JSON\n\\`\\`\\`json\n${planJson}\n\\`\\`\\`\n\n## EVALUATION RUBRICS & 5 CRITICAL DIMENSIONS (TOTAL 100 POINTS)\n\n1. **Step Incrementality & Single Leap Principle (20 pts):**\n   - 20 pts: Every session introduces at most ONE new syntax or algorithmic concept. No massive cognitive leaps (e.g. going from basic variables directly to asynchronous networking).\n   - 10 pts: Minor leap detected in 1 session that can be mitigated with starter code.\n   - 0 pts: Severe cognitive gap (e.g. multiple compound paradigms combined in one session).\n\n2. **Vygotsky ZPD Saturation & Cognitive Capacity (20 pts):**\n   - 20 pts: New concept count <= 2 per session (K-12) / 3 (Adults), with explicit prior concept anchor or recap slot.\n   - 10 pts: Session introduces 3 concepts without adequate bridge.\n   - 0 pts: Severe overload (>3 new concepts in a single session) or unanchored concepts.\n\n3. **Classroom Friction-Adjusted Time Budget (20 pts):**\n   - 20 pts: Incorporates 2.5x student friction multiplier. Total content minutes <= 85% of session duration (15% overhead reserved). No step > 76 minutes.\n   - 10 pts: Content is slightly packed, leaving < 10% buffer time.\n   - 0 pts: Overpacked content that will cause students to run out of time in a standard classroom.\n\n4. **Reigeluth Walking Skeleton & Milestone Agency (20 pts):**\n   - 20 pts: Unit 1 culminates in an end-to-end runnable MVP (Epitome). Subsequent units provide modular elaborations.\n   - 10 pts: Walking skeleton present but delayed to Unit 2.\n   - 0 pts: Pure theoretical silo teaching where no working product appears until the end of the course.\n\n5. **Exit Evidence Specificity (20 pts):**\n   - 20 pts: Every session produces an explicit, tangible, user-visible deliverable (e.g. running UI screen, passing test suite, physical LED sequence).\n   - 10 pts: Some sessions have generic deliverables (\"completed practice exercise\").\n   - 0 pts: Vague or absent deliverables (\"student understands topic\").\n\n## DECISION RULES\n- **PASS & AUTO-APPROVE:** Total Score >= 85 AND overallVerdict is \"PASS\" AND no CRITICAL actionable repairs.\n- **NEEDS_REVISION:** Total Score between 70 and 84, or fixable flaws. Prescribe concrete structured \\`actionableRepairs\\` (\\`SPLIT_STEP\\`, \\`INSERT_RECAP\\`, \\`ADJUST_TIME_BUDGET\\`, \\`REVISE_EXIT_EVIDENCE\\`).\n- **FAIL:** Total Score < 70, structural collapse, or unbridgeable pedagogical gaps.\n\n## OUTPUT FORMAT\nReturn a valid JSON object matching the MacroPedagogyPlanAuditSchema.\n`.trim();\n}\n\n/**\n * Stage 1: Project Graph Toolchain & Environment Provisioning Judge Prompt\n */\nexport interface ProjectGraphJudgePromptInput {\n  bundleJson: string;\n  briefingContext: string;\n  linterFindings?: Array<{ id: string; severity: string; title: string; description: string }>;\n}\n\nexport function buildProjectGraphJudgePrompt(input: ProjectGraphJudgePromptInput): string {\n  const { bundleJson, briefingContext, linterFindings = [] } = input;\n\n  return `\n# System Methodology: Lead Systems Engineer & Lab Infrastructure Auditor (@infra_judge)\n\nYou are the **Lead Lab Systems Engineer**. Your role is to rigorously evaluate a candidate \\`PROJECT_GRAPH\\` and its associated \\`technology_scope\\` against real-world lab environment feasibility, toolchain friction, and hardware constraints.\n\n## COURSE BRIEFING & INFRASTRUCTURE CONSTRAINTS\n${briefingContext}\n\n${linterFindings.length > 0 ? `## DETERMINISTIC PRE-LINT FINDINGS\n${linterFindings.map((f) => `- [${f.severity}] ${f.id}: ${f.title} — ${f.description}`).join('\\n')}` : ''}\n\n## CANDIDATE PROJECT GRAPH BUNDLE JSON\n\\`\\`\\`json\n${bundleJson}\n\\`\\`\\`\n\n## EVALUATION RUBRICS & 4 DIMENSIONS (TOTAL 100 POINTS)\n\n1. **Toolchain & Installation Feasibility (25 pts):**\n   - 25 pts: Toolchain installs cleanly without complex admin rights, OS friction, or fragile build scripts.\n   - 10 pts: Toolchain requires moderate admin setup, suitable for guided lab but risky for BYOD.\n   - 0 pts: High-friction setup that frequently breaks in student environments.\n\n2. **Environment Provisioning Strategy (25 pts):**\n   - 25 pts: Heavy technologies (PostgreSQL, Docker, ROS2, etc.) declare an explicit, realistic provisioning model (\\`PRE_INSTALLED_LAB\\`, \\`CLOUD_MANAGED\\`, or \\`DEDICATED_SETUP\\`). Core course topics are NEVER downgraded; instead, proper infrastructure is specified.\n   - 10 pts: Heavy tech used with ambiguous provisioning plan.\n   - 0 pts: Heavy tech dumped on students with no provisioning strategy, causing setup collapse.\n\n3. **Hardware & Runtime Envelope (25 pts):**\n   - 25 pts: Code, libraries, and algorithms fit comfortably within target device RAM, Flash, and pinout budget (<= 75% envelope).\n   - 10 pts: Memory or resource limits are tight.\n   - 0 pts: Guaranteed hardware crash or pinout conflict.\n\n4. **Time to Hello World (25 pts):**\n   - 25 pts: First working runnable milestone achieved in <= 15 minutes of student effort.\n   - 10 pts: First milestone takes 20-30 minutes.\n   - 0 pts: Student spends the entire first session on environment configuration without seeing running code.\n\n## DECISION RULES\n- **PASS:** Score >= 85 AND overallVerdict is \"PASS\".\n- **NEEDS_REVISION:** Score between 70 and 84. Prescribe structured actionable repairs.\n- **FAIL:** Score < 70 or critical environment blocker.\n\n## OUTPUT FORMAT\nReturn a valid JSON object matching ProjectGraphAuditSchema.\n`.trim();\n}\n\n","import type { MilestoneInput, ProjectGraph } from '../../schemas';\n\nexport interface ProjectInstructionPromptInput {\n  projectGraph?: ProjectGraph;\n  milestone: MilestoneInput;\n  roadmapContext?: {\n    projectTitle?: string;\n    techStack?: string[];\n    phaseTitle?: string;\n  };\n  researchNotes?: string;\n  externalResources?: string[];\n  language: string;\n  difficulty?: 'beginner' | 'intermediate' | 'advanced';\n}\n\nexport function buildProjectInstructionPrompt(input: ProjectInstructionPromptInput): string {\n  const {\n    projectGraph,\n    milestone,\n    roadmapContext,\n    researchNotes,\n    externalResources,\n    language,\n    difficulty = 'intermediate',\n  } = input;\n  const milestoneId = milestone.id || milestone.concept_code || 'M01';\n\n  const techStackList =\n    roadmapContext?.techStack ||\n    (Array.isArray(projectGraph?.project.tech_stack)\n      ? projectGraph.project.tech_stack\n      : typeof projectGraph?.project.tech_stack === 'object'\n      ? Object.values(projectGraph.project.tech_stack).flat()\n      : milestone.tech_keywords || ['General Technology']);\n\n  return `\n# System Methodology: Instructable-style Project Tutorial & Execution Manual (@instruction)\n\nYou are the **@instruction** senior technical author. Your mission is to generate a comprehensive, highly actionable, step-by-step technical tutorial/instruction for completing a specific milestone of a software/hardware project.\n\n## PRIMARY QUALITY BAR: EXECUTION ACCURACY & REPRODUCIBILITY\nThis is an **execution manual**, not a high-level overview. The reader must be able to follow every step sequentially and achieve the exact working result.\n\n## TARGET OUTPUT LANGUAGE ENFORCEMENT\n- **Target Language:** **\"${language}\"**\n- **MANDATORY REQUIREMENT:** Output all explanations, action titles, tips, warnings, preflight checks, and expected results strictly in **\"${language}\"**.\n- Keep file paths, CLI commands, code syntax, and official SDK API symbols in standard format.\n\n## PROJECT CONTEXT\n${\n  projectGraph\n    ? `\n- **Project Name:** ${projectGraph.project.name}\n- **Project Purpose:** ${projectGraph.project.purpose || 'N/A'}\n- **Project Type / Platforms:** ${projectGraph.project.project_type || 'N/A'} (${projectGraph.project.platform.join(', ')})\n- **Architecture:** ${projectGraph.project.architecture.join(', ') || 'N/A'}\n- **Product Goals:**\n${projectGraph.product.goals.map((g) => `  - [${g.id}] ${g.description}`).join('\\n')}\n- **User Journeys:**\n${projectGraph.product.journeys.map((j) => `  - ${j.name}: ${j.steps.slice(0, 3).join(' -> ')}...`).join('\\n')}\n`\n    : `- **Project:** ${roadmapContext?.projectTitle || 'Software Project'}`\n}\n\n## CURRENT MILESTONE & ROADMAP CONTEXT\n- **Instruction ID:** ${milestoneId}\n- **Milestone Name:** ${milestone.name}\n- **Milestone Description:** ${milestone.description || 'N/A'}\n- **Feature Cluster:** ${milestone.feature_name || milestone.feature_id || 'Core Feature'}\n- **Phase:** ${roadmapContext?.phaseTitle || 'Implementation'}\n- **Concept Code:** ${milestone.concept_code || 'N/A'}\n- **Tech Stack:** ${techStackList.join(', ')}\n- **Difficulty:** ${difficulty}\n- **Learning Objectives Covered:**\n${(milestone.learning_objectives || []).map((lo) => `  - [${lo.lo_type || 'ULO'}] ${lo.code}: ${lo.name} (${lo.description || ''})`).join('\\n')}\n\n${researchNotes ? `## RESEARCH NOTES & VERIFIED TECHNICAL SOURCES\\n${researchNotes}\\n` : ''}\n${externalResources && externalResources.length > 0 ? `## EXTERNAL RESOURCES & REPOSITORIES\\n${externalResources.join('\\n')}\\n` : ''}\n\n## EXECUTION & AUTHORING RULES\n1. **Section Breakdown:** Divide the tutorial into logical sequential sections (e.g. 1. Environment & Preflight, 2. Core Implementation, 3. Integration & Verification).\n2. **Preflight Checks:** Every section MUST start with preflight checks (e.g., verifying tools, directories, environment variables).\n3. **Action-Verb Steps:** Every step must have a clear action-verb title (e.g. \"Create the Network Discovery Manager\", \"Define the JSON Model Struct\").\n4. **Code Quality:** Provide complete, runnable code blocks with target file paths indicated (e.g. \\`# Sources/App/Model.swift\\`). Code comments must explain WHY, not just WHAT.\n5. **Expected Results:** Explicitly describe what the developer will observe (terminal output, simulator behavior, UI state).\n6. **Operational Gotchas & Warnings:** Include \\`warning\\` fields for common failure modes (e.g. missing permissions, wrong port, unhandled optional).\n7. **Visual Placeholders:** Include \\`imagePlaceholder\\` describing screenshots or diagrams where visual confirmation helps.\n8. **End-to-End Verification:** Provide a final verification checklist to ensure complete functionality.\n\n## REQUIRED JSON KEYS\nPlease return a single JSON object matching these exact keys:\n- \"artifactType\": \"INSTRUCTION\"\n- \"instructionId\": \"${milestoneId}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"difficulty\": \"${difficulty}\"\n- \"estimatedTotalMinutes\": number\n- \"scopeMode\": \"milestone\"\n- \"milestoneRef\": \"${milestoneId}\"\n- \"featureRef\": \"${milestone.feature_id || 'F0'}\"\n- \"techStack\": [${techStackList.map((t) => `\"${t}\"`).join(', ')}]\n- \"prerequisites\": string[]\n- \"materialsAndTools\": string[]\n- \"sections\": array of { \"sectionNumber\": number, \"title\": string, \"goal\": string, \"estimatedMinutes\": number, \"preflightChecks\": string[], \"steps\": array of { \"stepNumber\": string, \"actionTitle\": string, \"explanation\": string, \"targetFile\": string, \"codeSnippet\": string, \"codeLanguage\": string, \"tip\": string, \"warning\": string, \"expectedResult\": string, \"imagePlaceholder\": string }, \"rollbackOrCleanup\": string }\n- \"verificationChecklist\": string[]\n`.trim();\n}\n","import type { MilestoneInput, ProjectGraph } from '../../schemas';\nimport { loadAuthoringTemplate } from '../../services/templateLoader';\n\nexport interface SelfLabPromptInput {\n  milestone: MilestoneInput;\n  projectGraph?: ProjectGraph;\n  language: string;\n  targetTechStack?: string[];\n  contextContinuity?: string;\n}\n\nexport function buildSelfLabPrompt(input: SelfLabPromptInput): string {\n  const { milestone, projectGraph, language, targetTechStack, contextContinuity } = input;\n  const techStackList = (targetTechStack && targetTechStack.length > 0)\n    ? targetTechStack\n    : (milestone.tech_keywords && milestone.tech_keywords.length > 0)\n    ? milestone.tech_keywords\n    : ['General Engineering'];\n  const learningObjectives = milestone.learning_objectives || [];\n  const normalizedDifficulty = (milestone.difficulty || 'intermediate').toLowerCase() as 'beginner' | 'intermediate' | 'advanced';\n\n  const loList = learningObjectives\n    .map((lo) => `- [${lo.bloom_level || 'understand'}] ${lo.code}: ${lo.name || ''} — ${lo.description || ''}`)\n    .join('\\n');\n\n  return `\n# ROLE & PERSONA\nYou are the **Lead Software Engineering Mentor & Self-Paced Learning Architect**, dedicated to creating autonomous, inquiry-based labs for independent developers.\n\n# MISSION SCOPE & DESIGN PRINCIPLES\nBuild a complete, engaging Self-Paced Hands-On Lab (SELF_LAB) for autonomous learners.\n\n## CRITICAL PILLARS FOR SELF-LEARNERS:\n1. **Progressive Challenges (3 Tiers):**\n   - 🥉 **Bronze:** Foundational implementation, basic syntax correctness, verifying environment setup.\n   - 🥈 **Silver:** Core logic, state transformation, and explicit error handling (e.g. timeouts, bad inputs).\n   - 🥇 **Gold:** Edge cases, optimizations, performance profiling, or asynchronous resilience.\n2. **Progressive Hints System (3 Tiers per Challenge):**\n   - 💡 **Hint Level 1 (Conceptual Clue):** High-level architectural hint or mental model. DO NOT give code yet.\n   - 🔍 **Hint Level 2 (Structural Skeleton):** Method signature, structural boilerplate, or function signature with TODOs.\n   - 🚨 **Hint Level 3 (Full Solution & Post-Mortem):** Complete verified solution code + a concise explanation of *Why this works best*.\n3. **Automated Self-Verification Commands:**\n   - For EACH challenge, provide an executable terminal command or test runner (e.g. \\`curl ... | jq .\\`, \\`swift test --filter ...\\`, \\`pytest -k ...\\`) and the **Exact Expected Output**.\n4. **Actionable Troubleshooting Matrix:**\n   - At least 3 realistic runtime errors/gotchas, their exact root causes, and step-by-step fixes.\n\n# MANDATORY TEMPLATE STRUCTURE\nYou MUST generate data aligned with this Markdown template:\n---\n${loadAuthoringTemplate('SELF_LAB_template.md') ?? '[TEMPLATE FILE NOT FOUND: SELF_LAB_template.md]'}\n---\n\n# INPUT PARAMETERS\n- **Milestone ID:** ${milestone.id || 'F0-S1'}\n- **Title:** ${milestone.name}\n- **Description:** ${milestone.description}\n- **Tech Stack:** ${techStackList.join(', ')}\n- **Difficulty:** ${normalizedDifficulty}\n- **Language Policy:** Output 100% in **\"${language}\"** (code comments and explanations).\n- **Target Learning Objectives:**\n${loList}\n\n${projectGraph ? `- **Project Graph Context:** ${projectGraph.project.name} (${projectGraph.project.purpose || ''})` : ''}\n${contextContinuity ? `- **Prior Knowledge & Continuity:**\\n${contextContinuity}` : ''}\n\n# REQUIRED JSON KEYS\nReturn a single valid JSON object matching SelfLabSchema with these exact keys:\n- \"artifactType\": \"SELF_LAB\"\n- \"labId\": \"${milestone.id || 'F0-S1'}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"difficulty\": \"beginner\" | \"intermediate\" | \"advanced\"\n- \"estimatedTotalMinutes\": number (e.g. 60)\n- \"techStack\": string[]\n- \"missionBriefing\": string (Authentic scenario framing what we are building and why)\n- \"preflightChecklist\": string[] (3-5 prerequisite tools/configs)\n- \"challenges\": {\n    \"bronze\": {\n      \"tier\": \"bronze\",\n      \"title\": string,\n      \"estimatedMinutes\": number,\n      \"objective\": string,\n      \"tasks\": string[],\n      \"verifyCommand\": string,\n      \"expectedOutput\": string,\n      \"hints\": {\n        \"hint1Concept\": string,\n        \"hint2Skeleton\": string,\n        \"hint3Solution\": { \"code\": string, \"explanation\": string }\n      }\n    },\n    \"silver\": {\n      \"tier\": \"silver\",\n      \"title\": string,\n      \"estimatedMinutes\": number,\n      \"objective\": string,\n      \"tasks\": string[],\n      \"verifyCommand\": string,\n      \"expectedOutput\": string,\n      \"hints\": {\n        \"hint1Concept\": string,\n        \"hint2Skeleton\": string,\n        \"hint3Solution\": { \"code\": string, \"explanation\": string }\n      }\n    },\n    \"gold\": {\n      \"tier\": \"gold\",\n      \"title\": string,\n      \"estimatedMinutes\": number,\n      \"objective\": string,\n      \"tasks\": string[],\n      \"verifyCommand\": string,\n      \"expectedOutput\": string,\n      \"hints\": {\n        \"hint1Concept\": string,\n        \"hint2Skeleton\": string,\n        \"hint3Solution\": { \"code\": string, \"explanation\": string }\n      }\n    }\n  }\n- \"troubleshootingMatrix\": array of { \"symptom\": string, \"rootCause\": string, \"exactFix\": string }\n- \"finalSubmissionChecklist\": string[]\n`.trim();\n}\n","import type { MilestoneInput } from '../../schemas';\nimport { loadAuthoringTemplate } from '../../services/templateLoader';\n\nexport interface DiagnosticQuizPromptInput {\n  milestone: MilestoneInput;\n  language: string;\n  questionCount?: number;\n  passingScorePct?: number;\n}\n\nexport function buildDiagnosticQuizPrompt(input: DiagnosticQuizPromptInput): string {\n  const { milestone, language, questionCount = 4, passingScorePct = 80 } = input;\n  const learningObjectives = milestone.learning_objectives || [];\n\n  const loList = learningObjectives\n    .map((lo) => `- [${lo.bloom_level || 'understand'}] ${lo.code}: ${lo.name || ''} — ${lo.description || ''}`)\n    .join('\\n');\n\n  return `\n# ROLE & PERSONA\nYou are the **Lead Psychometrician & Technical Assessment Specialist (@assessor)**, expert in designing diagnostic scenario-based tests with high-quality distractors.\n\n# MISSION SCOPE\nGenerate a 3-5 question Diagnostic & Active Recall Quiz that deeply evaluates conceptual understanding, code tracing, and architectural trade-offs.\n\n## RIGOROUS RULES FOR HIGH-QUALITY QUESTIONS:\n\n### Bloom Taxonomy Cognitive Action Mapping (MANDATORY — DO NOT CONFLATE LEVELS):\nUse this mapping to determine which Bloom level each question truly targets. Match questions to the milestone's target level(s) listed in INPUT PARAMETERS.\n\n| Bloom Level | Cognitive Action | Code Task Examples |\n|---|---|---|\n| **Remember** | Recall syntax, definitions, API names | \"What does \\`async/await\\` do?\" |\n| **Understand** | Explain, interpret, classify, **predict execution of existing code**, trace a known algorithm | \"Given this code block, what does it print?\" / \"Why does this loop terminate?\" |\n| **Apply** | Execute a skill in a **new context**, fix a bug in code you haven't seen before, implement from a spec | \"This API response is malformed — rewrite the parsing logic to handle it\" |\n| **Analyze** | Decompose, compare designs, identify root causes, differentiate competing approaches | \"Compare these two caching strategies for a high-read workload\" |\n| **Evaluate** | Justify architectural decisions, critique trade-offs, argue for a design given constraints | \"Which approach is superior for a mobile-first environment and why?\" |\n\n> ⚠️ **CRITICAL RULE:** \"Predict the output of a code snippet\" = **Understand** level, NOT Apply. \"Trace code step by step\" = **Understand**, NOT Apply. Only count as Apply when the student must USE a concept in a context they have NOT seen in the lesson.\n\n### Question Generation Rules:\n1. **Respect Milestone Bloom Level:** The milestone targets \\`${milestone.bloom_level || 'understand'}\\`. Distribute question cognitive demand to match or exceed this level. Do NOT force all questions to Apply+ if the milestone targets Understand.\n2. **Scenario-Based Stems:** Frame questions around realistic engineering problems (e.g. \"A sensor network experiences packet loss...\", \"The UI thread freezes when...\").\n3. **Code-Based Questions:** Include a concise code snippet in at least 2 questions. Tag each with the correct Bloom level using the table above:\n   - If students **trace or predict** → tag as \\`\"understand\"\\`\n   - If students **debug in a new scenario** → tag as \\`\"apply\"\\`\n   - If students **compare architectures** → tag as \\`\"analyze\"\\`\n4. **Plausible Distractors (Cognitive Traps):** Every incorrect option (distractor) MUST represent a common student misconception, subtle edge case, or logical fallacy (e.g. inverted pin modes, millisecond vs second units, blocking delay, forgetting current-limiting resistor, missing pullup).\n   - ⛔ PROHIBITED LAZY DISTRACTORS: NEVER use \"All of the above\", \"None of the above\", \"Cả 3 đều đúng\", \"Không có đáp án nào\", or throwaway non-options.\n5. **Comprehensive Explanations:** For EVERY option (A, B, C, D), explain *Why it is right* or *Why it is a trap*.\n\n### FEW-SHOT GOLD EXEMPLARS:\n\n#### Example 1: Understand Level (Code Tracing / Output Prediction)\n- **Stem:** \"Given the following loop with a delay in Arduino C++, what is the exact duration of one complete blink cycle?\"\n- **Code:** \\`digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(800);\\`\n- **Options:**\n  - A (Correct): \"1000ms (1.0 second) because the total period equals the ON time (200ms) plus the OFF time (800ms).\"\n  - B (Trap): \"200ms because only the HIGH state duration is counted as the cycle period.\"\n  - C (Trap): \"800ms because the longer delay overrides the shorter delay in the execution queue.\"\n  - D (Trap): \"600ms due to subtracting the ON duration from the OFF duration.\"\n\n#### Example 2: Apply Level (Debugging Logic Bug in Novel Scenario)\n- **Stem:** \"A student connects an LED to digital pin 12. In setup(), they wrote \\`pinMode(13, OUTPUT);\\`. In loop(), they call \\`digitalWrite(12, HIGH);\\`. What physical symptom occurs and what is the exact root cause?\"\n- **Options:**\n  - A (Correct): \"The LED on pin 12 remains very dim or off because pin 12 was left in default high-impedance INPUT mode.\"\n  - B (Trap): \"The microcontroller immediately overheats and triggers an overcurrent reset.\"\n  - C (Trap): \"The Arduino IDE compiler rejects the sketch with a 'Pin Mismatch Error'.\"\n  - D (Trap): \"The LED on pin 13 blinks instead because digitalWrite redirects to the configured pin.\"\n\n# MANDATORY TEMPLATE STRUCTURE\nYou MUST generate data aligned with this Markdown template:\n---\n${loadAuthoringTemplate('QUIZ_v4.6_template.md') ?? '[TEMPLATE FILE NOT FOUND: QUIZ_v4.6_template.md]'}\n---\n\n# INPUT PARAMETERS\n- **Milestone ID:** ${milestone.id || 'F0-S1'}\n- **Milestone Name:** ${milestone.name}\n- **Description:** ${milestone.description}\n- **Number of Questions:** ${questionCount}\n- **Passing Score (%):** ${passingScorePct}%\n- **Language Policy:** Output 100% in **\"${language}\"**.\n- **Learning Objectives to Assess:**\n${loList}\n\n# REQUIRED JSON KEYS\nReturn a single valid JSON object matching DiagnosticQuizSchema with these exact keys:\n- \"artifactType\": \"QUIZ\"\n- \"quizId\": \"${milestone.id || 'F0-S1'}\"\n- \"title\": string (in \"${language}\")\n- \"language\": \"${language}\"\n- \"passingScorePct\": ${passingScorePct}\n- \"questions\": array of {\n    \"id\": string (e.g. \"Q1\", \"Q2\"),\n    \"bloomLevel\": \"understand\" | \"apply\" | \"analyze\" | \"evaluate\",\n    \"scenarioOrStem\": string,\n    \"codeSnippet\": string (optional, concise code snippet),\n    \"codeLanguage\": string (e.g. \"swift\", \"python\", \"typescript\"),\n    \"options\": array of {\n      \"id\": \"A\" | \"B\" | \"C\" | \"D\",\n      \"text\": string,\n      \"isCorrect\": boolean (exactly one option true per question),\n      \"explanation\": string (detailed breakdown why this option is correct or a pitfall)\n    },\n    \"takeawayMessage\": string (key takeaway)\n  }\n`.trim();\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { LessonPlanSchema, type LessonPlan, type MilestoneInput } from '../../schemas';\nimport { buildLessonMasterPrompt, type LessonPromptInput } from '../prompts';\n\nexport interface GenerateLessonMasterInput extends Omit<LessonPromptInput, 'milestone'> {\n  milestone: MilestoneInput;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateLessonMasterFlow(input: GenerateLessonMasterInput): Promise<LessonPlan> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildLessonMasterPrompt({\n    milestone: input.milestone,\n    language: input.language,\n    topic: input.topic,\n    targetAudience: input.targetAudience,\n    contextContinuity: input.contextContinuity,\n    standardsContext: input.standardsContext,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: LessonPlanSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n","/**\n * streamJson — STANDARD transport for kit structured inference (RC 2026-09-23).\n *\n * Why: every `generateObject` (non-stream) call through 9router dies on\n * Cloudflare 524 when the backend thinks >100s before the first byte — the\n * SLIDE blueprint lost U01_M01_L01 ×3 this way. Repeatedly patching individual\n * flows re-introduced non-stream paths with each new feature, so this helper\n * is now the single sanctioned transport:\n *\n *   PRIMARY   streamText → bytes flow → CF idle window never fires\n *             → strip think/fences → extract JSON (array or object) → schema\n *   FALLBACK  generateObject (only if the stream yields no valid JSON —\n *             e.g. a fast backend where structured mode is genuinely better)\n *\n * Callers pass the same (model, schema, prompt) they passed generateObject.\n */\nimport { generateObject, streamText } from 'ai';\nimport type { z } from 'zod';\nimport { jsonrepair } from 'jsonrepair';\n\nexport interface StreamJsonOptions<S extends z.ZodTypeAny = z.ZodTypeAny> {\n  model: Parameters<typeof generateObject>[0]['model'];\n  schema: S;\n  prompt?: string;\n  system?: string;\n  messages?: Array<{ role: 'user' | 'system'; content: any }>;\n  maxOutputTokens?: number;\n  temperature?: number;\n  /** Label used in warnings (defaults to schema constructor name). */\n  label?: string;\n}\n\n/** Flatten AI-SDK messages into (system, user) strings for streamText. */\nfunction flattenMessages(\n  messages: StreamJsonOptions['messages'],\n  prompt?: string,\n  system?: string\n): { system?: string; prompt: string } {\n  const sysParts: string[] = [];\n  const userParts: string[] = [];\n  if (system) sysParts.push(system);\n  if (prompt) userParts.push(prompt);\n  for (const m of messages ?? []) {\n    const text =\n      typeof m.content === 'string'\n        ? m.content\n        : Array.isArray(m.content)\n          ? m.content\n              .map((c: any) => (typeof c === 'string' ? c : c?.text ?? ''))\n              .join('\\n')\n          : '';\n    (m.role === 'system' ? sysParts : userParts).push(text);\n  }\n  return { system: sysParts.join('\\n\\n') || undefined, prompt: userParts.join('\\n\\n') };\n}\n\n/** Strip <think> blocks and markdown fences, then locate the JSON payload. */\nfunction extractJsonCandidate(raw: string): unknown | typeof NO_JSON {\n  let text = raw.replace(/<think>[\\s\\S]*?<\\/think>/gi, '').trim();\n  text = text.replace(/^```(?:json)?\\s*/m, '').replace(/```\\s*$/m, '').trim();\n  const firstBrace = text.indexOf('{');\n  const firstBracket = text.indexOf('[');\n  const start =\n    firstBrace < 0\n      ? firstBracket\n      : firstBracket < 0\n        ? firstBrace\n        : Math.min(firstBrace, firstBracket);\n  if (start < 0) return NO_JSON;\n  const lastBrace = text.lastIndexOf('}');\n  const lastBracket = text.lastIndexOf(']');\n  const end = Math.max(lastBrace, lastBracket);\n  if (end <= start) return NO_JSON;\n  const span = text.slice(start, end + 1);\n  try {\n    return JSON.parse(span);\n  } catch {\n    /* fallthrough */\n  }\n  try {\n    return JSON.parse(jsonrepair(span));\n  } catch {\n    return NO_JSON;\n  }\n}\nconst NO_JSON = Symbol('no-json');\n\n/**\n * Stream-first structured inference. Returns schema-valid data or throws the\n * last error (callers keep their own retry loops).\n */\nexport async function streamJson<S extends z.ZodTypeAny>(\n  opts: StreamJsonOptions<S>\n): Promise<z.output<S>> {\n  const label = opts.label ?? 'streamJson';\n  const flat = flattenMessages(opts.messages, opts.prompt, opts.system);\n\n  // ── PRIMARY: stream text, extract, validate ──────────────────────────────\n  try {\n    const stream = streamText({\n      model: opts.model,\n      system: flat.system,\n      prompt: flat.prompt,\n      ...(opts.maxOutputTokens ? { maxOutputTokens: opts.maxOutputTokens } : {}),\n      ...(opts.temperature !== undefined ? { temperature: opts.temperature } : {}),\n    });\n    const raw = await stream.text;\n    const candidate = extractJsonCandidate(raw);\n    if (candidate !== NO_JSON) {\n      const validated = opts.schema.safeParse(candidate);\n      if (validated.success) return validated.data as z.output<S>;\n      console.warn(\n        `[streamJson] ${label}: stream JSON failed schema validation — trying structured fallback:`,\n        validated.error?.message?.slice(0, 300)\n      );\n    } else {\n      console.warn(`[streamJson] ${label}: stream yielded no JSON span — trying structured fallback.`);\n    }\n  } catch (streamErr: any) {\n    console.warn(`[streamJson] ${label}: stream failed (${streamErr?.message || streamErr}) — trying structured fallback.`);\n  }\n\n  // ── FALLBACK: generateObject (non-stream — only viable on fast backends) ──\n  const { object } = await generateObject({\n    model: opts.model,\n    schema: opts.schema,\n    ...(flat.system ? { system: flat.system } : {}),\n    ...(opts.messages?.length ? { messages: opts.messages as any } : { prompt: flat.prompt }),\n    ...(opts.maxOutputTokens ? { maxOutputTokens: opts.maxOutputTokens } : {}),\n    ...(opts.temperature !== undefined ? { temperature: opts.temperature } : {}),\n  } as any);\n  return object as z.output<S>;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { ActivityLabSchema, type ActivityLab, type LessonPlan } from '../../schemas';\nimport { buildActivityPrompt, type ActivityPromptInput } from '../prompts';\n\nexport interface GenerateActivityInput extends Omit<ActivityPromptInput, 'lesson'> {\n  lesson: LessonPlan;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateActivityFlow(input: GenerateActivityInput): Promise<ActivityLab> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildActivityPrompt({\n    lesson: input.lesson,\n    language: input.language,\n    hardwareBOM: input.hardwareBOM,\n    softwareTools: input.softwareTools,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: ActivityLabSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { CodeLabSchema, type CodeLab, type LessonPlan, type ActivityLab } from '../../schemas';\nimport { buildCodeLabPrompt, type CodeLabPromptInput } from '../prompts';\n\nexport interface GenerateCodeLabInput extends Omit<CodeLabPromptInput, 'lesson'> {\n  lesson: LessonPlan;\n  activity?: ActivityLab;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateCodeLabFlow(input: GenerateCodeLabInput): Promise<CodeLab> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildCodeLabPrompt({\n    lesson: input.lesson,\n    activity: input.activity,\n    language: input.language,\n    targetTechStack: input.targetTechStack,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: CodeLabSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { WorksheetSchema, type Worksheet, type LessonPlan } from '../../schemas';\nimport { buildWorksheetPrompt, type WorksheetPromptInput } from '../prompts';\n\nexport interface GenerateWorksheetInput extends Omit<WorksheetPromptInput, 'lesson'> {\n  lesson: LessonPlan;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateWorksheetFlow(input: GenerateWorksheetInput): Promise<Worksheet> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildWorksheetPrompt({\n    lesson: input.lesson,\n    language: input.language,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: WorksheetSchema,\n    prompt,\n  });\n\n  return object;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { HandoutSchema, type Handout, type LessonPlan } from '../../schemas';\nimport { buildHandoutPrompt, type HandoutPromptInput } from '../prompts';\n\nexport interface GenerateHandoutInput extends Omit<HandoutPromptInput, 'lesson'> {\n  lesson: LessonPlan;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateHandoutFlow(input: GenerateHandoutInput): Promise<Handout> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildHandoutPrompt({\n    lesson: input.lesson,\n    language: input.language,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: HandoutSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { SlideDeckSchema, type SlideDeck, type LessonPlan } from '../../schemas';\nimport { buildSlidesPrompt, type SlidesPromptInput } from '../prompts';\n\nexport interface GenerateSlidesInput extends Omit<SlidesPromptInput, 'lesson'> {\n  lesson: LessonPlan;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateSlidesFlow(input: GenerateSlidesInput): Promise<SlideDeck> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildSlidesPrompt({\n    lesson: input.lesson,\n    language: input.language,\n    marpTheme: input.marpTheme,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: SlideDeckSchema,\n    prompt,\n  });\n\n  return object;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { TeacherGuideSchema, type TeacherGuide, type LessonPlan, type ActivityLab } from '../../schemas';\nimport { buildTeacherGuidePrompt, type TeacherGuidePromptInput } from '../prompts';\n\nexport interface GenerateTeacherGuideInput extends Omit<TeacherGuidePromptInput, 'lesson'> {\n  lesson: LessonPlan;\n  activity?: ActivityLab;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateTeacherGuideFlow(input: GenerateTeacherGuideInput): Promise<TeacherGuide> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildTeacherGuidePrompt({\n    lesson: input.lesson,\n    activity: input.activity,\n    language: input.language,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: TeacherGuideSchema,\n    prompt,\n  });\n\n  return object;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { ExtensionSchema, type Extension, type LessonPlan, type ActivityLab } from '../../schemas';\nimport { buildExtensionPrompt, type ExtensionPromptInput } from '../prompts';\n\nexport interface GenerateExtensionInput extends Omit<ExtensionPromptInput, 'lesson'> {\n  lesson: LessonPlan;\n  activity?: ActivityLab;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateExtensionFlow(input: GenerateExtensionInput): Promise<Extension> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildExtensionPrompt({\n    lesson: input.lesson,\n    activity: input.activity,\n    language: input.language,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: ExtensionSchema,\n    prompt,\n  });\n\n  return object;\n}\n","import { generateObject } from 'ai';\nimport type { z } from 'zod';\nimport { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { safeParseJson } from '../../services/prefillService';\nimport {\n  CurriculumQualityReportSchema,\n  type CurriculumQualityReport,\n  MacroPedagogyPlanAuditSchema,\n  type MacroPedagogyPlanAuditReport,\n  ProjectGraphAuditSchema,\n  type ProjectGraphAuditReport,\n} from '../../schemas';\nimport {\n  buildJudgePrompt,\n  type JudgePromptInput,\n  buildCurriculumPlanJudgePrompt,\n  type CurriculumPlanJudgePromptInput,\n  buildProjectGraphJudgePrompt,\n  type ProjectGraphJudgePromptInput,\n} from '../prompts';\nimport { JUDGE_AUTO_APPROVE_THRESHOLD } from '../../constants/pedagogy';\n\nexport interface AuditCurriculumQualityInput extends JudgePromptInput {\n  modelOptions?: ModelResolutionOptions;\n}\n\n// ─── Judge LLM harness (2026-09-18): fenced-JSON resilience ────────────────\n// Production judge runs failed 3/3 because the model wrapped the JSON verdict\n// in a ```json markdown fence — the AI SDK's generateObject cannot parse\n// fenced output and throws NoObjectGeneratedError, DISCARDING a completed\n// (paid-for) evaluation. Recovery ladder, fail-closed:\n//   1. local salvage from the error's raw text (err.text / cause.text /\n//      \"Text: \" in message) via safeParseJson — zero extra tokens;\n//   2. ONE repair turn re-prompting for bare JSON, then salvage its text too;\n//   3. still failing → rethrow. Never invent a verdict.\nconst REPAIR_SUFFIX = '\\n\\nCRITICAL OUTPUT FORMAT FIX: your previous response could not be parsed as JSON. Output ONLY the raw JSON object — no markdown code fences, no prose before or after. Start with { and end with }.';\n\nfunction extractRawText(err: unknown): string {\n  const e = err as { text?: unknown; message?: unknown; cause?: { text?: unknown; message?: unknown } | unknown };\n  if (typeof e?.text === 'string' && e.text) return e.text;\n  const cause = e?.cause as { text?: unknown; message?: unknown } | undefined;\n  if (typeof cause?.text === 'string' && cause.text) return cause.text;\n  const msg = typeof e?.message === 'string' ? e.message : typeof cause?.message === 'string' ? cause.message : '';\n  const m = msg.match(/Text: ([\\s\\S]+)/);\n  return m ? m[1]! : '';\n}\n\nasync function generateJudgeObject<S extends z.ZodTypeAny>(opts: {\n  model: Parameters<typeof generateObject>[0]['model'];\n  schema: S;\n  prompt: string;\n}): Promise<z.infer<S>> {\n  let firstText = '';\n  try {\n    // RC 2026-09-23: stream-first (standard transport). Fenced JSON — the\n    // historical 3/3 judge killer — parses fine on the stream path, and paid\n    // tokens are never discarded by a NoObjectGeneratedError.\n    return (await streamJson({ model: opts.model, schema: opts.schema, prompt: opts.prompt, label: 'judge' })) as z.infer<S>;\n  } catch (err) {\n    firstText = extractRawText(err);\n    if (firstText) {\n      const salvaged = safeParseJson(firstText);\n      if (salvaged) {\n        const check = opts.schema.safeParse(salvaged);\n        if (check.success) return check.data;\n      }\n    }\n    try {\n      return (await generateObject({ model: opts.model, schema: opts.schema, prompt: opts.prompt + REPAIR_SUFFIX })).object;\n    } catch (err2) {\n      const secondText = extractRawText(err2);\n      if (secondText && secondText !== firstText) {\n        const salvaged2 = safeParseJson(secondText);\n        if (salvaged2) {\n          const check2 = opts.schema.safeParse(salvaged2);\n          if (check2.success) return check2.data;\n        }\n      }\n      throw err2;\n    }\n  }\n}\n\nexport async function auditCurriculumQualityFlow(input: AuditCurriculumQualityInput): Promise<CurriculumQualityReport> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildJudgePrompt({\n    targetArtifactType: input.targetArtifactType,\n    lessonId: input.lessonId,\n    expectedLanguage: input.expectedLanguage,\n    targetObjectives: input.targetObjectives,\n    generatedContentJson: input.generatedContentJson,\n    standardStatements: input.standardStatements,\n  });\n\n  const object = await generateJudgeObject({\n    model,\n    schema: CurriculumQualityReportSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n\nexport interface AuditCurriculumPlanInput extends CurriculumPlanJudgePromptInput {\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function auditCurriculumPlanFlow(input: AuditCurriculumPlanInput): Promise<MacroPedagogyPlanAuditReport> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildCurriculumPlanJudgePrompt({\n    planJson: input.planJson,\n    briefingContext: input.briefingContext,\n    expectedLanguage: input.expectedLanguage,\n    linterFindings: input.linterFindings,\n  });\n\n  const object = await generateJudgeObject({\n    model,\n    schema: MacroPedagogyPlanAuditSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  // Enforce deterministic auto-approve invariant\n  const autoApproved = object.totalScore >= JUDGE_AUTO_APPROVE_THRESHOLD && object.overallVerdict === 'PASS';\n  return {\n    ...object,\n    autoApproved,\n  };\n}\n\nexport interface AuditProjectGraphInput extends ProjectGraphJudgePromptInput {\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function auditProjectGraphFlow(input: AuditProjectGraphInput): Promise<ProjectGraphAuditReport> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildProjectGraphJudgePrompt({\n    bundleJson: input.bundleJson,\n    briefingContext: input.briefingContext,\n    linterFindings: input.linterFindings,\n  });\n\n  const object = await generateJudgeObject({\n    model,\n    schema: ProjectGraphAuditSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n","import { jsonrepair } from 'jsonrepair';\nimport { isProviderEnabled, isModelAllowed, getDesignatedFallbackConfig, getDesignatedFallbackChain } from '../ai/streamRunner';\nimport type { ChunkType } from '../ai/streamRunner';\n\n/** Lifecycle event for one cascade candidate — hosts forward it to the UI so a\n * silent model switch (idle-timeout failover) is never invisible again. */\nexport interface PrefillProviderEvent {\n  type: 'candidate-start' | 'candidate-failed' | 'candidate-success';\n  provider: string;\n  model: string;\n  attempt: number;\n  total: number;\n  elapsedMs: number;\n  error?: string;\n}\n\nexport interface LayerPrefillOptions {\n  action?: 'prefill' | 'research';\n  targetLayer?: number;\n  accumulatedData?: Record<string, any>;\n  apiKeys?: Record<string, string>;\n  liveSearchConfig?: Record<string, boolean>;\n  /** Target language for pre-filled wizard values: 'vi' | 'en' (default: 'vi'). */\n  language?: string;\n  stream?: boolean;\n  model?: string;\n  provider?: AIProviderName;\n  /** Total wall-time budget override for this prefill run (ms). */\n  timeoutMs?: number;\n  /** Idle (no-data) budget override for this prefill run (ms). */\n  idleTimeoutMs?: number;\n  /** Optional parent abort signal (e.g. from HTTP request) to stop immediately on client disconnect. */\n  signal?: AbortSignal;\n  /**\n   * Host-provided inference override (Vercel AI SDK tiered gateway, test stubs).\n   * Same contract as StreamRunnerOptions['customInference']. When set it is the\n   * SOLE inference path: the built-in cascade (streamLLMWithFallback) never runs,\n   * so host apps that mandate one auditable gateway (Langfuse tracing, raw-wire\n   * idle kicks, reasoning_content extraction) get exactly that engine here too.\n   * Mirrors the unified-tracing mandate already enforced in lesson/chat/slide paths.\n   */\n  customInference?: (request: {\n    systemInstruction: string;\n    userPrompt: string;\n    messages: Array<{ role: 'user' | 'assistant' | 'system' | 'model'; content: string }>;\n    temperature: number;\n    maxTokens: number;\n    onChunk: (token: string, type: ChunkType) => void;\n  }) => Promise<string>;\n  /** Observe cascade candidate transitions (start/fail/success) for UI status. */\n  onProviderEvent?: (event: PrefillProviderEvent) => void;\n}\n\nexport interface PreliminaryResearchResult {\n  groundTruthSummary: string;\n  hardwareVersion: string;\n  ideVersion: string;\n  activeLibraries: string[];\n  technicalGotchas: string[];\n}\n\nexport interface LayerPrefillResult {\n  success: boolean;\n  targetLayer?: number;\n  parsedResponse?: any;\n  research?: PreliminaryResearchResult;\n  rawText?: string;\n}\n\nexport type LayerChunkCallback = (chunk: string, type: 'thought' | 'content') => void;\n\n/** Budget knobs for a streamed inference (see createStreamAbortSignal). */\nexport interface StreamBudget {\n  /** Abort when no data arrives for this long (ms). 0 disables. */\n  idleMs?: number;\n  /** Abort when the whole stream exceeds this total wall time (ms). 0 disables. */\n  totalMs?: number;\n}\n\nexport const DEFAULT_STREAM_IDLE_MS = 180_000;\nexport const DEFAULT_STREAM_TOTAL_MS = 480_000;\n\nexport const LAYER_IDLE_BUDGET_MS: Record<number, number> = {\n  1: 180_000,\n  2: 180_000,\n  3: 180_000, // 3 minutes idle protection across all layers for free-tier reasoning models\n};\n\n/**\n * Layer-aware total budget:\n * - Layer 1 & 2: 8 minutes hard cap.\n * - Layer 3: 10 minutes hard cap (600s) to allow deep reasoning models (e.g. NVIDIA Nemotron Ultra 550B)\n *   to complete the full deliverable and pathways synthesis without mid-JSON truncation.\n */\nexport const LAYER_TOTAL_BUDGET_MS: Record<number, number> = {\n  1: 480_000,\n  2: 480_000,\n  3: 600_000,\n};\n\n/**\n * Resolve the abort budget for a prefill run. Precedence: explicit options >\n * env (`WIZARD_PREFILL_IDLE_TIMEOUT_MS` / `WIZARD_PREFILL_TOTAL_TIMEOUT_MS`) >\n * layer-aware & provider-aware defaults. Exposed as a pure function for decision-table tests.\n */\nexport function resolveStreamBudget(\n  layer?: number,\n  opts?: StreamBudget & { model?: string; provider?: string }\n): Required<StreamBudget> {\n  const envIdle = Number(process.env.WIZARD_PREFILL_IDLE_TIMEOUT_MS);\n  const envTotal = Number(process.env.WIZARD_PREFILL_TOTAL_TIMEOUT_MS);\n\n  const isNvidia = Boolean(\n    (opts?.provider && opts.provider.toLowerCase().includes('nvidia')) ||\n    (opts?.model && (opts.model.toLowerCase().includes('nvidia') || opts.model.toLowerCase().includes('nemotron')))\n  );\n\n  const layerIdle = layer !== undefined ? LAYER_IDLE_BUDGET_MS[layer] : undefined;\n  const baseIdle = layerIdle ?? DEFAULT_STREAM_IDLE_MS;\n  const computedDefaultIdle = isNvidia ? Math.max(baseIdle, 180_000) : baseIdle;\n\n  const layerTotal = layer !== undefined ? LAYER_TOTAL_BUDGET_MS[layer] : undefined;\n  const baseTotal = layerTotal ?? DEFAULT_STREAM_TOTAL_MS;\n  const computedDefaultTotal = isNvidia ? Math.max(baseTotal, 600_000) : baseTotal;\n\n  return {\n    idleMs: opts?.idleMs ?? (Number.isFinite(envIdle) && envIdle > 0 ? envIdle : computedDefaultIdle),\n    totalMs: opts?.totalMs ?? (Number.isFinite(envTotal) && envTotal > 0 ? envTotal : computedDefaultTotal),\n  };\n}\n\n/**\n * Abort signal combining an IDLE window with an optional TOTAL cap.\n * RC-W1: `AbortSignal.timeout(60_000)` hard-killed Layer 2 mid-stream even while\n * tokens were flowing (free-tier models think + stream slowly) — the aborted\n * `fullContent` then failed `safeParseJson` (empty or truncated JSON).\n * The idle window only fires when NO data arrives (hung connection), while a\n * generous layer-aware total cap is the safety net.\n */\nexport interface StreamAbortHandle {\n  signal: AbortSignal;\n  /** Reset the idle window — call on EVERY received stream part. */\n  kick: () => void;\n  /** Clear both timers once the stream lifecycle is over. */\n  dispose: () => void;\n}\n\n/** Chunks extracted from one raw Vercel AI SDK stream part. */\nexport interface ExtractedStreamChunk {\n  /** Reasoning/thinking text to forward via onChunk(chunk, 'thought'). */\n  thought?: string;\n  /** Content text to forward via onChunk(chunk, 'content') and accumulate. */\n  content?: string;\n}\n\n/**\n * Channel Isolation Pattern (5-WHY root-cause architecture, 2026-09-10):\n *\n *   CONTENT channel — single source of truth: SDK-mapped `text-delta` ONLY.\n *                     Raw provider chunks ALWAYS carry `delta.content` too;\n *                     reading it duplicates every token (DUP-STREAM).\n *\n *   THOUGHT channel — SDK-mapped `reasoning-delta` PREFERRED; raw\n *                     `delta.reasoning_content` used as FALLBACK only, for\n *                     providers whose non-standard reasoning field the SDK\n *                     does not map (measured live: NVIDIA NIM emits\n *                     reasoning-delta=0, reasoning exists ONLY inside raw).\n *                     A per-stream `hasStandardReasoning` latch guarantees\n *                     exactly one source ever wins, so an SDK upgrade that\n *                     starts mapping reasoning can never re-introduce\n *                     DUP-THOUGHT.\n */\nexport type StreamChunkExtractor = (part: any) => ExtractedStreamChunk;\n\n/** Per-stream extractor with the reasoning source latch. Use ONE instance per stream. */\nexport function createStreamChunkExtractor(): StreamChunkExtractor {\n  // First reasoning source seen on the stream wins for the WHOLE stream —\n  // the other source is then suppressed. Guarantees exactly-once delivery\n  // regardless of ordering or future SDK mapping changes.\n  let thoughtSource: 'mapped' | 'raw' | null = null;\n  return (part: any): ExtractedStreamChunk => {\n    if (!part || typeof part !== 'object') return {};\n\n    // 1. SDK-mapped reasoning (any naming across SDK major versions).\n    if (part.type === 'reasoning-delta' || part.type === 'reasoning') {\n      if (thoughtSource === null) thoughtSource = 'mapped';\n      if (thoughtSource !== 'mapped') return {};\n      const thought = (part.text ?? part.delta ?? part.reasoning ?? '') as string;\n      return thought ? { thought } : {};\n    }\n\n    // 2. Content parts — the ONLY source of content, ever.\n    if (part.type === 'text-delta') {\n      const content = (part.text ?? part.delta ?? '') as string;\n      return content ? { content } : {};\n    }\n\n    // 3. `raw` parts — content NEVER read here (it duplicates text-delta);\n    //    reasoning read ONLY if no SDK-mapped reasoning has been seen.\n    if (part.type === 'raw') {\n      if (thoughtSource === null) thoughtSource = 'raw';\n      if (thoughtSource !== 'raw') return {};\n      const raw = (part.rawValue ?? part.raw ?? {}) as any;\n      const delta = raw?.choices?.[0]?.delta ?? {};\n      const reasoning = (delta.reasoning_content ?? delta.reasoning ?? delta.thought ?? '') as string;\n      return reasoning ? { thought: reasoning } : {};\n    }\n\n    return {};\n  };\n}\n\n/**\n * Stateless single-part mapper (kept for compatibility/tests): same channel\n * rules minus the reasoning latch — real streams must use\n * createStreamChunkExtractor, whose latch is the authoritative dedupe.\n */\nexport function extractStreamChunk(part: any): ExtractedStreamChunk {\n  if (!part || typeof part !== 'object') return {};\n\n  if (part.type === 'reasoning-delta' || part.type === 'reasoning') {\n    const thought = (part.text ?? part.delta ?? part.reasoning ?? '') as string;\n    return thought ? { thought } : {};\n  }\n  if (part.type === 'text-delta') {\n    const content = (part.text ?? part.delta ?? '') as string;\n    return content ? { content } : {};\n  }\n  return {};\n}\n\nexport function createStreamAbortSignal(\n  budget: Required<StreamBudget>,\n  parentSignal?: AbortSignal\n): StreamAbortHandle {\n  const controller = new AbortController();\n  let idleTimer: ReturnType<typeof setTimeout> | null = null;\n  let totalTimer: ReturnType<typeof setTimeout> | null = null;\n\n  const onParentAbort = () => {\n    controller.abort(parentSignal?.reason || new Error('Aborted by parent signal'));\n  };\n\n  if (parentSignal) {\n    if (parentSignal.aborted) {\n      controller.abort(parentSignal.reason || new Error('Parent signal already aborted'));\n    } else {\n      parentSignal.addEventListener('abort', onParentAbort, { once: true });\n    }\n  }\n\n  const armIdle = () => {\n    if (idleTimer) clearTimeout(idleTimer);\n    if (budget.idleMs > 0) {\n      idleTimer = setTimeout(\n        () => controller.abort(new Error(`Idle timeout: no data for ${Math.round(budget.idleMs / 1000)}s`)),\n        budget.idleMs\n      );\n      (idleTimer as any)?.unref?.();\n    }\n  };\n  armIdle();\n\n  if (budget.totalMs > 0) {\n    totalTimer = setTimeout(\n      () => controller.abort(new Error(`Total stream timeout after ${Math.round(budget.totalMs / 1000)}s`)),\n      budget.totalMs\n    );\n    (totalTimer as any)?.unref?.();\n  }\n\n  return {\n    signal: controller.signal,\n    /** Reset the idle window — call on EVERY received stream part. */\n    kick: armIdle,\n    /** Clear both timers once the stream lifecycle is over. */\n    dispose: () => {\n      if (idleTimer) clearTimeout(idleTimer);\n      if (totalTimer) clearTimeout(totalTimer);\n      if (parentSignal) {\n        parentSignal.removeEventListener('abort', onParentAbort);\n      }\n      idleTimer = null;\n      totalTimer = null;\n    },\n  };\n}\n\n/**\n * Close an unterminated JSON object/array: append the delimiters that are\n * still open, closing any open string first. Handles streams aborted\n * mid-JSON (budget timeout) where the structure is otherwise valid.\n * Returns the repaired candidate or null when unrecoverable.\n */\nexport function closeTruncatedJson(candidate: string): string | null {\n  let inStr = false;\n  let esc = false;\n  const stack: string[] = [];\n  for (let i = 0; i < candidate.length; i++) {\n    const ch = candidate[i];\n    if (esc) { esc = false; continue; }\n    if (inStr) {\n      if (ch === '\\\\') esc = true;\n      else if (ch === '\"') inStr = false;\n      continue;\n    }\n    if (ch === '\"') inStr = true;\n    else if (ch === '{' || ch === '[') stack.push(ch);\n    else if (ch === '}' || ch === ']') stack.pop();\n  }\n  if (stack.length === 0 && !inStr) return null; // not truncated\n  let out = candidate;\n  // Drop a trailing comma left by an aborted element.\n  out = out.replace(/,\\s*$/, '');\n  if (inStr) {\n    // A string ending on a bare backslash would make the closing quote an\n    // escaped-quote (\"\\\"\") → still unterminated. Strip trailing backslashes\n    // (each doubles as an escape) so the appended quote truly closes the string.\n    out = out.replace(/\\\\+$/, '');\n    out += '\"';\n  }\n  while (stack.length > 0) {\n    out += stack.pop() === '{' ? '}' : ']';\n  }\n  return out;\n}\n\n/**\n * Strip common LLM prose wrappers: code fences, leading \"Here is ...\" lines,\n * <think> blocks. Returns the raw inner text (may still be imperfect JSON).\n */\nexport function stripLlmJsonWrappers(rawText: string): string {\n  let cleaned = rawText\n    .replace(/<think>[\\s\\S]*?<\\/think>/gi, '')\n    .replace(/```json\\s*/gi, '')\n    .replace(/```\\s*/g, '')\n    .trim();\n  const firstBrace = cleaned.indexOf('{');\n  if (firstBrace > 0) {\n    // Prose before the JSON object (\"Here's the JSON you requested:\") — drop it.\n    cleaned = cleaned.slice(firstBrace);\n  }\n  return cleaned.trim();\n}\n\n/**\n * Robust JSON extraction and repair helper.\n *\n * Tolerates every real-world LLM output defect observed with free-tier\n * reasoning models (nemotron-ultra, OpenRouter :free presets):\n *   1. code fences / <think> blocks / prose around the JSON,\n *   2. trailing commas,\n *   3. TRUNCATED output — the stream abort (idle/total budget) can cut the\n *      payload mid-JSON; open strings/braces are closed deterministically,\n *   4. mixed defects — each candidate goes through jsonrepair last.\n * Layered: cheap strict parse first, heavier repair only on failure.\n */\nexport function safeParseJson<T = any>(rawText: string | null): T | null {\n  if (!rawText) return null;\n\n  const cleaned = stripLlmJsonWrappers(rawText);\n  if (!cleaned) return null;\n\n  // 1. Strict parse of the (stripped) full text.\n  try {\n    return JSON.parse(cleaned);\n  } catch {}\n\n  const firstBrace = cleaned.indexOf('{');\n  if (firstBrace === -1) return null;\n\n  const buildCandidates = (): string[] => {\n    const list: string[] = [];\n    // Truncation repair FIRST — it preserves the most data when the stream\n    // was aborted mid-JSON (the dominant free-tier failure mode).\n    const closed = closeTruncatedJson(cleaned.slice(firstBrace));\n    if (closed) list.push(closed);\n    const lastBrace = cleaned.lastIndexOf('}');\n    if (lastBrace > firstBrace) {\n      list.push(cleaned.slice(firstBrace, lastBrace + 1));\n    }\n    return list;\n  };\n\n  for (const candidate of buildCandidates()) {\n    try {\n      return JSON.parse(candidate);\n    } catch {}\n    try {\n      return JSON.parse(jsonrepair(candidate));\n    } catch {}\n  }\n\n  // 2. Balanced-substring scan: the first brace-balanced object. Handles\n  //    trailing commentary or multiple concatenated objects.\n  let depth = 0;\n  let inStr = false;\n  let esc = false;\n  for (let i = firstBrace; i < cleaned.length; i++) {\n    const ch = cleaned[i];\n    if (esc) { esc = false; continue; }\n    if (inStr) {\n      if (ch === '\\\\') esc = true;\n      else if (ch === '\"') inStr = false;\n      continue;\n    }\n    if (ch === '\"') inStr = true;\n    else if (ch === '{') depth++;\n    else if (ch === '}') {\n      depth--;\n      if (depth === 0) {\n        const candidate = cleaned.slice(firstBrace, i + 1);\n        try {\n          return JSON.parse(candidate);\n        } catch {}\n        try {\n          return JSON.parse(jsonrepair(candidate));\n        } catch {}\n      }\n    }\n  }\n\n  // 3. Last resort: full-text jsonrepair.\n  try {\n    return JSON.parse(jsonrepair(cleaned));\n  } catch {}\n\n  return null;\n}\n\nimport { streamText } from 'ai';\nimport { getAIModel, type AIProviderName } from '../ai/provider-factory';\n\ninterface CandidateTarget {\n  provider: AIProviderName;\n  model: string;\n  apiKey?: string;\n}\n\n/**\n * Multi-tiered resilient streaming inference helper using 100% Vercel AI SDK.\n */\nexport async function streamLLMWithFallback(\n  systemPrompt: string,\n  userPrompt: string,\n  apiKeys: Record<string, string> = {},\n  onChunk?: LayerChunkCallback,\n  preferredModel?: string,\n  preferredProvider?: AIProviderName,\n  budget?: StreamBudget,\n  signal?: AbortSignal,\n  onEvent?: (event: PrefillProviderEvent) => void\n): Promise<string | null> {\n  const alibabaKey = apiKeys.alibaba || apiKeys.dashscope || process.env.ALIBABA_API_KEY || process.env.DASHSCOPE_API_KEY;\n  const nvidiaKey = apiKeys.nvidia || process.env.NVIDIA_API_KEY;\n  const deepseekKey = apiKeys.deepseek || process.env.DEEPSEEK_API_KEY;\n  const openrouterKey = apiKeys.openrouter || process.env.OPENROUTER_API_KEY;\n  const geminiKey = apiKeys.gemini || process.env.GEMINI_API_KEY;\n  const openrouterPreset = process.env.OPENROUTER_FREE_PRESET || '@preset/coding-free';\n\n  const candidates: CandidateTarget[] = [];\n\n  // Preferred model from client / settings (highest priority)\n  if (preferredModel) {\n    const prov = preferredProvider || 'openrouter';\n    const key = apiKeys[prov] || (prov === 'openrouter' ? openrouterKey : prov === 'nvidia' ? nvidiaKey : prov === 'alibaba' ? alibabaKey : geminiKey) || '';\n    candidates.push({ provider: prov, model: preferredModel, apiKey: key });\n  }\n\n  // Tier 1: OpenRouter\n  if (openrouterKey && isProviderEnabled('openrouter')) {\n    const orModels = [\n      openrouterPreset,\n      'openrouter/free',\n      'nvidia/nemotron-3-super-120b-a12b:free',\n      'nvidia/nemotron-3-ultra-550b-a55b:free',\n      'nvidia/nemotron-3.5-lightning:free',\n      'cohere/north-mini-code:free',\n    ].filter(m => isModelAllowed(m));\n    for (const m of Array.from(new Set(orModels))) {\n      if (!candidates.some(c => c.provider === 'openrouter' && c.model === m)) {\n        candidates.push({ provider: 'openrouter', model: m, apiKey: openrouterKey });\n      }\n    }\n  }\n\n  // Tier 2: NVIDIA NIM\n  if (nvidiaKey && isProviderEnabled('nvidia')) {\n    const nemotronModels = [\n      'nvidia/nemotron-3-ultra-550b-a55b',\n      'nvidia/nemotron-3.5-lightning-30b-a3b',\n      'nvidia/llama-3.1-nemotron-70b-instruct'\n    ].filter(m => isModelAllowed(m));\n    for (const m of nemotronModels) {\n      if (!candidates.some(c => c.provider === 'nvidia' && c.model === m)) {\n        candidates.push({ provider: 'nvidia', model: m, apiKey: nvidiaKey });\n      }\n    }\n  }\n\n  // Tier 3: Alibaba / DashScope\n  if (alibabaKey && isProviderEnabled('alibaba')) {\n    const aliModels = ['qwen-plus', 'qwen-turbo', 'qwen3.7-plus'].filter(m => isModelAllowed(m));\n    for (const m of aliModels) {\n      if (!candidates.some(c => c.provider === 'alibaba' && c.model === m)) {\n        candidates.push({ provider: 'alibaba', model: m, apiKey: alibabaKey });\n      }\n    }\n  }\n\n  // Tier 4: DeepSeek\n  if (deepseekKey && isProviderEnabled('deepseek')) {\n    const dsModels = ['deepseek-chat', 'deepseek-coder'].filter(m => isModelAllowed(m));\n    for (const m of dsModels) {\n      if (!candidates.some(c => c.provider === 'deepseek' && c.model === m)) {\n        candidates.push({ provider: 'deepseek', model: m, apiKey: deepseekKey });\n      }\n    }\n  }\n\n  // Tier 5: Google Gemini\n  if (geminiKey && (isProviderEnabled('gemini') || isProviderEnabled('google'))) {\n    const gModels = ['gemini-1.5-flash', 'gemini-2.0-flash', 'gemini-1.5-pro'].filter(m => isModelAllowed(m));\n    for (const m of gModels) {\n      if (!candidates.some(c => c.provider === 'google' && c.model === m)) {\n        candidates.push({ provider: 'google', model: m, apiKey: geminiKey });\n      }\n    }\n  }\n\n  // Designated Fallback Chain\n  const fallbackChain = getDesignatedFallbackChain();\n  for (const target of fallbackChain) {\n    if (!candidates.some(c => c.provider === target.provider && c.model === target.model)) {\n      candidates.push({\n        provider: target.provider as AIProviderName,\n        model: target.model,\n        apiKey: apiKeys[target.provider]\n      });\n    }\n  }\n\n  // THINKING DIRECTIVE — measured on production Langfuse traces (swift-101, 2026-09-10):\n  // reasoning models (nemotron lightning/ultra) were dumping a 1000+ word\n  // `\"thinking\": \"...\"` block INSIDE the JSON body — burning output tokens and\n  // 2-3x wall time, duplicating what the native reasoning channel already\n  // streams as `thought`. The JSON must contain ONLY the layer payload.\n  const systemInstructions = `${systemPrompt}\\n\\nTHINKING DIRECTIVE: Do ALL your reasoning internally BEFORE emitting output. Do NOT include any \"thinking\", \"reasoning\", \"analysis\", or chain-of-thought keys or text inside the JSON output — the JSON must contain ONLY the layer payload fields specified by the schema. Then output the JSON immediately.`;\n\n  const resolvedBudget: Required<StreamBudget> = {\n    idleMs: budget?.idleMs ?? DEFAULT_STREAM_IDLE_MS,\n    totalMs: budget?.totalMs ?? DEFAULT_STREAM_TOTAL_MS,\n  };\n\n  for (const [candidateIdx, candidate] of candidates.entries()) {\n    if (signal?.aborted) {\n      console.log(`[curriculum-kit:VercelAI] AbortSignal already aborted, cancelling candidate loop.`);\n      break;\n    }\n    const t0 = Date.now();\n    const attempt = candidateIdx + 1;\n    onEvent?.({ type: 'candidate-start', provider: candidate.provider, model: candidate.model, attempt, total: candidates.length, elapsedMs: 0 });\n    const abort = createStreamAbortSignal(resolvedBudget, signal);\n    try {\n      const modelInstance = getAIModel({\n        provider: candidate.provider,\n        modelName: candidate.model,\n        apiKey: candidate.apiKey,\n      });\n\n      // Raw-wire idle kick (mirrors the app gateway's wireFetch, RC 2026-09-15):\n      // abort.kick() only fires when a PARSED stream part arrives, but reasoning\n      // models legitimately stay silent for minutes (thinking before the first\n      // token) and keep the socket alive with SSE comments only. The parsed-part\n      // kick then fired the 180s idle timeout mid-generation and silently failed\n      // over to the next candidate — every silent model burned its full idle\n      // budget before the switch. Wrapping fetch so EVERY raw socket byte kicks\n      // the timer makes silence truly mean a dead connection.\n      const wireFetch: typeof fetch = (input, init) =>\n        fetch(input, init).then((res) => {\n          if (!res.body) return res;\n          const kicked = res.body.pipeThrough(\n            new TransformStream<Uint8Array, Uint8Array>({\n              transform(chunk, ctrl) {\n                abort.kick();\n                ctrl.enqueue(chunk);\n              },\n            }),\n          );\n          return new Response(kicked, res);\n        });\n\n      const streamResult = streamText({\n        model: modelInstance,\n        system: systemInstructions,\n        prompt: userPrompt,\n        temperature: 0.2,\n        includeRawChunks: true,\n        abortSignal: abort.signal,\n        fetch: wireFetch,\n      } as Parameters<typeof streamText>[0]);\n\n      let fullContent = '';\n      const extract = createStreamChunkExtractor();\n      for await (const part of streamResult.fullStream) {\n        abort.kick();\n        // v7 surfaces recoverable provider failures (429/quota, network, auth)\n        // as ERROR PARTS instead of throwing. Swallowing them made every\n        // failure look like \"nothing streams, candidate hangs until idle\n        // timeout\" — fail loudly so the cascade falls through immediately.\n        if ((part as any)?.type === 'error') {\n          const errText = (part as any).errorText ?? String((part as any).error ?? 'unknown stream error');\n          throw new Error(`[${candidate.provider}] stream error part: ${errText}`);\n        }\n        const extracted = extract(part);\n        if (extracted.thought) onChunk?.(extracted.thought, 'thought');\n        if (extracted.content) {\n          fullContent += extracted.content;\n          onChunk?.(extracted.content, 'content');\n        }\n      }\n\n      if (fullContent.trim()) {\n        console.log(`[curriculum-kit:VercelAI] ✅ ${candidate.provider} (${candidate.model}) streamed in ${Date.now() - t0}ms`);\n        onEvent?.({ type: 'candidate-success', provider: candidate.provider, model: candidate.model, attempt, total: candidates.length, elapsedMs: Date.now() - t0 });\n        return fullContent.trim();\n      }\n      // Empty content = silent failure. Previously fell through with NO log —\n      // the operator could not even see that a candidate was tried and wasted.\n      console.warn(`[curriculum-kit:VercelAI] Candidate ${candidate.provider} (${candidate.model}) returned EMPTY content in ${Date.now() - t0}ms → trying next candidate.`);\n      onEvent?.({ type: 'candidate-failed', provider: candidate.provider, model: candidate.model, attempt, total: candidates.length, elapsedMs: Date.now() - t0, error: 'empty content' });\n    } catch (e: any) {\n      console.warn(`[curriculum-kit:VercelAI] Candidate ${candidate.provider} (${candidate.model}) failed in ${Date.now() - t0}ms:`, e?.message || e);\n      onEvent?.({ type: 'candidate-failed', provider: candidate.provider, model: candidate.model, attempt, total: candidates.length, elapsedMs: Date.now() - t0, error: e?.message || String(e) });\n      const isClientAborted = Boolean(\n        signal?.aborted ||\n        e?.name === 'AbortError' && signal?.aborted ||\n        (e?.message && (\n          e.message.includes('Controller is already closed') ||\n          e.message.includes('The operation was aborted') ||\n          e.message.includes('Aborted by parent signal')\n        ))\n      );\n      if (isClientAborted) {\n        console.log(`[curriculum-kit:VercelAI] Client aborted or stream closed, halting candidate fallback loop.`);\n        break;\n      }\n    } finally {\n      abort.dispose();\n    }\n  }\n\n  return null;\n}\n\n/**\n * Conducts preliminary ecosystem research for a course project.\n */\nexport async function conductPreliminaryResearch(\n  options: LayerPrefillOptions,\n  onChunk?: LayerChunkCallback\n): Promise<PreliminaryResearchResult> {\n  const { accumulatedData = {}, apiKeys = {}, liveSearchConfig = {} } = options;\n  const {\n    projectName = 'Technical Course',\n    courseDescription = '',\n    domain = 'tech',\n    context = 'center',\n    contextLabel = 'STEM Academy',\n    targetAge = 'Secondary (Ages 11-15 / Grades 6-9)',\n    courseDuration = 'Standard Course (16-24 sessions / 24-36 hours)',\n    hardwareReadiness = 'No dedicated hardware'\n  } = accumulatedData;\n\n  const isLiveSearchEnabled = liveSearchConfig.wizardEcosystem !== false;\n\n  const researchPrompt = `You are a Senior Educational Technology & Curriculum Standards Researcher.\nMission: Research and summarize the latest verified ecosystem specifications for \"${projectName}\" (Domain: ${domain}, Context: ${contextLabel || context}, Target: ${targetAge}, Duration: ${courseDuration}, Hardware: ${hardwareReadiness}).\nCourse Description: \"${courseDescription}\".\n\nGROUNDING & RESEARCH MANDATE:\n${isLiveSearchEnabled \n  ? '- LIVE REAL-TIME ECOSYSTEM GROUNDING: Prioritize the latest verified 2026 releases, active web cloud simulators (Zero-Hardware / Web Serial), official software/IDE versions, and modern third-party libraries.' \n  : '- FAST INFERENCE: Use standard authoritative pedagogical baseline knowledge.'}\n\nReturn concise JSON matching:\n{\n  \"groundTruthSummary\": \"Concise summary of verified industry and academic standard toolchains...\",\n  \"hardwareVersion\": \"Recommended hardware baseline or 'Workstation / Cloud Simulator'\",\n  \"ideVersion\": \"Recommended standard IDE / Software version\",\n  \"activeLibraries\": [\"Library 1\", \"Library 2\"],\n  \"technicalGotchas\": [\"Important safety or compatibility note 1\", \"Note 2\"]\n}`;\n\n  let rawContent = '';\n  if (options.customInference) {\n    rawContent = (await options.customInference({\n      systemInstruction: 'You are an authoritative STEM & CS curriculum researcher. Output valid JSON only.',\n      userPrompt: researchPrompt,\n      messages: [{ role: 'user', content: researchPrompt }],\n      temperature: 0.2,\n      maxTokens: 32768,\n      onChunk: (token, type) => {\n        if (type === 'content') rawContent += token;\n        if (type === 'content' || type === 'thought') onChunk?.(token, type);\n      },\n    })) || '';\n  } else {\n    await streamLLMWithFallback(\n      'You are an authoritative STEM & CS curriculum researcher. Output valid JSON only.',\n      researchPrompt,\n      apiKeys,\n      (chunk, type) => {\n        if (type === 'content') rawContent += chunk;\n        onChunk?.(chunk, type);\n      },\n      options.model,\n      options.provider,\n      // Research may run live web grounding — generous budget, still idle-guarded.\n      resolveStreamBudget(undefined, {\n        idleMs: options.idleTimeoutMs,\n        totalMs: options.timeoutMs,\n        model: options.model,\n        provider: options.provider,\n      }),\n      options.signal,\n      options.onProviderEvent\n    );\n  }\n\n  let parsedResearch: PreliminaryResearchResult = {\n    groundTruthSummary: `Verified ecosystem standards for ${projectName}`,\n    hardwareVersion: 'Standard Environment',\n    ideVersion: 'Latest stable version',\n    activeLibraries: [],\n    technicalGotchas: []\n  };\n\n  if (rawContent) {\n    parsedResearch = safeParseJson<PreliminaryResearchResult>(rawContent) || parsedResearch;\n  }\n\n  return parsedResearch;\n}\n\n/**\n * Semantic key aliases for the serialized accumulated context. Maps raw machine\n * keys (enums, snake_case, ids) to human-readable labels so the LLM always sees\n * semantic values instead of enum identifiers.\n */\nconst CONTEXT_KEY_LABELS: Record<string, string> = {\n  domain: 'Domain',\n  customDomain: 'Custom Domain',\n  context: 'Educational Context (Tier)',\n  contextLabel: 'Educational Context',\n  customContext: 'Custom Educational Context',\n  targetAgeTier: 'Target Age Tier',\n  targetAge: 'Target Age & Audience',\n  customAge: 'Custom Age Group',\n  courseDurationTier: 'Course Duration Tier',\n  courseDuration: 'Planned Course Duration',\n  customDuration: 'Custom Course Duration',\n  hardwareReadinessTier: 'Hardware Readiness Tier',\n  hardwareReadiness: 'Hardware & Tool Readiness',\n  customHardware: 'Custom Hardware Setup',\n  language: 'Artifact Output Language',\n  totalWeeks: 'Total Weeks',\n  sessionsPerWeek: 'Sessions Per Week',\n  sessionDurationMinutes: 'Session Duration (minutes)',\n  totalSessions: 'Total Sessions',\n  isConsecutiveSessions: 'Consecutive (Block) Sessions',\n  projectName: 'Course Title',\n  projectCode: 'Project Identifier',\n  courseDescription: 'Idea Description',\n};\n\n/** Keys that are already rendered in the dedicated structured sections below. */\nconst STRUCTURED_PROMPT_KEYS = new Set([\n  'projectName', 'projectCode', 'courseDescription', 'language',\n  'primaryGoal', 'exitVision', 'cognitiveDepth', 'valueAndCertification', 'entryBridge',\n  'pedagogy', 'classDynamic', 'hardwareDeployment', 'teacherRole', 'lessonPacingModel', 'voiceAndTone',\n]);\n\n/**\n * Serializes every remaining key of accumulatedData into human-readable\n * \"- Label: value\" lines so the LLM receives the COMPLETE accumulated context\n * from all previous steps — no field is ever silently dropped by a whitelist.\n * Arrays are joined, nested objects are JSON-stringified, everything else is\n * printed verbatim (semantic values, not enum ids).\n */\nfunction buildRemainingContextBlock(accumulatedData: Record<string, any>): string {\n  const lines: string[] = [];\n  for (const [key, rawVal] of Object.entries(accumulatedData)) {\n    if (STRUCTURED_PROMPT_KEYS.has(key)) continue;\n    if (rawVal === undefined || rawVal === null || rawVal === '') continue;\n    if (key.endsWith('_ids') || key.endsWith('_id')) continue; // enum-id mirrors of semantic values\n\n    const label = CONTEXT_KEY_LABELS[key] || key\n      .replace(/([A-Z])/g, ' $1')\n      .replace(/_/g, ' ')\n      .replace(/^./, c => c.toUpperCase())\n      .trim();\n\n    let valueStr: string;\n    if (Array.isArray(rawVal)) {\n      valueStr = rawVal.map(v => (typeof v === 'object' ? JSON.stringify(v) : String(v))).join('; ');\n    } else if (typeof rawVal === 'object') {\n      valueStr = JSON.stringify(rawVal);\n    } else {\n      valueStr = String(rawVal);\n    }\n    if (!valueStr.trim()) continue;\n    lines.push(`- ${label}: ${valueStr}`);\n  }\n  return lines.join('\\n');\n}\n\n/**\n * Executes concentric 3-layer drill-down prefill inference with live reasoning stream.\n */\nexport async function streamLayerPrefillWithFallback(\n  options: LayerPrefillOptions,\n  onChunk?: LayerChunkCallback\n): Promise<LayerPrefillResult> {\n  const { action = 'prefill', targetLayer = 1, accumulatedData = {}, apiKeys = {} } = options;\n\n  if (action === 'research') {\n    const research = await conductPreliminaryResearch(options, onChunk);\n    return { success: true, research };\n  }\n\n  // Host-provided inference override — the SOLE path when present (same mandate\n  // as streamCurriculumAIInference's customInference Route 0): the built-in\n  // candidate cascade below never runs, so hosts with their own auditable\n  // gateway (Vercel AI SDK tiered pool, Langfuse tracing, raw-wire idle kicks)\n  // get exactly that engine here too. The route still owns prompt assembly and\n  // JSON parsing; the host owns the model call.\n  const runWithCustomInference = async (systemInstruction: string, userPrompt: string): Promise<string> => {\n    if (!options.customInference) return '';\n    return options.customInference({\n      systemInstruction,\n      userPrompt,\n      messages: [{ role: 'user', content: userPrompt }],\n      temperature: 0.2,\n      // Layer 3 synthesizes full context — give reasoning models the same\n      // generous ceiling the artifact paths use (32k) so JSON is never truncated.\n      maxTokens: 32768,\n      onChunk: (token, type) => {\n        if (type === 'content') rawContent += token;\n        if (type === 'content' || type === 'thought') onChunk?.(token, type);\n      },\n    });\n  };\n\n  // Content accumulator shared by both paths: declared BEFORE the customInference\n  // closure so the bridge appends into the same binding the cascade path uses.\n  let rawContent = '';\n\n  const {\n    projectName = 'Curriculum Course',\n    projectCode = 'curriculum-course',\n    courseDescription = '',\n    targetAgeTier = 'secondary',\n    targetAge = 'Secondary (Ages 11-15 / Grades 6-9)',\n    courseDurationTier = 'standard',\n    courseDuration = 'Standard Course (16-24 sessions / 24-36 hours)',\n    primaryGoal = '',\n    exitVision = '',\n    valueAndCertification = '',\n    entryBridge = '',\n    pedagogy = '5E Instructional Model',\n    lessonPacingModel = '',\n    voiceAndTone = '',\n    classDynamic = '',\n    hardwareDeployment = '',\n    teacherRole = '',\n    cognitiveDepth = 'Apply',\n  } = accumulatedData;\n\n  const language = typeof options.language === 'string' && options.language\n    ? options.language\n    : typeof accumulatedData.language === 'string' && accumulatedData.language\n      ? accumulatedData.language\n      : 'vi';\n  const textLangMandate =\n    language === 'vi'\n      ? 'natural, fluent Vietnamese (Tiếng Việt)'\n      : language === 'en'\n        ? 'natural, fluent English'\n        : `natural, fluent ${language}`;\n  const choiceLangMandate =\n    language === 'vi' ? 'in Vietnamese' : language === 'en' ? 'in English' : `in ${language}`;\n\n  const systemPrompt = `You are @analyst, a Senior Curriculum Architect operating under International Curriculum Standards (UbD, Cognitive Load Theory, Bruner Spiral, BSCS 5E).\nSTANDARDS POLICY: Any academicBenchmark value you propose MUST be a framework ID from the org's Standards Registry (e.g. 'csta-k12-2017', 'gdpt-2018-tin-hoc'). NEVER name-drop a framework that is not in the registry — the generation pipeline grounds lessons with VERBATIM statements loaded from the registry by this ID.\nYour task is to generate PROACTIVE HIGH-FIDELITY PRE-FILLED values for Layer ${targetLayer} in a 4-Layer Concentric Curriculum Creation Wizard.\n\nSTRICT CONCENTRIC DRILL-DOWN MANDATES:\n- Layer 1 = UbD Stage 1 (Strategic Goals, Exit Vision & Cognitive Depth Benchmark).\n- Layer 2 = Teaching Framework & Lab Logistics (Pedagogy Model, Class Dynamic, Hardware Deployment, Teacher Role).\n- Layer 3 = Concrete Execution Packaging (Detailed Capstone Theme tailored to confirmed Pedagogy, Concrete Scaffolding, Toolchain, Artifact Scope, Assessment).\n\nMANDATES FOR LAYER ${targetLayer}:\n${targetLayer === 1 ? `\n- Layer 1 MUST focus on UbD Stage 1 (Strategic Intent & Exit Vision & Cognitive Depth).\n- Field 1 (id: 'primaryGoal', type: 'single_choice'): Provide 4 strategic goal options (A. Foundational Discovery & Engagement, B. In-Depth Technical Competence, C. Project Showcase / Competition, D. Institutional Standardization). Mark the BEST option with selected: true.\n- Field 2 (id: 'exitVision', type: 'textarea'): Write a vivid, inspiring, concrete end-to-end outcome description tailored to ${targetAge} and ${courseDuration}.\n- Field 3 (id: 'cognitiveDepth', type: 'single_choice'): Target Bloom taxonomy depth (Apply / Analyze / Create) matching course duration and age.\n- Field 4 (id: 'valueAndCertification', type: 'single_choice'): Recognition formats (Course Certificate, Project Portfolio, Demo Day Showcase).\n- Field 5 (id: 'entryBridge', type: 'single_choice'): Recommended prerequisite baseline & bridge mechanism for ${targetAge}.\n` : targetLayer === 2 ? `\n- Layer 2 MUST focus on Teaching Framework, Persona & Lab Logistics (Methodology & Content Style baseline).\n- Field 1 (id: 'lessonPacingModel', type: 'single_choice'): Lesson pacing model (e.g. 1 Session = 1 Independent Lesson vs Multi-session Thematic Units vs Hybrid Modular) with pedagogical pros/cons matching course duration.\n- Field 2 (id: 'pedagogy', type: 'single_choice'): Core pedagogical model (PBL, EDP, 5E, Hybrid 5E+PBL) with pros/cons analyzed in descriptions.\n- Field 3 (id: 'voiceAndTone', type: 'single_choice'): Persona & Teaching Voice (CONTENT_STYLE_GUIDE: Encouraging Mentor vs Industry Engineer vs Storyteller Guide vs Socratic Facilitator).\n- Field 4 (id: 'classDynamic', type: 'single_choice'): Class structure & Kit ratio (1:1 Individual, 2:1 Pair Programming, 3-4 Project Team).\n- Field 5 (id: 'hardwareDeployment', type: 'single_choice'): Lab logistics deployment (Lab kits provided, BYOD, Cloud simulator, Take-home kit).\n- Field 6 (id: 'teacherRole', type: 'single_choice'): Teacher role and instructional modality (Teacher-led step-by-step vs Facilitator vs Mentor).\n` : `\n- Layer 3 MUST focus on Concrete Execution, Art Direction & Packaging (Now that user confirmed Pedagogy '${pedagogy}').\n- Field 1 (id: 'capstoneTheme', type: 'textarea'): Detailed Capstone product theme designed strictly around confirmed '${pedagogy}' model and '${exitVision}'.\n- Field 2 (id: 'brandingAndTone', type: 'single_choice'): Art Direction & Visual Mood (ART_DIRECTION: Future Maker Lab high-contrast vs Clean Minimalist Studio vs Gamified Playful).\n- Field 3 (id: 'differentiationStrategy', type: 'single_choice'): Differentiation & Scaffolding Strategy (CONTENT_STYLE_GUIDE: Tier 1/2/3 Bronze/Silver/Gold + EXT Challenges vs Open-ended Rubric Studio).\n- Field 4 (id: 'cognitiveScaffolding', type: 'textarea'): Concrete scaffolding methods (Starter Code, color-coded breadboards, 4-step debug poster, simulator preview).\n- Field 5 (id: 'recommendedToolchain', type: 'single_choice'): 3 concrete toolchain/IDE options matching the confirmed Hardware & Tool Readiness from FULL ACCUMULATED CONTEXT.\n- Field 6 (id: 'artifactScope', type: 'multi_choice'): Deliverable artifacts (LESSON mandatory + ACT, QUIZ, SLIDE, WKS, HANDOUT, GUIDE, CODE).\n- Field 7 (id: 'assessmentStrategy', type: 'single_choice'): Grading weights (e.g. 40% Formative Process + 60% Capstone Rubric).\n`}\n\n- EVERY text/textarea field MUST have a complete, professional, ready-to-use pre-filled text in ${textLangMandate} adhering strictly to standard pedagogical terminology. NO placeholders, NO empty strings.\n- EVERY choice field MUST have realistic concrete options ${choiceLangMandate} with EXACTLY ONE recommended option (selected: true).\n- SCRIPT POLICY (CJK/non-Latin ban): Write ALL output STRICTLY in the ${textLangMandate} using the Latin alphabet. NEVER insert characters from CJK scripts (Chinese 汉字, Japanese かな/漢字, Korean 한글) or any other non-Latin script ANYWHERE in the output — not even a single character inside an otherwise Vietnamese/English sentence. If a technical term has no natural translation, keep the ENGLISH term (e.g. write \"tự kiểm tra lỗi\" or \"self-debugging\", NEVER 排查 lỗi; write \"bao gồm\", NEVER 包含). This ban includes partial words spliced into Vietnamese text like 排查, 包含, 导致, 是多少.\n\nRETURN STRICT VALID JSON ONLY adhering exactly to this format:\n{\n  \"layer\": ${targetLayer},\n  \"layerTitle\": \"Layer Title\",\n  \"layerDescription\": \"Brief goal description of this layer\",\n  \"fields\": [\n    {\n      \"id\": \"field_id\",\n      \"label\": \"Field Label\",\n      \"description\": \"Brief explanation\",\n      \"type\": \"single_choice | multi_choice | text | textarea\",\n      \"value\": \"Pre-filled text if text/textarea\",\n      \"options\": [\n        { \"id\": \"opt_1\", \"label\": \"Option Name\", \"description\": \"Details\", \"selected\": true }\n      ]\n    }\n  ]\n}`;\n\n  const userPrompt = `BASE INPUT PARAMETERS (LAYER 0: FOUNDATION & AUDIENCE):\n- Course Title: \"${projectName}\"\n- Project Identifier: \"${projectCode}\"\n- Idea Description: \"${courseDescription}\"\n- Target Age & Audience: ${targetAge}\n- Planned Course Duration: ${courseDuration}\n\n${targetLayer >= 2 ? `\nAPPROVED PARAMETERS FROM LAYER 1 (STRATEGIC INTENT & OUTCOMES):\n- Primary Strategic Goal: \"${primaryGoal}\"\n- Competency Exit Vision: \"${exitVision}\"\n- Target Cognitive Depth: \"${cognitiveDepth}\"\n- Value & Recognition: \"${valueAndCertification}\"\n- Prerequisite Entry Bridge: \"${entryBridge}\"\n` : ''}\n\n${targetLayer >= 3 ? `\nAPPROVED PARAMETERS FROM LAYER 2 (PEDAGOGY & LOGISTICS):\n- Lesson Pacing Model: \"${lessonPacingModel}\"\n- Selected Pedagogy Model: \"${pedagogy}\"\n- Voice & Tone: \"${voiceAndTone}\"\n- Class Dynamics / Hardware Ratio: \"${classDynamic}\"\n- Lab Deployment Mode: \"${hardwareDeployment}\"\n- Instructional Role: \"${teacherRole}\"\n` : ''}\n\nFULL ACCUMULATED CONTEXT (ALL CONFIRMED PARAMETERS FROM EVERY PREVIOUS STEP — user decisions, organization/instructor/template profiles, schedules and constraints; every line below MUST be honored in your output):\n${buildRemainingContextBlock(accumulatedData) || '(no additional context)'}\n\nREQUIREMENT: Synthesize ALL parameters above — every single line in FULL ACCUMULATED CONTEXT is a confirmed user decision or system constraint and MUST influence the generated configuration. Produce the high-fidelity pre-fill configuration for LAYER ${targetLayer}.`;\n\n  if (options.customInference) {\n    rawContent = (await runWithCustomInference(systemPrompt, userPrompt)) || '';\n  } else {\n    await streamLLMWithFallback(\n      systemPrompt,\n      userPrompt,\n      apiKeys,\n      (chunk, type) => {\n        if (type === 'content') rawContent += chunk;\n        onChunk?.(chunk, type);\n      },\n      options.model,\n      options.provider,\n      // RC-W1: layer-aware budget — Layer 3 synthesizes full context and free-tier\n      // models (especially NVIDIA NIM) may think/stream for minutes. Idle window still catches hangs.\n      resolveStreamBudget(targetLayer, {\n        idleMs: options.idleTimeoutMs,\n        totalMs: options.timeoutMs,\n        model: options.model,\n        provider: options.provider,\n      }),\n      options.signal,\n      options.onProviderEvent\n    );\n  }\n\n  const parsed = safeParseJson(rawContent);\n  return {\n    success: !!parsed,\n    targetLayer,\n    parsedResponse: parsed,\n    rawText: rawContent\n  };\n}\n","/**\n * Universal Pedagogical Constants & Empirical Classroom Standards\n * Single Source of Truth for Curriculum Planning, Linters, and LLM-as-Judge Evaluators.\n */\n\n/**\n * Student Friction Multiplier (Empirical Classroom Constant):\n * Senior engineers write code roughly 2.5x to 3.5x faster than students.\n * A 10-minute expert coding task requires ~25-35 minutes for a student in a classroom setting\n * due to typing, syntax errors, typos, and debugging.\n */\nexport const STUDENT_FRICTION_MULTIPLIER = 2.5;\n\n/**\n * Vygotsky Zone of Proximal Development (ZPD) Saturation Thresholds:\n * Maximum number of completely new conceptual primitives allowed in a single session.\n * @deprecated Prefer SESSION_COGNITIVE_BUDGET_* with LO type weights (ADR-0007).\n */\nexport const MAX_NEW_CONCEPTS_PER_SESSION_K12 = 2;\nexport const MAX_NEW_CONCEPTS_PER_SESSION_ADULT = 3;\n\n/**\n * Cognitive Load Budget by LO Type Weights (ADR-0007):\n * Replaces the blunt MAX_NEW_CONCEPTS_PER_SESSION count with a weighted budget\n * based on the abstraction level (Marr's Tri-Level & Skemp Relational vs Instrumental).\n * - ULO (Universal / Relational - Why): Highest cognitive abstraction -> 3 pts\n * - CIO (Algorithmic / Conceptual - How): Intermediate algorithmic design -> 2 pts\n * - SIO (Implementational / Syntax - Action): Concrete syntax / step -> 1 pt\n * - Default / Unspecified LO: Safe fallback weight -> 2 pts\n */\nexport const WEIGHT_ULO = 3;\nexport const WEIGHT_CIO = 2;\nexport const WEIGHT_SIO = 1;\nexport const DEFAULT_LO_WEIGHT = 2;\n\n/**\n * Maximum cognitive load budget points allowed in a single session:\n * - K-12: 10 points (e.g., 1 ULO + 1 CIO + 5 SIOs = 10 pts, or 2 ULOs + 2 CIOs = 10 pts)\n * - Adult: 15 points (higher cognitive bandwidth and prior schemata)\n * - Beginner First Session: 3 points (stricter cap for Day 1 setup & toolchain overhead)\n */\nexport const SESSION_COGNITIVE_BUDGET_K12 = 10;\nexport const SESSION_COGNITIVE_BUDGET_ADULT = 15;\nexport const FIRST_SESSION_COGNITIVE_BUDGET_BEGINNER = 3;\n\n/**\n * Age-band granularity gate (2026-09-19, regen7/8 semantic audit):\n * the FIRST teaching session for BEGINNER courses must introduce at most\n * ONE new concept — session 1 also carries environment setup, and L01\n * historically crammed 9 language tokens + toolchain beside its concepts\n * (regen7 L01: 6 keywords). Adults are exempt (they metabolize setup +\n * concept in one sitting).\n */\nexport const FIRST_SESSION_MAX_NEW_CONCEPTS_BEGINNER = 1;\n\n/**\n * Language-exposure ceiling (noisy PROXY, evidence for the judge — never a\n * hard gate): max NEW language tokens per session. var/let/Int/String are\n * one concept family; counting them as separate concepts breaks cognition\n * checks, but unbounded vocab dumps still overload beginners (regen7 L01:\n * 9 tokens on day 1).\n */\nexport const MAX_NEW_KEYWORDS_PER_SESSION_K12 = 6;\n\n/**\n * Standard Classroom Overhead Ratio:\n * 15% of total session duration is strictly reserved for setup, attendance,\n * questions, transitions, and hardware teardown.\n */\nexport const DEFAULT_OVERHEAD_RATIO = 0.15;\n\n/**\n * Maximum In-Session Setup Minutes:\n * The maximum time a student should spend on toolchain/environment configuration\n * during the first working session before achieving their first running \"Hello World\".\n */\nexport const MAX_IN_SESSION_SETUP_MINUTES = 15;\n\n/**\n * Session-Cut Tolerance (P52/T2.2):\n * When the content budget is reached, the packer searches for the nearest\n * user-visible checkpoint (node with a non-empty user_visible_deliverable)\n * within ±15% of the session's content budget before falling back to a raw\n * minute cut. Motivation: a session that ends mid-step without anything to\n * show kills momentum (P52 plan, Gap 2).\n */\nexport const SESSION_CUT_TOLERANCE = 0.15;\n\n/**\n * 3-Tier Environment Provisioning Models for Complex or Heavy Technology Stacks:\n * - PRE_INSTALLED_LAB: Environment/IDE/DB is imaged or pre-configured by IT/Lab technician before class.\n * - CLOUD_MANAGED: Cloud instance (Supabase, Neon, Codespaces, Wokwi) with pre-provisioned connection strings.\n * - DEDICATED_SETUP: A dedicated full session specifically budgeted for guided local environment setup.\n */\nexport const ENVIRONMENT_PROVISIONING_MODELS = [\n  'PRE_INSTALLED_LAB',\n  'CLOUD_MANAGED',\n  'DEDICATED_SETUP',\n] as const;\n\nexport type EnvironmentProvisioningModel = (typeof ENVIRONMENT_PROVISIONING_MODELS)[number];\n\n/**\n * Autonomous Evaluation Thresholds:\n */\nexport const JUDGE_AUTO_APPROVE_THRESHOLD = 85;\nexport const JUDGE_ESCALATE_THRESHOLD = 70;\nexport const MAX_AUTONOMOUS_REPAIR_TURNS = 3;\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { ProjectInstructionSchema, type ProjectInstruction } from '../../schemas';\nimport { buildProjectInstructionPrompt, type ProjectInstructionPromptInput } from '../prompts';\n\nexport interface GenerateProjectInstructionInput extends ProjectInstructionPromptInput {\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateProjectInstructionFlow(\n  input: GenerateProjectInstructionInput\n): Promise<ProjectInstruction> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildProjectInstructionPrompt({\n    projectGraph: input.projectGraph,\n    milestone: input.milestone,\n    roadmapContext: input.roadmapContext,\n    researchNotes: input.researchNotes,\n    externalResources: input.externalResources,\n    language: input.language,\n    difficulty: input.difficulty,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: ProjectInstructionSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { SelfLabSchema, type SelfLab, type MilestoneInput, type ProjectGraph } from '../../schemas';\nimport { buildSelfLabPrompt } from '../prompts';\n\nexport interface GenerateSelfLabInput {\n  milestone: MilestoneInput;\n  projectGraph?: ProjectGraph;\n  language: string;\n  targetTechStack?: string[];\n  contextContinuity?: string;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateSelfLabFlow(input: GenerateSelfLabInput): Promise<SelfLab> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildSelfLabPrompt({\n    milestone: input.milestone,\n    projectGraph: input.projectGraph,\n    language: input.language,\n    targetTechStack: input.targetTechStack,\n    contextContinuity: input.contextContinuity,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: SelfLabSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n","import { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { streamJson } from '../streamJson';\nimport { DiagnosticQuizSchema, type DiagnosticQuiz, type MilestoneInput } from '../../schemas';\nimport { buildDiagnosticQuizPrompt } from '../prompts';\n\nexport interface GenerateDiagnosticQuizInput {\n  milestone: MilestoneInput;\n  language: string;\n  questionCount?: number;\n  passingScorePct?: number;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function generateDiagnosticQuizFlow(input: GenerateDiagnosticQuizInput): Promise<DiagnosticQuiz> {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildDiagnosticQuizPrompt({\n    milestone: input.milestone,\n    language: input.language,\n    questionCount: input.questionCount,\n    passingScorePct: input.passingScorePct,\n  });\n\n  const object = await streamJson({\n    model,\n    schema: DiagnosticQuizSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n\n  return object;\n}\n","import { streamObject } from 'ai';\nimport { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { LessonPlanSchema, type MilestoneInput } from '../../schemas';\nimport { buildLessonMasterPrompt, type LessonPromptInput } from '../prompts';\n\nexport interface StreamLessonMasterInput extends Omit<LessonPromptInput, 'milestone'> {\n  milestone: MilestoneInput;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function streamLessonMasterFlow(input: StreamLessonMasterInput) {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildLessonMasterPrompt({\n    milestone: input.milestone,\n    language: input.language,\n    topic: input.topic,\n    targetAudience: input.targetAudience,\n    contextContinuity: input.contextContinuity,\n  });\n\n  return streamObject({\n    model,\n    schema: LessonPlanSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n}\n","import { streamObject } from 'ai';\nimport { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { SelfLabSchema, type MilestoneInput } from '../../schemas';\nimport { buildSelfLabPrompt } from '../prompts';\n\nexport interface StreamSelfLabInput {\n  milestone: MilestoneInput;\n  language: string;\n  targetTechStack?: string[];\n  contextContinuity?: string;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function streamSelfLabFlow(input: StreamSelfLabInput) {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildSelfLabPrompt({\n    milestone: input.milestone,\n    language: input.language,\n    targetTechStack: input.targetTechStack,\n    contextContinuity: input.contextContinuity,\n  });\n\n  return streamObject({\n    model,\n    schema: SelfLabSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n}\n","import { streamObject } from 'ai';\nimport { getAIModel, type ModelResolutionOptions } from '../provider-factory';\nimport { DiagnosticQuizSchema, type MilestoneInput } from '../../schemas';\nimport { buildDiagnosticQuizPrompt } from '../prompts';\n\nexport interface StreamDiagnosticQuizInput {\n  milestone: MilestoneInput;\n  language: string;\n  questionCount?: number;\n  passingScorePct?: number;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport async function streamDiagnosticQuizFlow(input: StreamDiagnosticQuizInput) {\n  const model = getAIModel(input.modelOptions);\n  const prompt = buildDiagnosticQuizPrompt({\n    milestone: input.milestone,\n    language: input.language,\n    questionCount: input.questionCount,\n    passingScorePct: input.passingScorePct,\n  });\n\n  return streamObject({\n    model,\n    schema: DiagnosticQuizSchema,\n    prompt: `${prompt}\\n\\nRespond with a valid JSON object matching the schema.`,\n  });\n}\n","/**\n * Specialist Sub-Agent Toolbelts (Parity with LangGraph AGENTS.md & nodes)\n *\n * Provides typed Zod tool schemas and execution contracts for 10 specialist personas:\n * 1. @analyst — Brief analysis, learner profile, age group constraints\n * 2. @researcher — Ground Truth, reference pack, evidence scoring\n * 3. @designer — 3-level Curriculum Framework, Bloom matrix, prerequisite graph\n * 4. @content — 5E Lesson Plan, Lesson contract, Section patching\n * 5. @activity — STEM Activity Operations, ACT contract validation\n * 6. @assessor — Diagnostic quizzes, question bank, rubric matrix\n * 7. @illustrator — Mermaid diagrams, technical illustrations, visual assets\n * 8. @tech_sme — Code Lab sandbox execution, syntax validation, runtime checking\n * 9. @reviewer — Alignment matrix audit, reading level check, scope drift detection\n * 10. @packager — 4 Delivery packs (Teacher, Student, Parent, Client), Handover Doc\n */\n\nimport { z } from 'zod';\n\n// ── 1. @analyst Toolbelt ───────────────────────────────────────────\nexport const analystTools = {\n  analyzeLearnerProfile: {\n    name: 'analyzeLearnerProfile',\n    description: 'Extracts and analyzes target learner profile, age tier, prerequisite baseline, and cognitive barriers.',\n    schema: z.object({\n      targetAge: z.string().describe('Target learner age group (e.g. 12-15 years, Secondary K-12)'),\n      priorKnowledge: z.string().describe('Prerequisite baseline knowledge (e.g. Scratch visual block mastery)'),\n      cognitiveBarriers: z.array(z.string()).describe('Identified psychological or cognitive barriers when approaching new concepts'),\n      transitionStrategy: z.string().describe('Bridge strategy for cognitive scaffolding')\n    })\n  },\n  validatePrerequisites: {\n    name: 'validatePrerequisites',\n    description: 'Validates prerequisite knowledge requirements and entrance benchmarks for the curriculum.',\n    schema: z.object({\n      requiredConcepts: z.array(z.string()).describe('List of mandatory prerequisite concepts required before starting'),\n      entryBenchmark: z.string().describe('Minimum diagnostic assessment or entry milestone')\n    })\n  },\n  writeLearnerProfile: {\n    name: 'writeLearnerProfile',\n    description: 'Generates or updates the standardized SOT LEARNER_PROFILE.md document.',\n    schema: z.object({\n      projectSlug: z.string().describe('Unique project identifier'),\n      markdownContent: z.string().describe('Detailed Markdown content conforming to SOT schema')\n    })\n  }\n};\n\n// ── 2. @researcher Toolbelt ────────────────────────────────────────\nexport const researcherTools = {\n  searchAcademicStandards: {\n    name: 'searchAcademicStandards',\n    description: 'Queries international curriculum standards (CSTA, IEEE/ACM CS2023, National Standards) and official vendor documentation.',\n    schema: z.object({\n      query: z.string().describe('Search query for standards and specifications'),\n      standardCategory: z.enum(['CSTA', 'CS2023', 'OFFICIAL_DOCS', 'ALL']).default('ALL')\n    })\n  },\n  scoreEvidence: {\n    name: 'scoreEvidence',\n    description: 'Evaluates credibility and relevance score (1-10) of reference materials to prevent AI hallucination.',\n    schema: z.object({\n      sourceUrl: z.string().describe('Resource URL or specification identifier'),\n      sourceType: z.enum(['academic_paper', 'official_doc', 'curriculum_standard', 'community_article']),\n      reliabilityScore: z.number().min(1).max(10).describe('Academic and technical reliability rating')\n    })\n  },\n  writeReferencePack: {\n    name: 'writeReferencePack',\n    description: 'Persists verified Ground Truth references into SOT REFERENCE_PACK.md.',\n    schema: z.object({\n      projectSlug: z.string().describe('Project identifier'),\n      references: z.array(z.object({\n        id: z.string(),\n        title: z.string(),\n        sourceUrl: z.string(),\n        relevanceScore: z.number()\n      })),\n      cs2023Area: z.string().optional()\n    })\n  }\n};\n\n// ── 3. @designer Toolbelt ──────────────────────────────────────────\nexport const designerTools = {\n  buildScopeAndSequence: {\n    name: 'buildScopeAndSequence',\n    description: 'Constructs the 3-tier curriculum hierarchy: Unit (PBL Project) -> Module (Topic cluster) -> Lesson (5E plan).',\n    schema: z.object({\n      totalWeeks: z.number().default(16),\n      totalSessions: z.number().default(32),\n      units: z.array(z.object({\n        unitId: z.string().describe('Unit Code (e.g. U01)'),\n        title: z.string().describe('Unit title'),\n        projectDeliverable: z.string().describe('End-of-unit capstone project deliverable'),\n        sessionCount: z.number().describe('Number of sessions allocated'),\n        bloomTarget: z.string().describe('Highest target Bloom taxonomy level')\n      }))\n    })\n  },\n  writeCurriculumFramework: {\n    name: 'writeCurriculumFramework',\n    description: 'Generates or updates the standardized SOT CURRICULUM_FRAMEWORK.md document.',\n    schema: z.object({\n      projectSlug: z.string().describe('Project identifier'),\n      frameworkMarkdown: z.string().describe('Complete decomposed curriculum framework in Markdown'),\n      standardRefs: z.array(z.object({\n        unitId: z.string().describe('Unit the statements anchor, e.g. \"U01\"'),\n        standardIds: z.array(z.string()).describe('Canonical statement IDs from the STANDARDS CONTEXT list, e.g. [\"csta-k12-2017:1B-AP-10\"]. MUST exist in the provided list — never invent IDs'),\n      })).optional().describe('Standards anchoring per unit, chosen ONLY from the STANDARDS CONTEXT statement list')\n    })\n  }\n};\n\n// ── 4. @content Toolbelt (Lesson Authoring) ────────────────────────\nexport const contentTools = {\n  scaffold5ELesson: {\n    name: 'scaffold5ELesson',\n    description: 'Scaffolds a 5E lesson plan structure (Engage, Explore, Explain, Elaborate, Evaluate).',\n    schema: z.object({\n      lessonId: z.string().describe('Lesson identifier (e.g. U01_M01_L01)'),\n      title: z.string().describe('Lesson title'),\n      learningObjectives: z.array(z.object({\n        code: z.string().describe('LO code, e.g. \"LO1\"'),\n        statement: z.string().describe('Bloom-tagged objective statement'),\n        standardRefs: z.array(z.string()).optional().describe('Anchoring statement IDs chosen ONLY from the STANDARDS CONTEXT list, e.g. [\"csta-k12-2017:1B-AP-10\"]')\n      })).describe('Target learning objectives (LOs) with standards anchors'),\n      durationMinutes: z.number().default(90)\n    })\n  },\n  writeLessonBody: {\n    name: 'writeLessonBody',\n    description: 'Authors full 5-phase lesson plan body conforming to Lesson Contract and pedagogical rules.',\n    schema: z.object({\n      lessonId: z.string(),\n      fullMarkdown: z.string(),\n      activitySequence: z.array(z.string()).describe('Committed activity sequence from lesson contract')\n    })\n  },\n  patchLessonSection: {\n    name: 'patchLessonSection',\n    description: 'Locally patches a specific section line range of a lesson artifact without full overwrite.',\n    schema: z.object({\n      filePath: z.string().describe('Relative path to lesson artifact'),\n      targetSectionHeader: z.string().describe('Target section heading to replace'),\n      replacementMarkdown: z.string().describe('New replacement Markdown section')\n    })\n  }\n};\n\n// ── 5. @activity Toolbelt (STEM Labs) ──────────────────────────────\nexport const activityTools = {\n  writeActLabOperations: {\n    name: 'writeActLabOperations',\n    description: 'Authors hands-on laboratory operation document (ACT_...md) expanding the committed LESSON activity flow.',\n    schema: z.object({\n      lessonId: z.string(),\n      targetPlatform: z.string().default('Cross-platform Workstation / IDE'),\n      stepByStepSteps: z.array(z.object({\n        stepNumber: z.number(),\n        instruction: z.string(),\n        starterCodeSnippet: z.string().optional(),\n        solutionCodeSnippet: z.string().optional()\n      }))\n    })\n  }\n};\n\n// ── 6. @assessor Toolbelt (Quiz & Rubrics) ─────────────────────────\nexport const assessorTools = {\n  writeQuizBank: {\n    name: 'writeQuizBank',\n    description: 'Generates diagnostic and formative scenario-based quiz bank with distractor explanations.',\n    schema: z.object({\n      lessonId: z.string(),\n      questions: z.array(z.object({\n        id: z.string(),\n        prompt: z.string(),\n        options: z.array(z.string()),\n        correctIndex: z.number(),\n        explanation: z.string(),\n        bloomLevel: z.string()\n      }))\n    })\n  },\n  generateRubricMatrix: {\n    name: 'generateRubricMatrix',\n    description: 'Generates 4-tier competency rubric matrix (Developing, Proficient, Advanced, Exemplary).',\n    schema: z.object({\n      lessonId: z.string(),\n      criteria: z.array(z.object({\n        criterionName: z.string(),\n        weight: z.number(),\n        levels: z.record(z.string())\n      }))\n    })\n  }\n};\n\n// ── 7. @illustrator Toolbelt (Visual Assets) ───────────────────────\nexport const illustratorTools = {\n  generateMermaidDiagram: {\n    name: 'generateMermaidDiagram',\n    description: 'Generates valid Mermaid diagrams representing data flow, architecture, or algorithmic state machines.',\n    schema: z.object({\n      diagramType: z.enum(['flowchart', 'sequenceDiagram', 'classDiagram', 'stateDiagram']),\n      mermaidCode: z.string().describe('Pure valid Mermaid code string')\n    })\n  },\n  generateSlideDeck: {\n    name: 'generateSlideDeck',\n    description: 'Generates pedagogical slide deck in Marp Markdown format following 5E structure.',\n    schema: z.object({\n      lessonId: z.string(),\n      marpMarkdown: z.string().describe('Complete Marp Markdown with frontmatter and slide delimiters')\n    })\n  }\n};\n\n// ── 8. @tech_sme Toolbelt (Sandbox Code Execution) ─────────────────\nexport const techSmeTools = {\n  sandboxExecuteCodeLab: {\n    name: 'sandboxExecuteCodeLab',\n    description: 'Executes student lab code in a sandbox environment to verify zero syntax and runtime errors.',\n    schema: z.object({\n      language: z.enum(['swift', 'python', 'javascript', 'html_css']),\n      code: z.string().describe('Source code to test and execute'),\n      expectedOutput: z.string().optional()\n    })\n  },\n  lintSyntaxErrors: {\n    name: 'lintSyntaxErrors',\n    description: 'Performs static linting and compiler validation on code samples before student delivery.',\n    schema: z.object({\n      language: z.string(),\n      code: z.string()\n    })\n  }\n};\n\n// ── 9. @reviewer Toolbelt (Quality Assurance) ──────────────────────\nexport const reviewerTools = {\n  auditAlignmentMatrix: {\n    name: 'auditAlignmentMatrix',\n    description: 'Audits alignment integrity between Objectives (LOs) - Content (LESSON) - Assessment (QUIZ).',\n    schema: z.object({\n      lessonId: z.string(),\n      loCoverageRate: z.number().min(0).max(100),\n      detectedGaps: z.array(z.string()),\n      verdict: z.enum(['PASS', 'WARN', 'FAIL'])\n    })\n  },\n  verifyReadingLevel: {\n    name: 'verifyReadingLevel',\n    description: 'Verifies readability grade level and vocabulary complexity against target age group.',\n    schema: z.object({\n      targetAgeGroup: z.string(),\n      textSnippet: z.string(),\n      readingGradeLevel: z.string(),\n      isAppropriate: z.boolean()\n    })\n  }\n};\n\n// ── 10. @packager Toolbelt (Delivery & Handover) ───────────────────\nexport const packagerTools = {\n  createDeliveryPackage: {\n    name: 'createDeliveryPackage',\n    description: 'Assembles and packages 4 delivery bundles: Teacher Pack, Student Pack, Parent Pack, and Client Pack.',\n    schema: z.object({\n      projectSlug: z.string(),\n      packageType: z.enum(['TEACHER', 'STUDENT', 'PARENT', 'CLIENT', 'ALL']),\n      outputDirectory: z.string().default('_released/')\n    })\n  }\n};\n","/**\n * Model Policy Resolver (Economic & Expert Council Architecture - August 2026)\n *\n * Core Routing Strategy:\n * 1. Expert Council / LLM-as-Judge (Tier 1):\n *    - OpenRouter / Google: google/gemini-3.7-flash (Opus-grade accuracy, 1M context)\n *    - DeepSeek: deepseek-v4-pro (Build 0813 - Deep CoT Reasoning)\n *    - Alibaba: qwen3.8-max (2.4T MoE Flagship)\n *    - NVIDIA NIM: nvidia/nemotron-3-ultra-550b-a55b:free (Robust Free Fallback)\n *\n * 2. Mid & Mid-High Production / Copilot (Tier 2 - Primary Economic):\n *    - DeepSeek: deepseek-v4-flash (Build 0731 - $0.22/1M, 1M context, 284B MoE)\n *    - Alibaba: qwen3.7-flash ($0.03/1M, ultra-fast tool caller)\n *    - OpenRouter / Google: google/gemini-3.7-flash\n *\n * 3. Easy / Structured & Free Tasks (Tier 3):\n *    - NVIDIA NIM: nvidia/nemotron-3.5-lightning-30b-a3b (Free 1.8s MoE)\n *    - DeepSeek: deepseek-v4-flash\n *    - Alibaba: qwen3.7-flash ($0.03/1M, ultra-fast tool caller)\n *    - Google: gemini-3.5-flash-lite\n */\n\nexport type ModelProviderKey = 'deepseek' | 'openrouter' | 'alibaba' | 'google' | 'nvidia' | 'zhipu' | 'ollama' | 'openai' | 'anthropic';\n\nexport interface ModelPolicyResolution {\n  provider: ModelProviderKey;\n  modelName: string;\n  maxTokens: number;\n  temperature: number;\n  reasoningEffort?: 'low' | 'medium' | 'high' | 'max';\n  contextWindow?: number;\n  providerLabel?: string;\n  tierDescription?: string;\n}\n\nexport interface MultiProviderPolicyResolution {\n  primary: ModelPolicyResolution;\n  fallbacks: ModelPolicyResolution[];\n  candidateChain: ModelPolicyResolution[];\n  expertCouncil?: ModelPolicyResolution[];\n}\n\nexport const DEFAULT_ENABLED_PROVIDERS: Record<ModelProviderKey, boolean> = {\n  deepseek: true,   // Primary economic provider (V4-Flash / V4-Pro)\n  openrouter: true, // Gateway for Gemini 3.7 Flash & top models\n  alibaba: true,    // Active provider (Qwen 3.8 / 3.7 Flash)\n  nvidia: true,     // Free tier fallback lead (Nemotron 3 Ultra / Lightning)\n  google: true,     // Google AI Studio direct\n  ollama: false,    // Disabled when out of local GPU/token\n  zhipu: false,     // Zhipu BigModel (Optional)\n  openai: false,\n  anthropic: false\n};\n\nexport class ModelPolicyResolver {\n  /**\n   * Returns the High-End Expert Council for LLM-as-Judge & Architecture Evaluation\n   */\n  public static getExpertCouncil(): ModelPolicyResolution[] {\n    return [\n      {\n        provider: 'openrouter',\n        providerLabel: 'OpenRouter Gateway',\n        modelName: 'google/gemini-3.7-flash', // Benchmark on par with Claude 3.5/3.7 Opus\n        maxTokens: 32768,\n        temperature: 0.15,\n        reasoningEffort: 'high',\n        contextWindow: 1048576,\n        tierDescription: 'Hội đồng Giám khảo: Gemini 3.7 Flash (Opus-grade accuracy)'\n      },\n      {\n        provider: 'deepseek',\n        providerLabel: 'DeepSeek API',\n        modelName: 'deepseek-v4-pro', // Build 0813\n        maxTokens: 32768,\n        temperature: 0.15,\n        reasoningEffort: 'high',\n        contextWindow: 1000000,\n        tierDescription: 'Hội đồng Giám khảo: DeepSeek V4 Pro (Deep CoT Reasoning)'\n      },\n      {\n        provider: 'alibaba',\n        providerLabel: 'Alibaba Qwen Cloud',\n        modelName: 'qwen3.8-max', // 2.4T MoE Flagship\n        maxTokens: 32768,\n        temperature: 0.15,\n        reasoningEffort: 'high',\n        contextWindow: 1000000,\n        tierDescription: 'Hội đồng Giám khảo: Qwen 3.8 Max (2.4T Sparse MoE)'\n      },\n      {\n        provider: 'nvidia',\n        providerLabel: 'NVIDIA NIM API',\n        modelName: 'nvidia/nemotron-3-ultra-550b-a55b:free',\n        maxTokens: 32768,\n        temperature: 0.15,\n        reasoningEffort: 'high',\n        contextWindow: 1000000,\n        tierDescription: 'Hội đồng Giám khảo Dự phòng: Nemotron 3 Ultra 550B (Miễn phí)'\n      }\n    ];\n  }\n\n  /**\n   * Builds the multi-provider priority candidates list for a given role/artifact\n   */\n  public static getCandidatePool(role: string, artifactType?: string): ModelPolicyResolution[] {\n    const isJudgeOrReasoning = ['judge', 'agent_as_judge', 'reviewer', 'designer', 'analyst', 'tech_sme'].includes(role.toLowerCase()) ||\n      (role === 'content' && artifactType?.toUpperCase() === 'LESSON');\n\n    const isFastOrEasyStructured = ['activity', 'assessor', 'illustrator', 'packager', 'polish'].includes(role.toLowerCase()) ||\n      ['QUIZ', 'SLIDE', 'ACT', 'WKS', 'EXT'].includes(artifactType?.toUpperCase() || '');\n\n    // ── 1. TIER 1: HIGH-END FLAGSHIP & LLM-AS-JUDGE ──\n    if (isJudgeOrReasoning) {\n      return this.getExpertCouncil();\n    }\n\n    // ── 3. TIER 3: EASY / FAST STRUCTURED ASSET PRODUCTION ──\n    if (isFastOrEasyStructured) {\n      return [\n        {\n          provider: 'nvidia',\n          providerLabel: 'NVIDIA NIM API (Free Tier)',\n          modelName: 'nvidia/nemotron-3.5-lightning-30b-a3b',\n          maxTokens: 32768,\n          temperature: 0.2,\n          reasoningEffort: 'low',\n          contextWindow: 1000000,\n          tierDescription: 'Nhiệm vụ dễ / Cấu trúc: Nemotron 3.5 Lightning (Miễn phí)'\n        },\n        {\n          provider: 'deepseek',\n          providerLabel: 'DeepSeek API',\n          modelName: 'deepseek-v4-flash',\n          maxTokens: 32768,\n          temperature: 0.2,\n          reasoningEffort: 'low',\n          contextWindow: 1000000,\n          tierDescription: 'Nhiệm vụ cấu trúc kinh tế: DeepSeek V4 Flash ($0.22/1M)'\n        },\n        {\n          provider: 'alibaba',\n          providerLabel: 'Alibaba Qwen Cloud',\n          modelName: 'qwen3.7-flash',\n          maxTokens: 32768,\n          temperature: 0.2,\n          reasoningEffort: 'low',\n          contextWindow: 1000000,\n          tierDescription: 'Nhiệm vụ cấu trúc: Qwen 3.7 Flash ($0.03/1M)'\n        },\n        {\n          provider: 'openrouter',\n          providerLabel: 'OpenRouter Gateway',\n          modelName: 'google/gemini-3.5-flash-lite',\n          maxTokens: 32768,\n          temperature: 0.2,\n          reasoningEffort: 'low',\n          contextWindow: 1048576,\n          tierDescription: 'Nhiệm vụ cấu trúc: Gemini 3.5 Flash-Lite'\n        }\n      ];\n    }\n\n    // ── 2. TIER 2: MID & MID-HIGH PRODUCTION / FRONT-LINE COPILOT ──\n    return [\n      {\n        provider: 'deepseek',\n        providerLabel: 'DeepSeek API (Primary Economic)',\n        modelName: 'deepseek-v4-flash', // $0.22/1M, 1M context, smart reasoning & tool calling\n        maxTokens: 32768,\n        temperature: 0.3,\n        reasoningEffort: 'medium',\n        contextWindow: 1000000,\n        tierDescription: 'Nhiệm vụ cấp trung kinh tế: DeepSeek V4 Flash (1M Context)'\n      },\n      {\n        provider: 'alibaba',\n        providerLabel: 'Alibaba Qwen Cloud',\n        modelName: 'qwen3.7-flash', // $0.03/1M, <400ms\n        maxTokens: 32768,\n        temperature: 0.3,\n        reasoningEffort: 'medium',\n        contextWindow: 1000000,\n        tierDescription: 'Điều phối & Tool Calling: Qwen 3.7 Flash'\n      },\n      {\n        provider: 'openrouter',\n        providerLabel: 'OpenRouter Gateway',\n        modelName: 'google/gemini-3.6-flash',\n        maxTokens: 32768,\n        temperature: 0.3,\n        contextWindow: 1048576,\n        tierDescription: 'Nhiệm vụ cấp trung cao: Gemini 3.6 Flash'\n      },\n      {\n        provider: 'nvidia',\n        providerLabel: 'NVIDIA NIM API (Free Fallback)',\n        modelName: 'nvidia/nemotron-3.5-lightning-30b-a3b',\n        maxTokens: 32768,\n        temperature: 0.3,\n        contextWindow: 1000000,\n        tierDescription: 'Dự phòng miễn phí: Nemotron 3.5 Lightning'\n      }\n    ];\n  }\n\n  /**\n   * Resolves the primary model and active fallback chain considering enabled providers\n   */\n  public static resolve(\n    role: string,\n    artifactType?: string,\n    userPreferredModel?: string,\n    enabledProviders: Record<string, boolean> = DEFAULT_ENABLED_PROVIDERS\n  ): ModelPolicyResolution {\n    const multiResolution = this.resolveMultiProvider(role, artifactType, userPreferredModel, enabledProviders);\n    return multiResolution.primary;\n  }\n\n  /**\n   * Resolves full multi-provider resolution with primary, fallbacks, and council\n   */\n  public static resolveMultiProvider(\n    role: string,\n    artifactType?: string,\n    userPreferredModel?: string,\n    enabledProviders: Record<string, boolean> = DEFAULT_ENABLED_PROVIDERS\n  ): MultiProviderPolicyResolution {\n    const pool = this.getCandidatePool(role, artifactType);\n    const expertCouncil = this.getExpertCouncil().filter(c => enabledProviders[c.provider] !== false);\n\n    // If user explicitly specified a model in Settings override\n    if (userPreferredModel && userPreferredModel !== 'auto') {\n      let provider: ModelProviderKey = 'nvidia';\n      if (userPreferredModel.includes('deepseek')) provider = 'deepseek';\n      else if (userPreferredModel.includes('openrouter') || userPreferredModel.includes('google/')) provider = 'openrouter';\n      else if (userPreferredModel.includes('qwen')) provider = 'alibaba';\n      else if (userPreferredModel.includes('gemini')) provider = 'google';\n      else if (userPreferredModel.includes('glm')) provider = 'zhipu';\n      else if (userPreferredModel.includes(':')) provider = 'ollama';\n\n      const explicitCandidate: ModelPolicyResolution = {\n        provider,\n        modelName: userPreferredModel,\n        maxTokens: 32768,\n        temperature: 0.3,\n        contextWindow: 1000000,\n        providerLabel: provider.toUpperCase()\n      };\n\n      const remainingCandidates = pool.filter(c => c.modelName !== userPreferredModel && enabledProviders[c.provider] !== false);\n\n      return {\n        primary: explicitCandidate,\n        fallbacks: remainingCandidates,\n        candidateChain: [explicitCandidate, ...remainingCandidates],\n        expertCouncil\n      };\n    }\n\n    // Filter candidate list by enabled providers\n    const activeCandidates = pool.filter(c => enabledProviders[c.provider] !== false);\n\n    // If all configured providers are disabled, fallback to available pool to avoid system failure\n    const effectiveCandidates = activeCandidates.length > 0 ? activeCandidates : pool;\n\n    const primary = effectiveCandidates[0];\n    const fallbacks = effectiveCandidates.slice(1);\n\n    return {\n      primary,\n      fallbacks,\n      candidateChain: effectiveCandidates,\n      expertCouncil\n    };\n  }\n}\n","import { auditCurriculumQualityFlow } from './flows/auditCurriculumQualityFlow';\nimport type { ModelResolutionOptions } from './provider-factory';\n\nexport interface JudgeEvaluationResult {\n  decision: 'APPROVED' | 'NEEDS_REVISION' | 'REJECTED';\n  score: number; // 0 to 100\n  passed: boolean;\n  evaluatedBy: '@agent-as-judge' | '@heuristic-linter';\n  critique: string;\n  strengths: string[];\n  weaknesses: string[];\n  autoRepairInstructions?: string;\n}\n\nexport interface AsyncLLMJudgeInput {\n  targetArtifactType: string;\n  lessonId: string;\n  expectedLanguage: string;\n  targetObjectives: Array<{ code: string; description: string; bloomLevel: string }>;\n  generatedContentJson: string;\n  /** Verbatim standard statements (canonical ID -> text) from the Standards Registry. */\n  standardStatements?: Record<string, string>;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport class LLMJudgeEngine {\n  /**\n   * Executes genuine LLM-as-Judge evaluation using the audit flow.\n   */\n  public static async evaluateArtifactWithLLM(input: AsyncLLMJudgeInput): Promise<JudgeEvaluationResult> {\n    try {\n      const report = await auditCurriculumQualityFlow({\n        targetArtifactType: input.targetArtifactType,\n        lessonId: input.lessonId,\n        expectedLanguage: input.expectedLanguage,\n        targetObjectives: input.targetObjectives,\n        generatedContentJson: input.generatedContentJson,\n        standardStatements: input.standardStatements,\n        modelOptions: input.modelOptions,\n      });\n\n      const passed = report.overallVerdict === 'PASS' && report.languageAdherencePassed;\n      const failedCriteria = report.criteria.filter((c) => !c.passed);\n      const passedCriteria = report.criteria.filter((c) => c.passed);\n\n      return {\n        decision: report.overallVerdict === 'PASS' ? 'APPROVED' : report.overallVerdict === 'NEEDS_REVISION' ? 'NEEDS_REVISION' : 'REJECTED',\n        score: report.totalScore,\n        passed,\n        evaluatedBy: '@agent-as-judge',\n        critique: passed\n          ? `Học liệu ${input.targetArtifactType} cho bài \"${input.lessonId}\" đạt điểm thẩm định ${report.totalScore}/100. Đủ điều kiện phê duyệt.`\n          : `Học liệu ${input.targetArtifactType} chưa đạt yêu cầu: ${failedCriteria.map((c) => c.feedback).join('; ')}`,\n        strengths: passedCriteria.map((c) => `${c.name}: ${c.feedback}`),\n        weaknesses: failedCriteria.map((c) => `${c.name}: ${c.feedback}`),\n        autoRepairInstructions: report.actionableRepairPrompts.length > 0 ? report.actionableRepairPrompts.join('\\n') : undefined,\n      };\n    } catch (err: any) {\n      return {\n        decision: 'NEEDS_REVISION',\n        score: 50,\n        passed: false,\n        evaluatedBy: '@agent-as-judge',\n        critique: `Lỗi trong quá trình thẩm định LLM: ${err.message || String(err)}`,\n        strengths: [],\n        weaknesses: ['Không thể hoàn tất thẩm định tự động do sự cố kết nối mô hình.'],\n        autoRepairInstructions: 'Chạy lại quy trình thẩm định hoặc kiểm tra cấu hình API keys.',\n      };\n    }\n  }\n\n  /**\n   * Evaluates Gate 1 (SOT Foundation: LEARNER_PROFILE, PROJECT_BRIEF, REFERENCE_PACK)\n   * Calibrated heuristic pre-check.\n   */\n  public static evaluateGate1(\n    learnerProfileMarkdown: string,\n    referencePackMarkdown: string\n  ): JudgeEvaluationResult {\n    if (!learnerProfileMarkdown?.trim() || !referencePackMarkdown?.trim()) {\n      return {\n        decision: 'REJECTED',\n        score: 0,\n        passed: false,\n        evaluatedBy: '@heuristic-linter',\n        critique: 'Tệp SOT rỗng hoặc không tồn tại.',\n        strengths: [],\n        weaknesses: ['Thiếu nội dung tệp SOT cơ sở.'],\n        autoRepairInstructions: 'Khởi tạo và biên soạn đầy đủ LEARNER_PROFILE.md và REFERENCE_PACK.md.'\n      };\n    }\n\n    const hasAgeGroup = /(?:độ tuổi|lứa tuổi|age|grade|thcs|tiểu học|k-12|sinh viên|người đi làm)/i.test(learnerProfileMarkdown);\n    const hasPriorKnowledge = /(?:kiến thức nền|nền tảng|prior knowledge|tiên quyết|prerequisite)/i.test(learnerProfileMarkdown);\n    const hasGroundTruth = /(?:reference|csta|apple|ieee|cs2023|nguồn tham khảo|tài liệu chuẩn|rfc|w3c)/i.test(referencePackMarkdown);\n    const hasClientObjectives = /(?:client objectives|mục tiêu|output|chuẩn đầu ra)/i.test(learnerProfileMarkdown);\n\n    let score = 30; // Baseline for non-empty documents\n    const strengths: string[] = [];\n    const weaknesses: string[] = [];\n\n    if (hasAgeGroup) {\n      score += 20;\n      strengths.push('Hồ sơ người học xác định rõ đối tượng và lứa tuổi mục tiêu.');\n    } else {\n      weaknesses.push('Thiếu định nghĩa rõ ràng về đối tượng/độ tuổi học viên.');\n    }\n\n    if (hasPriorKnowledge) {\n      score += 20;\n      strengths.push('Có phân tích kiến thức nền tảng và rào cản nhận thức.');\n    } else {\n      weaknesses.push('Chưa làm rõ kiến thức tiên quyết (Prerequisites).');\n    }\n\n    if (hasGroundTruth) {\n      score += 20;\n      strengths.push('REFERENCE_PACK trích dẫn tài liệu kỹ thuật chuẩn mực.');\n    } else {\n      weaknesses.push('Tệp REFERENCE_PACK thiếu danh mục tài liệu tham chiếu chuẩn.');\n    }\n\n    if (hasClientObjectives) {\n      score += 10;\n      strengths.push('Có xác định rõ mục tiêu đầu ra và kỳ vọng khách hàng.');\n    }\n\n    const passed = score >= 80;\n    return {\n      decision: passed ? 'APPROVED' : (score >= 60 ? 'NEEDS_REVISION' : 'REJECTED'),\n      score,\n      passed,\n      evaluatedBy: '@heuristic-linter',\n      critique: passed \n        ? 'Bộ tài liệu nền tảng SOT đạt chuẩn cấu trúc. Cho phép chuyển sang Phase 2 (Thiết kế Khung chương trình).'\n        : 'Tài liệu SOT cần bổ sung thêm các trường thông tin chuẩn trước khi phân rã bài học.',\n      strengths,\n      weaknesses,\n      autoRepairInstructions: passed ? undefined : 'Bổ sung đầy đủ thông tin lứa tuổi, kiến thức tiên quyết và ít nhất 2 nguồn tài liệu kỹ thuật chuẩn vào REFERENCE_PACK.md.'\n    };\n  }\n\n  /**\n   * Evaluates Gate 2 (Curriculum Framework: Units, Modules, Lessons, Bloom Progression)\n   */\n  public static evaluateGate2(\n    frameworkMarkdown: string,\n    targetUnitCount: number = 4\n  ): JudgeEvaluationResult {\n    if (!frameworkMarkdown?.trim()) {\n      return {\n        decision: 'REJECTED',\n        score: 0,\n        passed: false,\n        evaluatedBy: '@heuristic-linter',\n        critique: 'Tệp CURRICULUM_FRAMEWORK.md rỗng.',\n        strengths: [],\n        weaknesses: ['Thiếu nội dung khung chương trình.'],\n      };\n    }\n\n    const unitMatches = frameworkMarkdown.match(/(?:##\\s+(?:Unit\\s+\\d+|U\\d{2})|\\|\\s*U\\d{2}\\s*:|\\|\\s*Unit\\s+\\d+)/gi) || [];\n    const hasBloom = /(?:bloom|nhận biết|thông hiểu|vận dụng|phân tích|đánh giá|sáng tạo|remember|understand|apply|analyze|evaluate|create)/i.test(frameworkMarkdown);\n    const has5E = /(?:5e|engage|explore|explain|elaborate|evaluate|pbl|edp|hybrid)/i.test(frameworkMarkdown);\n    const hasScopeSequence = /(?:scope & sequence|lộ trình|tiến trình|bài học)/i.test(frameworkMarkdown);\n\n    let score = 30;\n    const strengths: string[] = [];\n    const weaknesses: string[] = [];\n\n    if (unitMatches.length >= targetUnitCount) {\n      score += 25;\n      strengths.push(`Phân rã đủ ${unitMatches.length} Units theo đúng yêu cầu cấu trúc.`);\n    } else {\n      score += Math.min(20, unitMatches.length * 5);\n      weaknesses.push(`Số lượng Unit (${unitMatches.length}) chưa đạt mục tiêu ${targetUnitCount} Units.`);\n    }\n\n    if (hasBloom) {\n      score += 20;\n      strengths.push('Có phân bổ thang đo Bloom rõ ràng theo tiến trình nhận thức.');\n    } else {\n      weaknesses.push('Thiếu ánh xạ mức độ Bloom trong các bài học.');\n    }\n\n    if (has5E) {\n      score += 15;\n      strengths.push('Cấu trúc bài học định hướng chuẩn mô hình sư phạm (5E/PBL/EDP).');\n    }\n\n    if (hasScopeSequence) {\n      score += 10;\n      strengths.push('Có bảng Scope & Sequence chi tiết.');\n    }\n\n    const passed = score >= 80;\n    return {\n      decision: passed ? 'APPROVED' : (score >= 60 ? 'NEEDS_REVISION' : 'REJECTED'),\n      score,\n      passed,\n      evaluatedBy: '@heuristic-linter',\n      critique: passed\n        ? 'Khung chương trình đạt chuẩn kiến trúc phân rã. Cho phép tiến hành sản xuất học liệu.'\n        : 'Cần bổ sung chi tiết cấu trúc bài học, bảng phân rã và mức độ Bloom tương ứng.',\n      strengths,\n      weaknesses\n    };\n  }\n\n  /**\n   * Evaluates a produced Lesson Artifact (LESSON, ACT, QUIZ, SLIDE) with heuristic structure checks\n   */\n  public static evaluateArtifact(\n    artifactType: string,\n    content: string,\n    lessonTitle: string\n  ): JudgeEvaluationResult {\n    if (!content?.trim() || content.trim().length < 50) {\n      return {\n        decision: 'REJECTED',\n        score: 0,\n        passed: false,\n        evaluatedBy: '@heuristic-linter',\n        critique: `Nội dung ${artifactType} cho bài \"${lessonTitle}\" quá ngắn hoặc rỗng.`,\n        strengths: [],\n        weaknesses: ['Học liệu không có nội dung thực tế.'],\n      };\n    }\n\n    let score = 40;\n    const strengths: string[] = [];\n    const weaknesses: string[] = [];\n\n    switch (artifactType.toUpperCase()) {\n      case 'LESSON': {\n        const phases = [\n          { name: 'Engage', regex: /(?:Engage|Khởi động|Warm-up|Hook|Mở đầu)/i },\n          { name: 'Explore', regex: /(?:Explore|Khám phá|Demo|Thử nghiệm)/i },\n          { name: 'Explain', regex: /(?:Explain|Giải thích|Core Concepts|Lý thuyết)/i },\n          { name: 'Elaborate', regex: /(?:Elaborate|Vận dụng|Guided Practice|Independent Practice|Challenge|Thực hành)/i },\n          { name: 'Evaluate', regex: /(?:Evaluate|Đánh giá|Wrap-up|Exit Ticket|Tổng kết)/i },\n        ];\n        let phaseCount = 0;\n        for (const p of phases) {\n          if (p.regex.test(content)) phaseCount++;\n        }\n        score += phaseCount * 10;\n        if (phaseCount >= 4) {\n          strengths.push(`Giáo án bao phủ ${phaseCount}/5 pha của tiến trình 5E.`);\n        } else {\n          weaknesses.push(`Giáo án chỉ có ${phaseCount}/5 pha 5E.`);\n        }\n        if (content.length > 500) score += 10;\n        break;\n      }\n\n      case 'ACT': {\n        const hasSteps = /(?:bước|step\\s+\\d+|hướng dẫn)/i.test(content);\n        const hasCode = /```[\\s\\S]*?```/.test(content);\n        const hasObjectives = /(?:mục tiêu|objective|yêu cầu)/i.test(content);\n        if (hasSteps) { score += 20; strengths.push('Bài thực hành có quy trình từng bước rõ ràng.'); }\n        if (hasCode) { score += 20; strengths.push('Có mã nguồn mẫu/lệnh thực thi minh họa.'); }\n        if (hasObjectives) { score += 10; strengths.push('Có xác định mục tiêu thực hành.'); }\n        break;\n      }\n\n      case 'QUIZ': {\n        const hasQuestions = /(?:question\\s*\\d+|câu\\s*\\d+|\\?)/i.test(content);\n        const hasOptions = /(?:[A-D]\\.|\\\"options\\\")/i.test(content);\n        const hasExplanation = /(?:explanation|giải thích|vì sao|đáp án)/i.test(content);\n        if (hasQuestions) { score += 20; strengths.push('Có câu hỏi chẩn đoán.'); }\n        if (hasOptions) { score += 20; strengths.push('Đầy đủ các lựa chọn đáp án.'); }\n        if (hasExplanation) { score += 15; strengths.push('Có phần giải thích đáp án chi tiết.'); }\n        break;\n      }\n\n      case 'SLIDE': {\n        const hasMarp = /(?:marp:\\s*true|---\\s*\\n)/i.test(content);\n        const slideCount = (content.match(/---\\s*\\n/g) || []).length;\n        if (hasMarp) { score += 25; strengths.push('Định dạng tương thích Marp Presentation.'); }\n        if (slideCount >= 5) { score += 25; strengths.push(`Bộ slide có dung lượng hợp lý (${slideCount + 1} slides).`); }\n        else { weaknesses.push(`Số lượng slide (${slideCount + 1}) còn quá ít.`); }\n        break;\n      }\n\n      default: {\n        if (content.length > 200) score += 40;\n        break;\n      }\n    }\n\n    const passed = score >= 80;\n    return {\n      decision: passed ? 'APPROVED' : (score >= 60 ? 'NEEDS_REVISION' : 'REJECTED'),\n      score: Math.min(100, score),\n      passed,\n      evaluatedBy: '@heuristic-linter',\n      critique: passed \n        ? `Học liệu ${artifactType} cho bài \"${lessonTitle}\" đạt kiểm tra cấu trúc (${score}/100).`\n        : `Học liệu ${artifactType} cần hoàn thiện thêm cấu trúc để đạt chuẩn sư phạm (${score}/100).`,\n      strengths,\n      weaknesses\n    };\n  }\n}\n\n","import {\n  type ChatMessage,\n  type StreamRunnerOptions,\n  type ChunkType,\n  resolveApiKey,\n} from './streamRunner';\nimport { createAiInferenceError } from '../errors';\nimport type { ToolLoopConfig, AggregatedToolCall, ToolExecutionResult } from './toolLoopTypes';\n\nconst PROVIDER_ENDPOINTS: Record<string, string> = {\n  openrouter: 'https://openrouter.ai/api/v1/chat/completions',\n  deepseek: 'https://api.deepseek.com/chat/completions',\n  alibaba: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions',\n  nvidia: 'https://integrate.api.nvidia.com/v1/chat/completions',\n};\n\nconst NVIDIA_DEFAULT_MODEL = 'nvidia/nemotron-3-ultra-550b-a55b:free';\n\nfunction resolveProviderRoute(options: StreamRunnerOptions): { provider: string; endpoint: string; apiKey: string; model: string } {\n  const openrouterKey = options.openrouterKey?.trim() || (typeof process !== 'undefined' ? process.env.OPENROUTER_API_KEY || '' : '');\n  const deepseekKey = options.deepseekKey?.trim() || (typeof process !== 'undefined' ? process.env.DEEPSEEK_API_KEY || '' : '');\n  const alibabaKey = options.alibabaKey?.trim() || (typeof process !== 'undefined' ? process.env.ALIBABA_API_KEY || process.env.DASHSCOPE_API_KEY || '' : '');\n  const nvidiaKey = options.nvidiaKey?.trim() || (typeof process !== 'undefined' ? process.env.NVIDIA_API_KEY || '' : '');\n  const requested = options.model || '';\n\n  // Route cùng logic với streamRunner: model id quyết định provider ưu tiên\n  if (requested.startsWith('nvidia/') && nvidiaKey) {\n    return { provider: 'nvidia', endpoint: PROVIDER_ENDPOINTS.nvidia, apiKey: nvidiaKey, model: requested };\n  }\n  if (requested.startsWith('deepseek') && deepseekKey) {\n    return { provider: 'deepseek', endpoint: PROVIDER_ENDPOINTS.deepseek, apiKey: deepseekKey, model: requested };\n  }\n  if (requested.startsWith('qwen') && alibabaKey) {\n    return { provider: 'alibaba', endpoint: PROVIDER_ENDPOINTS.alibaba, apiKey: alibabaKey, model: requested };\n  }\n  if (openrouterKey) {\n    return { provider: 'openrouter', endpoint: PROVIDER_ENDPOINTS.openrouter, apiKey: openrouterKey, model: requested || '@preset/coding-free' };\n  }\n  if (deepseekKey) return { provider: 'deepseek', endpoint: PROVIDER_ENDPOINTS.deepseek, apiKey: deepseekKey, model: requested || 'deepseek-chat' };\n  if (alibabaKey) return { provider: 'alibaba', endpoint: PROVIDER_ENDPOINTS.alibaba, apiKey: alibabaKey, model: requested || 'qwen3.7-plus' };\n  // FALLBACK SAU CÙNG: NVIDIA NIM — nemotron ultra\n  if (nvidiaKey) return { provider: 'nvidia', endpoint: PROVIDER_ENDPOINTS.nvidia, apiKey: nvidiaKey, model: NVIDIA_DEFAULT_MODEL };\n  throw new Error('No compatible API key for tool-calling chat (need OPENROUTER_API_KEY, DEEPSEEK_API_KEY, ALIBABA_API_KEY or NVIDIA_API_KEY).');\n}\n\n/** Parse SSE stream một turn, trả về { content, toolCalls } — dùng chung parser của streamRunner qua inline impl */\nasync function runTurn(\n  endpoint: string,\n  model: string,\n  apiKey: string,\n  messages: Array<{ role: string; content: string | null; tool_calls?: any[]; tool_call_id?: string }>,\n  tools: ToolLoopConfig['tools'],\n  idleTimeoutMs: number,\n  onChunk?: (token: string, type: ChunkType) => void,\n  maxTokens = 32768,\n  temperature = 0.3,\n): Promise<{ content: string; toolCalls: AggregatedToolCall[] }> {\n  const controller = new AbortController();\n  let timer: ReturnType<typeof setTimeout> | null = null;\n  const arm = () => { if (timer) clearTimeout(timer); timer = setTimeout(() => controller.abort(new Error('Idle timeout')), idleTimeoutMs); (timer as any)?.unref?.(); };\n  arm();\n  const idle = { signal: controller.signal, kick: arm, dispose: () => { if (timer) clearTimeout(timer); timer = null; } };\n  const toolCollector = new Map<string, { id: string; name: string; argsBuffer: string }>();\n\n  const res = await fetch(endpoint, {\n    method: 'POST',\n    headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },\n    body: JSON.stringify({\n      model,\n      messages,\n      max_tokens: maxTokens,\n      temperature,\n      stream: true,\n      stream_options: { include_usage: true },\n      ...(tools.length > 0 ? { tools } : {}),\n    }),\n    signal: idle.signal,\n  });\n  if (!res.ok) {\n    idle.dispose();\n    const body = await res.text().catch(() => '');\n    throw new Error(`LLM ${res.status}: ${body.slice(0, 300)}`);\n  }\n\n  if (!res.body) { idle.dispose(); return { content: '', toolCalls: [] }; }\n  const reader = res.body.getReader();\n  const decoder = new TextDecoder('utf-8');\n  let fullRaw = '';\n  let buffer = '';\n  let insideThink = false;\n\n  while (true) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    idle.kick();\n    buffer += decoder.decode(value, { stream: true });\n    const lines = buffer.split('\\n');\n    buffer = lines.pop() || '';\n    for (const line of lines) {\n      const trimmed = line.trim();\n      if (!trimmed || trimmed.startsWith(':') || trimmed === 'data: [DONE]') continue;\n      if (!trimmed.startsWith('data: ')) continue;\n      try {\n        const json = JSON.parse(trimmed.substring(6));\n        if (json.usage) {\n          const pt = json.usage.prompt_tokens || 0;\n          const ct = json.usage.completion_tokens || 0;\n          onChunk?.(JSON.stringify({ promptTokens: pt, completionTokens: ct, totalTokens: json.usage.total_tokens || pt + ct, reasoningTokens: 0 }), 'usage');\n        }\n        const delta = json.choices?.[0]?.delta;\n        if (!delta) continue;\n        const reasoning = delta.reasoning_content || delta.thought || delta.reasoning || '';\n        if (reasoning) onChunk?.(reasoning, 'thought');\n        if (delta.tool_calls) {\n          onChunk?.(JSON.stringify(delta.tool_calls), 'tool_call');\n          for (const tcall of delta.tool_calls) {\n            const idx = String(tcall.index ?? tcall.id ?? '0');\n            const acc = toolCollector.get(idx) || { id: tcall.id || `call_${idx}`, name: '', argsBuffer: '' };\n            if (tcall.id) acc.id = tcall.id;\n            if (tcall.function?.name) acc.name += tcall.function.name;\n            if (tcall.function?.arguments) acc.argsBuffer += tcall.function.arguments;\n            toolCollector.set(idx, acc);\n          }\n        }\n        let content = delta.content || '';\n        if (content) {\n          fullRaw += content;\n          if (content.includes('<think>')) { insideThink = true; const p = content.split('<think>'); if (p[0]) onChunk?.(p[0], 'content'); content = p[1] || ''; }\n          if (content.includes('</think>')) { insideThink = false; const p = content.split('</think>'); if (p[0]) onChunk?.(p[0], 'thought'); content = p[1] || ''; }\n          if (insideThink) { if (content) onChunk?.(content, 'thought'); }\n          else if (content) onChunk?.(content, 'content');\n        }\n      } catch { /* incomplete chunk */ }\n    }\n  }\n  idle.dispose();\n\n  const toolCalls: AggregatedToolCall[] = Array.from(toolCollector.values())\n    .filter((c) => c.name)\n    .map((c) => ({ id: c.id, name: c.name, arguments: c.argsBuffer || '{}' }));\n  return { content: fullRaw, toolCalls };\n}\n\n/**\n * Stream chat CÓ tool-calling (vòng lặp: model → tool → kết quả → model → …).\n * Route qua customToolInference (host AI SDK gateway) khi được truyền — unified\n * tracing mandate. Không có customToolInference:\n *  - CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE=1 → fail-loud ERR_CUSTOM_INFERENCE_REQUIRED\n *    (raw-fetch routes nằm ngoài biên telemetry của host).\n *  - Ngược lại → raw-fetch legacy (OpenRouter/DeepSeek/Alibaba/NVIDIA).\n * Tool error KHÔNG làm chết stream: lỗi được đóng gói gửi lại model để tự xử lý\n * (và được báo qua onToolError cho observability).\n */\nexport async function streamCurriculumAIInferenceWithTools(\n  messages: ChatMessage[],\n  projectContext: string,\n  options: StreamRunnerOptions,\n  loop: ToolLoopConfig,\n  onChunk?: (token: string, type: ChunkType) => void\n): Promise<string> {\n  // ── Unified-tracing mandate (gap #8): customToolInference gateway first ──\n  if (options.customToolInference) {\n    return runToolLoopWithCustomInference(messages, projectContext, options, loop, onChunk);\n  }\n  if (resolveApiKey('CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE') === '1') {\n    throw createAiInferenceError({\n      errorCode: 'ERR_CUSTOM_INFERENCE_REQUIRED',\n      message:\n        'customToolInference is REQUIRED (CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE=1): pass buildKitToolInference(...) ' +\n        'so tool-calling turns flow through the host AI SDK gateway and its unified Langfuse tracing. ' +\n        'Raw-fetch tool-loop provider routes are disabled by mandate.',\n      rawError: { mandate: 'CURRICULUM_KIT_REQUIRE_CUSTOM_INFERENCE', hasCustomToolInference: false },\n    });\n  }\n  const route = resolveProviderRoute(options);\n  const maxTokens = options.maxTokens ?? 32768;\n  const maxRounds = loop.maxRounds ?? 4;\n\n  const systemInstruction = `${options.systemPersona || 'You are Curriculum OS Assistant.'}\\n\\nProject Context:\\n${projectContext}\\n\\nGuidelines:\\n1. Answer precisely using the provided tools when they help (project status, deep research, production declaration, gate approval).\\n2. Keep Markdown formatting. Never invent tool results.`;\n\n  const convo: Array<{ role: string; content: string | null; tool_calls?: any[]; tool_call_id?: string }> = [\n    { role: 'system', content: systemInstruction },\n    ...messages.map((m) => ({ role: m.role === 'assistant' || m.role === 'model' ? 'assistant' : 'user', content: m.content })),\n  ];\n\n  let finalContent = '';\n  for (let round = 0; round < maxRounds; round++) {\n    let turn: { content: string; toolCalls: AggregatedToolCall[] };\n    try {\n      turn = await runTurn(route.endpoint, route.model, route.apiKey, convo, loop.tools, 180000, onChunk, maxTokens, options.temperature ?? 0.3);\n    } catch (err: any) {\n      // Model/provider không hỗ trợ tool-calling (404/400 'tools') → hạ cấp: trả lời không-tools, KHÔNG chết chat\n      const msg = String(err?.message || err);\n      if (/tool/i.test(msg) && /40[04]|400|not support|invalid/i.test(msg)) {\n        console.warn('[toolLoop] provider rejected tools — degrading to plain chat:', msg.slice(0, 120));\n        const plain = await runTurn(route.endpoint, route.model, route.apiKey, convo, [], 180000, onChunk, maxTokens, options.temperature ?? 0.3);\n        finalContent = plain.content;\n        break;\n      }\n      throw err;\n    }\n    const { content, toolCalls } = turn;\n    if (toolCalls.length === 0) { finalContent = content; break; }\n    // Always keep the latest text content so that if this is the final round\n    // and the model still emitted tool calls, we don't lose the accompanying text.\n    if (content) finalContent = content;\n\n    // Model muốn gọi tool — thực thi tuần tự, gộp vào hội thoại\n    convo.push({ role: 'assistant', content: content || null, tool_calls: toolCalls.map((t) => ({ id: t.id, type: 'function', function: { name: t.name, arguments: t.arguments } })) });\n    for (const call of toolCalls) {\n      let parsedArgs: Record<string, unknown> = {};\n      try { parsedArgs = JSON.parse(call.arguments || '{}'); } catch { /* model trả args sai JSON */ }\n      loop.onToolStart?.(call.name, parsedArgs);\n      let resultPayload: unknown;\n      let isError = false;\n      try {\n        resultPayload = await loop.executor(call.name, parsedArgs);\n      } catch (err: any) {\n        isError = true;\n        resultPayload = { error: err?.message || String(err) };\n        loop.onToolError?.(call.name, err?.message || String(err));\n      }\n      const exec: ToolExecutionResult = { toolCallId: call.id, name: call.name, result: resultPayload, isError };\n      loop.onToolResult?.(exec);\n      convo.push({ role: 'tool', tool_call_id: call.id, content: JSON.stringify(resultPayload).slice(0, 12000) });\n    }\n    if (round === maxRounds - 1) {\n      // Hết vòng: chạy turn cuối KHÔNG tools để model buộc trả lời văn bản\n      const last = await runTurn(route.endpoint, route.model, route.apiKey, convo, [], 180000, onChunk, maxTokens, options.temperature ?? 0.3);\n      finalContent = last.content;\n    }\n  }\n  return finalContent;\n}\n\n/**\n * Tool loop variant that routes EVERY turn through the host's\n * `customToolInference` gateway (AI SDK → OTel → unified Langfuse trace).\n * Mirrors the raw-fetch loop 1:1: same tool execution ordering, same\n * tool-result envelope, same final no-tools turn, same degrade path when the\n * provider rejects tool definitions (404/400/not supported).\n */\nasync function runToolLoopWithCustomInference(\n  messages: ChatMessage[],\n  projectContext: string,\n  options: StreamRunnerOptions,\n  loop: ToolLoopConfig,\n  onChunk?: (token: string, type: ChunkType) => void\n): Promise<string> {\n  const infer = options.customToolInference!;\n  const maxTokens = options.maxTokens ?? 32768;\n  const maxRounds = loop.maxRounds ?? 4;\n\n  const systemInstruction = `${options.systemPersona || 'You are Curriculum OS Assistant.'}\\n\\nProject Context:\\n${projectContext}\\n\\nGuidelines:\\n1. Answer precisely using the provided tools when they help (project status, deep research, production declaration, gate approval).\\n2. Keep Markdown formatting. Never invent tool results.`;\n\n  const convo: Array<{\n    role: string;\n    content: string | null;\n    tool_calls?: Array<{ id: string; type: 'function'; function: { name: string; arguments: string } }>;\n    tool_call_id?: string;\n  }> = [\n    { role: 'system', content: systemInstruction },\n    ...messages.map((m) => ({ role: m.role === 'assistant' || m.role === 'model' ? 'assistant' : 'user', content: m.content })),\n  ];\n\n  let finalContent = '';\n  for (let round = 0; round < maxRounds; round++) {\n    let turn: { content: string; toolCalls: AggregatedToolCall[] };\n    try {\n      turn = await infer({ messages: convo, tools: loop.tools, temperature: options.temperature ?? 0.3, maxTokens, onChunk: onChunk ?? (() => {}) });\n    } catch (err: any) {\n      // Provider không hỗ trợ tool-calling → hạ cấp: trả lời không-tools, KHÔNG chết chat\n      const msg = String(err?.message || err);\n      if (/tool/i.test(msg) && /40[04]|400|not support|invalid/i.test(msg)) {\n        console.warn('[toolLoop] custom gateway rejected tools — degrading to plain chat:', msg.slice(0, 120));\n        const plain = await infer({ messages: convo, tools: [], temperature: options.temperature ?? 0.3, maxTokens, onChunk: onChunk ?? (() => {}) });\n        finalContent = plain.content;\n        break;\n      }\n      throw err;\n    }\n    const { content, toolCalls } = turn;\n    if (toolCalls.length === 0) { finalContent = content; break; }\n    if (content) finalContent = content;\n\n    // Model muốn gọi tool — thực thi tuần tự, gộp vào hội thoại (giống raw loop)\n    convo.push({ role: 'assistant', content: content || null, tool_calls: toolCalls.map((t) => ({ id: t.id, type: 'function', function: { name: t.name, arguments: t.arguments } })) });\n    for (const call of toolCalls) {\n      let parsedArgs: Record<string, unknown> = {};\n      try { parsedArgs = JSON.parse(call.arguments || '{}'); } catch { /* model trả args sai JSON */ }\n      loop.onToolStart?.(call.name, parsedArgs);\n      let resultPayload: unknown;\n      let isError = false;\n      try {\n        resultPayload = await loop.executor(call.name, parsedArgs);\n      } catch (err: any) {\n        isError = true;\n        resultPayload = { error: err?.message || String(err) };\n        loop.onToolError?.(call.name, err?.message || String(err));\n      }\n      const exec: ToolExecutionResult = { toolCallId: call.id, name: call.name, result: resultPayload, isError };\n      loop.onToolResult?.(exec);\n      convo.push({ role: 'tool', tool_call_id: call.id, content: JSON.stringify(resultPayload).slice(0, 12000) });\n    }\n    if (round === maxRounds - 1) {\n      // Hết vòng: turn cuối KHÔNG tools để model buộc trả lời văn bản\n      const last = await infer({ messages: convo, tools: [], temperature: options.temperature ?? 0.3, maxTokens, onChunk: onChunk ?? (() => {}) });\n      finalContent = last.content;\n    }\n  }\n  return finalContent;\n}","import type {\n  LessonPlan,\n  ActivityLab,\n  CodeLab,\n  Worksheet,\n  Handout,\n  SlideDeck,\n  TeacherGuide,\n  Extension,\n  ProjectInstruction,\n} from '../schemas';\n\n/**\n * Serializes a LessonPlan object into canonical LESSON.md (5E Model & Deep Technical Standards)\n */\nexport function serializeLessonToMarkdown(lesson: LessonPlan): string {\n  const learningObjectivesStr = lesson.learningObjectives\n    .map((lo) => `  - **[${lo.bloomLevel}] \\`${lo.code}\\`**: ${lo.name ? `${lo.name} — ` : ''}${lo.description}${lo.successCriteria ? ` (Indicator: ${lo.successCriteria})` : ''}`)\n    .join('\\n');\n\n  const coreConceptsStr = (lesson.coreConcepts && lesson.coreConcepts.length > 0)\n    ? lesson.coreConcepts\n        .map((cc, i) => {\n          let str = `### Concept ${i + 1}: ${cc.name}\\n${cc.technicalDepth}`;\n          if (cc.analogy) {\n            str += `\\n\\n- **Real-World Analogy (Ẩn dụ thực tế):** ${cc.analogy}`;\n          }\n          if (cc.formulaOrRule) {\n            str += `\\n\\n- **Mathematical / Statistical Principle:**\\n  ${cc.formulaOrRule}`;\n          }\n          if (cc.comparisonTable && cc.comparisonTable.headers.length > 0) {\n            const headerRow = `| ${cc.comparisonTable.headers.join(' | ')} |`;\n            const dividerRow = `| ${cc.comparisonTable.headers.map(() => ':---').join(' | ')} |`;\n            const dataRows = cc.comparisonTable.rows.map((r) => `| ${r.join(' | ')} |`).join('\\n');\n            str += `\\n\\n**Comparison & Trade-off Analysis**\\n${headerRow}\\n${dividerRow}\\n${dataRows}`;\n          }\n          return str;\n        })\n        .join('\\n\\n---\\n\\n')\n    : (lesson.sections || [])\n        .map((sec, i) => `### Concept ${i + 1}: ${sec.title}\\n* **Teacher Explains:** ${sec.teacherActions}\\n* **Student Observes:** ${sec.studentActions}${sec.analogies.length > 0 ? `\\n* **Analogy:** ${sec.analogies.join('; ')}` : ''}`)\n        .join('\\n\\n---\\n\\n');\n\n  const guidedPractice = lesson.guidedPractice || {\n    title: 'Guided Practice',\n    explanation: 'Interactive implementation step.',\n    codeSnippet: '# Verified reference code',\n    codeLanguage: 'python',\n    mermaidDiagram: '',\n  };\n\n  const mermaidBlock = guidedPractice.mermaidDiagram\n    ? `\\`\\`\\`mermaid\\n${guidedPractice.mermaidDiagram.trim()}\\n\\`\\`\\``\n    : '';\n\n  const troubleshootingRows = (lesson.teacherNotes?.troubleshootingMatrix && lesson.teacherNotes.troubleshootingMatrix.length > 0)\n    ? lesson.teacherNotes.troubleshootingMatrix.map((r) => `| ${r.issue} | ${r.potentialCause} | ${r.solution} |`).join('\\n')\n    : '| Runtime Timeout / Disconnect | Hardware power fluctuation or wrong IP | Check network broadcast and verify 5V power stability |';\n\n  const commonPitfallsStr = (lesson.teacherNotes?.commonPitfalls && lesson.teacherNotes.commonPitfalls.length > 0)\n    ? lesson.teacherNotes.commonPitfalls.map((p) => `- ${p}`).join('\\n')\n    : '- Forgetting exception handling when payload format changes.';\n\n  const effectiveCodeLang = guidedPractice.codeLanguage || (lesson.topic?.toLowerCase().includes('swift') ? 'swift' : 'typescript');\n\n  return `<!-- [SME_MANDATE] -->\n<!-- \n  Lesson ID: ${lesson.lessonId}\n  Title: ${lesson.title}\n  Topic: ${lesson.topic}\n  Language: ${lesson.language}\n-->\n\n# ${lesson.lessonId}: ${lesson.title}\n\n---\n\n## 0. Overview\n- **Duration:** 90 minutes\n- **Target Audience:** ${lesson.targetGradeOrAudience || 'Learners'}\n- **Learning Objectives (Bloom's Taxonomy):**\n${learningObjectivesStr}\n- **Prerequisites & Continuity:** ${lesson.prerequisites || 'Basic understanding of foundational programming and protocols.'}\n- **Materials & Tools Required:** ${lesson.materialsSummary || 'Developer workstation with terminal and code editor.'}\n- **Core Vocabulary & Keywords:** ${lesson.keywords?.join(', ') || 'N/A'}\n\n---\n\n## 1. ENGAGE (Hook & High-Stakes Scenario)\n> **Duration:** 10-15 mins\n\n### Real-World Context: \"${lesson.hookTitle || 'The Incident'}\"\n${lesson.hookScenario}\n\n${lesson.hookQuestions && lesson.hookQuestions.length > 0 ? lesson.hookQuestions.map((q, idx) => `- **Inquiry Question ${idx + 1}:** ${q}`).join('\\n') : '- **Inquiry Question 1:** How can our system distinguish between legitimate telemetry and corrupted signals?'}\n\n---\n\n## 2. EXPLORE & EXPLAIN (Core Technical Concepts & Principles)\n> **Duration:** 30-40 mins\n\n${coreConceptsStr}\n\n---\n\n## 3. GUIDED PRACTICE (Visual Architecture & Annotated Code)\n> **Duration:** 20-25 mins\n\n### System Architecture & Data Flow (Mermaid Diagram)\n${mermaidBlock}\n\n### Verified Reference Code with Line-by-Line Annotations\n<!-- [SME_MANDATE] -->\n\\`\\`\\`${effectiveCodeLang}\n${guidedPractice.codeSnippet}\n\\`\\`\\`\n<!-- [/SME_MANDATE] -->\n\n---\n\n## 4. ELABORATE & INDEPENDENT PRACTICE (Technical Challenge & Scaffolding)\n> **Duration:** 15-20 mins\n\n### Engineering Challenge: \"${lesson.independentPractice?.title || 'System Optimization Challenge'}\"\n${lesson.independentPractice?.description || 'Implement the core logic and test against simulated edge cases.'}\n\n- 🥉 **Bronze (Foundational):** ${lesson.differentiation.bronzeTier || 'Implement the core happy path and run verified test.'}\n- 🥈 **Silver (Application):** ${lesson.differentiation.silverTier || 'Add conditional validation and error handling for malformed inputs.'}\n- 🥇 **Gold (Enrichment / Creative):** ${lesson.differentiation.goldTier || 'Extend with automated retries, metrics logging, or external notification hooks.'}\n\n---\n\n## 5. EVALUATE (Summary, Assessment & Metacognition)\n> **Duration:** 5-10 mins\n\n### Exit Ticket (Bloom: Apply / Analyze)\n> **Scenario Question:** ${lesson.exitTicket.questionStem}  \n> **Expected Response / Rubric:** ${lesson.exitTicket.expectedAnswerOrRubric}  \n> **Metacognitive Reflection Prompt:** ${lesson.exitTicket.metacognitivePrompt}\n\n---\n\n## 6. Teacher Notes & Troubleshooting Matrix\n- **Common Pitfalls (What Learners Commonly Misunderstand):**\n${commonPitfallsStr}\n\n- **Troubleshooting & Debugging Matrix:**\n| Issue | Potential Cause | Solution |\n| :--- | :--- | :--- |\n${troubleshootingRows}\n\n- **Extension Challenges for Advanced Learners:** ${lesson.teacherNotes?.extensionNotes || 'Explore asynchronous concurrency and resilience patterns.'}\n`.trim();\n}\n\n/**\n * Serializes an ActivityLab object into canonical ACT.md (Inquiry-Based & Computational Thinking)\n */\nexport function serializeActivityToMarkdown(act: ActivityLab): string {\n  const hardwareItems = act.materialsBOM.hardware.length > 0\n    ? act.materialsBOM.hardware.map((h) => `- ${h}`).join('\\n')\n    : '- 1 x Standard developer workstation / simulation board';\n\n  const ct = act.computationalThinking || {\n    problemStatement: act.objective,\n    decomposition: [\n      '1. Parse incoming parameters and validate input state.',\n      '2. Execute core transformation / hardware communication.',\n      '3. Verify response telemetry and handle exceptions.',\n    ],\n    algorithmDesign: 'Structured data flow ensuring state consistency before and after execution.',\n  };\n\n  const workflow = act.activeLearningWorkflow;\n  const phase1 = workflow?.phase1Planning || {\n    durationMinutes: 15,\n    studentTask: 'Hand-draw the data flow diagram or state machine on paper before writing code.',\n    teacherAction: 'Inspect student flowcharts and ask: \"What happens if network latency spikes?\"',\n    inquiryQuestions: ['Where is the primary point of failure?', 'How will the system notify the user upon error?'],\n  };\n\n  const phase2 = workflow?.phase2Implementation || {\n    durationMinutes: 40,\n    studentTask: 'Implement the logic step by step using the reference specifications.',\n    teacherAction: 'Observe student progress and intervene only when a team is stuck for > 5 mins.',\n    codeOrCommands: act.steps.map((s) => `# Step ${s.stepNumber}: ${s.title}\\n${s.studentInstructions}`),\n  };\n\n  const phase3 = workflow?.phase3Debugging || {\n    durationMinutes: 15,\n    testingSteps: 'Run test suite or live verification commands to confirm expected output.',\n    errorAnalysis: 'Compare error logs against the troubleshooting table to isolate hardware vs software faults.',\n  };\n\n  const diff3Tier = act.differentiation3Tier || {\n    bronzeTier: act.scaffoldingSupport || 'Complete basic verified setup and run happy path test.',\n    silverTier: 'Implement validation checks and handle error recovery gracefully.',\n    goldTier: act.levelUpExtension || 'Extend with automated regression tests or asynchronous event streaming.',\n  };\n\n  return `---\nid: \"${act.lessonId}\"\ntitle: \"${act.title}\"\ntype: \"ACT\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T2\"\nversion: \"1.0.0\"\ndate: \"${new Date().toISOString().split('T')[0]}\"\n---\n<!-- INJECT_BODY -->\n\n# INQUIRY-BASED ACTIVITY: ${act.title}\n_Lesson: ${act.lessonId} | Estimated Duration: ${act.totalDurationMinutes} mins_\n\n## [REQUIRED] Computational Thinking Focus\n- **Problem Statement (Real-world Scenario):** ${ct.problemStatement}\n- **Decomposition (Sub-problems Breakdown):**\n${ct.decomposition.map((d) => `  ${d}`).join('\\n')}\n- **Algorithm Design (Data Flow & Logic Architecture):** ${ct.algorithmDesign}\n\n## [REQUIRED] Materials & Setup\n- **Reference Material:** Students should use the **HANDOUT** and Technical Reference as their primary technical lifeline.\n- **Hardware/Software:**\n<!-- [HARDWARE_BOM] -->\n${hardwareItems}\n<!-- [/HARDWARE_BOM] -->\n- **Software:** ${act.materialsBOM.software.join(', ') || 'IDE and Terminal'}\n- **Consumables:** ${act.materialsBOM.consumables.join(', ') || 'None'}\n- **Other Resources:** ${act.materialsBOM.otherResources.join(', ') || 'Handout cheat sheet'}\n\n## [REQUIRED] Constraints & Safety\n- ⚠️ **Technical/Safety:** ${act.safetyWarnings.join('; ') || 'Do not expose unencrypted secrets or exceed hardware electrical ratings.'}\n- 💡 **Design Constraint:** ${act.designConstraints?.join('; ') || 'All operations must be idempotent and non-blocking.'}\n\n## [REQUIRED] Active Learning Workflow\n\n### Phase 1: Planning & Design\n> **Duration:** ${phase1.durationMinutes} mins\n\n- **Student Task:** ${phase1.studentTask}\n- **Teacher Action:** ${phase1.teacherAction}\n${phase1.inquiryQuestions.map((q) => `  - *Inquiry Question:* ${q}`).join('\\n')}\n\n### Phase 2: Implementation & Discovery\n> **Duration:** ${phase2.durationMinutes} mins\n\n- **Student Task:** ${phase2.studentTask}\n- **Teacher Action:** ${phase2.teacherAction}\n\n${phase2.codeOrCommands.map((c) => `\\`\\`\\`text\\n${c}\\n\\`\\`\\``).join('\\n\\n')}\n\n### Phase 3: Debugging & Testing\n> **Duration:** ${phase3.durationMinutes} mins\n\n- **Testing:** ${phase3.testingSteps}\n- **Error Analysis:** ${phase3.errorAnalysis}\n\n## [REQUIRED] 3-Tier Differentiation\n- 🥉 **Bronze (Foundational):** ${diff3Tier.bronzeTier}\n- 🥈 **Silver (Application):** ${diff3Tier.silverTier}\n- 🥇 **Gold (Enrichment/Creative):** ${diff3Tier.goldTier}\n\n## [REQUIRED] Reflection & Discussion\n- **Discussion Question:** ${act.reflectionQuestion || 'Why is this architectural design superior to a monolithic direct call? Where is the performance bottleneck?'}\n`.trim();\n}\n\n/**\n * Serializes CodeLab object into canonical LAB.md (LAB_TEMPLATE standard)\n */\nexport function serializeCodeLabToMarkdown(codeLab: CodeLab): string {\n  const env = codeLab.environmentSetup || {\n    languageFramework: codeLab.techStack.join(', '),\n    ideEditor: 'VS Code / Xcode / IDE of choice',\n    requiredLibraries: codeLab.techStack,\n    hardwareOrEnvConnection: 'Localhost / Embedded connection',\n  };\n\n  const tasks = codeLab.threeTierTasks || {\n    bronze: { mins: 15, objective: 'Basic Setup & Syntax', task: 'Implement starter code skeleton', requirement: 'Clean compilation without errors' },\n    silver: { mins: 25, objective: 'Core Logic Implementation', task: 'Implement full data processing logic', requirement: 'All standard test cases pass' },\n    gold: { mins: 20, objective: 'Edge Cases & Optimization', task: 'Handle network failures and performance tuning', requirement: 'Resilience under edge-case injection' },\n  };\n\n  const troubleshootingRows = (codeLab.troubleshootingMatrix && codeLab.troubleshootingMatrix.length > 0)\n    ? codeLab.troubleshootingMatrix.map((r) => `| ${r.issue} | ${r.potentialCause} | ${r.solution} |`).join('\\n')\n    : (codeLab.commonBugsAndFixes && codeLab.commonBugsAndFixes.length > 0)\n        ? codeLab.commonBugsAndFixes.map((b) => `| ${b.bugDescription} | Logical error or misconfiguration | ${b.solutionHint} |`).join('\\n')\n        : '| Connection Timeout | Network interface down or bad endpoint | Check IP address and retry with timeout wrapper |';\n\n  const checklistStr = (codeLab.submissionChecklist && codeLab.submissionChecklist.length > 0)\n    ? codeLab.submissionChecklist.map((c) => `- [ ] ${c}`).join('\\n')\n    : `- [ ] Starter code compiles and runs without crashes.\\n- [ ] Solution code passes all automated test cases.\\n- [ ] Code comments explain the reasoning behind key algorithms.`;\n\n  return `---\nid: \"${codeLab.lessonId}\"\ntitle: \"${codeLab.title}\"\ntype: \"LAB\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T2\"\nversion: \"1.0.0\"\ndate: \"${new Date().toISOString().split('T')[0]}\"\n---\n<!-- INJECT_BODY -->\n\n# 👨‍💻 CODE LAB: ${codeLab.title}\n_Lesson: ${codeLab.lessonId} | Tech Stack: ${codeLab.techStack.join(', ')}_\n\n## 🎯 Overview\nThis lab focuses on the practical implementation of core technical concepts, bridging theory into working, robust, and testable code.\n\n## 🛠️ Environment & Setup\n- **Language / Framework:** ${env.languageFramework}\n- **IDE / Editor:** ${env.ideEditor}\n- **Required Libraries:** ${env.requiredLibraries.join(', ')}\n- **Hardware / Connection Setup:** ${env.hardwareOrEnvConnection || 'Local dev environment'}\n\n## 📝 Lab Tasks (3-Tier Differentiation)\n\n### 🥉 Bronze (Foundational)\n> **Duration:** ${tasks.bronze.mins} mins\n\n**Objective:** ${tasks.bronze.objective}\n- **Task:** ${tasks.bronze.task}\n- **Requirement:** ${tasks.bronze.requirement}\n\n### 🥈 Silver (Application)\n> **Duration:** ${tasks.silver.mins} mins\n\n**Objective:** ${tasks.silver.objective}\n- **Task:** ${tasks.silver.task}\n- **Requirement:** ${tasks.silver.requirement}\n\n### 🥇 Gold (Enrichment/Creative)\n> **Duration:** ${tasks.gold.mins} mins\n\n**Objective:** ${tasks.gold.objective}\n- **Task:** ${tasks.gold.task}\n- **Requirement:** ${tasks.gold.requirement}\n\n## 💻 Technical Reference\n<!-- [SME_MANDATE] -->\n> Any code provided in this section is verified for syntax accuracy and runtime execution.\n\n### Starter Code Template (\\`${codeLab.starterCode.filename}\\`)\n\\`\\`\\`${codeLab.starterCode.language}\n${codeLab.starterCode.content}\n\\`\\`\\`\n\n### Solution Code (\\`${codeLab.solutionCode.filename}\\`)\n\\`\\`\\`${codeLab.solutionCode.language}\n${codeLab.solutionCode.content}\n\\`\\`\\`\n<!-- [/SME_MANDATE] -->\n\n## 🔍 Troubleshooting & Debugging Matrix\n| Issue | Potential Cause | Solution |\n| :--- | :--- | :--- |\n${troubleshootingRows}\n\n## 🏁 Submission & Verification Checklist\n${checklistStr}\n`.trim();\n}\n\n/**\n * Serializes Handout to HANDOUT.md (5-Second Rule Cheat Sheet standard)\n */\nexport function serializeHandoutToMarkdown(handout: Handout): string {\n  const conceptsStr = (handout.coreConceptsSummary && handout.coreConceptsSummary.length > 0)\n    ? handout.coreConceptsSummary.map((c) => `- **${c.concept}:** ${c.definition}`).join('\\n')\n    : (handout.sections || []).map((s) => `### ${s.heading}\\n${s.summaryPoints.map((p) => `- ${p}`).join('\\n')}`).join('\\n\\n');\n\n  const syntaxTableRows = (handout.syntaxTable && handout.syntaxTable.length > 0)\n    ? handout.syntaxTable.map((r) => `| \\`${r.syntax}\\` | ${r.meaning} | \\`${r.example}\\` |`).join('\\n')\n    : '| `execute()` | Main trigger function | `const res = await service.execute()` |';\n\n  const procedure = handout.problemSolvingProcedure || {\n    step1Trigger: 'Identify input parameters, sensor triggers, or user events.',\n    step2Logic: 'Transform data, apply business logic, and handle potential errors.',\n    step3Output: 'Update system state, persist results, or transmit telemetry.',\n  };\n\n  const proTipsStr = (handout.proTips && handout.proTips.length > 0)\n    ? handout.proTips.map((t) => `> 💡 **Pro-Tip:** ${t}`).join('\\n')\n    : '> 💡 **Pro-Tip:** Always validate inputs at the system boundary before executing heavy processing.';\n\n  return `---\nid: \"${handout.lessonId}\"\ntitle: \"${handout.title}\"\ntype: \"HANDOUT\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T6\"\nversion: \"1.0.0\"\ndate: \"${new Date().toISOString().split('T')[0]}\"\n---\n\n# STUDENT HANDOUT: ${handout.title}\n**Quick-Reference Cheat Sheet & Concept Summary**\n\n> **For Students:** This document summarizes the core concepts and the most important syntax following the **5-Second Rule** (instant look-up). Use it as a quick reference during your lab tasks or projects.\n\n## 📖 1. Core Concepts\n${conceptsStr}\n\n## ⚡ 2. Common Syntax & Configurations\n| Syntax / Config | Meaning & Function | Example / Snippet |\n| :--- | :--- | :--- |\n${syntaxTableRows}\n\n## 🚀 3. General Problem-Solving Procedure\n*Three general thinking steps when tackling problems in this domain:*\n1. **Step 1 (Input/Trigger):** ${procedure.step1Trigger}\n2. **Step 2 (Logic/Transform):** ${procedure.step2Logic}\n3. **Step 3 (Output/Verify):** ${procedure.step3Output}\n\n---\n\n### 💡 Pro-tips\n${proTipsStr}\n`.trim();\n}\n\n/**\n * Serializes ProjectInstruction to Instructable-style INSTRUCTION.md\n */\nexport function serializeProjectInstructionToMarkdown(instruction: ProjectInstruction): string {\n  return `---\nid: \"${instruction.instructionId}\"\ntitle: \"${instruction.title}\"\ntype: \"INSTRUCTION\"\nlanguage: \"${instruction.language}\"\ndifficulty: \"${instruction.difficulty}\"\nestimated_minutes: ${instruction.estimatedTotalMinutes}\ntech_stack: [${instruction.techStack.map((t) => `\"${t}\"`).join(', ')}]\n---\n\n# 🛠️ ${instruction.title}\n\n> ⏱️ **Estimated Duration:** ~${instruction.estimatedTotalMinutes} mins  \n> 🎯 **Difficulty:** ${instruction.difficulty.toUpperCase()}  \n> 🧰 **Tech Stack:** ${instruction.techStack.join(', ')}\n\n---\n\n## 📋 Prerequisites & Tools\n* **Prerequisites:** ${instruction.prerequisites.join('; ') || 'Basic programming knowledge'}\n* **Materials & Tools:** ${instruction.materialsAndTools.join('; ') || 'Standard developer environment'}\n\n---\n\n${instruction.sections\n  .map(\n    (sec) => `## Section ${sec.sectionNumber}: ${sec.title}\n> 🎯 **Goal:** ${sec.goal} (~${sec.estimatedMinutes || 15} mins)\n\n${sec.preflightChecks.length > 0 ? `### 🛫 Preflight Checks\\n${sec.preflightChecks.map((p) => `- [ ] ${p}`).join('\\n')}\\n` : ''}\n${sec.steps\n  .map(\n    (step) => `### Step ${step.stepNumber}: ${step.actionTitle}\n\n${step.explanation}\n\n${step.targetFile ? `📁 **File:** \\`${step.targetFile}\\`` : ''}\n\n${step.codeSnippet ? `\\`\\`\\`${step.codeLanguage || 'text'}\\n# ${step.targetFile || 'Implementation'}\\n${step.codeSnippet}\\n\\`\\`\\`` : ''}\n\n${step.tip ? `> [!TIP]\\n> ${step.tip}` : ''}\n${step.warning ? `> [!WARNING]\\n> ${step.warning}` : ''}\n\n**Expected result:** ${step.expectedResult}\n\n${step.imagePlaceholder ? `[IMAGE: ${step.imagePlaceholder}]` : ''}`\n  )\n  .join('\\n\\n')}\n\n${sec.rollbackOrCleanup ? `> 🔄 **Rollback / Reset:** ${sec.rollbackOrCleanup}` : ''}`\n  )\n  .join('\\n\\n---\\n\\n')}\n\n---\n\n## 🏁 Verification Checklist\n${instruction.verificationChecklist.map((c) => `- [ ] ${c}`).join('\\n')}\n`.trim();\n}\n","import type { SelfLab, DiagnosticQuiz } from '../schemas';\n\n/**\n * Serializes SelfLab object into canonical SELF_LAB.md with Progressive Hints (Accordion / Spoilers)\n */\nexport function serializeSelfLabToMarkdown(lab: SelfLab): string {\n  const renderChallenge = (c: SelfLab['challenges']['bronze'], label: string) => {\n    const tasksList = c.tasks.map((t) => `- ${t}`).join('\\n');\n    return `### ${label}: ${c.title}\n> **Duration:** ~${c.estimatedMinutes} mins\n\n**Objective:** ${c.objective}\n\n#### Tasks & Implementation Details:\n${tasksList}\n\n#### 🧪 Self-Verification Command:\n\\`\\`\\`bash\n${c.verifyCommand}\n\\`\\`\\`\n*Expected Terminal Output:*\n\\`\\`\\`text\n${c.expectedOutput}\n\\`\\`\\`\n\n#### 💡 Progressive Hints (Expand only if stuck):\n<details>\n<summary><b>💡 Hint Level 1: Conceptual Clue (Hướng tư duy)</b></summary>\n\n${c.hints.hint1Concept}\n</details>\n\n<details>\n<summary><b>🔍 Hint Level 2: Structural Skeleton (Khung code mẫu)</b></summary>\n\n\\`\\`\\`${lab.techStack[0]?.toLowerCase() || 'swift'}\n${c.hints.hint2Skeleton}\n\\`\\`\\`\n</details>\n\n<details>\n<summary><b>🚨 Hint Level 3: Full Solution & Explanation (Lời giải trọn vẹn)</b></summary>\n\n\\`\\`\\`${lab.techStack[0]?.toLowerCase() || 'swift'}\n${c.hints.hint3Solution.code}\n\\`\\`\\`\n\n**Why this solution works:**\n${c.hints.hint3Solution.explanation}\n</details>`;\n  };\n\n  const troubleshootingRows = (lab.troubleshootingMatrix && lab.troubleshootingMatrix.length > 0)\n    ? lab.troubleshootingMatrix.map((r) => `| ${r.symptom} | ${r.rootCause} | ${r.exactFix} |`).join('\\n')\n    : '| Network Timeout | Device IP unreachable or firewall blocking port | Verify device is on same subnet and ping IP |';\n\n  const preflightList = (lab.preflightChecklist && lab.preflightChecklist.length > 0)\n    ? lab.preflightChecklist.map((p) => `- [ ] ${p}`).join('\\n')\n    : '- [ ] Development environment configured\\n- [ ] Code editor ready';\n\n  const finalChecklist = (lab.finalSubmissionChecklist && lab.finalSubmissionChecklist.length > 0)\n    ? lab.finalSubmissionChecklist.map((c) => `- [ ] ${c}`).join('\\n')\n    : '- [ ] All verification commands pass with expected outputs\\n- [ ] Code is formatted and clean';\n\n  return `---\nid: \"${lab.labId}\"\ntitle: \"${lab.title}\"\ntype: \"SELF_LAB\"\nlanguage: \"${lab.language}\"\ndifficulty: \"${lab.difficulty}\"\nestimated_minutes: ${lab.estimatedTotalMinutes}\ntech_stack: [${lab.techStack.map((t) => `\"${t}\"`).join(', ')}]\n---\n\n# 🚀 Self-Paced Hands-On Lab: ${lab.title}\n\n> ⏱️ **Estimated Duration:** ~${lab.estimatedTotalMinutes} mins  \n> 🎯 **Difficulty Level:** ${lab.difficulty.toUpperCase()}  \n> 🧰 **Tech Stack:** ${lab.techStack.join(', ')}  \n> 💡 **Self-Learner Notice:** You are in full control of this lab. Follow the progressive challenges below. If you get stuck at any point, use the **Progressive Hints System** to get unstuck without ruining the learning experience!\n\n---\n\n## 📋 Mission Briefing & Environment Setup\n${lab.missionBriefing}\n\n### 🛫 Preflight Checklist\n${preflightList}\n\n---\n\n## 🎯 Progressive Challenges (3-Tier Differentiation)\n\n${renderChallenge(lab.challenges.bronze, '🥉 Challenge 1: Foundational Core (Bronze)')}\n\n---\n\n${renderChallenge(lab.challenges.silver, '🥈 Challenge 2: Logic & Error Handling (Silver)')}\n\n---\n\n${renderChallenge(lab.challenges.gold, '🥇 Challenge 3: Edge Cases & Optimization (Gold)')}\n\n---\n\n## 🔍 Self-Learner Troubleshooting Matrix\n| Symptom / Error Message | Root Cause | Exact Fix |\n| :--- | :--- | :--- |\n${troubleshootingRows}\n\n---\n\n## 🏁 Final Lab Submission & Mastery Checklist\n${finalChecklist}\n`.trim();\n}\n\n/**\n * Serializes DiagnosticQuiz object into canonical QUIZ.md\n */\nexport function serializeDiagnosticQuizToMarkdown(quiz: DiagnosticQuiz): string {\n  const questionsSection = quiz.questions\n    .map((q, qIdx) => {\n      let qStr = `### Question ${qIdx + 1} (${q.id}) [Bloom: ${q.bloomLevel.toUpperCase()}]\\n${q.scenarioOrStem}`;\n      if (q.codeSnippet) {\n        qStr += `\\n\\n\\`\\`\\`${q.codeLanguage || 'text'}\\n${q.codeSnippet}\\n\\`\\`\\``;\n      }\n      qStr += '\\n\\n' + q.options.map((opt) => `- **${opt.id}.** ${opt.text}`).join('\\n');\n      return qStr;\n    })\n    .join('\\n\\n---\\n\\n');\n\n  const answerKeySection = quiz.questions\n    .map((q, qIdx) => {\n      const correctOpt = q.options.find((o) => o.isCorrect) || q.options[0];\n      const optExplanations = q.options\n        .map((o) => `  - **${o.id}${o.isCorrect ? ' (✅ CORRECT)' : ' (❌)'}:** ${o.explanation}`)\n        .join('\\n');\n\n      const takeaway = q.takeawayMessage || q.teacherNote || `The correct answer is ${correctOpt.id}.`;\n      return `#### Question ${qIdx + 1} (${q.id}) — Correct Answer: **${correctOpt.id}**\n- **Takeaway:** ${takeaway}\n- **Option Analysis:**\n${optExplanations}`;\n    })\n    .join('\\n\\n');\n\n  return `---\nid: \"${quiz.quizId}\"\ntitle: \"${quiz.title}\"\ntype: \"QUIZ\"\nlanguage: \"${quiz.language}\"\ntotal_questions: ${quiz.questions.length}\npassing_score_pct: ${quiz.passingScorePct}\n---\n\n# 🧠 Diagnostic & Active Recall Quiz: ${quiz.title}\n\n> ⏱️ **Recommended Time:** ~10-15 mins  \n> 🎯 **Passing Score:** ${quiz.passingScorePct}%  \n> 💡 **Purpose:** Test your conceptual understanding, catch hidden misconceptions, and evaluate architectural trade-offs.\n\n---\n\n${questionsSection}\n\n---\n\n## 🔑 Comprehensive Answer Key & Deep Explanation (Expand after completing)\n<details>\n<summary><b>👉 Click to View Full Explanations & Common Pitfall Analysis</b></summary>\n\n${answerKeySection}\n</details>\n`.trim();\n}\n","import { auditCurriculumQualityFlow } from '../ai/flows';\nimport type { CurriculumQualityReport } from '../schemas';\nimport type { ModelResolutionOptions } from '../ai/provider-factory';\n\nexport interface AutoRepairOptions<T> {\n  artifactType: string;\n  lessonId: string;\n  language: string;\n  targetObjectives: Array<{ code: string; description: string; bloomLevel: string }>;\n  maxRetries?: number;\n  modelOptions?: ModelResolutionOptions;\n  generatorFn: (repairFeedback?: string) => Promise<T>;\n}\n\nexport interface AutoRepairResult<T> {\n  artifact: T;\n  verdict: 'PASS' | 'NEEDS_REVISION' | 'FAIL';\n  attempts: number;\n  report: CurriculumQualityReport;\n}\n\n/**\n * Autonomous Proposer -> Judge -> Repair Loop\n * Runs generator, calls LLM-as-Judge to audit, and triggers a repair turn if needed.\n */\nexport async function withAutoRepair<T>(options: AutoRepairOptions<T>): Promise<AutoRepairResult<T>> {\n  const maxRetries = options.maxRetries ?? 3;\n  let currentAttempt = 1;\n  let lastRepairFeedback: string | undefined = undefined;\n  let lastArtifact!: T;\n  let lastReport!: CurriculumQualityReport;\n\n  while (currentAttempt <= maxRetries) {\n    // 1. Proposer Step\n    lastArtifact = await options.generatorFn(lastRepairFeedback);\n\n    // 2. Judge Step\n    lastReport = await auditCurriculumQualityFlow({\n      targetArtifactType: options.artifactType,\n      lessonId: options.lessonId,\n      expectedLanguage: options.language,\n      targetObjectives: options.targetObjectives,\n      generatedContentJson: JSON.stringify(lastArtifact, null, 2),\n      modelOptions: options.modelOptions,\n    });\n\n    if (lastReport.overallVerdict === 'PASS' && lastReport.languageAdherencePassed) {\n      return {\n        artifact: lastArtifact,\n        verdict: 'PASS',\n        attempts: currentAttempt,\n        report: lastReport,\n      };\n    }\n\n    // Accumulate repair prompts for next attempt\n    lastRepairFeedback = `\nPREVIOUS AUDIT VERDICT: ${lastReport.overallVerdict} (Score: ${lastReport.totalScore}/100)\nDetected Issues:\n${lastReport.criteria.filter((c) => !c.passed).map((c) => `- [${c.name}] ${c.feedback}`).join('\\n')}\nActionable Repairs:\n${lastReport.actionableRepairPrompts.map((p) => `* ${p}`).join('\\n')}\nLanguage Adherence Required: \"${options.language}\"\n`.trim();\n\n    currentAttempt++;\n  }\n\n  // If the loop completed without returning (all attempts used), return the best we have.\n  // lastArtifact and lastReport are guaranteed non-null because the loop ran at least once.\n  return {\n    artifact: lastArtifact,\n    verdict: lastReport.overallVerdict,\n    attempts: currentAttempt - 1,\n    report: lastReport,\n  };\n}\n","/**\n * Activity Time Catalog — SEED VALUES for the LO time-estimation model.\n *\n * Source of every number: docs/ideas/2026-10-09-lo-time-estimation-models.md\n * (§2 unit minutes, §3 Bloom floors, §4 bundle example, §5 baseline v0) in the\n * learning-artifact-gen-ui repo. ALL values are seeds awaiting calibration at\n * plan gate TC6 (bias < 15%, P75 coverage ≥ 75% against real lesson data).\n * Every constant carries its idea line as provenance — recalibrate HERE, in\n * one file, when L2/L3 data arrives; do not scatter coefficients.\n */\n\nimport type { ActivityType, BloomLevel, DepthLevel } from '../schemas/curriculumPlanSchema';\n\n/** Three-point minute range (optimistic / likely / pessimistic). */\nexport interface ThreePoint {\n  readonly o: number;\n  readonly m: number;\n  readonly p: number;\n}\n\n/**\n * Per-unit minute ranges by measurable quantity (idea §2).\n * Keys describe the QUANTITY unit, not the ActivityType — one type may be\n * measurable in several units (read: words; instruction: slides).\n */\nexport const ACTIVITY_UNIT_MINUTES = {\n  /** 120–180 wpm reading-to-learn → minutes per 100 words (100/180, 100/150, 100/120). */\n  read_per_100_words: { o: 0.56, m: 0.67, p: 0.83 },\n  /** ~130 wpm lecture; concept slides 1–2 min each (idea §2) → per slide. */\n  instruction_per_slide: { o: 1, m: 1.5, p: 2 },\n  /** Expert time for ONE guided/independent practice item; multiply by STUDENT_FRICTION_MULTIPLIER (2.5 guided / 3.0 independent) at use site. */\n  practice_per_item_expert: { o: 1.5, m: 2, p: 2.5 },\n  /** Multiple-choice recall question (idea §2). */\n  quiz_mcq_per_question: { o: 0.75, m: 1, p: 1.5 },\n  /** Short-answer recall question (idea §2). */\n  quiz_short_per_question: { o: 2, m: 2.5, p: 3 },\n  /** Fixed discussion/reflection block (idea §2: 3–5 min). */\n  discuss_fixed: { o: 3, m: 4, p: 5 },\n} as const;\n\n/**\n * Age pacing factor (idea §5 baseline `Age_Pacing`; bundle model applies it to\n * instruction/transition activities only — never multiplied across the whole\n * LO). Band rule uses the band's MAX age: <13 → 1.5, 13–17 → 1.2, ≥18 → 1.0.\n * SEED — idea §1 keeps the old draft's 1.5/1.2/1.0 as starting values.\n */\nexport function agePacing(ageBand?: readonly [number, number]): number {\n  if (!ageBand) return 1;\n  const maxAge = ageBand[1];\n  if (maxAge < 13) return 1.5;\n  if (maxAge < 18) return 1.2;\n  return 1.0;\n}\n\n/** One entry of a bundle template: quantity × unit three-point minutes. */\nexport interface BundleEntrySeed extends ThreePoint {\n  type: ActivityType;\n  quantity: number;\n  /** Practice role — lets authored SIO counts override the independent-practice quantity. */\n  role?: 'guided' | 'independent';\n}\n\n/**\n * Standard activity bundle per depth level (idea §4 table).\n * adult band (age pacing 1.0) reproduces the idea rows exactly:\n *   ulo {12,15,20} · cio {18,22,30} · sio {28,35,45} → total {58,72,95}.\n * (Idea §4 states total \"55–95\" while its own rows sum to 58 — a ±3 seed\n * rounding inconsistency in the idea doc; rows are the pinned values.)\n */\nexport const BUNDLE_BASE: Record<DepthLevel, BundleEntrySeed[]> = {\n  // ULO·Understand ≈ 15 (12–20): dẫn nhập+giải thích 8, dự đoán/thảo luận 4, kiểm tra 3.\n  ulo: [\n    { type: 'instruction', quantity: 1, o: 7, m: 8, p: 10 },\n    { type: 'discuss', quantity: 1, o: 3, m: 4, p: 6 },\n    { type: 'quiz', quantity: 1, o: 2, m: 3, p: 4 },\n  ],\n  // CIO·Understand/Apply ≈ 22 (18–30): 2 ví dụ mẫu 7, 2 bài lần theo vết 8, trừu tượng hóa 4, kiểm tra 3.\n  cio: [\n    { type: 'instruction', quantity: 2, o: 2.5, m: 3.5, p: 4.5 },\n    { type: 'code', quantity: 2, o: 3.5, m: 4, p: 5, role: 'guided' },\n    { type: 'instruction', quantity: 1, o: 3, m: 4, p: 6 },\n    { type: 'quiz', quantity: 1, o: 3, m: 3, p: 5 },\n  ],\n  // SIO·Apply ≈ 35 (28–45): thao tác mẫu 5, 3 bài dẫn dắt 15, 2 bài độc lập 12, kiểm tra 3.\n  sio: [\n    { type: 'instruction', quantity: 1, o: 4, m: 5, p: 7 },\n    { type: 'code', quantity: 3, o: 4, m: 5, p: 6, role: 'guided' },\n    { type: 'code', quantity: 2, o: 5, m: 6, p: 8, role: 'independent' },\n    { type: 'quiz', quantity: 1, o: 2, m: 3, p: 4 },\n  ],\n};\n\n/**\n * Bloom-floor overlay entries appended when the base bundle lacks a required\n * activity group (idea §3 minimum-activity rules). SEED minutes.\n */\nexport const FLOOR_OVERLAY: Record<'practice' | 'project', BundleEntrySeed> = {\n  // Apply floor: worked example + ≥1 guided practice → 'code' is the missing group.\n  practice: { type: 'code', quantity: 2, o: 4, m: 5, p: 6 },\n  // Create floor: project task with a deliverable.\n  project: { type: 'project', quantity: 1, o: 12, m: 15, p: 20 },\n};\n\n/**\n * Bloom tier → required activity-type GROUPS (each group = at least one type\n * from the group must be present). Idea §3. Analyze/Evaluate reuse the\n * practice floor: their \"case/compare-critique\" task is authorable as either\n * 'code' or 'discuss' — ceiling: type alone cannot tell a case task from a\n * plain drill; upgrade path = carry an activity role on bundle entries.\n */\nexport function bloomFloorGroups(bloom: BloomLevel): ActivityType[][] {\n  const base: ActivityType[][] = [['read', 'watch', 'instruction'], ['quiz']];\n  if (bloom === 'Remember' || bloom === 'Understand') return base;\n  if (bloom === 'Create') return [...base, ['code'], ['project']];\n  // Apply | Analyze | Evaluate\n  return [...base, ['code']];\n}\n\n/** Map a Bloom level to the bundle floor tier used by the overlay. */\nexport function bloomTier(bloom: BloomLevel): 'basic' | 'practice' | 'project' {\n  if (bloom === 'Remember' || bloom === 'Understand') return 'basic';\n  if (bloom === 'Create') return 'project';\n  return 'practice';\n}\n\n/**\n * Baseline v0 — `Base_Time × LO_Type_Weight × Bloom_Weight × Age_Pacing`,\n * kept ONLY for A/B comparison (idea §5). Weights are reconstructed so the\n * three published example results are reproduced exactly (pinned by test):\n *   CIO·Understand = 12 · SIO·Apply = 18 · ULO·Create = 54 (adult band).\n * SEED — not the primary model.\n */\nexport const BASELINE_V0 = {\n  base_time: 12,\n  lo_weight: { ulo: 1.5, cio: 1.0, sio: 0.75 } as const,\n  bloom_weight: {\n    Remember: 0.5,\n    Understand: 1,\n    Apply: 2,\n    Analyze: 2.5,\n    Evaluate: 2.75,\n    Create: 3,\n  } as const,\n};\n\n/**\n * Expected-error band per estimation level (idea \"Ước lượng nhiều mức\" table):\n * L0 ±50% · L1 ±30% · L2 ±15% · L3 ±5–10%. Used to build three-point ranges\n * when only a single point estimate exists (fallback / activity-count paths).\n */\nexport const EXPECTED_ERROR_BANDS: Record<'L0' | 'L1' | 'L2' | 'L3', ThreePoint> = {\n  L0: { o: 0.5, m: 1, p: 1.5 },\n  L1: { o: 0.7, m: 1, p: 1.3 },\n  L2: { o: 0.85, m: 1, p: 1.15 },\n  L3: { o: 0.9, m: 1, p: 1.1 },\n};\n","/**\n * LO Time Estimator — deterministic, activity-anchored minute estimation.\n *\n * Model: minutes belong to ACTIVITIES, not to learning objectives (idea\n * docs/ideas/2026-10-09-lo-time-estimation-models.md). This module is pure:\n * no I/O, no LLM. The planner calls it; it never calls the planner.\n *\n * Levels: L0 reference class (fallback) · L1 bundle template · L2 activity\n * count (plan phase D: artifact measurement) · L3 observed (out of scope —\n * no class-log channel yet).\n */\n\nimport type { ActivityType, BloomLevel, DepthLevel, LoTimeEstimate } from '../schemas/curriculumPlanSchema';\nimport {\n  ACTIVITY_UNIT_MINUTES,\n  BASELINE_V0,\n  BUNDLE_BASE,\n  EXPECTED_ERROR_BANDS,\n  FLOOR_OVERLAY,\n  agePacing,\n  bloomFloorGroups,\n  type BundleEntrySeed,\n  type ThreePoint,\n} from '../constants/activityCatalog';\nimport { STUDENT_FRICTION_MULTIPLIER } from '../constants/pedagogy';\n\n/** Incoming-vs-model divergence that earns a `time_estimate:` warning (seed — mirrors domain-kit MIN_CALIBRATION_DIVERGENCE). */\nexport const TIME_DIVERGENCE_THRESHOLD = 0.5;\n\n// ─── PERT three-point ────────────────────────────────────────────────────────\n\nexport interface PertResult {\n  /** PERT expected value: (O + 4M + P) / 6. */\n  likely: number;\n  /** PERT sigma: (P − O) / 6. */\n  sigma: number;\n}\n\nexport function pert3(tp: ThreePoint): PertResult {\n  return { likely: (tp.o + 4 * tp.m + tp.p) / 6, sigma: (tp.p - tp.o) / 6 };\n}\n\n// ponytail: P75 of a POOLED sum via normal approximation (z = 0.675) on\n// √Σσ² — assumes independence between estimates, underestimates correlated\n// overruns (e.g. a cohort that is slow across every activity). Ceiling:\n// systematic class-speed bias is only correctable with L3 observation data;\n// upgrade path: per-unit empirical percentiles once ≥ ~20 observed sessions exist.\nexport function p75FromSigma(likely: number, sigma: number): number {\n  return likely + 0.675 * sigma;\n}\n\n/** Sum unit minutes × quantity × modifier product, split by counts flag. */\nfunction sumEntries(\n  entries: Array<{ quantity: number; o: number; m: number; p: number; factor: number; counts: boolean }>,\n): ThreePoint {\n  let o = 0;\n  let m = 0;\n  let p = 0;\n  for (const e of entries) {\n    if (!e.counts) continue;\n    o += e.quantity * e.o * e.factor;\n    m += e.quantity * e.m * e.factor;\n    p += e.quantity * e.p * e.factor;\n  }\n  return { o, m, p };\n}\n\nfunction bandMinutes(band: ThreePoint, center: number): LoTimeEstimate['minutes'] {\n  return {\n    optimistic: Math.max(0, Math.round(center * band.o)),\n    likely: Math.max(0, Math.round(center)),\n    pessimistic: Math.max(0, Math.round(center * band.p)),\n  };\n}\n\n// ─── L0: reference-class fallback ────────────────────────────────────────────\n\n/**\n * Honest fallback: when a node carries no usable depth/bloom metadata we KEEP\n * the incoming minutes instead of guessing — labeled L0 / reference_class\n * with low confidence so downstream can tell the difference.\n */\nexport function referenceFallbackEstimate(loId: string, incomingMinutes: number): LoTimeEstimate {\n  return {\n    lo_id: loId,\n    level: 'L0',\n    basis: 'reference_class',\n    minutes: bandMinutes(EXPECTED_ERROR_BANDS.L0, incomingMinutes),\n    confidence: 0.3,\n  };\n}\n\n// ─── L1: bundle template (depth × Bloom) ────────────────────────────────────\n\nexport interface BundleEstimateInput {\n  lo_id: string;\n  depth: DepthLevel;\n  bloom: BloomLevel;\n  /** PlanConstraints.age_band — paces instruction activities only (seed). */\n  ageBand?: readonly [number, number];\n  /** Authored SIO item count (depth_context.sio.length) — overrides the independent-practice quantity. */\n  sioCount?: number;\n}\n\n/**\n * Build the activity list for (depth, bloom): depth base bundle + Bloom-floor\n * overlay for any required group the base lacks (idea §3).\n */\nexport function bundleEntriesFor(depth: DepthLevel, bloom: BloomLevel, sioCount?: number): BundleEntrySeed[] {\n  const entries: BundleEntrySeed[] = BUNDLE_BASE[depth].map((e) => ({ ...e }));\n\n  // Authored SIO items ARE the independent practice tasks — counts beat defaults.\n  if (depth === 'sio' && typeof sioCount === 'number' && sioCount >= 1) {\n    for (const e of entries) if (e.role === 'independent') e.quantity = sioCount;\n  }\n\n  const present = new Set(entries.map((e) => e.type));\n  for (const group of bloomFloorGroups(bloom)) {\n    if (group.some((t) => present.has(t))) continue;\n    // Only the code/project floors can be missing from a base bundle —\n    // read/instruction + quiz exist in all three bases by construction.\n    // Ceiling: type alone cannot distinguish a case task from a plain drill;\n    // upgrade path = role-tagged bundle entries (see bloomFloorGroups).\n    const overlay = group.includes('project') ? FLOOR_OVERLAY.project : group.includes('code') ? FLOOR_OVERLAY.practice : null;\n    if (!overlay) continue;\n    entries.push({ ...overlay });\n    present.add(overlay.type);\n  }\n  return entries;\n}\n\n/**\n * L1 estimate from a bundle template. Three-point comes straight from the\n * template entries; `likely` is the PERT value of the summed range.\n */\nexport function estimateByBundleTemplate(input: BundleEstimateInput): LoTimeEstimate {\n  const entries = bundleEntriesFor(input.depth, input.bloom, input.sioCount);\n  const pace = agePacing(input.ageBand);\n\n  const summed = sumEntries(\n    entries.map((e) => ({\n      quantity: e.quantity,\n      o: e.o,\n      m: e.m,\n      p: e.p,\n      // Age pacing scales INSTRUCTION/transition activity only (idea §1) —\n      // never the whole LO.\n      factor: e.type === 'instruction' ? pace : 1,\n      counts: true,\n    })),\n  );\n\n  const { likely } = pert3(summed);\n  const hasCounts = input.depth === 'sio' && typeof input.sioCount === 'number' && input.sioCount >= 1;\n\n  return {\n    lo_id: input.lo_id,\n    level: 'L1',\n    basis: 'bundle_template',\n    minutes: {\n      optimistic: Math.max(0, Math.round(summed.o)),\n      likely: Math.max(0, Math.round(likely)),\n      pessimistic: Math.max(0, Math.round(summed.p)),\n    },\n    // Seed confidence: counts present is better evidence than template defaults.\n    confidence: hasCounts ? 0.7 : 0.6,\n    activities: entries.map((e) => {\n      const factor = e.type === 'instruction' ? pace : 1;\n      const modifiers: Record<string, number> = {};\n      if (factor !== 1) modifiers.age = factor;\n      return {\n        type: e.type,\n        quantity: e.quantity,\n        unit_minutes: Math.round(e.m * factor * 100) / 100,\n        modifiers,\n        counts_toward_total: true,\n      };\n    }),\n  };\n}\n\n// ─── L2: counted activities ──────────────────────────────────────────────────\n\nexport interface ActivityCountInput {\n  type: ActivityType;\n  quantity: number;\n  unit_minutes: number;\n  modifiers?: Record<string, number>;\n  /** Default true — pair/parallel work can set false to avoid double-counting. */\n  counts_toward_total?: boolean;\n}\n\n/**\n * Counted-activity estimate: Σ quantity × unit × modifier product for entries\n * that count. Three-point derived from the level's expected-error band (idea\n * multi-level table) around the summed point estimate.\n */\nexport function estimateByActivityCount(\n  loId: string,\n  activities: ActivityCountInput[],\n  opts?: { level?: 'L1' | 'L2' | 'L3'; confidence?: number },\n): LoTimeEstimate {\n  const level = opts?.level ?? 'L2';\n  const summed = sumEntries(\n    activities.map((a) => ({\n      quantity: a.quantity,\n      o: a.unit_minutes,\n      m: a.unit_minutes,\n      p: a.unit_minutes,\n      factor: Object.values(a.modifiers ?? {}).reduce((acc, v) => acc * v, 1),\n      counts: a.counts_toward_total !== false,\n    })),\n  );\n  const band = EXPECTED_ERROR_BANDS[level];\n  return {\n    lo_id: loId,\n    level,\n    basis: 'activity_count',\n    minutes: bandMinutes(band, summed.m),\n    confidence: opts?.confidence ?? 0.75,\n    activities: activities.map((a) => ({\n      type: a.type,\n      quantity: a.quantity,\n      unit_minutes: a.unit_minutes,\n      modifiers: a.modifiers ?? {},\n      counts_toward_total: a.counts_toward_total !== false,\n    })),\n  };\n}\n\n// ─── L2: artifact measurement (plan phase D) ────────────────────────────────\n\nexport interface ArtifactTimeInput {\n  lo_id: string;\n  /** Word count of HANDOUT/GUIDE material → reading time (120–180 wpm). */\n  handoutWords?: number;\n  /** Number of concept slides → lecture time (1–2 min/slide). */\n  slideCount?: number;\n  /** Activity/worksheet procedure items → guided practice (expert × STUDENT_FRICTION_MULTIPLIER). */\n  activityItems?: number;\n  /** Recall questions (e.g. lesson exit-ticket questions). */\n  quizQuestions?: number;\n}\n\n/** Word count of markdown-ish text — punctuation/code symbols collapse to spaces. */\nexport function countWords(text: string): number {\n  const cleaned = text.replace(/[^\\p{L}\\p{N}\\s]/gu, ' ');\n  return cleaned.split(/\\s+/).filter(Boolean).length;\n}\n\n/**\n * L2 estimate measured from artifacts that actually shipped (idea time-boxing\n * artifact table): words → reading, slides → lecture, activity items → guided\n * practice, quiz questions → recall. Three-point per rule from the catalog;\n * `likely` is the PERT value of the summed range, same as the bundle path.\n */\nexport function measureArtifactMinutes(input: ArtifactTimeInput): LoTimeEstimate {\n  const sums = { o: 0, m: 0, p: 0 };\n  const activities: NonNullable<LoTimeEstimate['activities']> = [];\n  const add = (\n    type: ActivityType,\n    quantity: number,\n    unit: ThreePoint,\n    unitMinutes: number,\n  ): void => {\n    if (quantity <= 0) return;\n    sums.o += quantity * unit.o;\n    sums.m += quantity * unit.m;\n    sums.p += quantity * unit.p;\n    activities.push({ type, quantity, unit_minutes: Math.round(unitMinutes * 1000) / 1000, modifiers: {}, counts_toward_total: true });\n  };\n\n  const words = input.handoutWords ?? 0;\n  if (words > 0) {\n    // catalog unit is PER 100 WORDS — emit per-word so quantity × unit_minutes = contribution\n    const u = ACTIVITY_UNIT_MINUTES.read_per_100_words;\n    add('read', words, { o: u.o / 100, m: u.m / 100, p: u.p / 100 }, u.m / 100);\n  }\n  const slides = input.slideCount ?? 0;\n  if (slides > 0) {\n    const u = ACTIVITY_UNIT_MINUTES.instruction_per_slide;\n    add('instruction', slides, u, u.m);\n  }\n  const items = input.activityItems ?? 0;\n  if (items > 0) {\n    const u = ACTIVITY_UNIT_MINUTES.practice_per_item_expert;\n    add('code', items, { o: u.o * STUDENT_FRICTION_MULTIPLIER, m: u.m * STUDENT_FRICTION_MULTIPLIER, p: u.p * STUDENT_FRICTION_MULTIPLIER }, u.m * STUDENT_FRICTION_MULTIPLIER);\n  }\n  const questions = input.quizQuestions ?? 0;\n  if (questions > 0) {\n    const u = ACTIVITY_UNIT_MINUTES.quiz_mcq_per_question;\n    add('quiz', questions, u, u.m);\n  }\n\n  const { likely } = pert3(sums);\n  return {\n    lo_id: input.lo_id,\n    level: 'L2',\n    basis: 'activity_count',\n    minutes: {\n      optimistic: Math.max(0, Math.round(sums.o)),\n      likely: Math.max(0, Math.round(likely)),\n      pessimistic: Math.max(0, Math.round(sums.p)),\n    },\n    confidence: 0.75,\n    activities,\n  };\n}\n\n/** L1-vs-L2 divergence warning, or null when within threshold (plan TC8). */\nexport function timeDivergenceWarning(loId: string, from: LoTimeEstimate, to: LoTimeEstimate): string | null {\n  const a = from.minutes.likely;\n  const b = to.minutes.likely;\n  if (a > 0 && Math.abs(b - a) / a > TIME_DIVERGENCE_THRESHOLD) {\n    return `time_estimate: ${loId}: ${a}m → ${b}m (basis ${to.basis}, conf ${to.confidence})`;\n  }\n  return null;\n}\n\n// ─── Bloom minimum-activity rules (idea §3) ──────────────────────────────────\n\n/** Groups of activity types; at least one type from each group is required for the Bloom level. */\nexport function minActivitiesForBloom(bloom: BloomLevel): ActivityType[][] {\n  return bloomFloorGroups(bloom);\n}\n\n// ─── Baseline v0 (A/B only — never the production path) ─────────────────────\n\nexport function baselineV0(input: { depth: DepthLevel; bloom: BloomLevel; ageBand?: readonly [number, number] }): number {\n  const { base_time, lo_weight, bloom_weight } = BASELINE_V0;\n  return base_time * lo_weight[input.depth] * bloom_weight[input.bloom] * agePacing(input.ageBand);\n}\n\n// ─── Pooled buffer (Critical-Chain style, unit level) ───────────────────────\n\nexport interface BufferSummary {\n  /** Sum of PERT likely minutes. */\n  p50: number;\n  /** P75 planning point: p50 + 0.675 × pooled sigma. */\n  p75: number;\n  /** Pooled sigma √Σσ² (one-sigma aggregate buffer). */\n  buffer: number;\n}\n\nexport function aggregateBuffer(estimates: LoTimeEstimate[]): BufferSummary {\n  let p50 = 0;\n  let sumVar = 0;\n  for (const e of estimates) {\n    p50 += e.minutes.likely;\n    const sigma = (e.minutes.pessimistic - e.minutes.optimistic) / 6;\n    sumVar += sigma * sigma;\n  }\n  const buffer = Math.sqrt(sumVar);\n  return { p50: Math.round(p50), p75: Math.round(p75FromSigma(p50, buffer)), buffer: Math.round(buffer) };\n}\n\nexport { ACTIVITY_UNIT_MINUTES };\n","import {\n  generateLessonMasterFlow,\n  generateActivityFlow,\n  generateCodeLabFlow,\n  generateWorksheetFlow,\n  generateHandoutFlow,\n  generateSlidesFlow,\n  generateTeacherGuideFlow,\n  generateExtensionFlow,\n} from '../ai/flows';\nimport {\n  serializeLessonToMarkdown,\n  serializeActivityToMarkdown,\n  serializeHandoutToMarkdown,\n} from './markdownSerializers';\nimport { withAutoRepair, type AutoRepairResult } from './autonomousRepair';\nimport { countWords, measureArtifactMinutes, timeDivergenceWarning } from '../services/loTimeEstimator';\nimport type {\n  MilestoneInput,\n  LessonPlan,\n  ActivityLab,\n  CodeLab,\n  Worksheet,\n  Handout,\n  SlideDeck,\n  TeacherGuide,\n  Extension,\n  LoTimeEstimate,\n} from '../schemas';\nimport type { ModelResolutionOptions } from '../ai/provider-factory';\n\nexport type BundleTier = 'minimum' | 'full';\n\nexport interface MilestoneCurriculumBundle {\n  milestoneId: string;\n  milestoneName: string;\n  language: string;\n  lesson: LessonPlan;\n  lessonMarkdown: string;\n  activity: ActivityLab;\n  activityMarkdown: string;\n  codeLab: CodeLab;\n  handout: Handout;\n  handoutMarkdown: string;\n  worksheet?: Worksheet;\n  slides?: SlideDeck;\n  teacherGuide?: TeacherGuide;\n  extension?: Extension;\n  judgeResults: Record<string, AutoRepairResult<any>>;\n  /** L2 time estimate measured from the artifacts that shipped (plan 2026-10-09, phase D). */\n  time_estimate?: LoTimeEstimate;\n  /** L2 measurement warnings, e.g. |L2 − L1| > 50% when a planEstimate was supplied. */\n  time_warnings?: string[];\n}\n\nexport interface GenerateMilestoneBundleOptions {\n  milestone: MilestoneInput;\n  language?: string;\n  bundleTier?: BundleTier;\n  techStack?: string[];\n  topic?: string;\n  targetAudience?: string;\n  enableJudgeRepair?: boolean;\n  modelOptions?: ModelResolutionOptions;\n  /** Optional L1 estimate for the same lesson (plan time_estimates) — enables the |L2−L1| divergence warning. */\n  planEstimate?: LoTimeEstimate;\n}\n\n/**\n * Generates a complete Pedagogical Learning Bundle for a single Milestone\n */\nexport async function generateMilestoneCurriculumBundle(\n  options: GenerateMilestoneBundleOptions\n): Promise<MilestoneCurriculumBundle> {\n  const language = options.language || 'vi';\n  const bundleTier = options.bundleTier || 'minimum';\n  const techStack = options.techStack || options.milestone.tech_keywords || ['General Technology'];\n  const enableJudge = options.enableJudgeRepair ?? true;\n  const milestoneId = options.milestone.id || options.milestone.concept_code || 'L01';\n\n  const judgeResults: Record<string, AutoRepairResult<any>> = {};\n\n  const targetObjectives = (options.milestone.learning_objectives || []).map((lo) => ({\n    code: lo.code,\n    description: lo.description || lo.name,\n    bloomLevel: lo.bloom_level || 'understand',\n  }));\n\n  // 1. Generate Master Lesson (LESSON.md)\n  let lesson: LessonPlan;\n  if (enableJudge) {\n    const repairRes = await withAutoRepair<LessonPlan>({\n      artifactType: 'LESSON',\n      lessonId: milestoneId,\n      language,\n      targetObjectives,\n      modelOptions: options.modelOptions,\n      generatorFn: async (repairFeedback) => {\n        return generateLessonMasterFlow({\n          milestone: options.milestone,\n          language,\n          topic: options.topic,\n          targetAudience: options.targetAudience,\n          contextContinuity: repairFeedback,\n          modelOptions: options.modelOptions,\n        });\n      },\n    });\n    lesson = repairRes.artifact;\n    judgeResults['LESSON'] = repairRes;\n  } else {\n    lesson = await generateLessonMasterFlow({\n      milestone: options.milestone,\n      language,\n      topic: options.topic,\n      targetAudience: options.targetAudience,\n      modelOptions: options.modelOptions,\n    });\n  }\n\n  const lessonMarkdown = serializeLessonToMarkdown(lesson);\n\n  // 2. Generate Activity (ACT.md)\n  let activity: ActivityLab;\n  if (enableJudge) {\n    const repairRes = await withAutoRepair<ActivityLab>({\n      artifactType: 'ACT',\n      lessonId: milestoneId,\n      language,\n      targetObjectives,\n      modelOptions: options.modelOptions,\n      generatorFn: async () => {\n        return generateActivityFlow({\n          lesson,\n          language,\n          modelOptions: options.modelOptions,\n        });\n      },\n    });\n    activity = repairRes.artifact;\n    judgeResults['ACT'] = repairRes;\n  } else {\n    activity = await generateActivityFlow({\n      lesson,\n      language,\n      modelOptions: options.modelOptions,\n    });\n  }\n\n  const activityMarkdown = serializeActivityToMarkdown(activity);\n\n  // 3. Generate Code Lab (CODE) & Handout (HANDOUT.md)\n  const [codeLab, handout] = await Promise.all([\n    generateCodeLabFlow({\n      lesson,\n      activity,\n      language,\n      targetTechStack: techStack,\n      modelOptions: options.modelOptions,\n    }),\n    generateHandoutFlow({\n      lesson,\n      language,\n      modelOptions: options.modelOptions,\n    }),\n  ]);\n\n  const handoutMarkdown = serializeHandoutToMarkdown(handout);\n\n  const bundle: MilestoneCurriculumBundle = {\n    milestoneId,\n    milestoneName: options.milestone.name,\n    language,\n    lesson,\n    lessonMarkdown,\n    activity,\n    activityMarkdown,\n    codeLab,\n    handout,\n    handoutMarkdown,\n    judgeResults,\n  };\n\n  // If Full Bundle requested, generate satellite assets\n  if (bundleTier === 'full') {\n    const [worksheet, slides, teacherGuide, extension] = await Promise.all([\n      generateWorksheetFlow({ lesson, language, modelOptions: options.modelOptions }),\n      generateSlidesFlow({ lesson, language, modelOptions: options.modelOptions }),\n      generateTeacherGuideFlow({ lesson, activity, language, modelOptions: options.modelOptions }),\n      generateExtensionFlow({ lesson, activity, language, modelOptions: options.modelOptions }),\n    ]);\n\n    bundle.worksheet = worksheet;\n    bundle.slides = slides;\n    bundle.teacherGuide = teacherGuide;\n    bundle.extension = extension;\n  }\n\n  // L2 time measurement (plan 2026-10-09, phase D): count minutes from what\n  // actually shipped. Counts: handout words, slides, activity procedure steps,\n  // recall checks (per-section formativeCheck + exit ticket). Worksheet mirrors\n  // the activity steps — not counted twice (ceiling: a divergent worksheet\n  // needs its own item count).\n  const quizQuestions =\n    (lesson.exitTicket?.questionStem?.trim() ? 1 : 0) +\n    lesson.sections.filter((s) => s.formativeCheck?.trim()).length;\n  const timeEstimate = measureArtifactMinutes({\n    lo_id: milestoneId,\n    handoutWords: countWords(handoutMarkdown),\n    slideCount: bundle.slides?.slides.length ?? 0,\n    activityItems: activity.steps.length,\n    quizQuestions,\n  });\n  bundle.time_estimate = timeEstimate;\n  if (options.planEstimate) {\n    const warning = timeDivergenceWarning(milestoneId, options.planEstimate, timeEstimate);\n    if (warning) bundle.time_warnings = [warning];\n  }\n\n  return bundle;\n}\n","import pLimit from 'p-limit';\nimport { generateMilestoneCurriculumBundle, type MilestoneCurriculumBundle, type BundleTier } from './milestoneBundleGenerator';\nimport type { RoadmapInput, PhaseInput, MilestoneInput } from '../schemas';\nimport type { ModelResolutionOptions } from '../ai/provider-factory';\n\nexport interface GenerateRoadmapCurriculumOptions {\n  roadmap: RoadmapInput;\n  language?: string;\n  bundleTier?: BundleTier;\n  concurrency?: number;\n  enableJudgeRepair?: boolean;\n  modelOptions?: ModelResolutionOptions;\n  onMilestoneProgress?: (milestoneId: string, current: number, total: number) => void;\n}\n\nexport interface RoadmapCurriculumOutput {\n  projectTitle: string;\n  language: string;\n  totalMilestones: number;\n  bundles: MilestoneCurriculumBundle[];\n}\n\n/**\n * Generates curriculum bundles for an entire Roadmap from knowledge-tree\n */\nexport async function generateRoadmapCurriculum(\n  options: GenerateRoadmapCurriculumOptions\n): Promise<RoadmapCurriculumOutput> {\n  const language = options.language || 'vi';\n  const concurrency = options.concurrency || 2;\n  const limit = pLimit(concurrency);\n\n  const allMilestones: Array<{ phase: PhaseInput; milestone: MilestoneInput }> = [];\n  for (const phase of options.roadmap.phases) {\n    for (const milestone of phase.milestones) {\n      allMilestones.push({ phase, milestone });\n    }\n  }\n\n  const total = allMilestones.length;\n  let completedCount = 0;\n\n  const tasks = allMilestones.map(({ phase, milestone }, taskIdx) =>\n    limit(async () => {\n      const bundle = await generateMilestoneCurriculumBundle({\n        milestone,\n        language,\n        bundleTier: options.bundleTier,\n        techStack: options.roadmap.project_brief.tech_stack,\n        topic: phase.title || phase.phase_name,\n        targetAudience: options.roadmap.project_brief.target_learner || options.roadmap.project_brief.audience,\n        enableJudgeRepair: options.enableJudgeRepair,\n        modelOptions: options.modelOptions,\n      });\n\n      completedCount++;\n      if (options.onMilestoneProgress) {\n        options.onMilestoneProgress(bundle.milestoneId, completedCount, total);\n      }\n\n      return { bundle, taskIdx };\n    })\n  );\n\n  const results = await Promise.all(tasks);\n  // Re-sort by original phase/milestone order to guarantee deterministic output\n  const bundles = results\n    .sort((a, b) => a.taskIdx - b.taskIdx)\n    .map((r) => r.bundle);\n\n  return {\n    projectTitle: options.roadmap.project_brief.title || options.roadmap.project_brief.name || 'Curriculum Project',\n    language,\n    totalMilestones: total,\n    bundles,\n  };\n}\n","import { generateProjectInstructionFlow } from '../ai/flows';\nimport { serializeProjectInstructionToMarkdown } from './markdownSerializers';\nimport { withAutoRepair, type AutoRepairResult } from './autonomousRepair';\nimport type {\n  ProjectInstruction,\n  MilestoneInput,\n  ProjectGraph,\n} from '../schemas';\nimport type { ModelResolutionOptions } from '../ai/provider-factory';\n\nexport interface GenerateProjectInstructionOptions {\n  projectGraph?: ProjectGraph;\n  milestone: MilestoneInput;\n  roadmapContext?: {\n    projectTitle?: string;\n    techStack?: string[];\n    phaseTitle?: string;\n  };\n  researchNotes?: string;\n  externalResources?: string[];\n  language?: string;\n  difficulty?: 'beginner' | 'intermediate' | 'advanced';\n  enableJudgeRepair?: boolean;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport interface ProjectInstructionResult {\n  instruction: ProjectInstruction;\n  instructionMarkdown: string;\n  judgeResult?: AutoRepairResult<ProjectInstruction>;\n}\n\n/**\n * Generates an Instructable-style Step-by-Step Project Instruction / Tutorial\n * adhering to researcher/prompts/tutorial.md methodology.\n */\nexport async function generateProjectInstruction(\n  options: GenerateProjectInstructionOptions\n): Promise<ProjectInstructionResult> {\n  const language = options.language || 'vi';\n  const difficulty = options.difficulty || 'intermediate';\n  const enableJudge = options.enableJudgeRepair ?? true;\n  const milestoneId = options.milestone.id || options.milestone.concept_code || 'M01';\n\n  let instruction: ProjectInstruction;\n  let judgeResult: AutoRepairResult<ProjectInstruction> | undefined;\n\n  const targetObjectives = (options.milestone.learning_objectives || []).map((lo) => ({\n    code: lo.code,\n    description: lo.description || lo.name,\n    bloomLevel: lo.bloom_level || 'apply',\n  }));\n\n  if (enableJudge) {\n    judgeResult = await withAutoRepair<ProjectInstruction>({\n      artifactType: 'INSTRUCTION',\n      lessonId: milestoneId,\n      language,\n      targetObjectives,\n      modelOptions: options.modelOptions,\n      generatorFn: async (repairFeedback) => {\n        return generateProjectInstructionFlow({\n          projectGraph: options.projectGraph,\n          milestone: options.milestone,\n          roadmapContext: options.roadmapContext,\n          researchNotes: repairFeedback ? `${options.researchNotes || ''}\\n\\n[REPAIR NOTE]: ${repairFeedback}` : options.researchNotes,\n          externalResources: options.externalResources,\n          language,\n          difficulty,\n          modelOptions: options.modelOptions,\n        });\n      },\n    });\n    instruction = judgeResult.artifact;\n  } else {\n    instruction = await generateProjectInstructionFlow({\n      projectGraph: options.projectGraph,\n      milestone: options.milestone,\n      roadmapContext: options.roadmapContext,\n      researchNotes: options.researchNotes,\n      externalResources: options.externalResources,\n      language,\n      difficulty,\n      modelOptions: options.modelOptions,\n    });\n  }\n\n  const instructionMarkdown = serializeProjectInstructionToMarkdown(instruction);\n\n  return {\n    instruction,\n    instructionMarkdown,\n    judgeResult,\n  };\n}\n","import fs from 'fs';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport {\n  generateSelfLabFlow,\n  generateDiagnosticQuizFlow,\n  generateHandoutFlow,\n  generateCodeLabFlow,\n} from '../ai/flows';\nimport { generateProjectInstruction } from './projectInstructionGenerator';\nimport {\n  serializeSelfLabToMarkdown,\n  serializeDiagnosticQuizToMarkdown,\n} from './selfPacedSerializers';\nimport {\n  serializeHandoutToMarkdown,\n  serializeCodeLabToMarkdown,\n} from './markdownSerializers';\nimport type {\n  MilestoneInput,\n  ProjectGraph,\n  SelfPacedBundle,\n  LessonPlan,\n} from '../schemas';\nimport type { ModelResolutionOptions } from '../ai/provider-factory';\n\nexport interface GenerateSelfPacedBundleInput {\n  milestone: MilestoneInput;\n  projectGraph?: ProjectGraph;\n  language?: string;\n  targetTechStack?: string[];\n  contextContinuity?: string;\n  outputDirectory?: string;\n  modelOptions?: ModelResolutionOptions;\n}\n\nexport interface SelfPacedBundleOutput {\n  bundle: SelfPacedBundle;\n  markdown: {\n    instructionMd: string;\n    selfLabMd: string;\n    quizMd: string;\n    cheatSheetMd: string;\n    codeLabMd?: string;\n  };\n  outputDirectory?: string;\n}\n\n/**\n * Orchestrates generation of a complete Autonomous Self-Learner Bundle\n */\nexport async function generateSelfPacedBundle(\n  input: GenerateSelfPacedBundleInput\n): Promise<SelfPacedBundleOutput> {\n  const language = input.language || 'vi';\n  const techStack = input.targetTechStack || input.milestone.tech_keywords || ['Swift'];\n  const milestoneId = input.milestone.id || 'F0-S1';\n\n  // 1. Generate Instructable Step-by-Step Blueprint\n  const instructionResult = await generateProjectInstruction({\n    milestone: input.milestone,\n    projectGraph: input.projectGraph,\n    language,\n    modelOptions: input.modelOptions,\n  });\n  const instruction = instructionResult.instruction;\n  const instructionMd = instructionResult.instructionMarkdown;\n\n  // 2. Generate Self-Paced Hands-On Lab with Progressive Hints & Verification Commands\n  const selfLab = await generateSelfLabFlow({\n    milestone: input.milestone,\n    projectGraph: input.projectGraph,\n    language,\n    targetTechStack: techStack,\n    contextContinuity: input.contextContinuity,\n    modelOptions: input.modelOptions,\n  });\n\n  // 3. Generate Diagnostic & Active Recall Quiz\n  const quiz = await generateDiagnosticQuizFlow({\n    milestone: input.milestone,\n    language,\n    modelOptions: input.modelOptions,\n  });\n\n  // Canonical Lesson Plan container to feed secondary helpers\n  const canonicalLesson: LessonPlan = {\n    artifactType: 'LESSON',\n    lessonId: milestoneId,\n    title: input.milestone.name,\n    language,\n    topic: input.milestone.feature_name || 'Engineering',\n    targetGradeOrAudience: 'Self-Learner',\n    overview: input.milestone.description || input.milestone.name,\n    learningObjectives: (input.milestone.learning_objectives || []).map((lo) => ({\n      code: lo.code,\n      name: lo.name,\n      description: lo.description || '',\n      bloomLevel: lo.bloom_level || 'understand',\n      successCriteria: '',\n    })),\n    prerequisites: 'Foundational programming knowledge',\n    materialsSummary: techStack.join(', '),\n    keywords: techStack,\n    hookTitle: 'Self-Paced Challenge',\n    hookScenario: input.milestone.description || input.milestone.name,\n    hookQuestions: ['How can we implement this efficiently?'],\n    coreConcepts: [],\n    differentiation: { bronzeTier: '', silverTier: '', goldTier: '' },\n    sections: [\n      {\n        title: input.milestone.name,\n        durationMinutes: 45,\n        teacherActions: 'Guide learner through core implementation',\n        studentActions: 'Build and verify solution',\n        analogies: [],\n        formativeCheck: 'Verify test execution',\n      },\n    ],\n    exitTicket: {\n      questionStem: 'What was the core takeaway?',\n      expectedAnswerOrRubric: 'Successful build and run',\n      metacognitivePrompt: 'How can this be optimized?',\n    },\n    teacherNotes: { commonPitfalls: [], troubleshootingMatrix: [], extensionNotes: '' },\n  };\n\n  // 4. Generate 5-Second Rule Cheat Sheet (Handout)\n  const cheatSheet = await generateHandoutFlow({\n    lesson: canonicalLesson,\n    language,\n    modelOptions: input.modelOptions,\n  });\n\n  // 5. Generate Code Lab Starter & Solution Code\n  const codeLab = await generateCodeLabFlow({\n    lesson: canonicalLesson,\n    language,\n    targetTechStack: techStack,\n    modelOptions: input.modelOptions,\n  });\n\n  // 6. Serialize to High-Fidelity Markdown\n  const selfLabMd = serializeSelfLabToMarkdown(selfLab);\n  const quizMd = serializeDiagnosticQuizToMarkdown(quiz);\n  const cheatSheetMd = serializeHandoutToMarkdown(cheatSheet);\n  const codeLabMd = serializeCodeLabToMarkdown(codeLab);\n\n  const bundle: SelfPacedBundle = {\n    bundleId: milestoneId,\n    title: input.milestone.name,\n    language,\n    techStack,\n    instruction,\n    selfLab,\n    quiz,\n    cheatSheet,\n    codeLab,\n  };\n\n  // 7. Save to directory if outputDirectory provided (async to avoid blocking event loop)\n  if (input.outputDirectory) {\n    await fsPromises.mkdir(input.outputDirectory, { recursive: true });\n\n    await Promise.all([\n      fsPromises.writeFile(path.join(input.outputDirectory, 'INSTRUCTION.md'), instructionMd, 'utf-8'),\n      fsPromises.writeFile(path.join(input.outputDirectory, 'SELF_LAB.md'), selfLabMd, 'utf-8'),\n      fsPromises.writeFile(path.join(input.outputDirectory, 'QUIZ.md'), quizMd, 'utf-8'),\n      fsPromises.writeFile(path.join(input.outputDirectory, 'QUIZ.json'), JSON.stringify(quiz, null, 2), 'utf-8'),\n      fsPromises.writeFile(path.join(input.outputDirectory, 'CHEAT_SHEET.md'), cheatSheetMd, 'utf-8'),\n      fsPromises.writeFile(path.join(input.outputDirectory, 'LAB.md'), codeLabMd, 'utf-8'),\n      fsPromises.writeFile(path.join(input.outputDirectory, 'bundle.json'), JSON.stringify(bundle, null, 2), 'utf-8'),\n    ]);\n  }\n\n  return {\n    bundle,\n    markdown: {\n      instructionMd,\n      selfLabMd,\n      quizMd,\n      cheatSheetMd,\n      codeLabMd,\n    },\n    outputDirectory: input.outputDirectory,\n  };\n}\n","import type { ICurriculumStorage, ProjectStatusReport } from '../storage/types';\n\nexport interface ConvertedSotBundle {\n  learnerProfile: string;\n  projectBrief: string;\n  referencePack: string;\n  curriculumFramework: string;\n  contentStyleGuide: string;\n  artDirection: string;\n  projectStatus: string;\n}\n\n/**\n * Normalizes and converts Roadmap JSON and Project Graph JSON from knowledge-tree into 7 Canonical SOT Foundation Files.\n */\nexport function convertRoadmapToFoundationSot(\n  roadmapInput: any,\n  projectGraphInput?: any\n): ConvertedSotBundle {\n  const brief = roadmapInput?.project_brief || roadmapInput?.project || {};\n  const projectInfo = projectGraphInput?.project || {};\n  const productGoals = projectGraphInput?.product?.goals || [];\n  const techStack = projectInfo?.tech_stack || brief?.tech_stack || {};\n  const architecture = projectInfo?.architecture || [];\n\n  const title = brief?.title || projectInfo?.name || 'Curriculum Project';\n  const projectCode = (brief?.project_code || projectInfo?.id || 'PROJECT').toUpperCase();\n  const description = brief?.description || projectInfo?.purpose || 'A comprehensive, production-grade learning path.';\n  const audience = brief?.audience || brief?.target_learner || 'Intermediate Engineers';\n  const estimatedWeeks = brief?.estimated_weeks || 8;\n  const estimatedHours = brief?.estimated_hours || 120;\n  const phases = roadmapInput?.phases || [];\n\n  const allMilestones: any[] = [];\n  phases.forEach((p: any) => {\n    if (Array.isArray(p.milestones)) {\n      p.milestones.forEach((m: any) => {\n        allMilestones.push({ ...m, phase_name: p.phase_name, phase_id: p.phase_id });\n      });\n    }\n  });\n\n  const totalLessons = allMilestones.length || 16;\n  const totalUnits = phases.length || 4;\n\n  const dateStr = new Date().toISOString().split('T')[0];\n\n  // ─────────────────────────────────────────────────────────────\n  // 1. LEARNER_PROFILE.md\n  // ─────────────────────────────────────────────────────────────\n  const learnerProfile = `---\nid: \"${projectCode}-LEARNER-PROFILE\"\ntitle: \"Learner Profile: ${title}\"\ntype: \"LEARNER_PROFILE\"\ncreated_by: \"Curriculum OS Converter\"\nphase: \"P1\"\ndeliverable: \"P1-T1\"\nversion: \"v1.2\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Foundational Info\"\n  - \"Entry Level\"\n  - \"Goals & Motivations\"\n  - \"Client Objectives\"\n---\n\n# LEARNER PROFILE: ${title}\n\n## [REQUIRED] Foundational Info\n- **Đối tượng:** ${audience}\n- **Độ tuổi:** 18+ (Kỹ sư & Lập trình viên)\n- **Quy mô lớp học:** 15 – 25 học viên\n- **Bối cảnh học tập:** Corporate Training / Bootcamp / Self-paced Engineering (Hybrid/Online)\n\n## [REQUIRED] Entry Level\n- **Nền tảng kỹ thuật:** Đã nắm vững logic lập trình cơ bản và cú pháp ngôn ngữ nền tảng.\n- **Yêu cầu công cụ:** Đã làm quen với môi trường IDE và Git version control.\n- **Tiêu chuẩn ngoại ngữ:** Đọc hiểu tài liệu kỹ thuật chuyên ngành bằng Tiếng Anh.\n\n## [REQUIRED] Goals & Motivations\n- **Thời lượng mỗi buổi:** 90 phút (40 phút Lý thuyết, 50 phút Hands-on Lab).\n- **Tổng số bài học:** ${totalLessons} bài học (${totalUnits} Unit x bài học tương ứng).\n- **Tổng thời lượng ước tính:** ${estimatedHours} giờ học (~${estimatedWeeks} tuần).\n- **Thiết bị học viên:** Laptop cá nhân cài đặt đầy đủ công cụ và runtime cần thiết.\n\n## [REQUIRED] Client Objectives\n- **Core Goal 1:** Làm chủ các khái niệm và nguyên lý cốt lõi được định nghĩa trong Knowledge Graph.\n- **Core Goal 2:** Vận dụng thành thạo để xây dựng đồ án thực tế đạt chuẩn công nghiệp.\n- **Standard Alignment:** IEEE/ACM CS2023 Curricula Standards.\n\n## [OPTIONAL] Student Characteristics\n- **Động lực:** Nâng cao năng lực chuyên môn và giải quyết các bài toán sản xuất thực tế.\n- **Phương pháp tiếp cận:** Thực hành Hands-on kết hợp mô hình sư phạm 5E.\n\n---\n- **Global Standard:** v1.2 (Canonical Curriculum OS Standard).\n- **Last Updated:** ${dateStr}.\n`;\n\n  // ─────────────────────────────────────────────────────────────\n  // 2. PROJECT_BRIEF.md\n  // ─────────────────────────────────────────────────────────────\n  const goalsSection = productGoals.length > 0\n    ? productGoals.map((g: any) => `- **${g.id || 'Goal'}:** ${g.description || g.title}`).join('\\n')\n    : `- **G1:** Xây dựng nền tảng kiến thức vững chắc bám sát Knowledge Graph.\\n- **G2:** Thực hành tái cấu trúc mã nguồn theo chuẩn kiến trúc chuyên nghiệp.`;\n\n  const projectBrief = `---\nid: \"${projectCode}-PROJECT-BRIEF\"\ntitle: \"Project Brief: ${title}\"\ntype: \"PROJECT_BRIEF\"\ncreated_by: \"Curriculum OS Converter\"\nphase: \"P1\"\ndeliverable: \"P1-T3\"\nversion: \"v1.2\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Project Context and Problem Statement\"\n  - \"Core Course Objectives\"\n  - \"Target Audience Profile\"\n  - \"Deliverables and Scope\"\n---\n\n# PROJECT BRIEF: ${title}\n\n## [REQUIRED] Project Context and Problem Statement\n- **Bối cảnh dự án:** ${description}\n- **Vấn đề cần giải quyết:** Xây dựng lộ trình đào tạo chuẩn hóa, chuyển đổi từ lý thuyết trừu tượng sang bài tập thực hành có thể chạy và đánh giá được.\n\n## [REQUIRED] Core Course Objectives\n${goalsSection}\n\n## [REQUIRED] Target Audience Profile\n- **Đối tượng:** ${audience}\n- **Mức độ cam kết:** Hoàn thành các bài lab thực hành sau mỗi buổi học.\n\n## [REQUIRED] Deliverables and Scope\n- **Tài liệu Nền tảng (7 Files SOT):** Learner Profile, Project Brief, Reference Pack, Curriculum Framework, Content Style Guide, Art Direction, Project Status.\n- **Học liệu bài học:** Bộ 4 học liệu (Giáo án 5E, Lab thực hành, Trắc nghiệm, Slide) cho toàn bộ ${totalLessons} bài học.\n\n---\n- **Global Standard:** v1.2 (Canonical Curriculum OS Standard).\n- **Last Updated:** ${dateStr}.\n`;\n\n  // ─────────────────────────────────────────────────────────────\n  // 3. REFERENCE_PACK.md\n  // ─────────────────────────────────────────────────────────────\n  const extractedKeywords = new Set<string>();\n  allMilestones.forEach(m => {\n    if (Array.isArray(m.tech_keywords)) {\n      m.tech_keywords.forEach((k: string) => extractedKeywords.add(k));\n    }\n  });\n\n  const keywordsList = Array.from(extractedKeywords).slice(0, 15).join(', ') || 'Core concepts, Standards, Best practices';\n\n  const referencePack = `---\nid: \"${projectCode}-REF-PACK\"\ntitle: \"Reference Pack: ${title}\"\ntype: \"REFERENCE_PACK\"\ncreated_by: \"Curriculum OS Converter\"\nphase: \"P1\"\ndeliverable: \"P1-T2\"\nversion: \"v1.2\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Official Standards and Specifications\"\n  - \"Pedagogical and Engineering References\"\n---\n\n# REFERENCE PACK: ${title}\n\n## [REQUIRED] Official Standards and Specifications\n- **Core Technology Keywords:** ${keywordsList}\n- **Architecture References:** ${architecture.join(', ') || 'Clean Architecture, Modular Components'}\n- **Official Documentation:** Trích dẫn các tài liệu hướng dẫn và đặc tả kỹ thuật chính thức từ nhà sản xuất/tổ chức phát triển.\n\n## [REQUIRED] Pedagogical and Engineering References\n- **5E Instructional Model (Bybee et al.):** Mô hình kiến tạo 5 pha sư phạm.\n- **Bloom's Revised Taxonomy:** Thang đo mục tiêu năng lực nhận thức.\n- **IEEE/ACM CS2023:** Khung chuẩn chương trình Khoa học Máy tính quốc tế.\n\n---\n- **Global Standard:** v1.2 (Canonical Curriculum OS Standard).\n- **Last Updated:** ${dateStr}.\n`;\n\n  // ─────────────────────────────────────────────────────────────\n  // 4. CURRICULUM_FRAMEWORK.md\n  // ─────────────────────────────────────────────────────────────\n  let hierarchyRows = '';\n  phases.forEach((p: any, idx: number) => {\n    const unitNum = String(idx + 1).padStart(2, '0');\n    const unitTitle = p.phase_name || `Unit ${unitNum}`;\n    const mCount = Array.isArray(p.milestones) ? p.milestones.length : 1;\n    hierarchyRows += `| **Unit ${unitNum}: ${unitTitle}** | U${unitNum}_M01: Core Competencies | ${mCount} | ${p.description || p.target_outcome || 'Làm chủ các khái niệm trong Unit'} |\\n`;\n  });\n\n  let scopeSequenceRows = '';\n  let globalCounter = 1;\n  phases.forEach((p: any, pIdx: number) => {\n    const unitNum = String(pIdx + 1).padStart(2, '0');\n    if (Array.isArray(p.milestones)) {\n      p.milestones.forEach((m: any, mIdx: number) => {\n        const lessonNum = String(mIdx + 1).padStart(2, '0');\n        const lessonCode = `U${unitNum}_M01_L${lessonNum}`;\n        const lessonTitle = m.name || m.concept_code || `Lesson ${lessonNum}`;\n        const concept = m.concept_code || 'Core Concept';\n        const prereqs = Array.isArray(m.prerequisite_concept_codes) && m.prerequisite_concept_codes.length > 0\n          ? m.prerequisite_concept_codes.join(', ')\n          : (mIdx === 0 ? 'None' : `Lesson ${mIdx}`);\n        const bloom = m.bloom_level || 'Apply';\n\n        scopeSequenceRows += `| ${String(globalCounter).padStart(2, '0')} | **${lessonCode}** | ${lessonTitle} | Unit ${unitNum} | ${concept} | ${prereqs} | ${bloom} |\\n`;\n        globalCounter++;\n      });\n    }\n  });\n\n  const curriculumFramework = `---\nid: \"${projectCode}-FRAMEWORK\"\ntitle: \"Curriculum Framework: ${title}\"\ntype: \"CURRICULUM_FRAMEWORK\"\ncreated_by: \"Curriculum OS Converter\"\nphase: \"P2\"\ndeliverable: \"P2-T1\"\nversion: \"v1.2\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Course Overview\"\n  - \"Global Learning Objectives\"\n  - \"Structural Hierarchy (Unit & Module)\"\n  - \"Scope & Sequence (Detailed Roadmap)\"\n  - \"Standard Lesson Format\"\n---\n\n# CURRICULUM FRAMEWORK: ${title}\n\n_Based on: LEARNER_PROFILE.md v1.2_\n\n## [REQUIRED] Course Overview\n- **Official Course Name:** ${title}\n- **Short Description:** ${description}\n- **Total Units:** ${totalUnits} Unit (U01 – U${String(totalUnits).padStart(2, '0')})\n- **Total Lessons:** ${totalLessons} bài học\n- **Total Duration:** ${estimatedHours} giờ học (${totalLessons} buổi x 90 phút).\n\n## [REQUIRED] Global Learning Objectives\n1. **[Bloom 4 - Analyze]:** Phân tích và hiểu sâu các khái niệm kỹ thuật trong lộ trình.\n2. **[Bloom 5 - Evaluate]:** Đánh giá các giải pháp công nghệ và thiết kế kiến trúc phù hợp với ngữ cảnh.\n3. **[Bloom 6 - Create]:** Xây dựng các đồ án thực hành hoàn chỉnh, tối ưu và kiểm thử tự động.\n\n## [REQUIRED] Structural Hierarchy (Unit & Module)\n| Unit | Module | Lessons | Module Objectives |\n|---|---|:---:|---|\n${hierarchyRows || '| **Unit 01: Core Foundations** | U01_M01: Basics | 4 | Nắm vững kiến thức nền tảng |\\n'}\n\n## [REQUIRED] Scope & Sequence (Detailed Roadmap)\n| # | Mã bài | Tên bài học | Unit | Concept chính | Tiền đề (Prerequisites) | Bloom Level |\n|:---:|:---:|---|---|---|---|:---:|\n${scopeSequenceRows || '| 01 | **U01_M01_L01** | Introduction & Setup | Unit 01 | Setup | None | Understand |\\n'}\n\n## [REQUIRED] Standard Lesson Format\n- **Tổng thời lượng mỗi bài:** 90 phút.\n- **Phân bổ sư phạm 5E:**\n  * **Engage (10m):** Đặt vấn đề bằng tình huống thực tế.\n  * **Explore (20m):** Khám phá mô hình và phân tích cơ chế.\n  * **Explain (25m):** Giảng viên phân tích nguyên lý kỹ thuật cốt lõi.\n  * **Elaborate (25m):** Hands-on Lab thực hành trên dự án mẫu.\n  * **Evaluate (10m):** Câu hỏi trắc nghiệm chẩn đoán và rubric.\n\n---\n- **Global Standard:** v1.2 (Canonical Curriculum OS Standard).\n- **Last Updated:** ${dateStr}.\n`;\n\n  // ─────────────────────────────────────────────────────────────\n  // 5. CONTENT_STYLE_GUIDE.md\n  // ─────────────────────────────────────────────────────────────\n  const contentStyleGuide = `---\nid: \"${projectCode}-STYLE-GUIDE\"\ntitle: \"Content Style Guide: ${title}\"\ntype: \"CONTENT_STYLE_GUIDE\"\ncreated_by: \"Curriculum OS Converter\"\nphase: \"P2\"\ndeliverable: \"P2-T2\"\nversion: \"v1.2\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Tone and Voice\"\n  - \"Code Standards and Conventions\"\n  - \"Pedagogical Structure (5E Model)\"\n---\n\n# CONTENT STYLE GUIDE: ${title}\n\n## [REQUIRED] Tone and Voice\n- **Tông điệu:** Chuyên nghiệp, truyền cảm hứng, tính thực tiễn cao (Engineering-first).\n- **Ngôn ngữ:** Tiếng Việt mạch lạc, giữ nguyên thuật ngữ kỹ thuật quốc tế bằng Tiếng Anh.\n\n## [REQUIRED] Code Standards and Conventions\n- **Tính thực thi:** 100% mã nguồn trong bài giảng, lab thực hành và trắc nghiệm phải chạy được không có lỗi cú pháp.\n- **Cấu trúc:** Có chú thích rõ ràng mục đích từng khối lệnh và so sánh giải pháp cũ vs mới.\n\n## [REQUIRED] Pedagogical Structure (5E Model)\nMỗi bài học 90 phút bắt buộc tuân theo 5 pha: Engage (10m) $\\rightarrow$ Explore (20m) $\\rightarrow$ Explain (25m) $\\rightarrow$ Elaborate (25m) $\\rightarrow$ Evaluate (10m).\n\n---\n- **Global Standard:** v1.2 (Canonical Curriculum OS Standard).\n- **Last Updated:** ${dateStr}.\n`;\n\n  // ─────────────────────────────────────────────────────────────\n  // 6. ART_DIRECTION.md\n  // ─────────────────────────────────────────────────────────────\n  const artDirection = `---\nid: \"${projectCode}-ART-DIRECTION\"\ntitle: \"Art Direction: ${title}\"\ntype: \"ART_DIRECTION\"\ncreated_by: \"Curriculum OS Converter\"\nphase: \"P2\"\ndeliverable: \"P2-T3\"\nversion: \"v1.2\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Design Theme and Mood\"\n  - \"Color System and Palette\"\n  - \"Diagram and Visualization Guidelines\"\n---\n\n# ART DIRECTION: ${title}\n\n## [REQUIRED] Design Theme and Mood\n- **Phong cách:** Modern Minimalist Dark Mode với Apple Engineering Aesthetics.\n- **Cảm xúc:** Tinh tế, hiện đại, tập trung cao.\n\n## [REQUIRED] Color System and Palette\n- **Màu Chủ Đạo:** Apple Amber (\\`#F59E0B\\`)\n- **Màu Thành Công / An Toàn:** Emerald Green (\\`#10B981\\`)\n- **Màu Luồng Dữ Liệu:** Electric Cyan (\\`#06B6D4\\`)\n- **Màu Cảnh Báo:** Crimson Rose (\\`#F43F5E\\`)\n\n## [REQUIRED] Diagram and Visualization Guidelines\nSử dụng chuẩn Mermaid Sequence Diagram và State Diagram để mô tả luồng thực thi và quan hệ giữa các thành phần.\n\n---\n- **Global Standard:** v1.2 (Canonical Curriculum OS Standard).\n- **Last Updated:** ${dateStr}.\n`;\n\n  // ─────────────────────────────────────────────────────────────\n  // 7. PROJECT_STATUS.md\n  // ─────────────────────────────────────────────────────────────\n  let statusMatrixRows = '';\n  let lessonCounter = 1;\n  phases.forEach((p: any, pIdx: number) => {\n    const unitNum = String(pIdx + 1).padStart(2, '0');\n    if (Array.isArray(p.milestones)) {\n      p.milestones.forEach((m: any, mIdx: number) => {\n        const lessonNum = String(mIdx + 1).padStart(2, '0');\n        const lessonCode = `U${unitNum}_M01_L${lessonNum}`;\n        const lessonTitle = m.name || m.concept_code || `Lesson ${lessonNum}`;\n        statusMatrixRows += `| **${lessonCode}** | ${lessonTitle} | ⏳ | ⏳ | ⏳ | ⏳ | **Hàng đợi** |\\n`;\n        lessonCounter++;\n      });\n    }\n  });\n\n  const projectStatus = `---\nid: \"${projectCode}-PROJECT-STATUS\"\ntitle: \"Project Status: ${title}\"\ntype: \"PROJECT_STATUS\"\ncreated_by: \"Curriculum OS Converter\"\nphase: \"P1\"\ndeliverable: \"P1-T4\"\nversion: \"v1.2\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\n---\n\n# PROJECT STATUS: ${title}\n\n## [REQUIRED] Phase Status\n- **Phase 01: SOT & Brief:** ✅ **100% Hoàn thành** (7/7 Files sẵn sàng, Gate 1 Approved).\n- **Phase 02: Kiến trúc & Thiết kế:** ✅ **100% Hoàn thành** (Gate 2 Approved).\n- **Phase 03: Sản xuất Học liệu:** 🚀 **Sẵn sàng khởi chạy** (0/${totalLessons} bài học hoàn tất).\n- **Phase 04: Xuất bản & Đóng gói:** ⏳ Chờ hoàn tất bài học.\n\n## [REQUIRED] Physical Artifacts Matrix\n| Mã bài học | Tên bài học | Giáo án 5E | Lab thực hành | Trắc nghiệm | Slide | Trạng thái |\n| :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n${statusMatrixRows || '| **U01_M01_L01** | Introduction & Setup | ⏳ | ⏳ | ⏳ | ⏳ | **Hàng đợi** |\\n'}\n\n---\n- **Global Standard:** v1.2 (Canonical Curriculum OS Standard).\n- **Last Updated:** ${dateStr}.\n`;\n\n  return {\n    learnerProfile,\n    projectBrief,\n    referencePack,\n    curriculumFramework,\n    contentStyleGuide,\n    artDirection,\n    projectStatus,\n  };\n}\n\n/**\n * High-level function to import Roadmap JSON and Project Graph JSON into storage as a fully initialized SOT project.\n */\nexport async function importRoadmapToProject(\n  storage: ICurriculumStorage,\n  projectId: string,\n  roadmapInput: any,\n  projectGraphInput?: any\n): Promise<ProjectStatusReport> {\n  const bundle = convertRoadmapToFoundationSot(roadmapInput, projectGraphInput);\n\n  await storage.saveArtifact(projectId, '_sot/LEARNER_PROFILE.md', bundle.learnerProfile);\n  await storage.saveArtifact(projectId, '_sot/PROJECT_BRIEF.md', bundle.projectBrief);\n  await storage.saveArtifact(projectId, '_sot/REFERENCE_PACK.md', bundle.referencePack);\n  await storage.saveArtifact(projectId, '_sot/CURRICULUM_FRAMEWORK.md', bundle.curriculumFramework);\n  await storage.saveArtifact(projectId, '_sot/CONTENT_STYLE_GUIDE.md', bundle.contentStyleGuide);\n  await storage.saveArtifact(projectId, '_sot/ART_DIRECTION.md', bundle.artDirection);\n  await storage.saveArtifact(projectId, '_sot/PROJECT_STATUS.md', bundle.projectStatus);\n\n  return storage.getProjectStatus(projectId);\n}\n","export * from './markdownSerializers';\nexport * from './selfPacedSerializers';\nexport * from './autonomousRepair';\nexport * from './milestoneBundleGenerator';\nexport * from './roadmapCurriculumGenerator';\nexport * from './projectInstructionGenerator';\nexport * from './generateSelfPacedBundle';\nexport * from './roadmapSotAdapter';\nexport * from './artifactLinter';\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport type { \n  ICurriculumStorage, \n  SotDocument, \n  LessonArtifactSummary, \n  ProjectStatusReport,\n  PipelineState,\n  ArtifactLifecycleInfo\n} from './types';\nexport function computeContentHash(content: string): string {\n  return 'sha256:' + crypto.createHash('sha256').update(content.trim(), 'utf-8').digest('hex');\n}\n\nexport const STANDARD_SOT_FILES = [\n  'LEARNER_PROFILE.md',\n  'PROJECT_BRIEF.md',\n  'REFERENCE_PACK.md',\n  'PROJECT_GRAPH.json',\n  'HYBRID_GRAPH.json',\n  'CURRICULUM_FRAMEWORK.md',\n  'CONTENT_STYLE_GUIDE.md',\n  'ART_DIRECTION.md',\n  'ALIGNMENT_MATRIX.md',\n];\n\nexport interface FileSystemStorageOptions {\n  baseDir?: string;\n}\n\n/**\n * Atomic single-file write (5-Whys RC-race, 2026-09-13): write to a unique\n * temp file in the SAME directory, then `rename` over the target. On POSIX a\n * rename within a filesystem is atomic — a concurrent reader sees either the\n * old or the new complete file, never a torn write, and two racing writers\n * each land a complete file (last rename wins) instead of interleaved halves.\n * Previously a direct writeFileSync let the double-run race truncate/clobber\n * companion files (deck.json / .html disappeared while the .md survived).\n */\nexport function atomicWriteFileSync(targetPath: string, content: string): void {\n  const dir = path.dirname(targetPath);\n  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n  const tmpPath = path.join(dir, `.${path.basename(targetPath)}.${process.pid}.${Date.now()}.${crypto.randomBytes(4).toString('hex')}.tmp`);\n  try {\n    fs.writeFileSync(tmpPath, content, 'utf-8');\n    fs.renameSync(tmpPath, targetPath);\n  } catch (err) {\n    // Best-effort temp cleanup; never mask the original error.\n    try { if (fs.existsSync(tmpPath)) fs.unlinkSync(tmpPath); } catch {}\n    throw err;\n  }\n}\n\nexport class FileSystemCurriculumAdapter implements ICurriculumStorage {\n  private baseDir: string;\n\n  constructor(options: FileSystemStorageOptions = {}) {\n    this.baseDir = options.baseDir || path.resolve(process.cwd(), 'output', 'projects');\n  }\n\n  private getProjectDir(projectId: string): string {\n    const raw = (projectId || '').replace('proj_', '');\n    const directPath = path.join(this.baseDir, raw);\n    if (fs.existsSync(directPath)) return directPath;\n    const fullIdPath = path.join(this.baseDir, projectId);\n    if (fs.existsSync(fullIdPath)) return fullIdPath;\n    return directPath;\n  }\n\n  /** Ensures the resolved path stays within the project directory (prevents path traversal). */\n  private assertInsideProject(projectDir: string, targetPath: string): void {\n    const resolvedProject = path.resolve(projectDir);\n    const resolvedTarget = path.resolve(targetPath);\n    if (!resolvedTarget.startsWith(resolvedProject + path.sep) && resolvedTarget !== resolvedProject) {\n      throw new Error(`[FileSystemCurriculumAdapter] Path traversal blocked: ${targetPath} is outside project directory ${projectDir}`);\n    }\n  }\n\n  async projectExists(projectId: string): Promise<boolean> {\n    return fs.existsSync(this.getProjectDir(projectId));\n  }\n\n  async readSotDocument(projectId: string, filename: string): Promise<string | null> {\n    const projectDir = this.getProjectDir(projectId);\n    const possiblePaths = [\n      path.join(projectDir, '_sot', filename),\n      path.join(projectDir, filename),\n    ];\n\n    for (const p of possiblePaths) {\n      if (fs.existsSync(p) && fs.statSync(p).isFile()) {\n        return fs.readFileSync(p, 'utf-8');\n      }\n    }\n    return null;\n  }\n\n  async listSotDocuments(projectId: string): Promise<SotDocument[]> {\n    const projectDir = this.getProjectDir(projectId);\n    const sotDir = path.join(projectDir, '_sot');\n\n    const discoveredFiles = new Set<string>(STANDARD_SOT_FILES);\n    if (fs.existsSync(sotDir)) {\n      try {\n        const diskFiles = fs.readdirSync(sotDir);\n        for (const f of diskFiles) {\n          if (f.startsWith('.') || f.endsWith('.review.json')) continue;\n          const fullPath = path.join(sotDir, f);\n          if (fs.statSync(fullPath).isFile()) {\n            discoveredFiles.add(f);\n          }\n        }\n      } catch {}\n    }\n\n    return Array.from(discoveredFiles).map(filename => {\n      const p = fs.existsSync(path.join(sotDir, filename))\n        ? path.join(sotDir, filename)\n        : (fs.existsSync(path.join(projectDir, filename)) ? path.join(projectDir, filename) : null);\n\n      if (p && fs.existsSync(p)) {\n        const stats = fs.statSync(p);\n        return {\n          name: filename.replace(/\\.(md|json)$/i, '').replace(/_/g, ' '),\n          filename,\n          exists: true,\n          sizeBytes: stats.size\n        };\n      }\n\n      return {\n        name: filename.replace(/\\.(md|json)$/i, '').replace(/_/g, ' '),\n        filename,\n        exists: false,\n        sizeBytes: 0\n      };\n    });\n  }\n\n  async readArtifact(projectId: string, relPathOrIdentifier: string): Promise<string | null> {\n    const projectDir = this.getProjectDir(projectId);\n\n    // Block path traversal attempts\n    const directCandidate = path.join(projectDir, relPathOrIdentifier);\n    this.assertInsideProject(projectDir, directCandidate);\n\n    // 1. Direct file path lookup\n    const possiblePaths = [\n      directCandidate,\n      path.join(projectDir, '_sot', relPathOrIdentifier),\n      path.join(projectDir, 'lessons', relPathOrIdentifier),\n      path.join(projectDir, '_sot', path.basename(relPathOrIdentifier)),\n      path.join(projectDir, 'lessons', path.basename(relPathOrIdentifier)),\n    ];\n\n    for (const p of possiblePaths) {\n      if (fs.existsSync(p) && fs.statSync(p).isFile()) {\n        return fs.readFileSync(p, 'utf-8');\n      }\n    }\n\n    // If relPathOrIdentifier was an explicit filename with extension, don't guess\n    if (relPathOrIdentifier.includes('.md') || relPathOrIdentifier.includes('/')) {\n      return null;\n    }\n\n    // 2. Intelligent Identifier Resolution for query strings (e.g. \"U01_M01_L01 — Giáo án 5E\")\n    const lessonMatch = relPathOrIdentifier.match(/U\\d+_M\\d+_L\\d+/i);\n    if (lessonMatch) {\n      const lessonId = lessonMatch[0].toUpperCase();\n      const lessonDir = path.join(projectDir, 'lessons', lessonId);\n\n      if (fs.existsSync(lessonDir) && fs.statSync(lessonDir).isDirectory()) {\n        const lower = relPathOrIdentifier.toLowerCase();\n        let artifactPrefix = 'LESSON';\n        if (lower.includes('act') || lower.includes('lab') || lower.includes('thực hành')) {\n          artifactPrefix = 'ACT';\n        } else if (lower.includes('quiz') || lower.includes('trắc nghiệm') || lower.includes('đánh giá')) {\n          artifactPrefix = 'QUIZ';\n        } else if (lower.includes('slide') || lower.includes('bài giảng') || lower.includes('trình chiếu')) {\n          artifactPrefix = 'SLIDE';\n        } else if (lower.includes('guide') || lower.includes('hướng dẫn')) {\n          artifactPrefix = 'GUIDE';\n        } else if (lower.includes('wks') || lower.includes('worksheet') || lower.includes('phiếu bài tập')) {\n          artifactPrefix = 'WKS';\n        } else if (lower.includes('handout') || lower.includes('tài liệu')) {\n          artifactPrefix = 'HANDOUT';\n        } else if (lower.includes('code')) {\n          artifactPrefix = 'CODE';\n        } else if (lower.includes('ext') || lower.includes('extension')) {\n          artifactPrefix = 'EXT';\n        }\n\n        const candidateFile = path.join(lessonDir, `${artifactPrefix}_${lessonId}.md`);\n        if (fs.existsSync(candidateFile)) {\n          return fs.readFileSync(candidateFile, 'utf-8');\n        }\n      }\n    }\n\n    return null;\n  }\n\n  async saveArtifact(projectId: string, relPath: string, content: string): Promise<void> {\n    const projectDir = this.getProjectDir(projectId);\n    const targetPath = path.join(projectDir, relPath);\n    this.assertInsideProject(projectDir, targetPath);\n    const targetDir = path.dirname(targetPath);\n\n    if (!fs.existsSync(targetDir)) {\n      fs.mkdirSync(targetDir, { recursive: true });\n    }\n\n    // Version history (P2): ghi đè file đã tồn tại → chép bản cũ vào .history/ trước (giữ tối đa 10 bản gần nhất)\n    if (fs.existsSync(targetPath)) {\n      try {\n        const oldContent = fs.readFileSync(targetPath, 'utf-8');\n        if (oldContent !== content) {\n          const historyDir = path.join(projectDir, '.history', relPath);\n          fs.mkdirSync(historyDir, { recursive: true });\n          atomicWriteFileSync(path.join(historyDir, `${Date.now()}.md`), oldContent);\n          const versions = fs.readdirSync(historyDir).filter((f) => f.endsWith('.md')).sort();\n          while (versions.length > 10) {\n            fs.unlinkSync(path.join(historyDir, versions.shift() as string));\n          }\n        }\n      } catch (histErr: any) {\n        // History failure KHÔNG chặn ghi chính — nhưng không âm thầm: log rõ\n        console.warn('[FileSystemCurriculumAdapter] version history snapshot failed:', histErr?.message || histErr);\n      }\n    }\n\n    atomicWriteFileSync(targetPath, content);\n\n    // Phase 2: Automatic entity sidecar generation alongside markdown\n    // Also auto-sync to lessons/ directory if this is a lesson artifact (e.g. _content/U01/SLIDE_U01_M01_L01.md)\n    const filename = path.basename(relPath);\n    const match = filename.match(/(LESSON|ACT|QUIZ|SLIDE|GUIDE|HANDOUT|WKS|EXT)_(U\\d+_M\\d+_L\\d+)\\.md/i);\n    if (match) {\n      const lessonId = match[2].toUpperCase();\n      atomicWriteFileSync(path.join(projectDir, 'lessons', lessonId, filename), content);\n\n      // Also sync to legacy _content/U01_M01_L01/ folder if it exists\n      const legacyContentDir = path.join(projectDir, '_content', lessonId);\n      if (fs.existsSync(legacyContentDir)) {\n        atomicWriteFileSync(path.join(legacyContentDir, filename), content);\n      }\n    }\n  }\n\n  async listLessons(projectId: string): Promise<LessonArtifactSummary[]> {\n    const lessonsDir = path.join(this.getProjectDir(projectId), 'lessons');\n    if (!fs.existsSync(lessonsDir)) return [];\n\n    const lessonFolders = fs.readdirSync(lessonsDir).filter(f => !f.startsWith('.'));\n    return lessonFolders.map(folder => {\n      const lDir = path.join(lessonsDir, folder);\n      const isDir = fs.statSync(lDir).isDirectory();\n      if (!isDir) {\n        return {\n          lessonId: folder,\n          artifactsCount: 0,\n          isComplete: false,\n          artifacts: []\n        };\n      }\n\n      const artifacts = fs.readdirSync(lDir).filter(f => !f.startsWith('.'));\n      return {\n        lessonId: folder,\n        artifactsCount: artifacts.length,\n        isComplete: artifacts.length >= 4,\n        artifacts\n      };\n    });\n  }\n\n  async getProjectStatus(projectId: string): Promise<ProjectStatusReport> {\n    const sotList = await this.listSotDocuments(projectId);\n    const lessons = await this.listLessons(projectId);\n\n    const completedCount = lessons.filter(l => l.isComplete).length;\n    const totalLessons = lessons.length || 4;\n    const progressPercent = Math.round((completedCount / totalLessons) * 100);\n\n    const sotTable = sotList.map(doc => `| \\`${doc.filename}\\` | ${doc.exists ? '✅ Sẵn sàng' : '❌ Chưa có'} |`).join('\\n');\n    const lessonTable = lessons.length > 0 \n      ? lessons.map(l => `| **${l.lessonId}** | ${l.artifactsCount}/4 Artifacts | ${l.isComplete ? '✅ Hoàn tất' : '⏳ Đang tạo sinh'} | ${l.artifacts.join(', ') || '-'} |`).join('\\n')\n      : '| Chưa có bài học nào trên đĩa cứng | 0/4 | ⏳ Chờ chạy | - |';\n\n    const rawMarkdownReport = `## 📊 BÁO CÁO TRẠNG THÁI DỰ ÁN: \\`${projectId.toUpperCase()}\\`\n\n### 1. Nền tảng Tài liệu (SOT Readiness)\n| Tài liệu SOT | Trạng thái |\n|---|:---:|\n${sotTable}\n\n### 2. Danh mục Bài học & Học liệu (Lessons & Artifacts Matrix)\n| Mã bài học | Số lượng Artifact | Trạng thái | Danh sách Artifact đã tạo |\n|---|:---:|:---:|---|\n${lessonTable}\n\n**Tiến độ tổng thể:** ${completedCount}/${totalLessons} bài học (${progressPercent}%)\n\n### 3. Đề xuất Hành động Tiếp theo:\n- Sử dụng lệnh \\`/create-lesson <id>\\` để tạo sinh các bài học tiếp theo trong pipeline.\n- Sử dụng lệnh \\`/audit-quality\\` để chạy kiểm thử tiêu chuẩn Bloom và Alignment Matrix.`;\n\n    return {\n      projectId,\n      sotReadiness: sotList,\n      lessons,\n      completedCount,\n      totalLessons,\n      progressPercent,\n      rawMarkdownReport\n    };\n  }\n\n  async getPipelineState(projectId: string): Promise<PipelineState> {\n    const projectDir = this.getProjectDir(projectId);\n    const stateFile = path.join(projectDir, '_pipeline', 'state.json');\n\n    if (fs.existsSync(stateFile)) {\n      try {\n        const raw = fs.readFileSync(stateFile, 'utf-8');\n        const parsed = JSON.parse(raw);\n        if (parsed && typeof parsed === 'object' && parsed.tasks) {\n          return parsed as PipelineState;\n        }\n      } catch (err) {\n        console.warn(`[FileSystemCurriculumAdapter] Error reading pipeline state for ${projectId}:`, err);\n      }\n    }\n\n    // Default empty pipeline state\n    return {\n      projectId,\n      updatedAt: new Date().toISOString(),\n      tasks: {}\n    };\n  }\n\n  async savePipelineState(projectId: string, state: PipelineState): Promise<void> {\n    const projectDir = this.getProjectDir(projectId);\n    const pipelineDir = path.join(projectDir, '_pipeline');\n\n    if (!fs.existsSync(pipelineDir)) {\n      fs.mkdirSync(pipelineDir, { recursive: true });\n    }\n\n    const stateFile = path.join(pipelineDir, 'state.json');\n    state.updatedAt = new Date().toISOString();\n    atomicWriteFileSync(stateFile, JSON.stringify(state, null, 2));\n  }\n\n  async updateArtifactState(\n    projectId: string,\n    taskId: string,\n    artifactType: string,\n    update: Partial<ArtifactLifecycleInfo>\n  ): Promise<PipelineState> {\n    const current = await this.getPipelineState(projectId);\n    if (!current.tasks[taskId]) {\n      current.tasks[taskId] = {};\n    }\n\n    const existingInfo = current.tasks[taskId][artifactType] || {\n      state: 'pending',\n    };\n\n    current.tasks[taskId][artifactType] = {\n      ...existingInfo,\n      ...update,\n    };\n\n    await this.savePipelineState(projectId, current);\n    return current;\n  }\n\n  /** Disk adapter: purge = rm the file (best-effort, mirrors cloud deleteArtifact). */\n  async deleteArtifact(projectId: string, relPath: string): Promise<void> {\n    try {\n      const projectDir = this.getProjectDir(projectId);\n      const targetPath = path.join(projectDir, relPath);\n      this.assertInsideProject(projectDir, targetPath);\n      if (fs.existsSync(targetPath)) fs.rmSync(targetPath, { force: true });\n    } catch { /* best-effort */ }\n  }\n}\n","import { createClient, type SupabaseClient } from '@supabase/supabase-js';\nimport type { MilestoneCurriculumBundle } from '../pipeline';\nimport type { \n  ICurriculumStorage, \n  SotDocument, \n  LessonArtifactSummary, \n  ProjectStatusReport \n} from './types';\nimport { STANDARD_SOT_FILES } from './fileSystemCurriculumAdapter';\n\nexport interface SupabaseStorageConfig {\n  supabaseUrl?: string;\n  supabaseServiceRoleKey?: string;\n  bucketName?: string;\n  client?: SupabaseClient;\n}\n\n/**\n * Supabase Curriculum Adapter — Syncs Markdown artifacts to Storage & Database\n * Implements ICurriculumStorage for multi-tenant Cloud deployment (Vercel, Netlify, Cloudflare, etc.).\n */\nexport class SupabaseCurriculumAdapter implements ICurriculumStorage {\n  private client: SupabaseClient;\n  private bucketName: string;\n\n  constructor(config: SupabaseStorageConfig = {}) {\n    this.bucketName = config.bucketName || process.env.SUPABASE_STORAGE_BUCKET || 'course-materials';\n\n    if (config.client) {\n      this.client = config.client;\n    } else {\n      const url = config.supabaseUrl || process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || '';\n      const key =\n        config.supabaseServiceRoleKey ||\n        process.env.SUPABASE_SERVICE_ROLE_KEY ||\n        process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n        '';\n\n      if (!url || !key) {\n        throw new Error('Supabase URL or Key is missing in SupabaseCurriculumAdapter');\n      }\n\n      this.client = createClient(url, key);\n    }\n  }\n\n  async projectExists(projectId: string): Promise<boolean> {\n    try {\n      const { data, error } = await this.client.storage\n        .from(this.bucketName)\n        .list(projectId, { limit: 5 });\n      return !error && !!data && data.length > 0;\n    } catch {\n      return false;\n    }\n  }\n\n  async readSotDocument(projectId: string, filename: string): Promise<string | null> {\n    const paths = [\n      `${projectId}/_sot/${filename}`,\n      `${projectId}/${filename}`,\n      `${projectId}/_designer/${filename}`,\n      `${projectId}/_analyst/${filename}`\n    ];\n    for (const p of paths) {\n      try {\n        const { data, error } = await this.client.storage.from(this.bucketName).download(p);\n        if (!error && data) {\n          return await data.text();\n        }\n      } catch {}\n    }\n    return null;\n  }\n\n  async listSotDocuments(projectId: string): Promise<SotDocument[]> {\n    const discoveredFiles = new Set<string>(STANDARD_SOT_FILES);\n    try {\n      const { data, error } = await this.client.storage\n        .from(this.bucketName)\n        .list(`${projectId}/_sot`);\n      if (!error && data) {\n        for (const item of data) {\n          if (item.name && !item.name.startsWith('.') && !item.name.endsWith('.review.json')) {\n            discoveredFiles.add(item.name);\n          }\n        }\n      }\n    } catch {}\n\n    const results: SotDocument[] = [];\n    for (const filename of discoveredFiles) {\n      const content = await this.readSotDocument(projectId, filename);\n      results.push({\n        name: filename.replace(/\\.(md|json)$/i, '').replace(/_/g, ' '),\n        filename,\n        exists: !!content,\n        content: content || undefined,\n        sizeBytes: content ? content.length : 0\n      });\n    }\n    return results;\n  }\n\n  async readArtifact(projectId: string, relPathOrIdentifier: string): Promise<string | null> {\n    const cleanPath = relPathOrIdentifier.replace(/^\\//, '');\n\n    // 1. Direct path lookup attempts\n    const possiblePaths = [\n      `${projectId}/${cleanPath}`,\n      `${projectId}/_sot/${cleanPath}`,\n      `${projectId}/_content/${cleanPath}`,\n      `${projectId}/lessons/${cleanPath}`,\n      `${projectId}/_sot/${cleanPath.split('/').pop()}`,\n      `${projectId}/lessons/${cleanPath.split('/').pop()}`,\n    ];\n\n    for (const p of possiblePaths) {\n      try {\n        const { data, error } = await this.client.storage.from(this.bucketName).download(p);\n        if (!error && data) {\n          return await data.text();\n        }\n      } catch {}\n    }\n\n    // If relPathOrIdentifier was an explicit filename with extension or path, don't guess\n    if (relPathOrIdentifier.includes('.md') || relPathOrIdentifier.includes('.json') || relPathOrIdentifier.includes('/')) {\n      return null;\n    }\n\n    // 2. Intelligent Identifier Resolution (e.g. \"U01_M01_L01 — Giáo án 5E\" or \"U01_M01_L01\")\n    const lessonMatch = relPathOrIdentifier.match(/U\\d+_M\\d+_L\\d+/i);\n    if (lessonMatch) {\n      const lessonId = lessonMatch[0].toUpperCase();\n      const unitCode = lessonId.split('_')[0] || 'U01';\n      const lower = relPathOrIdentifier.toLowerCase();\n\n      let artifactPrefix: string | null = null;\n      if (lower.includes('act') || lower.includes('lab') || lower.includes('thực hành')) {\n        artifactPrefix = 'ACT';\n      } else if (lower.includes('quiz') || lower.includes('trắc nghiệm') || lower.includes('đánh giá')) {\n        artifactPrefix = 'QUIZ';\n      } else if (lower.includes('slide') || lower.includes('bài giảng') || lower.includes('trình chiếu')) {\n        artifactPrefix = 'SLIDE';\n      } else if (lower.includes('guide') || lower.includes('hướng dẫn')) {\n        artifactPrefix = 'GUIDE';\n      } else if (lower.includes('wks') || lower.includes('worksheet') || lower.includes('phiếu bài tập')) {\n        artifactPrefix = 'WKS';\n      } else if (lower.includes('handout') || lower.includes('tài liệu')) {\n        artifactPrefix = 'HANDOUT';\n      } else if (lower.includes('code')) {\n        artifactPrefix = 'CODE';\n      } else if (lower.includes('ext') || lower.includes('extension') || lower.includes('mở rộng')) {\n        artifactPrefix = 'EXT';\n      } else if (lower.includes('exp') || lower.includes('exposition') || lower.includes('tự học') || lower.includes('kiến thức nền')) {\n        artifactPrefix = 'EXPOSITION';\n      } else if (lower.includes('rubric')) {\n        artifactPrefix = 'RUBRIC';\n      } else if (lower.includes('bom')) {\n        artifactPrefix = 'BOM';\n      } else if (lower.includes('lesson') || lower.includes('giáo án') || lower.includes('5e')) {\n        artifactPrefix = 'LESSON';\n      }\n\n      if (!artifactPrefix) {\n        return null;\n      }\n\n      const candidatePaths = [\n        `${projectId}/_content/${unitCode}/${artifactPrefix}_${lessonId}.md`,\n        `${projectId}/lessons/${lessonId}/${artifactPrefix}_${lessonId}.md`,\n        `${projectId}/${artifactPrefix}_${lessonId}.md`,\n      ];\n\n      for (const p of candidatePaths) {\n        try {\n          const { data, error } = await this.client.storage.from(this.bucketName).download(p);\n          if (!error && data) {\n            return await data.text();\n          }\n        } catch {}\n      }\n    }\n\n    return null;\n  }\n\n  async saveArtifact(projectId: string, relPath: string, content: string): Promise<void> {\n    const fullPath = `${projectId}/${relPath.replace(/^\\//, '')}`;\n    const { error } = await this.client.storage\n      .from(this.bucketName)\n      .upload(fullPath, Buffer.from(content, 'utf-8'), {\n        contentType: 'text/markdown',\n        upsert: true,\n      });\n\n    if (error) {\n      throw new Error(`Failed to upload artifact to Supabase Storage: ${error.message}`);\n    }\n\n    // Optional DB Upsert for fast indexed searching if artifacts table exists\n    try {\n      await this.client.from('curriculum_artifacts').upsert({\n        project_id: projectId,\n        rel_path: relPath,\n        content: content,\n        updated_at: new Date().toISOString(),\n      }, { onConflict: 'project_id,rel_path' });\n    } catch {\n      // Ignore if table not yet migrated\n    }\n  }\n\n  /**\n   * Split-brain root-cause fix (2026-09-14): purge must reach the cloud copy\n   * too. Removes the storage object AND the indexed `curriculum_artifacts`\n   * row (the row is what `readArtifact`-style indexed readers resolve first).\n   * Best-effort / no-throw per the interface contract.\n   */\n  async deleteArtifact(projectId: string, relPath: string): Promise<void> {\n    const fullPath = `${projectId}/${relPath.replace(/^\\//, '')}`;\n    try {\n      await this.client.storage.from(this.bucketName).remove([fullPath]);\n    } catch { /* object may not exist — fine */ }\n    try {\n      await this.client\n        .from('curriculum_artifacts')\n        .delete()\n        .match({ project_id: projectId, rel_path: relPath });\n    } catch { /* table may not exist — fine */ }\n  }\n\n  async listLessons(projectId: string): Promise<LessonArtifactSummary[]> {\n    const summaries: LessonArtifactSummary[] = [];\n    const processedLessons = new Set<string>();\n\n    try {\n      // 1. Scan _content/ folders (e.g. _content/U01/, _content/U02/)\n      const { data: unitDirs } = await this.client.storage\n        .from(this.bucketName)\n        .list(`${projectId}/_content`);\n\n      if (unitDirs) {\n        for (const u of unitDirs) {\n          const { data: files } = await this.client.storage\n            .from(this.bucketName)\n            .list(`${projectId}/_content/${u.name}`);\n\n          if (files) {\n            const lessonMap: Record<string, string[]> = {};\n            files.forEach(f => {\n              const m = f.name.match(/U\\d+_M\\d+_L\\d+/i);\n              if (m) {\n                const lid = m[0].toUpperCase();\n                lessonMap[lid] = lessonMap[lid] || [];\n                lessonMap[lid].push(f.name);\n              }\n            });\n\n            for (const [lid, arts] of Object.entries(lessonMap)) {\n              if (!processedLessons.has(lid)) {\n                processedLessons.add(lid);\n                summaries.push({\n                  lessonId: lid,\n                  artifactsCount: arts.length,\n                  isComplete: arts.length >= 4,\n                  artifacts: arts,\n                });\n              }\n            }\n          }\n        }\n      }\n\n      // 2. Scan lessons/ folders (legacy / alternate structure)\n      const { data: lessonDirs } = await this.client.storage\n        .from(this.bucketName)\n        .list(`${projectId}/lessons`);\n\n      if (lessonDirs) {\n        for (const dir of lessonDirs) {\n          if (!processedLessons.has(dir.name)) {\n            const { data: files } = await this.client.storage\n              .from(this.bucketName)\n              .list(`${projectId}/lessons/${dir.name}`);\n            \n            const artifacts = (files || []).map(f => f.name).filter(n => !n.startsWith('.'));\n            processedLessons.add(dir.name);\n            summaries.push({\n              lessonId: dir.name,\n              artifactsCount: artifacts.length,\n              isComplete: artifacts.length >= 4,\n              artifacts\n            });\n          }\n        }\n      }\n    } catch {\n      // Fallback\n    }\n\n    return summaries;\n  }\n\n  async getProjectStatus(projectId: string): Promise<ProjectStatusReport> {\n    const sotList = await this.listSotDocuments(projectId);\n    const lessons = await this.listLessons(projectId);\n\n    const completedCount = lessons.filter(l => l.isComplete).length;\n    const totalLessons = lessons.length || 4;\n    const progressPercent = Math.round((completedCount / totalLessons) * 100);\n\n    const sotTable = sotList.map(doc => `| \\`${doc.filename}\\` | ${doc.exists ? '✅ Sẵn sàng' : '❌ Chưa có'} |`).join('\\n');\n    const lessonTable = lessons.length > 0 \n      ? lessons.map(l => `| **${l.lessonId}** | ${l.artifactsCount}/4 Artifacts | ${l.isComplete ? '✅ Hoàn tất' : '⏳ Đang tạo sinh'} | ${l.artifacts.join(', ') || '-'} |`).join('\\n')\n      : '| Chưa có bài học nào trên cloud storage | 0/4 | ⏳ Chờ chạy | - |';\n\n    const rawMarkdownReport = `## 📊 BÁO CÁO TRẠNG THÁI DỰ ÁN (CLOUD): \\`${projectId.toUpperCase()}\\`\n\n### 1. Nền tảng Tài liệu (SOT Readiness)\n| Tài liệu SOT | Trạng thái |\n|---|:---:|\n${sotTable}\n\n### 2. Danh mục Bài học & Học liệu (Lessons & Artifacts Matrix)\n| Mã bài học | Số lượng Artifact | Trạng thái | Danh sách Artifact đã tạo |\n|---|:---:|:---:|---|\n${lessonTable}\n\n**Tiến độ tổng thể:** ${completedCount}/${totalLessons} bài học (${progressPercent}%)`;\n\n    return {\n      projectId,\n      sotReadiness: sotList,\n      lessons,\n      completedCount,\n      totalLessons,\n      progressPercent,\n      rawMarkdownReport\n    };\n  }\n\n  /**\n   * Uploads a complete milestone bundle (Markdown files) to Supabase Storage\n   */\n  async uploadMilestoneBundle(\n    projectSlug: string,\n    bundle: MilestoneCurriculumBundle\n  ): Promise<{ lessonUrl?: string; activityUrl?: string; handoutUrl?: string }> {\n    const basePath = `${projectSlug}/${bundle.milestoneId}`;\n\n    const uploads = [\n      {\n        path: `${basePath}/LESSON.md`,\n        content: bundle.lessonMarkdown,\n        type: 'text/markdown',\n      },\n      {\n        path: `${basePath}/ACT.md`,\n        content: bundle.activityMarkdown,\n        type: 'text/markdown',\n      },\n      {\n        path: `${basePath}/HANDOUT.md`,\n        content: bundle.handoutMarkdown,\n        type: 'text/markdown',\n      },\n    ];\n\n    const results: Record<string, string> = {};\n\n    for (const item of uploads) {\n      const { data, error } = await this.client.storage\n        .from(this.bucketName)\n        .upload(item.path, Buffer.from(item.content, 'utf-8'), {\n          contentType: item.type,\n          upsert: true,\n        });\n\n      if (!error && data) {\n        const { data: publicUrlData } = this.client.storage.from(this.bucketName).getPublicUrl(item.path);\n        results[item.path] = publicUrlData.publicUrl;\n      }\n    }\n\n    return {\n      lessonUrl: results[`${basePath}/LESSON.md`],\n      activityUrl: results[`${basePath}/ACT.md`],\n      handoutUrl: results[`${basePath}/HANDOUT.md`],\n    };\n  }\n\n  async getPipelineState(projectId: string): Promise<import('./types').PipelineState> {\n    const p = `${projectId}/_pipeline/state.json`;\n    try {\n      const { data, error } = await this.client.storage.from(this.bucketName).download(p);\n      if (!error && data) {\n        const text = await data.text();\n        return JSON.parse(text);\n      }\n    } catch {}\n\n    return {\n      projectId,\n      updatedAt: new Date().toISOString(),\n      tasks: {}\n    };\n  }\n\n  async savePipelineState(projectId: string, state: import('./types').PipelineState): Promise<void> {\n    const p = `${projectId}/_pipeline/state.json`;\n    state.updatedAt = new Date().toISOString();\n    await this.client.storage.from(this.bucketName).upload(p, Buffer.from(JSON.stringify(state, null, 2), 'utf-8'), {\n      contentType: 'application/json',\n      upsert: true,\n    });\n  }\n\n  async updateArtifactState(\n    projectId: string,\n    taskId: string,\n    artifactType: string,\n    update: Partial<import('./types').ArtifactLifecycleInfo>\n  ): Promise<import('./types').PipelineState> {\n    const current = await this.getPipelineState(projectId);\n    if (!current.tasks[taskId]) {\n      current.tasks[taskId] = {};\n    }\n    current.tasks[taskId][artifactType] = {\n      ...(current.tasks[taskId][artifactType] || { state: 'pending' }),\n      ...update,\n    };\n    await this.savePipelineState(projectId, current);\n    return current;\n  }\n}\n","import type { ICurriculumStorage } from './types';\nimport { FileSystemCurriculumAdapter, FileSystemStorageOptions } from './fileSystemCurriculumAdapter';\nimport { SupabaseCurriculumAdapter, SupabaseStorageConfig } from './supabaseCurriculumAdapter';\n\nexport interface StorageFactoryOptions {\n  provider?: 'filesystem' | 'supabase' | 'auto';\n  fileSystemOptions?: FileSystemStorageOptions;\n  supabaseConfig?: SupabaseStorageConfig;\n}\n\n/**\n * Creates and returns the appropriate ICurriculumStorage instance based on environment or explicit config.\n */\nexport function createCurriculumStorage(options: StorageFactoryOptions = {}): ICurriculumStorage {\n  const provider = options.provider || process.env.CURRICULUM_STORAGE_PROVIDER || 'auto';\n\n  if (provider === 'supabase') {\n    return new SupabaseCurriculumAdapter(options.supabaseConfig);\n  }\n\n  if (provider === 'auto') {\n    const hasSupabase = Boolean(\n      (process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL) &&\n      (process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY) &&\n      process.env.STORAGE_USE_SUPABASE === 'true'\n    );\n\n    if (hasSupabase) {\n      try {\n        return new SupabaseCurriculumAdapter(options.supabaseConfig);\n      } catch (e) {\n        console.warn('⚠️ Falling back to FileSystemCurriculumAdapter due to Supabase initialization error:', e);\n      }\n    }\n  }\n\n  return new FileSystemCurriculumAdapter(options.fileSystemOptions);\n}\n","import type { ICurriculumStorage, ProjectStatusReport, SmartResumeContext, QualityAuditReport } from '../storage/types';\n\n/**\n * Service to generate high-level status, readiness reports, and resume guidance.\n */\nexport async function getProjectStatusReport(\n  storage: ICurriculumStorage,\n  projectId: string\n): Promise<ProjectStatusReport> {\n  return storage.getProjectStatus(projectId);\n}\n\nexport async function getSmartResumeContext(\n  storage: ICurriculumStorage,\n  projectId: string\n): Promise<SmartResumeContext> {\n  const status = await storage.getProjectStatus(projectId);\n  const nextLesson = status.lessons.find(l => !l.isComplete);\n\n  const nextLessonId = nextLesson ? nextLesson.lessonId : 'U01_M01_L01';\n  const recommendedAction = nextLesson \n    ? `Bấm **Khởi chạy** trên bảng Task hoặc dùng lệnh \\`/create-lesson ${nextLessonId}\\` để sinh bộ 4 học liệu.`\n    : `Tất cả bài học đã hoàn thành (${status.completedCount}/${status.totalLessons}). Chuyển sang Phase 04 Xuất bản!`;\n\n  const rawMarkdownReport = `## 🧭 SMART CONTEXT RESUME: \\`${projectId.toUpperCase()}\\`\n- **Mã dự án:** \\`${projectId}\\`\n- **Vị trí hiện tại:** Phase 03 — Sản xuất Học liệu (Task Pipeline)\n- **Tiến độ:** ${status.completedCount}/${status.totalLessons} bài học (${status.progressPercent}%)\n- **Bài học kế tiếp cần xử lý:** \\`${nextLessonId}\\`\n- **Hành động đề xuất:** ${recommendedAction}`;\n\n  return {\n    projectId,\n    currentPhase: status.progressPercent >= 100 ? 4 : 3,\n    nextLessonId,\n    recommendedAction,\n    rawMarkdownReport\n  };\n}\n\n/**\n * Dynamically resolves the required artifact scope from SOT (PROJECT_BRIEF.md or CURRICULUM_FRAMEWORK.md)\n */\nexport async function getProjectArtifactScope(\n  storage: ICurriculumStorage,\n  projectId: string\n): Promise<string[]> {\n  const brief = (await storage.readSotDocument(projectId, 'PROJECT_BRIEF.md')) || '';\n  const framework = (await storage.readSotDocument(projectId, 'CURRICULUM_FRAMEWORK.md')) || '';\n  \n  const match = brief.match(/Artifact Scope:\\s*([^\\n\\r]+)/i) || \n                brief.match(/artifact_scope:\\s*\\[?([^\\n\\r\\]]+)\\]?/i) ||\n                framework.match(/Artifact Scope:\\s*([^\\n\\r]+)/i);\n\n  if (match && match[1]) {\n    const raw = match[1].replace(/[\\[\\]'\"`]/g, '');\n    const tokens = raw.split(/[,|\\s]+/).map(s => s.trim().toUpperCase()).filter(Boolean);\n    const valid = tokens.filter(t => ['LESSON', 'ACT', 'QUIZ', 'SLIDE', 'GUIDE', 'HANDOUT', 'WKS', 'EXT', 'CODE', 'CODE_LAB', 'RUBRIC'].includes(t));\n    if (valid.length > 0) {\n      if (!valid.includes('LESSON')) valid.unshift('LESSON');\n      return Array.from(new Set(valid));\n    }\n  }\n\n  return ['LESSON', 'ACT', 'QUIZ', 'SLIDE'];\n}\n\nexport async function auditQualityReport(\n  storage: ICurriculumStorage,\n  projectId: string\n): Promise<QualityAuditReport> {\n  const status = await storage.getProjectStatus(projectId);\n  const pipelineState = await storage.getPipelineState(projectId);\n  const sotReady = status.sotReadiness.every(s => s.exists);\n  const lessons = status.lessons;\n  const artifactScope = await getProjectArtifactScope(storage, projectId);\n\n  let pedagogy5ECount = 0;\n  let bloomPassCount = 0;\n  let syntaxExecutableCount = 0;\n  let scopeCompletenessCount = 0;\n  const details: string[] = [];\n\n  for (const l of lessons) {\n    const lid = l.lessonId;\n    const unitCode = lid.split('_')[0] || 'U01';\n\n    // 1. Read Master LESSON\n    const lessonContent = (await storage.readArtifact(projectId, `_content/${unitCode}/LESSON_${lid}.md`)) || \n                          (await storage.readArtifact(projectId, `lessons/${lid}/LESSON_${lid}.md`)) || '';\n\n    // Pedagogy structure check (5E or EDP)\n    const has5E = /(?:ENGAGE|EXPLORE|EXPLAIN|ELABORATE|EVALUATE)/i.test(lessonContent);\n    const hasEDP = /(?:ASK|IMAGINE|PLAN|CREATE|TEST|IMPROVE)/i.test(lessonContent);\n    if (has5E || hasEDP) {\n      pedagogy5ECount++;\n    }\n\n    // Bloom alignment check\n    const hasBloom = /(?:Bloom|Apply|Evaluate|Analyze|Understand|Remember|Create)/i.test(lessonContent) &&\n                     /(?:Objective|Mục tiêu|LO1|LO2)/i.test(lessonContent);\n    if (hasBloom) {\n      bloomPassCount++;\n    }\n\n    // 2. Read all other declared artifacts in SOT artifactScope dynamically\n    let allScopeArtifactsPresent = true;\n    for (const artType of artifactScope) {\n      if (artType === 'LESSON') continue;\n      const artContent = (await storage.readArtifact(projectId, `_content/${unitCode}/${artType}_${lid}.md`)) || \n                         (await storage.readArtifact(projectId, `lessons/${lid}/${artType}_${lid}.md`)) || '';\n      \n      if (!artContent) {\n        allScopeArtifactsPresent = false;\n      } else {\n        if (artType === 'ACT' || artType === 'CODE' || artType === 'CODE_LAB') {\n          if (artContent.includes('```')) {\n            syntaxExecutableCount++;\n          }\n        }\n      }\n    }\n\n    if (allScopeArtifactsPresent && lessonContent) {\n      scopeCompletenessCount++;\n    }\n  }\n\n  const total = lessons.length || 1;\n  const pedagogy5EPass = pedagogy5ECount >= total;\n  const bloomAlignmentPass = bloomPassCount >= total;\n  const strictConcurrencyPass = syntaxExecutableCount >= total;\n  const alignmentMatrixPass = scopeCompletenessCount >= total;\n\n  let computedScore = 0;\n  if (sotReady) computedScore += 20;\n  computedScore += Math.round((pedagogy5ECount / total) * 20);\n  computedScore += Math.round((bloomPassCount / total) * 20);\n  computedScore += Math.round((Math.min(syntaxExecutableCount, total) / total) * 20);\n  computedScore += Math.round((scopeCompletenessCount / total) * 20);\n\n  const sotCompletedCount = status.sotReadiness.filter(s => s.exists).length;\n  const sotTotalCount = status.sotReadiness.length;\n\n  if (sotReady) {\n    details.push(`✅ Nền tảng SOT (${sotCompletedCount}/${sotTotalCount} tài liệu) sẵn sàng.`);\n  } else {\n    details.push(`⚠️ Cần hoàn thiện đầy đủ tài liệu SOT cơ sở (${sotCompletedCount}/${sotTotalCount}).`);\n  }\n\n  details.push(`🎯 Phạm vi học liệu theo SOT (Artifact Scope): [${artifactScope.join(', ')}].`);\n\n  if (pedagogy5EPass) {\n    details.push(`✅ Mô hình sư phạm 5E/EDP: Đạt chuẩn (${pedagogy5ECount}/${total} bài học).`);\n  } else {\n    details.push(`⚠️ Cần chuẩn hóa cấu trúc 5E/EDP (${pedagogy5ECount}/${total} bài học).`);\n  }\n\n  if (bloomAlignmentPass) {\n    details.push(`✅ Thang đo Bloom & Chuẩn đầu ra: Hoàn thiện (${bloomPassCount}/${total} bài học).`);\n  } else {\n    details.push(`⚠️ Cần bổ sung ma trận Bloom mục tiêu (${bloomPassCount}/${total} bài học).`);\n  }\n\n  details.push(`✅ Độ phủ đầy đủ các học liệu trong Artifact Scope: ${scopeCompletenessCount}/${total} bài học.`);\n\n  const rawMarkdownReport = `## 🛡️ BÁO CÁO KIỂM ĐỊNH CHẤT LƯỢNG (QUALITY AUDIT): \\`${projectId.toUpperCase()}\\`\n- **Điểm thẩm định chất lượng:** **${computedScore}/100**\n- **Trạng thái SOT:** ${sotReady ? `✅ ${sotCompletedCount}/${sotTotalCount} File SOT hoàn tất` : `⚠️ Cần bổ sung tài liệu SOT thiếu (${sotCompletedCount}/${sotTotalCount})`}.\n- **Phạm vi học liệu (SOT Artifact Scope):** \\`${artifactScope.join(', ')}\\`\n- **Cấu trúc Sư phạm (5E / EDP):** ${pedagogy5ECount}/${total} bài học đạt chuẩn phân pha.\n- **Thang đo nhận thức Bloom:** ${bloomPassCount}/${total} bài học đạt ma trận mục tiêu.\n- **Mức độ hoàn tất các học liệu vệ tinh:** ${scopeCompletenessCount}/${total} bài học đạt chuẩn đóng gói.\n- **Tiến độ sản xuất:** ${status.completedCount}/${status.totalLessons} bài học đã xuất bản.`;\n\n  return {\n    projectId,\n    pedagogy5EPass,\n    bloomAlignmentPass,\n    strictConcurrencyPass,\n    alignmentMatrixPass,\n    score: computedScore,\n    details,\n    rawMarkdownReport\n  };\n}\n","import type { ICurriculumStorage } from '../storage/types';\n\nexport interface BuildContextOptions {\n  activeArtifactRelPath?: string;\n  maxContentChars?: number;\n}\n\n/**\n * Builds the complete Ground Truth curriculum context for LLM prompt ingestion.\n */\nexport async function buildCurriculumContext(\n  storage: ICurriculumStorage,\n  projectId: string,\n  options: BuildContextOptions = {}\n): Promise<string> {\n  const maxChars = options.maxContentChars || 2000;\n  let context = `=== BỐI CẢNH DỰ ÁN GIÁO TRÌNH: ${projectId.toUpperCase()} ===\\n\\n`;\n\n  // 1. SOT Documents\n  context += `## 📚 1. TÀI LIỆU NỀN TẢNG (SOURCE OF TRUTH):\\n`;\n  const sotDocs = await storage.listSotDocuments(projectId);\n  for (const doc of sotDocs) {\n    if (doc.exists) {\n      const content = await storage.readSotDocument(projectId, doc.filename);\n      if (content) {\n        context += `\\n### [TÀI LIỆU: ${doc.filename}]\\n${content.slice(0, maxChars).trim()}\\n`;\n      }\n    }\n  }\n\n  // 2. Lessons & Artifacts State\n  context += `\\n## 🛠️ 2. DANH MỤC BÀI HỌC VÀ TIẾN ĐỘ TẠO SINH:\\n`;\n  const lessons = await storage.listLessons(projectId);\n  if (lessons.length > 0) {\n    for (const l of lessons) {\n      context += `- Bài học **${l.lessonId}**: ${l.artifactsCount}/4 Học liệu (${l.artifacts.join(', ') || 'Chưa tạo'})\\n`;\n    }\n  } else {\n    context += `- Chưa có bài học nào được sinh ra trong hệ thống lưu trữ.\\n`;\n  }\n\n  // 3. Active Viewing Document\n  if (options.activeArtifactRelPath) {\n    const viewedContent = await storage.readArtifact(projectId, options.activeArtifactRelPath);\n    if (viewedContent) {\n      context += `\\n## 👁️ 3. NỘI DUNG CHI TIẾT TÀI LIỆU NGƯỜI DÙNG ĐANG MỞ XEM TRÊN MÀN HÌNH (${options.activeArtifactRelPath}):\\n`;\n      context += `> [HỆ THỐNG GHI CHÚ]: Người dùng đang mở xem trực tiếp tài liệu này. Bạn CÓ TOÀN QUYỀN VÀ ĐẦY ĐỦ NỘI DUNG để phân tích, đánh giá, trích dẫn hoặc chỉnh sửa chi tiết từng câu chữ, code snippet, timing, 5E phases trong tài liệu này:\\n\\n`;\n      context += `\\`\\`\\`markdown\\n${viewedContent.slice(0, 10000)}\\n\\`\\`\\`\\n`;\n    }\n  }\n\n  return context;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport type { ICurriculumStorage } from '../storage/types';\nimport { runCurriculumAIInference } from '../ai/streamRunner';\nimport type { StreamRunnerOptions } from '../ai/streamRunner';\n\n/** AI options (customInference gateway etc.) threaded into every SOT inference call. */\ntype SotAiOptions = { aiOptions?: StreamRunnerOptions };\nimport { lintCurriculumFramework, type FrameworkLintReport } from './frameworkLinter';\nimport { buildStandardStackMarkdown } from '../standards/standardStackGenerator';\nimport type { FrameworkPack } from '../standards/frameworkPackSchema';\nimport { buildLanguageDirective } from './languageDirective';\nimport { lintSotBoundaries, ownershipHeader, type SotArtifactId } from './sotOwnership';\n\nconst __filename = typeof import.meta?.url === 'string' && typeof fileURLToPath === 'function' ? fileURLToPath(import.meta.url) : '';\nconst __dirname = __filename ? path.dirname(__filename) : process.cwd();\n\nexport interface ProjectBriefingData {\n  projectName?: string;\n  topic?: string;\n  context?: string;\n  language?: string;\n  targetAge?: string;\n  targetAgeTier?: string;\n  courseDuration?: string;\n  courseDurationTier?: string;\n  hardwarePlatform?: string | string[];\n  hardwareReadiness?: string;\n  pedagogy?: string;\n  depth?: string;\n  capstoneTheme?: string;\n  exitVision?: string;\n  primaryGoal?: string;\n  valueAndCertification?: string;\n  budgetAndHardwareBOM?: string;\n  cognitiveScaffolding?: string;\n  differentiationStrategy?: string;\n  assessmentStrategy?: string;\n  academicBenchmark?: string;\n  /** Adopted Framework Packs (Standards Registry) — STANDARD_STACK.md is rendered deterministically from these. */\n  standardsPacks?: FrameworkPack[];\n  brandingAndTone?: string;\n  recommendedToolchain?: string;\n  artifactScope?: string[];\n  specialRequirements?: string;\n  [key: string]: any;\n}\n\n/**\n * Semantic delivery environment — declared by the survey wizard\n * (HardwareReadinessTier: 'none_budget' | 'lab_ready' | 'sim_only' | 'custom'),\n * NOT inferred from keywords. Replaces the removed regex heuristic\n * `isPhysicalHardware` which misclassified any 'tech' course that didn't list\n * an exclusion keyword (Swift → forced embedded pinouts, 2026-09-30 audit).\n * 'custom' keeps the user's own hardware string as the source of truth — a\n * custom Mac Mini is a workstation, not an MCU, so physical pinout guidance\n * only fires when the custom string itself names embedded-class hardware.\n */\nexport type DeliveryEnvironment = 'software_only' | 'embedded_hardware' | 'workstation_computer';\n\n/** Embedded-class markers ONLY used to disambiguate the 'custom' free-text tier. */\nconst EMBEDDED_HW_MARKERS = /arduino|esp32|micro:?bit|raspberry|stm32|sensor|robot|mạch|vi điều khiển|nhúng|iot|circuit|gpio|breadboard/i;\n\nexport function resolveDeliveryEnvironment(briefing: ProjectBriefingData): DeliveryEnvironment {\n  const tier = String(\n    briefing.hardwareReadinessTier || briefing.hardwareTier || briefing.hardwareReadiness || ''\n  ).toLowerCase();\n  // Wizard enum values — the semantic flags the survey actually sends.\n  if (tier === 'none_budget' || tier === 'sim_only' || tier === 'cloud_simulation_100') return 'software_only';\n  if (tier === 'lab_ready') return 'embedded_hardware';\n  // Free-text tier: decide from the user's own hardware description.\n  const customHw = String(briefing.customHardware || briefing.hardwarePlatform || '').trim();\n  if (EMBEDDED_HW_MARKERS.test(customHw)) return 'embedded_hardware';\n  if (/mac|pc|laptop|computer|máy tính|workstation|imac/i.test(customHw)) return 'workstation_computer';\n  // No hardware signal at all → generic software environment (safe default:\n  // software guidance is never factually wrong about hardware that may not exist).\n  return 'software_only';\n}\n\n/**\n * Selective survey-context per artifact role (replaces the monolithic briefContext\n * that injected all 27 survey fields into every Phase-1 prompt). Each artifact gets\n * only the fields its template owns — the boundary fix from the 2026-09-30 SOT audit:\n * LEARNER_PROFILE no longer sees logistics fields it used to copy verbatim, and\n * PROJECT_BRIEF no longer sees psychological-profile fields.\n */\nexport type SotArtifactType = 'LEARNER_PROFILE' | 'PROJECT_BRIEF' | 'REFERENCE_PACK';\n\nexport function buildSelectiveContext(briefing: ProjectBriefingData, projectId: string, artifactType: SotArtifactType): string {\n  const hw = Array.isArray(briefing.hardwarePlatform)\n    ? briefing.hardwarePlatform.join(', ')\n    : (briefing.hardwarePlatform || briefing.hardwareDeployment || briefing.hardwareReadiness || 'Môi trường thực hành tiêu chuẩn');\n  const env = resolveDeliveryEnvironment(briefing);\n  const courseLine = `- Course Name: ${briefing.projectName || projectId}`;\n  const topicLine = `- Technical Topic: ${briefing.topic || briefing.courseDescription || projectId}`;\n  const ageLine = `- Target Age & Grade: ${briefing.targetAge || '12–15 tuổi (THCS)'} (Tier: ${briefing.targetAgeTier || 'secondary'})`;\n  const langLine = `- Target Output Language: ${briefing.language || 'vi'}`;\n  const focusLine = `- Detailed Description / Focus: ${briefing.courseDescription || briefing.topic || 'Chương trình đào tạo chuyên sâu'}`;\n\n  if (artifactType === 'LEARNER_PROFILE') {\n    // Psychological & cognitive ownership ONLY — logistics fields (duration,\n    // sessions, equipment, budget) belong to PROJECT_BRIEF and were being\n    // copied into the profile verbatim when visible.\n    return [\n      'COURSE SURVEY DATA (LEARNER PROFILE SCOPE — psychology & cognition only):',\n      courseLine,\n      topicLine,\n      focusLine,\n      `- Domain / Field: ${briefing.domain || 'tech'}`,\n      ageLine,\n      `- Entry Prerequisite / Bridge: ${briefing.entryBridge || 'Bắt đầu từ số 0, dùng hình ảnh trực quan & mã màu'}`,\n      `- Cognitive Scaffolding: ${briefing.cognitiveScaffolding || 'Code skeleton, sơ đồ mã màu chống chập, quy trình gỡ lỗi 4 bước'}`,\n      `- Differentiation: ${briefing.differentiationStrategy || 'Thử thách 3 tầng bậc (Cơ bản / Vận dụng / Nâng cao EXT)'}`,\n      `- Pedagogical Model: ${briefing.pedagogy || '5E Instructional Model & Project-Based Learning'}`,\n      langLine,\n    ].join('\\n');\n  }\n\n  if (artifactType === 'PROJECT_BRIEF') {\n    // Operations & scope ownership: duration, logistics, BOM, artifacts, milestones.\n    return [\n      'COURSE SURVEY DATA (PROJECT BRIEF SCOPE — operations & deliverables):',\n      courseLine,\n      topicLine,\n      `- Domain / Field: ${briefing.domain || 'tech'}`,\n      ageLine,\n      `- Course Duration / Total Sessions: ${briefing.courseDuration || '16–24 buổi'} (Tier: ${briefing.courseDurationTier || 'standard'})`,\n      `- Delivery Mode / Learning Context: ${briefing.context || 'Trung tâm STEM / Trường học'} (${briefing.deliveryMode || 'Offline Lab Hands-on'})`,\n      `- Class Dynamic / Kit Ratio: ${briefing.classDynamic || 'Ghép đôi 2 học sinh / 1 bộ kit thực hành'}`,\n      `- Hardware Ecosystem & Toolchain: ${hw} (Toolchain: ${briefing.recommendedToolchain || hw})`,\n      `- Budget / Hardware BOM: ${briefing.budgetAndHardwareBOM || briefing.specialRequirements || 'Theo danh mục kit tiêu chuẩn'}`,\n      `- Artifact Scope: ${(briefing.artifactScope || ['LESSON', 'ACT', 'QUIZ', 'SLIDE']).join(', ')}`,\n      `- Capstone Project Theme: ${briefing.capstoneTheme || 'Dự án kỹ thuật thông minh ứng dụng thực tiễn'}`,\n      `- Value & Certification: ${briefing.valueAndCertification || 'Portfolio số + Chứng nhận + Triển lãm Showcase'}`,\n      `- Assessment Strategy: ${briefing.assessmentStrategy || '40% Đánh giá tiến trình + 60% Đồ án Capstone Rubric'}`,\n      `- Homework Policy: ${briefing.homeworkPolicy || 'Thực hành mô phỏng web / Không bắt buộc bài tập về nhà'}`,\n      `- Safety Risk Level: ${briefing.safetyRiskLevel || 'An toàn cơ bản (Điện áp thấp)'}`,\n      `- AI Usage Policy: ${briefing.studentAiUsePolicy || 'AI hỗ trợ gỡ lỗi và đồng sáng tạo có kiểm soát'}`,\n      langLine,\n    ].join('\\n');\n  }\n\n  // REFERENCE_PACK: technical grounding scope — topic, toolchain, delivery\n  // environment (enum-driven guidance), pacing and audience for level-appropriateness.\n  return [\n    'COURSE SURVEY DATA (REFERENCE PACK SCOPE — technical grounding):',\n    courseLine,\n    topicLine,\n    focusLine,\n    `- Domain / Field: ${briefing.domain || 'tech'}`,\n    `- Hardware Ecosystem & Toolchain: ${hw} (Toolchain: ${briefing.recommendedToolchain || hw})`,\n    `- Delivery Environment (from survey): ${env}`,\n    ageLine,\n    `- Course Duration / Total Sessions: ${briefing.courseDuration || '16–24 buổi'}`,\n    `- Academic Benchmark: ${briefing.academicBenchmark || 'CSTA K-12 CS, ACM/IEEE CS2023 (nếu áp dụng)'}`,\n    `- Cognitive Depth (Bloom): ${briefing.depth || briefing.cognitiveDepth || 'Apply (Vận dụng) & Create (Sáng tạo)'}`,\n    langLine,\n  ].join('\\n');\n}\n\n/**\n * Helper to load Markdown Template from docs/refs/templates\n *\n * Path resolution must work in THREE layouts (kit 1.5.70):\n *   1. Dev        — src/services/ → ../../docs/refs/templates\n *   2. Bundled    — dist/index.cjs (esbuild, __dirname = dist/) → ../docs/refs/templates\n *                   (../../ would ESCAPE the npm package root — measured live:\n *                   every SOT template resolved to '' in the app container)\n *   3. npm copies — dist/templates/ (copy-templates script) as a final fallback\n * Previously also hardcoded /Users/tonypham dev-machine paths (removed) and\n * relied on process.cwd() in a container (=/app, nothing there).\n */\nexport function loadSotTemplate(templateFileName: string): string {\n  const isBundled = __dirname.replace(/\\\\/g, '/').includes('/dist');\n  const possiblePaths = [\n    // package-root-relative from THIS file: src/services/ → ../.. ; dist/ → ..\n    path.resolve(__dirname, isBundled ? '../docs/refs/templates' : '../../docs/refs/templates', templateFileName),\n    path.resolve(__dirname, '../templates', templateFileName), // bundled copies (dist/templates)\n    path.resolve(process.cwd(), 'packages/curriculum-kit/docs/refs/templates', templateFileName),\n    path.resolve(process.cwd(), 'docs/refs/templates', templateFileName),\n  ];\n  for (const p of possiblePaths) {\n    if (fs.existsSync(p)) {\n      try {\n        return fs.readFileSync(p, 'utf-8');\n      } catch {}\n    }\n  }\n  return '';\n}\n\n/**\n * Boundary linter hook (kit 1.5.72): runs the ownership taxonomy against a\n * freshly generated SOT artifact and reports violations via onProgress.\n * OBSERVATIONAL by design — findings do not block the pipeline yet; they make\n * the zero-overlap contract VISIBLE (and the /playground Prompt X-Ray will\n * surface them per-artifact) before we decide on a hard gate.\n */\nexport function reportSotBoundaries(\n  projectId: string,\n  artifact: SotArtifactId,\n  markdown: string,\n  onProgress?: (agent: string, step: string) => void\n): void {\n  try {\n    const findings = lintSotBoundaries(artifact, markdown);\n    if (findings.length === 0) return;\n    const byOwner = findings.reduce<Record<string, number>>((acc, f) => {\n      acc[f.owner] = (acc[f.owner] || 0) + 1;\n      return acc;\n    }, {});\n    onProgress?.(\n      '@reviewer',\n      `⚠️ [SOT-BOUNDARY] ${artifact}: ${findings.length} finding(s) — content owned by other artifacts: ${JSON.stringify(byOwner)}. First: L${findings[0].line} \"${findings[0].excerpt.slice(0, 80)}\" (${findings[0].rationale})`,\n    );\n  } catch {\n    // linting must never break generation\n  }\n}\n\n/**\n * Service to generate Phase 1 Foundation SOT artifacts (@analyst & @researcher) from Brief input.\n */\nexport async function generatePhase1SotArtifacts(\n  storage: ICurriculumStorage,\n  projectId: string,\n  briefing: ProjectBriefingData & SotAiOptions,\n  onProgress?: (agent: string, step: string) => void\n): Promise<{ learnerProfile: string; projectBrief: string; referencePack: string; standardStack?: string }> {\n  const { aiOptions } = briefing;\n  const rawHw = Array.isArray(briefing.hardwarePlatform) \n    ? briefing.hardwarePlatform.join(', ') \n    : (briefing.hardwarePlatform || briefing.hardwareDeployment || briefing.hardwareReadiness || 'Môi trường thực hành tiêu chuẩn');\n  const hw = (rawHw.includes('Chưa có') || rawHw.includes('Đã có sẵn') || rawHw.includes('none_budget') || rawHw.includes('lab_ready'))\n    ? (briefing.recommendedToolchain || briefing.hardwareDeployment || 'Phần mềm mô phỏng & Kit thực hành tiêu chuẩn')\n    : rawHw;\n\n  // Selective survey-context per artifact (kit SOT audit 2026-09-30): each prompt\n  // receives ONLY the survey fields its artifact template owns — logistics fields no\n  // longer leak into LEARNER_PROFILE, psychological fields no longer leak into\n  // PROJECT_BRIEF. Previously a single monolithic briefContext (27 fields) fed every\n  // prompt, causing verbatim cross-copying between artifacts.\n  const learnerContext = buildSelectiveContext(briefing, projectId, 'LEARNER_PROFILE');\n  const briefContext = buildSelectiveContext(briefing, projectId, 'PROJECT_BRIEF');\n  const refPackContext = buildSelectiveContext(briefing, projectId, 'REFERENCE_PACK');\n\n  // 1. Generate LEARNER_PROFILE.md using LEARNER_PROFILE_template.md\n  onProgress?.('@analyst', 'Analyzing target audience profile and authoring standardized LEARNER_PROFILE.md...');\n  const learnerProfileTemplate = loadSotTemplate('LEARNER_PROFILE_template.md');\n  const learnerProfilePrompt = `You are @analyst (Lead Learner Profile & Educational Needs Analyst in Curriculum OS).\nFill out the following \\`LEARNER_PROFILE.md\\` template strictly based on the course survey specifications:\n\n${ownershipHeader('LEARNER_PROFILE')}\n\n[COURSE SURVEY DATA]:\n${learnerContext}\n\n[TEMPLATE CONTRACT (Fill all slots, preserve exact YAML Frontmatter and ## [REQUIRED] section headers)]:\n${learnerProfileTemplate || `---\nid: \"${projectId.toUpperCase()}-LEARNER-PROFILE\"\ntitle: \"Learner Profile: ${briefing.projectName || projectId}\"\ntype: \"LEARNER_PROFILE\"\nphase: \"P1\"\ndeliverable: \"P1-T1\"\nversion: \"v1.2\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Foundational Info\"\n  - \"Entry Level\"\n  - \"Learning Context\"\n  - \"Client Objectives\"\n---`}\n\nINSTRUCTIONS:\n1. Strictly preserve the frontmatter and section headers.\n2. Fill every placeholder with deep, authentic pedagogical and cognitive profile analysis tailored to this specific age group, topic, and hardware.\n3. Output 100% clean Markdown document directly.`;\n\n  const learnerProfile = await runCurriculumAIInference(\n    [{ role: 'user', content: `${learnerProfilePrompt}\\n\\n${buildLanguageDirective(briefing.language || 'vi')}` }],\n    learnerContext,\n    aiOptions\n  );\n  await storage.saveArtifact(projectId, '_sot/LEARNER_PROFILE.md', learnerProfile);\n  reportSotBoundaries(projectId, 'LEARNER_PROFILE', learnerProfile, onProgress);\n\n  // 2. Generate PROJECT_BRIEF.md using PROJECT_BRIEF_template.md\n  onProgress?.('@analyst', 'Synthesizing project charter and deliverable scope (PROJECT_BRIEF.md)...');\n  const projectBriefTemplate = loadSotTemplate('PROJECT_BRIEF_template.md');\n  const projectBriefPrompt = `You are @analyst. Fill out the \\`PROJECT_BRIEF.md\\` template for course: ${briefing.projectName || projectId}\n\n${ownershipHeader('PROJECT_BRIEF')}\n\n[COURSE SURVEY DATA]:\n${briefContext}\n\n[TEMPLATE CONTRACT]:\n${projectBriefTemplate || `---\nid: \"${projectId.toUpperCase()}-PROJECT-BRIEF\"\ntitle: \"Project Brief: ${briefing.projectName || projectId}\"\ntype: \"PROJECT_BRIEF\"\nphase: \"P1\"\ndeliverable: \"P1-T3\"\nversion: \"v1.2\"\ntemplate_contract: \"artifact-template-v1\"\n---`}\n\nINSTRUCTIONS:\n1. Synthesize all survey parameters into a formal project charter.\n2. Detail the 3-Milestone roadmap (Milestone 1 Discovery -> Milestone 2 Implementation -> Milestone 3 Capstone Integration).\n3. Output 100% clean Markdown document directly.`;\n\n  const learnerProfileForBrief = extractSotSections(learnerProfile, [\n    'Foundational Info',\n    'Entry Level',\n    'Learning Context',\n    'Client Objectives',\n  ]);\n  const projectBrief = await runCurriculumAIInference(\n    [{ role: 'user', content: `${projectBriefPrompt}\\n\\n${buildLanguageDirective(briefing.language || 'vi')}` }],\n    `${briefContext}\\n\\n[APPROVED LEARNER PROFILE (KEY SECTIONS)]:\\n${learnerProfileForBrief}`,\n    aiOptions\n  );\n  await storage.saveArtifact(projectId, '_sot/PROJECT_BRIEF.md', projectBrief);\n  reportSotBoundaries(projectId, 'PROJECT_BRIEF', projectBrief, onProgress);\n\n  // 3. Generate REFERENCE_PACK.md using REFERENCE_PACK_template.md\n  onProgress?.('@researcher', 'Gathering official technical standards and pedagogical references (REFERENCE_PACK.md)...');\n  const refPackTemplate = loadSotTemplate('REFERENCE_PACK_template.md');\n  \n  // Delivery environment comes from the SURVEY ENUM (HardwareReadinessTier:\n  // none_budget/lab_ready/sim_only/custom), never from keyword guessing. The\n  // old regex heuristic classified any 'tech' course without an exclusion\n  // keyword as embedded hardware and ORDERED the model to write pinout/I2C/\n  // voltage specs — manufacturing hallucinated electronics for software\n  // courses (Swift on Mac Mini, 2026-09-30 audit).\n  const deliveryEnv = resolveDeliveryEnvironment(briefing);\n  const hwGuidance = deliveryEnv === 'embedded_hardware'\n    ? `2. Detail the exact hardware pinouts, voltage levels, communication protocols (I2C/SPI/UART), sensor specs, and compiler requirements ONLY for the embedded hardware named in the survey data (${hw}). If the survey hardware is a general-purpose computer (Mac/PC/laptop), document its supported development environment instead — NEVER invent GPIO pins, I2C/SPI buses, or voltage levels for it.`\n    : deliveryEnv === 'workstation_computer'\n      ? `2. Detail the development environment, required software toolchains, libraries/frameworks, runtime versions, and system requirements for ${hw}. This is a general-purpose computer, NOT an embedded board — do NOT describe GPIO pins, I2C/SPI/UART buses, or voltage levels.`\n      : `2. Detail the development environment, required software toolchains, libraries/frameworks, runtime versions, and system requirements for ${hw}.`;\n\n  const refPackPrompt = `You are @researcher (Lead Technical Research & Standardization Specialist).\nFill out the \\`REFERENCE_PACK.md\\` template by conducting rigorous grounding research for topic: ${briefing.topic || briefing.projectName || projectId}\n\n${ownershipHeader('REFERENCE_PACK')}\n\n[COURSE SURVEY DATA]:\n${refPackContext}\n\n[TEMPLATE CONTRACT]:\n${refPackTemplate || `---\nid: \"${projectId.toUpperCase()}-REFERENCE-PACK\"\ntitle: \"Reference Pack: ${briefing.projectName || projectId}\"\ntype: \"REFERENCE_PACK\"\nphase: \"P1\"\ndeliverable: \"P1-T2\"\nversion: \"v1.2\"\n---`}\n\nINSTRUCTIONS:\n1. Cite authentic, authoritative standards (CSTA K-12 CS, ACM/IEEE CS2023, official language/hardware documentation, RFCs, safety guidelines).\n${hwGuidance}\n3. Summarize pedagogical foundations (5E Model, Bruner EIS Scaffolding, Sweller Cognitive Load Theory).\n4. Output 100% clean Markdown document directly.`;\n\n  const learnerContextForRefPack = extractSotSections(learnerProfile, [\n    'Foundational Info',\n    'Learning Context',\n    'Entry Level',\n  ]);\n  const referencePack = await runCurriculumAIInference(\n    [{ role: 'user', content: `${refPackPrompt}\\n\\n${buildLanguageDirective(briefing.language || 'vi')}` }],\n    `${refPackContext}\\n\\n[APPROVED LEARNER CONTEXT]:\\n${learnerContextForRefPack}`,\n    aiOptions\n  );\n  await storage.saveArtifact(projectId, '_sot/REFERENCE_PACK.md', referencePack);\n  reportSotBoundaries(projectId, 'REFERENCE_PACK', referencePack, onProgress);\n\n  // Phase 2: STANDARD_STACK.md is rendered DETERMINISTICALLY from the Standards Registry packs\n  // (verbatim statements + canonical IDs) instead of asking the LLM to cite standards from memory.\n  const standardStack = buildStandardStackMarkdown({\n    projectId,\n    packs: briefing.standardsPacks ?? [],\n    language: briefing.language || 'vi',\n  });\n  await storage.saveArtifact(projectId, '_sot/STANDARD_STACK.md', standardStack);\n\n  return { learnerProfile, projectBrief, referencePack, standardStack };\n}\n\n/**\n * Parses markdown into discrete structured sections (H2 boundaries) as a JSON dictionary.\n * Does NOT truncate or slice content — preserves 100% of each section's data.\n */\nexport function parseMarkdownToSections(markdown: string): Record<string, string> {\n  const sections: Record<string, string> = {};\n  if (!markdown) return sections;\n\n  const lines = markdown.split('\\n');\n  let currentKey = '__preamble__';\n  let currentLines: string[] = [];\n\n  for (const line of lines) {\n    const headingMatch = line.match(/^##\\s+(.+)$/);\n    if (headingMatch) {\n      if (currentLines.length > 0) {\n        sections[currentKey] = currentLines.join('\\n').trim();\n      }\n      currentKey = headingMatch[1].replace(/\\[REQUIRED\\]/gi, '').trim();\n      currentLines = [];\n    } else {\n      currentLines.push(line);\n    }\n  }\n  if (currentLines.length > 0) {\n    sections[currentKey] = currentLines.join('\\n').trim();\n  }\n  return sections;\n}\n\n/**\n * Selectively extracts specified sections by keyword from a markdown document without ANY budget limitation or truncation.\n * Preserves 100% of the content within the selected sections.\n */\nexport function extractSotSections(\n  markdown: string,\n  targetKeywords: string[]\n): string {\n  const sectionMap = parseMarkdownToSections(markdown);\n  const selectedBlocks: string[] = [];\n\n  for (const target of targetKeywords) {\n    const normTarget = target.toLowerCase().replace(/[^a-z0-9]/g, '');\n    const matchedKey = Object.keys(sectionMap).find((k) => {\n      const normK = k.toLowerCase().replace(/[^a-z0-9]/g, '');\n      return normK.includes(normTarget) || normTarget.includes(normK);\n    });\n\n    if (matchedKey && sectionMap[matchedKey]) {\n      selectedBlocks.push(`## ${matchedKey}\\n\\n${sectionMap[matchedKey]}`);\n    }\n  }\n\n  // If no specific section matched, return full markdown without truncation\n  return selectedBlocks.length > 0 ? selectedBlocks.join('\\n\\n') : markdown;\n}\n\n/**\n * Service to generate Phase 2 Architecture SOT artifacts (@designer) from approved Foundation.\n */\nexport async function generatePhase2SotArtifacts(\n  storage: ICurriculumStorage,\n  projectId: string,\n  briefing: ProjectBriefingData & SotAiOptions,\n  onProgress?: (agent: string, step: string) => void\n): Promise<{ framework: string; styleGuide: string; artDirection: string; projectStatus: string }> {\n  const { aiOptions } = briefing;\n  // Read Foundation SOT files\n  const learnerProfile = (await storage.readSotDocument(projectId, 'LEARNER_PROFILE.md')) || '';\n  const projectBrief = (await storage.readSotDocument(projectId, 'PROJECT_BRIEF.md')) || '';\n  const refPack = (await storage.readSotDocument(projectId, 'REFERENCE_PACK.md')) || '';\n\n  const foundationContext = `APPROVED FOUNDATION SOT SPECIFICATIONS (GATE 1 APPROVED):\n[LEARNER_PROFILE.md]:\n${extractSotSections(learnerProfile, [\n  'Foundational Info',\n  'Entry Level',\n  'Learning Context',\n  'Cognitive Scaffolding',\n  'Differentiation',\n  'Client Objectives'\n])}\n\n[PROJECT_BRIEF.md]:\n${extractSotSections(projectBrief, [\n  'Project Charter',\n  'Core Objectives',\n  'Milestone',\n  'Deliverable',\n  'Constraint'\n])}\n\n[REFERENCE_PACK.md]:\n${extractSotSections(refPack, [\n  'Technical Standards',\n  'Hardware',\n  'Toolchain',\n  'Pedagogical',\n  'Pitfall'\n])}`;\n\n  const pacing = briefing.lessonPacingModel || 'opt_single_session_1_1';\n  const isSingleSession = pacing.includes('single_session') || pacing.includes('1_1') || pacing.includes('1 Buổi = 1 Bài') || (!pacing.includes('thematic') && !pacing.includes('Chuyên đề') && !pacing.includes('hybrid') && !pacing.includes('Kết hợp'));\n  const isThematic = pacing.includes('thematic') || pacing.includes('Chuyên đề') || pacing.includes('2–3 Buổi') || pacing.includes('2-3 Buổi');\n\n  const pacingInstructions = isSingleSession\n    ? `PACING DIRECTIVE (Mô hình 1 Buổi = 1 Bài học độc lập):\n- Every single session (60–90 minutes) MUST correspond to exactly 1 independent Lesson artifact (LESSON_01, LESSON_02, ... up to the total session count).\n- For example, if courseDuration is 16 sessions: generate exactly 16 discrete Lesson rows (LESSON_01 to LESSON_16) across 3-4 Units.\n- Each lesson MUST have its own clear single-session objective, hands-on lab, and exit ticket checkpoint so students who attend weekly/non-consecutively can complete each session self-contained.`\n    : isThematic\n    ? `PACING DIRECTIVE (Mô hình Chuyên đề lớn 2–3 buổi/bài):\n- Group sessions into 6–8 comprehensive thematic modules/lessons where each lesson is an overarching 5E/EDP cycle lasting 2–3 sessions.\n- In 'Standard Lesson Format' and Scope & Sequence, explicitly detail the multi-session breakdown (e.g. Session 1: Engage + Explore, Session 2: Explain + Elaborate, Session 3: Evaluate + Mini-Showcase).\n- Provide clear guidance on session cut-off points and recap protocols for classes with non-consecutive weekly schedules.`\n    : `PACING DIRECTIVE (Mô hình Kết hợp Hybrid):\n- Foundational skill lessons are 1 session each; Capstone integration modules span 2–3 sessions each.`;\n\n  // 1. Generate CURRICULUM_FRAMEWORK.md using CURRICULUM_FRAMEWORK_template.md\n  onProgress?.('@designer', 'Designing Curriculum Framework (CURRICULUM_FRAMEWORK.md) with Unit/Module breakdown and Scope & Sequence...');\n  const frameworkTemplate = loadSotTemplate('CURRICULUM_FRAMEWORK_template.md');\n  const frameworkPrompt = `You are @designer (Lead Curriculum Architect).\nFill out the \\`CURRICULUM_FRAMEWORK.md\\` template for course: ${briefing.projectName || projectId}\n\n[COURSE SPECIFICATIONS & PACING]:\n- Course Name: ${briefing.projectName || projectId}\n- Duration / Sessions: ${briefing.courseDuration || '16–24 buổi'}\n- Target Audience: ${briefing.targetAge || '12–15 tuổi'}\n- Hardware / Platform: ${Array.isArray(briefing.hardwarePlatform) ? briefing.hardwarePlatform.join(', ') : (briefing.hardwarePlatform || 'Tiêu chuẩn')}\n- Capstone Project: ${briefing.capstoneTheme || 'Dự án thực tế'}\n- Pacing Model: ${isSingleSession ? '1 Buổi = 1 Bài học độc lập' : isThematic ? 'Chuyên đề lớn 2–3 buổi/bài' : 'Mô hình Kết hợp'}\n\n${pacingInstructions}\n\n[TEMPLATE CONTRACT]:\n${frameworkTemplate || `---\nid: \"${projectId.toUpperCase()}-CURRICULUM-FRAMEWORK\"\ntitle: \"Curriculum Framework: ${briefing.projectName || projectId}\"\ntype: \"CURRICULUM_FRAMEWORK\"\nphase: \"P2\"\ndeliverable: \"P2-T1\"\nversion: \"v1.2\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Course Overview\"\n  - \"Global Learning Objectives\"\n  - \"Structural Hierarchy (Unit & Module)\"\n  - \"Scope & Sequence (Detailed Roadmap)\"\n  - \"Standard Lesson Format\"\n---`}\n\nCRITICAL INSTRUCTIONS FOR ROADMAP & SIZING:\n1. The \\`## [REQUIRED] Structural Hierarchy (Unit & Module)\\` and \\`## [REQUIRED] Scope & Sequence (Detailed Roadmap)\\` MUST strictly adhere to the PACING DIRECTIVE above!\n   - In the Scope & Sequence table, write out every single lesson row (01, 02, 03, ...) with unique Title, Key Concept, Prerequisites, and Bloom taxonomy level. Do NOT truncate with '...'.\n2. Fill Global Learning Objectives with measurable Bloom action verbs.\n3. In \\`## [REQUIRED] Standard Lesson Format\\`, explicitly define the session structure, timing breakdown (Warm-up, Theory, Lab, Exit Ticket), and resumption/recap protocol between sessions.\n4. Output 100% clean Markdown document directly.`;\n\n  const parseExpectedSessions = (duration?: string): number | undefined => {\n    if (!duration) return undefined;\n    const m = duration.match(/(\\d{1,3})\\s*(?:-|–|to|đến)?\\s*(\\d{1,3})?\\s*(?:buổi|session|buổi)/i);\n    if (!m) return undefined;\n    // Lấy TRẦN của khoảng (16-24 → 16): bắt buộc đủ số dòng, không để AI viết ít rồi gọi là xong\n    return m[2] ? parseInt(m[1] as string, 10) : parseInt(m[1], 10);\n  };\n  const expectedSessions = parseExpectedSessions(briefing.courseDuration);\n\n  const lintFrameworkOrFail = async (draft: string, attempt: number): Promise<{ content: string; report: FrameworkLintReport } | null> => {\n    if (!draft || draft.trim().length <= 100) return null;\n    const report = lintCurriculumFramework(draft, expectedSessions);\n    if (report.passed) return { content: draft, report };\n    onProgress?.('@reviewer', `⚠️ Framework lint round ${attempt} FAILED (score ${report.score}/100, ${report.totalLessons} sessions): ${report.findings.filter((f) => f.severity === 'CRITICAL').map((f) => f.code).join(', ')}`);\n    return null;\n  };\n\n  let framework = await runCurriculumAIInference(\n    [{ role: 'user', content: `${frameworkPrompt}\\n\\n${buildLanguageDirective(briefing.language || 'vi')}` }],\n    foundationContext,\n    aiOptions\n  );\n\n  // ── Framework quality gate (deterministic, 0 token): \"1 buổi = 1 dòng đầy đủ\" ──\n  // Fail → 1 lần retry có mục tiêu với findings cụ thể → vẫn fail → SAVE + cảnh báo rõ (HITL gate sẽ chặn).\n  let lintReport: FrameworkLintReport | undefined;\n  const firstPass = await lintFrameworkOrFail(framework, 1);\n  if (firstPass) {\n    lintReport = firstPass.report;\n  } else if (framework && framework.trim().length > 100) {\n    const firstReport = lintCurriculumFramework(framework, expectedSessions);\n    const criticalList = firstReport.findings.map((f) => `- [${f.severity}] ${f.message}`).join('\\n');\n    onProgress?.('@designer', '🔧 Framework failed contract lint — retrying once with targeted feedback...');\n    const retryDraft = await runCurriculumAIInference(\n      [{ role: 'user', content: `Your previously drafted \\`CURRICULUM_FRAMEWORK.md\\` FAILED the per-session contract lint. Rewrite the COMPLETE corrected document: fix EVERY issue below, keep the template contract, output 100% clean Markdown only.\\n\\nLINT FINDINGS:\\n${criticalList}\\n\\nREQUIREMENTS REMINDER:\\n- Mỗi buổi học PHẢI có đúng 1 dòng trong bảng Scope & Sequence với đủ 11 cột: # | Lesson Code (UXX_MYY_LZZ) | Title | Unit | Module | Learning Objective (đo được) | Key Concepts | Hands-on Deliverable | Prerequisites | Bloom | Duration\\n- Số dòng PHẢI bằng tổng số buổi khóa (${expectedSessions || 'theo Course Duration'}) — KHÔNG truncate bằng '...'\\n- Prerequisites chỉ tham chiếu mã bài TRƯỚC đó\\n\\nPREVIOUS DRAFT:\\n${framework}` }],\n      foundationContext,\n      aiOptions\n    );\n    const retryPass = await lintFrameworkOrFail(retryDraft, 2);\n    if (retryPass) {\n      framework = retryPass.content;\n      lintReport = retryPass.report;\n    } else {\n      // Vẫn fail: vẫn SAVE (người duyệt HITL cần thấy) + cảnh báo NẶNG qua telemetry\n      lintReport = lintCurriculumFramework(framework || '', expectedSessions);\n      onProgress?.('@reviewer', `❌ CURRICULUM_FRAMEWORK still fails contract lint after retry (score ${lintReport.score}/100). Saved for human review — DO NOT trust this as SOT until fixed.`);\n    }\n  }\n\n  if (framework && framework.trim().length > 100) {\n    const lintSuffix = lintReport\n      ? `\\n\\n<!-- framework-lint: score=${lintReport.score}/100 sessions=${lintReport.totalLessons} passed=${lintReport.passed} findings=${lintReport.findings.length} -->\\n`\n      : '';\n    await storage.saveArtifact(projectId, '_sot/CURRICULUM_FRAMEWORK.md', framework + lintSuffix);\n  }\n\n  // 2. Generate CONTENT_STYLE_GUIDE.md using CONTENT_STYLE_GUIDE_template.md\n  onProgress?.('@designer', 'Establishing Content Style Guide and Code Standards (CONTENT_STYLE_GUIDE.md)...');\n  const styleGuideTemplate = loadSotTemplate('CONTENT_STYLE_GUIDE_template.md');\n  const styleGuidePrompt = `You are @designer. Author the standardized \\`CONTENT_STYLE_GUIDE.md\\` artifact:\n\n[TEMPLATE CONTRACT]:\n${styleGuideTemplate || `---\nid: \"${projectId.toUpperCase()}-CONTENT-STYLE-GUIDE\"\ntitle: \"Content Style Guide: ${briefing.projectName || projectId}\"\ntype: \"CONTENT_STYLE_GUIDE\"\nphase: \"P2\"\ndeliverable: \"P2-T2\"\nversion: \"v1.2\"\n---`}\n\nINSTRUCTIONS:\n1. Tailor the Tone & Voice, Glossary, Code Standards, and Examples strictly to the topic: ${briefing.topic || briefing.projectName || projectId} (NOT generic boilerplate).\n2. Define exact terminology translation pairs, prohibited practices, and 5E lesson timing.\n3. Include Session Pacing & Interruption Handling Protocol: How teachers should warm up, recap previous lessons, and handle weekly/non-consecutive classes.\n4. Output 100% clean Markdown document directly.`;\n\n  const styleGuide = await runCurriculumAIInference(\n    [{ role: 'user', content: `${styleGuidePrompt}\\n\\n${buildLanguageDirective(briefing.language || 'vi')}` }],\n    `${foundationContext}\\n\\n[CURRICULUM_FRAMEWORK]:\\n${extractSotSections(framework, [\n      'Scope & Sequence',\n      'Unit Breakdown',\n      'Module Structure',\n      'Standard Lesson Format',\n    ])}`,\n    aiOptions\n  );\n  if (styleGuide && styleGuide.trim().length > 100) {\n    await storage.saveArtifact(projectId, '_sot/CONTENT_STYLE_GUIDE.md', styleGuide);\n  }\n\n  // 3. Generate ART_DIRECTION.md using ART_DIRECTION_template.md\n  onProgress?.('@designer', 'Establishing Art Direction, color palette, and Mermaid diagram standards (ART_DIRECTION.md)...');\n  const artTemplate = loadSotTemplate('ART_DIRECTION_template.md');\n  const artPrompt = `You are @illustrator & @designer. Author the standardized \\`ART_DIRECTION.md\\` artifact:\n\n[TEMPLATE CONTRACT]:\n${artTemplate || `---\nid: \"${projectId.toUpperCase()}-ART-DIRECTION\"\ntitle: \"Art Direction: ${briefing.projectName || projectId}\"\ntype: \"ART_DIRECTION\"\nphase: \"P2\"\ndeliverable: \"P2-T3\"\nversion: \"v1.2\"\n---`}\n\nINSTRUCTIONS:\n1. Define the visual theme, color palette (Primary, Accent, Background), typography, and Mermaid diagram styling for this topic.\n2. Output 100% clean Markdown document directly.`;\n\n  const artDirection = await runCurriculumAIInference(\n    [{ role: 'user', content: `${artPrompt}\\n\\n${buildLanguageDirective(briefing.language || 'vi')}` }],\n    foundationContext,\n    aiOptions\n  );\n  if (artDirection && artDirection.trim().length > 100) {\n    await storage.saveArtifact(projectId, '_sot/ART_DIRECTION.md', artDirection);\n  }\n\n  // 4. Generate PROJECT_STATUS.md / ALIGNMENT_MATRIX\n  onProgress?.('@reviewer', 'Initializing Curriculum Alignment Matrix and tracking ledger (PROJECT_STATUS.md)...');\n  const statusPrompt = `You are @reviewer. Author the standardized \\`PROJECT_STATUS.md\\` reflecting current progress:\n- Phase 01: SOT & Brief (100% Complete, Gate 1 Approved)\n- Phase 02: Architecture & Design (100% Complete, Gate 2 Approved)\n- Phase 03: Production Task Pipeline (Ready to start)\n- Tabular Alignment Matrix mapping all lessons defined in the Framework to their required artifacts (LESSON, ACT, QUIZ, SLIDE).`;\n\n  const projectStatus = await runCurriculumAIInference(\n    [{ role: 'user', content: `${statusPrompt}\\n\\n${buildLanguageDirective(briefing.language || 'vi')}` }],\n    `[FRAMEWORK]:\\n${extractSotSections(framework, [\n      'Scope & Sequence',\n      'Unit Breakdown',\n      'Module Structure',\n      'Structural Hierarchy',\n    ])}`,\n    aiOptions\n  );\n  if (projectStatus && projectStatus.trim().length > 100) {\n    await storage.saveArtifact(projectId, '_sot/PROJECT_STATUS.md', projectStatus);\n  }\n\n  return { framework, styleGuide, artDirection, projectStatus };\n}\n\n","/**\n * 🛠️ Framework Linter — hợp đồng \"1 buổi = 1 dòng đầy đủ\" cho CURRICULUM_FRAMEWORK.md\n *\n * Framework là SOT của toàn bộ pipeline production: nếu framework thiếu objective/deliverable/prerequisite\n * cho từng buổi, MỌI LESSON phía sau sinh sai. Linter này chạy NGAY SAU khi sinh framework\n * (0 token, deterministic) và trả findings để caller retry có mục tiêu hoặc cảnh báo rõ ràng.\n */\n\nexport interface FrameworkLintFinding {\n  code: string;\n  severity: 'CRITICAL' | 'MAJOR' | 'MINOR';\n  message: string;\n}\n\nexport interface FrameworkLintReport {\n  passed: boolean;\n  score: number;\n  totalLessons: number;\n  findings: FrameworkLintFinding[];\n  summary: string;\n}\n\n/** Động từ Bloom hợp lệ (VI + EN, bao gồm dạng chia). */\nconst BLOOM_LEVELS = [\n  'remember', 'understand', 'apply', 'analyze', 'evaluate', 'create',\n  'ghi nhớ', 'nhớ', 'hiểu', 'vận dụng', 'áp dụng', 'phân tích', 'đánh giá', 'sáng tạo', 'thiết kế',\n];\n\n/** Động từ trừu tượng không đo được — cấm trong Learning Objective. */\nconst VAGUE_VERBS = /^(?:hiểu|biết|nắm\\s*được|know|understand\\s+about)\\b/i;\n\nfunction normalizeLine(line: string): string {\n  return line.replace(/\\u00a0/g, ' ');\n}\n\n/**\n * Trích các dòng dữ liệu từ bảng Scope & Sequence (bỏ header + separator).\n * Nhận diện bảng theo header chứa cả \"Lesson Code\" và \"Learning Objective\".\n */\nexport function extractScopeSequenceRows(framework: string): { headerFound: boolean; rows: string[][] } {\n  const lines = framework.split('\\n').map(normalizeLine);\n  let headerFound = false;\n  const rows: string[][] = [];\n  for (const line of lines) {\n    const trimmed = line.trim();\n    if (!trimmed.startsWith('|')) continue;\n    const lower = trimmed.toLowerCase();\n    const hasCodeCol = lower.includes('lesson code') || lower.includes('mã bài') || lower.includes('mã bài học');\n    const hasObjCol = lower.includes('learning objective') || lower.includes('mục tiêu') || lower.includes('mục tiêu học tập');\n    if (hasCodeCol && hasObjCol) {\n      headerFound = true;\n      continue;\n    }\n    if (!headerFound) continue;\n    if (/^\\|\\s*[-: |]+\\|\\s*$/.test(trimmed)) continue; // separator row\n    if (lower.includes('không truncate') || lower.includes('rules:')) break; // ghi chú sau bảng\n    const cols = trimmed.split('|').slice(1, -1).map((c) => c.trim());\n    if (cols.length >= 10) rows.push(cols);\n  }\n  return { headerFound, rows };\n}\n\nexport function lintCurriculumFramework(\n  framework: string,\n  expectedSessions?: number\n): FrameworkLintReport {\n  const findings: FrameworkLintFinding[] = [];\n  let score = 100;\n\n  const { headerFound, rows } = extractScopeSequenceRows(framework);\n\n  // 1. Bảng Scope & Sequence phải tồn tại với header hợp đồng\n  if (!headerFound) {\n    findings.push({\n      code: 'FW_MISSING_SCOPE_TABLE',\n      severity: 'CRITICAL',\n      message: 'Thiếu bảng Scope & Sequence với header hợp đồng (phải có cột Lesson Code + Learning Objective). Framework này KHÔNG đủ làm SOT cho production.',\n    });\n    score -= 40;\n  }\n\n  if (headerFound && rows.length === 0) {\n    findings.push({\n      code: 'FW_EMPTY_SCOPE_TABLE',\n      severity: 'CRITICAL',\n      message: 'Bảng Scope & Sequence tồn tại nhưng KHÔNG có dòng buổi học nào hợp lệ (mỗi dòng cần ≥10 cột).',\n    });\n    score -= 35;\n  }\n\n  // 2. Số buổi phải khớp courseDuration\n  if (expectedSessions && rows.length > 0 && rows.length !== expectedSessions) {\n    findings.push({\n      code: 'FW_SESSION_COUNT_MISMATCH',\n      severity: 'CRITICAL',\n      message: `Số dòng buổi học (${rows.length}) ≠ tổng số buổi của khóa (${expectedSessions}). Viết ĐỦ, không truncate.`,\n    });\n    score -= 25;\n  }\n\n  // 3. Kiểm từng dòng: mã bài, objective, deliverable, bloom, prereq\n  const seenCodes = new Set<string>();\n  rows.forEach((cols, idx) => {\n    const rowNum = idx + 1;\n    const lessonCode = cols[1] || '';\n    const objective = cols[5] || '';\n    const deliverable = cols[7] || '';\n    const prerequisites = cols[8] || '';\n    const bloom = cols[9] || '';\n    const duration = cols[10] || '';\n\n    if (!/^[Uu]\\d{2}[_-][Mm]\\d{2}[_-][Ll]\\d{2}$/.test(lessonCode)) {\n      findings.push({ code: 'FW_BAD_LESSON_CODE', severity: 'CRITICAL', message: `Dòng ${rowNum}: mã bài \"${lessonCode}\" không đúng format UXX_MYY_LZZ.` });\n      score -= 10;\n    } else if (seenCodes.has(lessonCode.toUpperCase())) {\n      findings.push({ code: 'FW_DUPLICATE_LESSON_CODE', severity: 'MAJOR', message: `Dòng ${rowNum}: mã bài ${lessonCode} bị trùng.` });\n      score -= 8;\n    } else {\n      seenCodes.add(lessonCode.toUpperCase());\n    }\n\n    if (VAGUE_VERBS.test(objective)) {\n      findings.push({ code: 'FW_VAGUE_OBJECTIVE', severity: 'MAJOR', message: `Dòng ${rowNum} (${lessonCode}): Objective dùng động từ trừu tượng (\"hiểu/biết\") — thay bằng động từ Bloom đo được.` });\n      score -= 8;\n    } else if (objective.length < 20) {\n      findings.push({ code: 'FW_WEAK_OBJECTIVE', severity: 'MAJOR', message: `Dòng ${rowNum} (${lessonCode}): Learning Objective quá ngắn/generic — cần mục tiêu đo được với động từ Bloom cụ thể.` });\n      score -= 8;\n    }\n\n    if (deliverable.length < 10) {\n      findings.push({ code: 'FW_MISSING_DELIVERABLE', severity: 'MAJOR', message: `Dòng ${rowNum} (${lessonCode}): thiếu Hands-on Deliverable cụ thể (sản phẩm học sinh làm được trong buổi).` });\n      score -= 8;\n    }\n\n    if (!BLOOM_LEVELS.some((b) => bloom.toLowerCase().includes(b))) {\n      findings.push({ code: 'FW_BAD_BLOOM', severity: 'MINOR', message: `Dòng ${rowNum} (${lessonCode}): cột Bloom \"${bloom}\" không nhận diện được mức Bloom.` });\n      score -= 3;\n    }\n\n    if (prerequisites && prerequisites.toLowerCase() !== 'none' && !/[Uu]\\d{2}[_-][Mm]\\d{2}[_-][Ll]\\d{2}/.test(prerequisites) && !/bài\\s*\\d+/i.test(prerequisites)) {\n      findings.push({ code: 'FW_BAD_PREREQ', severity: 'MINOR', message: `Dòng ${rowNum} (${lessonCode}): Prerequisites \"${prerequisites}\" nên tham chiếu mã bài (UXX_MYY_LZZ) hoặc 'None'.` });\n      score -= 3;\n    }\n\n    if (duration && !/^\\d+$/.test(duration.replace(/\\s*mins?/i, '').trim())) {\n      findings.push({ code: 'FW_BAD_DURATION', severity: 'MINOR', message: `Dòng ${rowNum} (${lessonCode}): Duration phải là số phút.` });\n      score -= 2;\n    }\n  });\n\n  // 4. Forward-reference prerequisites (phụ thuộc bài sau) — theo vị trí dòng ĐẦU TIÊN của mã được tham chiếu\n  const codeFirstIdx = new Map<string, number>();\n  rows.forEach((r, i) => {\n    const code = (r[1] || '').toUpperCase();\n    if (/^[Uu]\\d{2}[_-][Mm]\\d{2}[_-][Ll]\\d{2}$/.test(code) && !codeFirstIdx.has(code)) {\n      codeFirstIdx.set(code, i);\n    }\n  });\n  for (let i = 0; i < rows.length; i++) {\n    const prereq = (rows[i][8] || '').toUpperCase();\n    const match = prereq.match(/[Uu]\\d{2}[_-][Mm]\\d{2}[_-][Ll]\\d{2}/);\n    if (match) {\n      const refIdx = codeFirstIdx.get(match[0].toUpperCase());\n      if (refIdx !== undefined && refIdx > i) {\n        findings.push({ code: 'FW_FORWARD_PREREQ', severity: 'MAJOR', message: `Dòng ${i + 1}: Prerequisites ${match[0]} là bài SAU nó (forward-reference không hợp lệ).` });\n        score -= 6;\n      }\n    }\n  }\n\n  const passed = findings.every((f) => f.severity !== 'CRITICAL') && rows.length > 0;\n  score = Math.max(0, score);\n\n  return {\n    passed,\n    score,\n    totalLessons: rows.length,\n    findings,\n    summary: passed\n      ? `Framework hợp lệ: ${rows.length} buổi, mỗi buổi đủ objective + deliverable + prereq.`\n      : `Framework CHƯA đạt hợp đồng SOT (${findings.filter((f) => f.severity === 'CRITICAL').length} critical): ${findings.slice(0, 5).map((f) => f.message).join(' | ')}`,\n  };\n}\n","import type { FrameworkPack } from '../standards/frameworkPackSchema';\n\n/**\n * Deterministic STANDARD_STACK.md generator (Phase 2).\n *\n * Replaces the old anti-pattern where @researcher was asked to \"cite authentic\n * standards\" from memory (hallucinated IDs). The SOT document is now RENDERED\n * from the Standards Registry packs adopted for the course — verbatim statements,\n * canonical IDs, zero LLM involvement.\n */\nexport interface StandardStackOptions {\n  projectId: string;\n  packs: FrameworkPack[];\n  /** Overall course grade band (canonical numeric) for coverage scoping. */\n  courseGradeBand?: [number, number];\n  language?: string;\n}\n\nfunction bandLabel(band: readonly number[]): string {\n  return band[0] === band[1] ? `L${band[0]}` : `L${band[0]}–L${band[1]}`;\n}\n\nexport function buildStandardStackMarkdown(opts: StandardStackOptions): string {\n  const { projectId, packs, courseGradeBand, language } = opts;\n  const lines: string[] = [];\n\n  lines.push('---');\n  lines.push(`id: \"${projectId.toUpperCase()}-STANDARD-STACK\"`);\n  lines.push(`title: \"Standard Stack: ${projectId}\"`);\n  lines.push('type: \"STANDARD_STACK\"');\n  lines.push('phase: \"P1\"');\n  lines.push('version: \"v2.0-deterministic\"');\n  lines.push(`generatedAt: \"${new Date().toISOString()}\"`);\n  lines.push('source: \"Standards Registry (deterministic render — not LLM-generated)\"');\n  lines.push('---');\n  lines.push('');\n  lines.push('# STANDARD STACK — Hệ tiêu chuẩn tham chiếu');\n  lines.push('');\n\n  if (packs.length === 0) {\n    // Kit SOT audit 2026-09-30: the empty-pack path used to emit ONLY a\n    // blockquote — zero `##` headings — so the section-aware context parser\n    // (H2-boundary based) returned 0 sections for the whole document and\n    // STANDARD_STACK was invisible to every downstream excerpt. A fallback\n    // MUST still render a parseable section structure.\n    lines.push('## Khung Tiêu Chuẩn Tham Chiếu (Fallback — No Pack Adopted)');\n    lines.push('');\n    lines.push('> ⚠️ No Framework Pack adopted for this course. Generation will run WITHOUT standards grounding');\n    lines.push('> (no statement anchoring, no Standards Alignment judge dimension, no coverage gate).');\n    lines.push('> Import a pack via the Standards Registry before generating for standards-bound courses.');\n    lines.push('');\n    lines.push('### Trạng Thái Tiêu Chuẩn');\n    lines.push('');\n    lines.push('| Pack ID | Trust | Statements | Trạng thái |');\n    lines.push('|---|---|---|---|');\n    lines.push('| (none) | — | 0 | ⚠️ Chưa import Framework Pack nào từ Standards Registry |');\n    lines.push('');\n    lines.push('### Hướng Dẫn Khắc Phục');\n    lines.push('');\n    lines.push('- Import ít nhất một Framework Pack (ví dụ CSTA K-12 CS, ACM/IEEE CS2023) qua Standards Registry để STANDARD_STACK chứa các statement verbatim làm mốc đối chiếu.');\n    lines.push('- Khi chưa có pack: mọi trích dẫn tiêu chuẩn trong artifact sinh sau đó phải được đánh dấu là UNVERIFIED — không được trình bày như chuẩn chính thức.');\n    return lines.join('\\n');\n  }\n\n  for (const pack of packs) {\n    const m = pack.manifest;\n    lines.push(`## ${m.name}`);\n    lines.push('');\n    lines.push(`- **Pack ID:** \\`${m.id}\\` (content ${m.contentVersion}, contract v${m.specVersion})`);\n    lines.push(`- **Trust:** ${m.trust} — ${m.trust === 'verified' ? 'platform-curated' : 'org-imported'}`);\n    lines.push(`- **Nguồn:** ${m.provenance.sourceRef}${m.provenance.sourceUrl ? ' (' + m.provenance.sourceUrl + ')' : ''}`);\n    lines.push(`- **License:** ${m.provenance.license}`);\n    lines.push(`- **Grade range (manifest):** ${bandLabel(m.gradeModel.range)}`);\n    lines.push('');\n    lines.push('### Statements (verbatim — binding targets)');\n    lines.push('');\n    lines.push('| ID | Band | Text (verbatim) | Keywords |');\n    lines.push('|---|---|---|---|');\n\n    const statements = courseGradeBand\n      ? pack.statements.filter((s) => Math.max(s.gradeBand[0], courseGradeBand[0]) <= Math.min(s.gradeBand[1], courseGradeBand[1]))\n      : pack.statements;\n\n    for (const s of statements) {\n      const text = (language && s.texts[language]) || Object.values(s.texts)[0];\n      const mapped = (pack.mappings ?? []).filter((mp) => mp.statementId === s.id);\n      const mapNote = mapped.length > 0 ? ` → ${mapped.map((mp) => mp.targetRef + ' (' + mp.kind + ')').join(', ')}` : '';\n      lines.push(`| \\`${s.id}\\` | ${bandLabel(s.gradeBand)} | ${text.replace(/\\|/g, '\\\\|')} | ${(s.keywords || []).join(', ')}${mapNote ? ' |' + mapNote : ' |'}`);\n    }\n    lines.push('');\n  }\n\n  lines.push('---');\n  lines.push('');\n  lines.push('*Document rendered deterministically from the Standards Registry. Statement texts are COPIED VERBATIM from the cited sources and are binding for generation, judging, and coverage reporting.*');\n  return lines.join('\\n');\n}\n","import { resolveArtifactTemplate } from './templateLoader';\n/**\n * Language Directive and section-heading resolution for Curriculum Generation.\n */\n\nexport function resolveTargetLanguageCode(language?: string | null): string {\n  const raw = String(language || 'vi').trim().toLowerCase();\n  if (raw.startsWith('vi')) return 'vi';\n  if (raw.startsWith('en')) return 'en';\n  return raw || 'vi';\n}\n\nexport function targetLanguageDisplayName(code: string): string {\n  const map: Record<string, string> = {\n    vi: 'Vietnamese (Tiếng Việt)',\n    en: 'English (US)',\n  };\n  return map[code] || code;\n}\n\nexport function buildLanguageDirective(targetLanguage?: string | null): string {\n  const code = resolveTargetLanguageCode(targetLanguage);\n  const name = targetLanguageDisplayName(code);\n\n  const perLanguageExamples: Record<string, string> = {\n    vi: `- Ví dụ tiêu đề bài học đúng chuẩn: \"Bài 1: [chủ đề bài học]\", \"Bài 2: [chủ đề bài học tiếp theo]\" — KHÔNG dùng tiêu đề tiếng Anh, không mượn ví dụ từ lĩnh vực khác môn học.`,\n    en: `- Example compliant lesson title: \"Lesson 1: [lesson topic]\" — natural, idiomatic English throughout.`,\n  };\n  const exampleLine = perLanguageExamples[code] || '';\n\n  return `MANDATORY LANGUAGE DIRECTIVE (TARGET OUTPUT LANGUAGE: ${name}):\n- The TARGET OUTPUT LANGUAGE for this course is ${name}. You MUST author the ENTIRE document in ${name}.\n- All section titles, table headers, table cells, lesson names, learning objectives, pedagogical narratives, and cognitive analyses MUST be written in natural, fluent, academic ${name}.\n- Technical identifiers, code keywords, API/framework symbols (e.g. fetch(), main(), init()), and protocol names remain in standard technical notation, but all surrounding explanations MUST be in ${name}. Use the concrete symbols of THIS course's domain — never borrow unrelated-domain vocabulary.\n- DO NOT mix in paragraphs, tables, or titles written in any other language. Strict adherence is required.${exampleLine ? `\\n${exampleLine}` : ''}\n- CJK / NON-LATIN SCRIPT BAN (ABSOLUTE): NEVER output characters from Chinese (汉字), Japanese (かな/漢字), or Korean (한글) scripts ANYWHERE in the document — not even a single glyph spliced inside a ${name} sentence. Observed past violations that are STRICTLY forbidden: 排查, 包含, 导致, 是多少, 技术, 真机, 休息, 纸质. To express such meaning write it fully in ${name} or keep the ENGLISH technical term (e.g. write \"tự kiểm tra lỗi\" / \"self-debugging\", \"bao gồm\" / \"includes\"). A mechanical scanner rejects any document containing even one CJK character.`;\n}\n\n/**\n * P53 rev3 — the template itself is the single source: `sections` is the\n * mechanical echo of its body headings (static text only, [OPTIONAL]\n * excluded). No label map, no fallback — a bundled English template yields\n * English echo; a translated project copy yields the translated echo.\n * This map only resolves artifact type → template file.\n */\nconst TEMPLATE_BY_TYPE: Record<string, string> = {\n  LESSON: 'LESSON_5E_template.md',\n  LESSON_5E: 'LESSON_5E_template.md',\n  LESSON_EDP: 'LESSON_EDP_template.md',\n  LESSON_GENERAL: 'LESSON_GENERAL_template.md',\n  ACT: 'ACT_template.md',\n  CODE: 'CODE_template.md',\n  // JSON-first code lab shares the CODE label set (the serializer renders its\n  // own headings; this lookup only feeds the directive fallback path).\n  CODE_LAB: 'CODE_template.md',\n  QUIZ: 'QUIZ_v4.6_template.md',\n  GUIDE: 'GUIDE_template.md',\n  HANDOUT: 'HANDOUT_template.md',\n  WKS: 'WKS_template.md',\n  EXT: 'EXT_template.md',\n  SLIDE: 'SLIDE_template.md',\n  KNOWLEDGE_EXPOSITION: 'KNOWLEDGE_EXPOSITION_template.md',\n  LEARNER_PROFILE: 'LEARNER_PROFILE_template.md',\n  PROJECT_BRIEF: 'PROJECT_BRIEF_template.md',\n  CURRICULUM_FRAMEWORK: 'CURRICULUM_FRAMEWORK_template.md',\n  CONTENT_STYLE_GUIDE: 'CONTENT_STYLE_GUIDE_template.md',\n};\n\n/**\n * Identity heading map from the resolved template's echo (canonical = display).\n */\nexport function extractSectionHeadings(\n  artifactType: string,\n  opts?: { templatesDir?: string }\n): Record<string, string> {\n  const templateFile = TEMPLATE_BY_TYPE[artifactType.trim().toUpperCase()];\n  if (!templateFile) return {};\n  const resolved = resolveArtifactTemplate(templateFile, opts);\n  if (!resolved) return {};\n  return Object.fromEntries(resolved.sections.map((s) => [s, s]));\n}\n\n/**\n * Builds the heading directive block to instruct the LLM on section headings.\n *\n * P53 rev3 — one regime only: the resolved template's ECHO is the source.\n *   - Translated project copy (declaredLang ≠ \"en\"): headings are already the\n *     display strings.\n *   - Bundled English template: echo = English headings.\n * The frontmatter list is system-owned (it IS the echo), so the directive\n * tells the LLM to copy it verbatim — never to translate or invent entries.\n */\nexport function buildHeadingDirective(\n  artifactType: string,\n  opts?: { templatesDir?: string }\n): string {\n  const headings = extractSectionHeadings(artifactType, opts);\n  if (Object.keys(headings).length === 0) {\n    return '';\n  }\n\n  const lines = Object.keys(headings).map((heading) => `  - \"${heading}\"`);\n\n  return `MANDATORY SECTION HEADINGS (SOURCE: RESOLVED ARTIFACT TEMPLATE):\n- Copy the template's YAML frontmatter \\`template_required_sections\\` list VERBATIM into the artifact frontmatter — never translate, reorder, or invent entries.\n- In the markdown body, section headers MUST be exactly the Display Headings below (do NOT translate, paraphrase, or re-marker them):\n${lines.join('\\n')}\n- Example: if the resolved template's heading is \"${Object.values(headings)[0]}\", your body heading must be exactly \"## ${Object.values(headings)[0]}\".`;\n}\n\n/**\n * Kit 1.5.64: heading directive for the SLIDE artifact that respects a caller-\n * supplied REQUIRED outline. buildHeadingDirective('SLIDE') injects the\n * resolved template's \"MANDATORY SECTION HEADINGS\" + \"copy\n * template_required_sections VERBATIM\" — with a required outline that\n * directive beats the outline (the model clones the template's section list;\n * measured live on kit 1.5.61–1.5.63 L02 marp runs). When an outline is\n * supplied, the outline IS the section directive.\n */\nexport function slideHeadingDirective(slidesOutline?: string[]): string {\n  if (slidesOutline?.length) {\n    return 'SECTION STRUCTURE: the REQUIRED SLIDE OUTLINE in the prompt is the deck\\'s section spine — use the outline items as section headings (in order). Do NOT copy any template\\'s section list, template headings, or template_required_sections into the artifact.';\n  }\n  return buildHeadingDirective('SLIDE');\n}\n","/**\n * SOT Artifact Ownership Taxonomy (kit 1.5.71)\n * ═════════════════════════════════════════════\n * Single source of truth for WHICH artifact owns WHICH information, enforcing\n * the uni-directional information flow principle from the 2026-09-30 SOT audit\n * handover: the merged SOT set must paint ONE complete picture with ZERO\n * overlap — every fact lives in exactly one artifact.\n *\n * Three enforcement layers consume this module:\n *   1. Templates   — docs/refs/templates/*_template.md carry the same ownership\n *                    headers, so the LLM sees the boundary while filling them.\n *   2. Prompts     — buildSelectiveContext already scopes survey data per role;\n *                    prompts now also quote the ownership line from here.\n *   3. Linter      — lintSotBoundaries() scans generated artifacts for content\n *                    that belongs to ANOTHER artifact's exclusive fields.\n */\n\n/**\n * Actual generation order (measured in sotGeneratorService.ts):\n *   Phase 1 (Foundation, @analyst/@researcher): LEARNER_PROFILE → PROJECT_BRIEF → REFERENCE_PACK\n *   Phase 1.5 (deterministic):                   STANDARD_STACK\n *   Phase 2 (Architecture, @designer):           CURRICULUM_FRAMEWORK → CONTENT_STYLE_GUIDE → ART_DIRECTION\n *   Phase 3:                                     ALIGNMENT_MATRIX\n * Downstream artifacts READ upstream ones (generatePhase2SotArtifacts reads\n * the Phase-1 files) — information flows strictly DOWN this list.\n */\nexport const SOT_GENERATION_ORDER: SotArtifactId[] = [\n  'LEARNER_PROFILE',\n  'PROJECT_BRIEF',\n  'REFERENCE_PACK',\n  'STANDARD_STACK',\n  'CURRICULUM_FRAMEWORK',\n  'CONTENT_STYLE_GUIDE',\n  'ART_DIRECTION',\n  'ALIGNMENT_MATRIX',\n];\n\nexport type SotArtifactId =\n  | 'LEARNER_PROFILE'\n  | 'PROJECT_BRIEF'\n  | 'REFERENCE_PACK'\n  | 'CURRICULUM_FRAMEWORK'\n  | 'CONTENT_STYLE_GUIDE'\n  | 'ART_DIRECTION'\n  | 'STANDARD_STACK'\n  | 'ALIGNMENT_MATRIX';\n\n/** Information domains and the ONE artifact that owns each. */\nexport interface OwnershipRule {\n  /** Stable domain key (referenced by linter findings). */\n  domain: string;\n  /** Human-readable label used in prompts/template headers. */\n  label: string;\n  /** The single artifact allowed to state facts in this domain. */\n  owner: SotArtifactId;\n  /** Exclusive field/section names of the owner (its signature content). */\n  ownerMarkers: string[];\n  /**\n   * Regexes that detect the domain's content LEAKING into another artifact.\n   * Keep them high-precision: a match is a boundary violation, not a mention.\n   */\n  leakPatterns: RegExp[];\n  /** Why this boundary exists (surfaced in linter findings). */\n  rationale: string;\n}\n\nexport const SOT_OWNERSHIP: OwnershipRule[] = [\n  {\n    domain: 'session_logistics',\n    label: 'Session logistics (duration, session count, frequency)',\n    owner: 'PROJECT_BRIEF',\n    ownerMarkers: ['Total Duration', 'Session Duration', 'Total Sessions', 'Frequency'],\n    leakPatterns: [\n      /(?:session|buổi)\\s*(?:duration|thời lượng)[^\\n]*:\\s*\\d+/i,\n      /total\\s+sessions?[^\\n]*:\\s*\\d+/i,\n      /\\d+\\s*(?:sessions|buổi)\\s*\\/\\s*week/i,\n    ],\n    rationale: 'Logistics is a project-operations fact; the learner profile describes the PERSON, not the schedule.',\n  },\n  {\n    domain: 'equipment_budget',\n    label: 'Equipment, hardware BOM and budget',\n    owner: 'PROJECT_BRIEF',\n    ownerMarkers: ['Student Equipment', 'Hardware Budget', 'Technical Constraints', 'Kit Ratio'],\n    leakPatterns: [\n      /(?:student\\s+)?equipment[^\\n:]*:\\s*[A-Za-z]/i,\n      /hardware\\s+budget[^\\n:]*:/i,\n      /(?:budget|ngân sách)\\s*(?:per\\s+student|mỗi\\s*học\\s*sinh)/i,\n      /kit\\s+ratio|2\\s*học\\s*sinh\\s*\\/\\s*(?:1\\s*)?bộ\\s*kit/i,\n    ],\n    rationale: 'Equipment and budget are procurement facts owned by the project brief.',\n  },\n  {\n    domain: 'learner_psychology',\n    label: 'Learner psychology (motivation, barriers, scaffolding needs)',\n    owner: 'LEARNER_PROFILE',\n    ownerMarkers: ['Entry Level', 'Motivation', 'Cognitive Scaffolding', 'Learning Barriers'],\n    leakPatterns: [\n      /(?:learning\\s+)?barriers?[^\\n:]*:\\s*[A-Za-z]/i,\n      /motivation[^\\n:]*:\\s*(?:students?|học\\s*sinh)/i,\n    ],\n    rationale: 'Psychology/cognition facts live only in the learner profile; other artifacts reference learners by role, not psyche.',\n  },\n  {\n    domain: 'visual_identity',\n    label: 'Visual identity (palette, typography, diagram styling)',\n    owner: 'ART_DIRECTION',\n    ownerMarkers: ['Color Palette', 'Typography', 'Visual Identity', 'Diagram Standards'],\n    leakPatterns: [\n      /#[0-9a-f]{6}\\b/i,\n      /(?:font[- ]family|phông\\s*chữ)[^\\n:]*:/i,\n      /color\\s*palette|bảng\\s*màu/i,\n    ],\n    rationale: 'Hex codes, fonts and palettes are art-direction facts; style guide owns VOICE, not visuals.',\n  },\n  {\n    domain: 'external_references',\n    label: 'External technical references (docs, URLs, citations)',\n    owner: 'REFERENCE_PACK',\n    ownerMarkers: ['Coverage Summary', 'Detailed Technical References', 'Official Standards Alignment'],\n    leakPatterns: [\n      /https?:\\/\\/[^\\s)]+/,\n      /source:\\s*https?/i,\n    ],\n    rationale: 'Citations and external links live in the reference pack; other artifacts state facts, not sources.',\n  },\n];\n\nexport interface SotBoundaryFinding {\n  artifact: SotArtifactId;\n  /** The artifact that legitimately owns the leaked content. */\n  owner: SotArtifactId;\n  domain: string;\n  line: number;\n  excerpt: string;\n  rationale: string;\n}\n\n/**\n * Lint ONE generated SOT artifact against the ownership taxonomy. Everything\n * it owns is exempt; a hit on an exclusive domain of ANOTHER artifact is a\n * boundary violation with a fix hint.\n */\nexport function lintSotBoundaries(artifact: SotArtifactId, markdown: string): SotBoundaryFinding[] {\n  const findings: SotBoundaryFinding[] = [];\n  const lines = String(markdown ?? '').split('\\n');\n\n  for (const rule of SOT_OWNERSHIP) {\n    if (rule.owner === artifact) continue; // owner is exempt for its own domain\n    // Frontmatter is metadata, not content — skip it.\n    let inFrontmatter = false;\n    let fmDone = false;\n    lines.forEach((line, idx) => {\n      if (!fmDone && line.trim() === '---') {\n        if (!inFrontmatter) inFrontmatter = true;\n        else { fmDone = true; inFrontmatter = false; }\n        return;\n      }\n      if (inFrontmatter) return;\n      if (rule.leakPatterns.some((re) => re.test(line))) {\n        findings.push({\n          artifact,\n          owner: rule.owner,\n          domain: rule.domain,\n          line: idx + 1,\n          excerpt: line.trim().slice(0, 160),\n          rationale: rule.rationale,\n        });\n      }\n    });\n  }\n  return findings;\n}\n\n/**\n * Order-aware boundary header for prompts + templates. Beyond domain ownership\n * it states the GENERATION ORDER rule: an artifact may CONSUME upstream facts\n * (they were its inputs) but must NOT re-state them as its own content — the\n * merged SOT set must read as one picture where each fact appears exactly once,\n * in the artifact that owns it.\n */\nexport function ownershipHeader(artifact: SotArtifactId): string {\n  const idx = SOT_GENERATION_ORDER.indexOf(artifact);\n  const upstream = idx > 0 ? SOT_GENERATION_ORDER.slice(0, idx).join(' → ') : '(none — first artifact)';\n  const downstream = idx < SOT_GENERATION_ORDER.length - 1\n    ? SOT_GENERATION_ORDER.slice(idx + 1).join(' → ')\n    : '(none — last artifact)';\n  const mine = SOT_OWNERSHIP.filter((r) => r.owner === artifact)\n    .map((r) => `- ✅ OWNS: ${r.label}`)\n    .join('\\n');\n  const others = SOT_OWNERSHIP.filter((r) => r.owner !== artifact)\n    .map((r) => `- ❌ NOT HERE (owned by ${r.owner}): ${r.label}`)\n    .join('\\n');\n  return `> **BOUNDARY CONTRACT (${artifact})** — merged SOT must have ZERO overlap.\n> Generation order: ${SOT_GENERATION_ORDER.join(' → ')}.\n> You are #${idx + 1} in that order. UPSTREAM (already generated, you may CONSUME their facts as inputs): ${upstream}.\n> DOWNSTREAM (will be generated after you; they will read YOUR facts — do not pre-empt their domains): ${downstream}.\n> RULE: state a fact ONLY in the domain you own, ONCE. Consumed upstream facts must not be re-stated as your own content — downstream artifacts get them by reading the upstream artifact, not by reading you.\n${mine}\n${others}`;\n}\n","import type { ICurriculumStorage, ProjectStatusReport, PipelineState } from '../storage/types';\nimport { computeContentHash } from '../storage/fileSystemCurriculumAdapter';\nimport { runCurriculumAIInference, type ChunkType } from '../ai/streamRunner';\nimport { LLMJudgeEngine } from '../ai/llmJudgeEngine';\nimport type { JudgeEvaluationResult } from '../ai/llmJudgeEngine';\nimport { lintAndSanitizeArtifact } from '../pipeline/artifactLinter';\nimport { createAiInferenceError, CurriculumError } from '../errors';\nimport { getProjectArtifactScope } from './statusService';\nimport { resolveGateSettings, gateModeFor, type ResolvedGateSettings } from '../workflow/gateSettings';\nimport { ensureExpositionForLesson, type ExpositionResult } from './knowledgeExpositionService';\nimport { buildSessionSliceContext } from './curriculumPlannerService';\nimport { buildStandardsContext, selectStatementsForLesson } from '../standards/standardsContextInjector';\nimport { evaluateStandardsCoverage, type CoverageGateReport } from '../standards/standardsCoverageGate';\nimport { resolveStandardsPacks, extractStandardRefs } from '../standards/bundledPacks';\nimport type { FrameworkPack } from '../standards/frameworkPackSchema';\nimport {\n  buildLanguageDirective,\n  buildHeadingDirective,\n  slideHeadingDirective,\n  resolveTargetLanguageCode,\n} from './languageDirective';\nimport {\n  buildSectionAwareExcerpt,\n  buildExpositionExcerpt,\n  extractSymbolLedger,\n  DEFAULT_LESSON_PRIORITIES,\n  SATELLITE_LESSON_PRIORITIES,\n  extractCurriculumHorizon,\n  renderHorizonPromptBlock,\n  type CurriculumHorizon,\n} from './contextBuilder';\nimport { buildDomainLexiconGuardrail } from './knowledgeExpositionService';\nimport { validateArtifactDeterministic, validatorRepairPrompt, checkLessonOwnership } from './artifactValidators';\nimport { buildProductSpecBlock } from './productSpec';\nimport { buildSatelliteContext, evaluateActivityAlignment, type SatContextResult, type ContextRoutingMode } from './contextSlots';\nimport { buildMarpMarkdownSlidePrompt, buildHtmlDeckSlidePrompt } from '../ai/prompts/slidesPrompt';\nimport { loadCurriculumTemplate } from './templateLoader';\nimport {\n  buildLessonPrompt,\n  buildSatellitePrompt,\n  zpdCeilingPrompt,\n  EXT_HEADINGS_VI,\n  EXT_HEADINGS_EN,\n  type PedagogicalModel,\n} from './productionPromptAssembler';\n// `buildArtifactPrompt`, `dropTemplateSections`, `buildLessonPrompt`,\n// `NO_VERBATIM_COPYING` and every satellite directive moved verbatim into\n// `productionPromptAssembler`, which `services/index.ts` star-exports. They are\n// NOT re-exported here: two `export *` barrels claiming the same name would\n// make those exports ambiguous and silently drop them.\nimport { parseArtifactAst } from '../parsers/artifactAstParser.js';\nimport { projectAstForPrompt } from '../parsers/artifactAstProjection.js';\nimport { getKxSlotPriorities, DEFAULT_KX_SLOT_PRIORITIES } from '../registry/index.js';\n\n/**\n * Canonical KX excerpt feeding the LLM judge — AST-primary: project the\n * lossless AST via the registry's semantic-key kxPriorities (same specs the\n * satellite path consumes; LESSON has no per-type spec, so the registry\n * default mirrors what the markdown fallback prioritizes). Falls back to the\n * section-aware markdown excerpt only when the AST overlay resolves nothing.\n * Budgets are characters in both views.\n */\nfunction canonicalExpositionForJudge(expositionContext: string | undefined): string | undefined {\n  // ponytail: no onWarning here — the judge payload is a bare string with no\n  // diagnostics channel, so a warning would have nowhere to land. Ceiling: a\n  // budget-tight KX loses a section to the judge silently. Upgrade path: widen\n  // the return to `{ excerpt, issues }` and forward into the judge's metadata.\n  if (!expositionContext || !expositionContext.trim()) return undefined;\n  const priorities = getKxSlotPriorities('LESSON') ?? DEFAULT_KX_SLOT_PRIORITIES;\n  const projected = projectAstForPrompt(parseArtifactAst(expositionContext), priorities, { budgetTokens: 3000 });\n  if (projected.trim()) return projected;\n  return buildExpositionExcerpt(expositionContext, { budget: 3000, artifactType: 'KNOWLEDGE_EXPOSITION' }).excerpt;\n}\n\n/**\n * KNOWLEDGE_EXPOSITION slot for the plan-driven LESSON flow — AST-primary\n * with the ExcerptResult telemetry shape. The AST projection only ever ships\n * the requested keys, so it matches the markdown builder's `exclusive: true`\n * whole-section selection semantics. `verified: true` means \"resolved\", not\n * \"complete\": the projection drops a section that does not fit the budget WHOLE,\n * so its `section:dropped:` warnings are forwarded as `issues` — hardcoding\n * `issues: []` here is what made a truncated canonical KX excerpt look\n * indistinguishable from a complete one. The markdown excerpt builder (same\n * priorities + budget, exclusive) remains the fallback when the AST overlay\n * resolves nothing.\n */\nexport function canonicalExpositionSource(\n  markdown: string | undefined,\n  priorities: string[],\n  budget: number\n): { excerpt: string; verified: boolean; sectionAware: boolean; issues: string[] } {\n  if (markdown && markdown.trim()) {\n    const issues: string[] = [];\n    const projected = projectAstForPrompt(parseArtifactAst(markdown), priorities, {\n      budgetTokens: budget,\n      onWarning: (msg) => issues.push(msg),\n    });\n    if (projected.trim()) return { excerpt: projected, verified: true, sectionAware: true, issues };\n  }\n  const fallback = buildExpositionExcerpt(markdown ?? '', {\n    budget,\n    artifactType: 'KNOWLEDGE_EXPOSITION',\n    priorities,\n    exclusive: true,\n  });\n  return { excerpt: fallback.excerpt, verified: fallback.verified, sectionAware: fallback.sectionAware, issues: fallback.issues };\n}\n\n// ─── P52: Runtime artifact templates (single source of truth) ───────────\n// Structure comes from docs/refs/templates/*.md loaded at RUNTIME (with\n// project-level `_templates/` override); methodology directives live in\n// `productionPromptAssembler.ts`, which owns `buildArtifactPrompt` and every\n// per-type directive. `produceSingleLesson` calls into that module, so the\n// playground's path-comparison tab compares the text production actually sends\n// instead of a second, silently-drifting copy. Re-exported here so every\n// pre-extraction import site keeps working.\n\n/**\n * P52: raw template lookup moved to `templateLoader.ts` (runtime resolution\n * across packaged dist/templates, project `_templates/`, and repo layouts).\n * Re-exported here for backward compatibility with pre-P52 import sites.\n */\nexport { loadCurriculumTemplate };\n\n\nexport interface ProduceLessonOptions {\n  artifactScope?: string[];\n  force?: boolean;\n  pedagogy?: PedagogicalModel;\n  targetLanguage?: string;\n  slidesEngine?: 'html' | 'marp';\n  /**\n   * Deck engine for the HTML slide path (RC 2026-09-23): 'bespoke' (model\n   * authors full HTML/CSS per slide — the frontend-slides skill) is the\n   * STANDARD; 'chunked'/'hybrid' keep the slot-template pipeline. Previously\n   * this call-site never passed an engine, so every queue run silently\n   * degraded bespoke → hybrid slot slides.\n   */\n  slidesDeckEngine?: 'bespoke' | 'hybrid' | 'chunked';\n  /** Optional REQUIRED slide outline (kit 1.5.60): ordered section titles the\n   *  SLIDE deck must cover in order. Supplied → deck blueprint follows it as a\n   *  hard structural constraint (same outline across engines ⇒ same deck\n   *  structure). Omitted → each engine self-plans its blueprint (standalone\n   *  slide-only artifacts without a LESSON still work). */\n  slidesOutline?: string[];\n  /** Chiến lược batch (chỉ produceBatchLessons dùng). */\n  batchStrategy?: 'depth_first_lesson' | 'breadth_first_artifact';\n  /**\n   * Gate Settings — NGUỒN DUY NHẤT quyết định \"ai kiểm artifact nào\".\n   * Chấp nhận config thô (vd: gateModes từ project.config.json của Composer):\n   * { LESSON: 'llm_judge', ACT: 'none', gate1: 'hitl', ... } — kit tự chuẩn hoá.\n   * Riêng approvedArtifacts là INPUT của HITL (bản đã được người duyệt), không phải config.\n   */\n  gateSettings?: unknown;\n  /**\n   * Standards Registry packs (đã validate + activate) để GROUNDING prompt và Judge.\n   * Không truyền → pipeline chạy như cũ, không inject block chuẩn nào.\n   */\n  standardsPacks?: import('../standards/frameworkPackSchema').FrameworkPack[];\n  /** Id pack đóng gói sẵn trong kit (vd: 'csta-k12-2017') — cách Composer truyền chuẩn gọn nhất. */\n  standardsPackIds?: string[];\n  /** Grade band của lesson (để chọn statement theo lớp). Fallback [6,12]. */\n  gradeBand?: [number, number] | number;\n  /**\n   * Media Ledger policy (nếu có): agent chèn placeholder [IMAGE: slug], Curator duyệt, Fulfiller thực thi.\n   * maxGenImagesPerArtifact = quota ảnh AI/gen — search kho ảnh (Pexels) KHÔNG tốn quota này.\n   */\n  mediaPolicy?: {\n    maxGenImagesPerArtifact: number;\n    autoFulfill?: boolean;\n    preferredProvider?: 'openai' | 'gemini';\n    mode?: 'search_only' | 'gen_only' | 'auto';\n  };\n  approvedArtifacts?: string[]; // e.g. ['LESSON']\n  /**\n   * 5-Whys RC-canonicality: project briefing feeding the canonical PRODUCT_SPEC\n   * block (platform, hardware, deliverable template). Injected identically into\n   * every artifact's ground truth so no artifact re-decides product shape.\n   */\n  briefing?: {\n    techStack?: string;\n    coreTechnology?: string;\n    topic?: string;\n    hardwarePlatform?: string;\n    studentEquipment?: string;\n    classDynamic?: string;\n    language?: string;\n    /** P49 G1.2/G2: pedagogical slots consumed by context routing (age-appropriate language, bridge hints). */\n    targetAge?: string;\n    targetAgeTier?: string;\n    entryBridge?: string;\n    assessmentStrategy?: string;\n  };\n  /**\n   * P49 G2: Micro-Slot context routing mode. 'legacy' (default) = the\n   * pre-P49 one-size-fits-all satelliteContext. 'hybrid' = per-artifact\n   * whitelisted slots (LESSON-primary scoped excerpts; KX-only types get KX\n   * priorities + activity-contract mini-slot). Shadow-compare before\n   * flipping the app default.\n   */\n  contextRoutingMode?: ContextRoutingMode;\n  /**\n   * P46 RC2: host-provided inference override (Vercel AI SDK gateway).\n   * When supplied, ALL lesson/satellite LLM calls route through it — the kit's\n   * internal raw-fetch providers never run, so the embedding app gets one\n   * auditable, traceable (Langfuse/OTel) inference engine.\n   */\n  customInference?: import('../ai/streamRunner').StreamRunnerOptions['customInference'];\n  onProgress?: (agent: string, message: string, meta?: any) => void;\n}\n\nexport interface ContextInjectionMeta {\n  /** Which canonical source the excerpt came from (e.g. 'KNOWLEDGE_EXPOSITION', 'LESSON'). */\n  source: string;\n  /** True when the builder excerpt passed verify (priority resolution + sufficiency). */\n  verified: boolean;\n  /** True when canonical section resolution contributed to the excerpt. */\n  sectionAware: boolean;\n  /** Structured reasons when verified === false (empty otherwise). */\n  issues: string[];\n}\n\nexport interface ProduceLessonResult {\n  lessonId: string;\n  pedagogy: PedagogicalModel;\n  producedArtifacts: string[];\n  pausedForReview: boolean;\n  gateStatus?: string;\n  /** P43 Cụm 5: observability for context injection — surfaced by every path\n   *  (queue, standalone, batch) so callers can record telemetry / execution\n   *  history without re-parsing. */\n  contextInjection?: ContextInjectionMeta;\n  promptChars?: number;\n  /** Truncation telemetry (1.5.54): every canonical section a satellite prompt\n   *  ran WITHOUT (whole-section dropped for budget, or truncated). Empty runs\n   *  omit the field — presence itself is the degradation signal. */\n  contextDrops?: Array<{ artifactType: string; slot: string; section: string; kind: 'dropped' | 'truncated' }>;\n  standardsCoverage?: CoverageGateReport;\n}\n\n/**\n * Detects pedagogical model from SOT (Framework, Style Guide, or Brief)\n */\nexport function detectProjectPedagogy(\n  frameworkText: string,\n  styleGuideText: string,\n  explicitPedagogy?: PedagogicalModel\n): PedagogicalModel {\n  if (explicitPedagogy) return explicitPedagogy;\n\n  const combined = (frameworkText + ' ' + styleGuideText).toLowerCase();\n  if (combined.includes('edp') || combined.includes('engineering design process') || combined.includes('thiết kế kỹ thuật')) {\n    return 'edp';\n  }\n  if (combined.includes('pbl') || combined.includes('project-based') || combined.includes('dựa trên dự án')) {\n    return 'pbl';\n  }\n  if (combined.includes('general') || combined.includes('truyền thống') || combined.includes('standard lesson format')) {\n    return 'general';\n  }\n  return '5e';\n}\n\n/**\n * Extracts lesson information (Title, Concept, Bloom, Unit, Module) from CURRICULUM_FRAMEWORK.md.\n */\nexport async function getLessonMetadata(\n  storage: ICurriculumStorage,\n  projectId: string,\n  lessonId: string\n): Promise<{\n  unitCode: string;\n  moduleCode: string;\n  lessonCode: string;\n  lessonTitle: string;\n  concept: string;\n  prerequisites: string;\n  bloomLevel: string;\n}> {\n  const parts = lessonId.split('_');\n  const unitCode = parts[0] || 'U01';\n  const moduleCode = parts.length >= 2 ? `${parts[0]}_${parts[1]}` : `${unitCode}_M01`;\n  const lessonCode = lessonId;\n\n  // 1. Primary path (P42): read from CURRICULUM_PLAN.json FIRST\n  let planStr: string | null = null;\n  try {\n    planStr = (await storage.readSotDocument(projectId, 'CURRICULUM_PLAN.json')) ||\n              (await storage.readArtifact(projectId, '_sot/CURRICULUM_PLAN.json')) ||\n              (await storage.readArtifact(projectId, 'CURRICULUM_PLAN.json'));\n  } catch {}\n\n  if (planStr) {\n    try {\n      const plan = JSON.parse(planStr);\n      if (Array.isArray(plan.sessions)) {\n        const session = plan.sessions.find((s: any) => s.id === lessonId);\n        if (session) {\n          const lessonTitle = session.title || `Lesson ${lessonId}`;\n          const keywords = Array.isArray(session.new_keywords) && session.new_keywords.length > 0\n            ? ` Từ khóa: ${session.new_keywords.join(', ')}`\n            : '';\n          const objective = session.prose_objective || session.title || '';\n          const concept = objective ? `${objective}.${keywords}` : (session.title || 'Core Technical Competency');\n          const prerequisites = session.anchor_type ? `Anchor: ${session.anchor_type}` : 'None';\n          const depth = Array.isArray(session.depth_assignments)\n            ? session.depth_assignments[0]?.depth\n            : session.depth_assignments?.knowledge_depth;\n          const bloomLevel = depth === 'sio' ? 'Create' : depth === 'cio' ? 'Apply' : 'Understand';\n\n          return {\n            unitCode: session.unit_id || unitCode,\n            moduleCode,\n            lessonCode,\n            lessonTitle,\n            concept: `Mục tiêu buổi học: ${concept}`,\n            prerequisites,\n            bloomLevel,\n          };\n        }\n      }\n    } catch (planErr) {\n      console.warn(`[getLessonMetadata] Error parsing CURRICULUM_PLAN.json for ${projectId}:`, planErr);\n    }\n  }\n\n  // 2. Fallback: Parse markdown table from CURRICULUM_FRAMEWORK.md\n  const framework = (await storage.readSotDocument(projectId, 'CURRICULUM_FRAMEWORK.md')) || '';\n\n  let lessonTitle = `Lesson ${lessonId}`;\n  let concept = 'Core Technical Competency';\n  let prerequisites = 'None';\n  let bloomLevel = 'Apply';\n  let objective = '';\n  let deliverable = '';\n  let found = false;\n\n  // ── Đọc bảng Scope & Sequence THEO HEADER (không theo vị trí cứng) ──\n  // Hỗ trợ bảng hợp đồng mới (11 cột có Lesson Code + Learning Objective) VÀ bảng legacy (6 cột).\n  const lines = framework.split('\\n');\n  let headerCols: string[] = [];\n  for (const line of lines) {\n    const trimmed = line.trim();\n    if (!trimmed.startsWith('|')) continue;\n    const cols = trimmed.split('|').slice(1, -1).map((c) => c.trim());\n    const lower = cols.map((c) => c.toLowerCase());\n\n    // Header row? — ghi mapping cột\n    if (lower.some((c) => c.includes('lesson code') || c === 'mã bài')) {\n      headerCols = cols;\n      continue;\n    }\n    if (/^[-: |]+$/.test(trimmed.slice(1, -1))) continue;\n    if (cols.length < 3) continue;\n\n    // Tìm dòng của bài này: cột nào chứa mã UXX_MYY_LZZ khớp lessonId\n    const codePattern = new RegExp('^' + lessonId.replace(/_/g, '[_-]') + '$', 'i');\n    const codeColIdx = cols.findIndex((c) => codePattern.test(c.replace(/\\*\\*/g, '').trim()));\n    if (codeColIdx === -1) continue;\n\n    if (headerCols.length > 0) {\n      // Bảng có header chuẩn → map theo tên cột\n      const col = (name: string): string => {\n        const idx = headerCols.findIndex((h) => h.toLowerCase().includes(name));\n        return idx >= 0 ? (cols[idx] || '') : '';\n      };\n      lessonTitle = (col('title') || col('tên')).replace(/\\*\\*/g, '') || lessonTitle;\n      objective = col('learning objective') || col('objective') || col('mục tiêu') || '';\n      concept = col('key concept') || col('concept') || col('khái niệm') || concept;\n      deliverable = col('deliverable') || col('sản phẩm') || '';\n      prerequisites = col('prerequisit') || col('tiền điều kiện') || prerequisites;\n      bloomLevel = col('bloom') || bloomLevel;\n      found = true;\n    } else {\n      // Bảng legacy không có header: đoán theo vị trí (hành vi cũ)\n      lessonTitle = cols[2]?.replace(/\\*\\*/g, '') || lessonTitle;\n      concept = cols[4] || concept;\n      prerequisites = cols[5] || prerequisites;\n      bloomLevel = cols[6] || bloomLevel;\n      found = true;\n    }\n    if (found) break;\n  }\n\n  if (found) {\n    // Objective/deliverable từ framework chảy thẳng vào metadata — SOT thật cho LESSON prompt\n    return {\n      unitCode,\n      moduleCode,\n      lessonCode,\n      lessonTitle,\n      concept: objective ? `${concept}. Mục tiêu buổi học: ${objective}` : concept,\n      prerequisites: deliverable ? `${prerequisites}. Sản phẩm hands-on của buổi: ${deliverable}` : prerequisites,\n      bloomLevel,\n    };\n  }\n\n  // 3. Fail-closed (P42): Lesson not found in Plan OR Framework -> Throw CurriculumError\n  throw new CurriculumError({\n    errorCode: 'ERR_LESSON_NOT_IN_SOT',\n    lessonId,\n    message: `ERR_LESSON_NOT_IN_SOT: Bài học \"${lessonId}\" không tồn tại trong CURRICULUM_PLAN.json hoặc CURRICULUM_FRAMEWORK.md của dự án \"${projectId}\".`,\n    suggestedAction: 'Đồng bộ CURRICULUM_PLAN rồi chạy lại',\n    retryable: false,\n  });\n}\n\n/**\n * P1: Framework excerpt CÓ CHỦ ĐIỂM cho từng bài — thay cho slice(0,1500) mù:\n * Global Objectives + Structural Hierarchy + dòng bài hiện tại (đủ cột) + 2 dòng lân cận (context trước/sau).\n */\nfunction buildFrameworkExcerptForLesson(framework: string, lessonId: string): string {\n  if (!framework) return '';\n  const lines = framework.split('\\n');\n\n  // 1. Lấy khối Global Learning Objectives\n  const objStart = lines.findIndex((l) => /##\\s*\\[?REQUIRED\\]?\\s*Global Learning Objectives/i.test(l));\n  let objectivesBlock = '';\n  if (objStart >= 0) {\n    const objLines: string[] = [];\n    for (let i = objStart; i < Math.min(objStart + 12, lines.length); i++) {\n      if (i > objStart && /^##\\s/.test(lines[i] as string)) break;\n      objLines.push(lines[i] as string);\n    }\n    objectivesBlock = objLines.join('\\n');\n  }\n\n  // 2. Tìm các dòng Scope & Sequence: bài hiện tại + lân cận\n  const scopeRows: number[] = [];\n  lines.forEach((l, idx) => {\n    if (l.includes('|') && new RegExp(lessonId.replace(/_/g, '[_-]'), 'i').test(l)) scopeRows.push(idx);\n  });\n  const rowIdx = scopeRows[0] ?? -1;\n  const currentRow = rowIdx >= 0 ? lines[rowIdx] : '';\n  // Audit fix #5: a markdown separator row (|---|---|) directly above the\n  // current row is TABLE DECORATION, not the previous lesson — emitting it\n  // under \"[BÀI TRƯỚC — học sinh đã biết gì]\" fed the model garbage.\n  const isSeparatorRow = (l: string | undefined) => !!l && /^\\s*\\|?[\\s:|-]+\\|?\\s*$/.test(l) && l.includes('-');\n  const prevRaw = rowIdx > 0 ? lines[rowIdx - 1] : '';\n  const prevRow = prevRaw.trim().startsWith('|') && !isSeparatorRow(prevRaw) ? prevRaw : '';\n  const nextRaw = lines[rowIdx + 1] || '';\n  const nextRow = nextRaw.trim().startsWith('|') && !isSeparatorRow(nextRaw) ? nextRaw : '';\n\n  // 3. Hierarchy table (structural) — cắt gọn 10 dòng đầu\n  const hierStart = lines.findIndex((l) => /Structural Hierarchy/i.test(l));\n  let hierarchyBlock = '';\n  if (hierStart >= 0) {\n    hierarchyBlock = lines.slice(hierStart, Math.min(hierStart + 12, lines.length)).join('\\n');\n  }\n\n  const parts = [\n    objectivesBlock && `[GLOBAL LEARNING OBJECTIVES]:\\n${objectivesBlock}`,\n    hierarchyBlock && `[COURSE STRUCTURE]:\\n${hierarchyBlock}`,\n    currentRow && `[BÀI HIỆN TẠI (${lessonId}) — dòng Scope & Sequence của chính bài này]:\\n${currentRow}`,\n    prevRow && `[BÀI TRƯỚC — học sinh đã biết gì]:\\n${prevRow}`,\n    nextRow && `[BÀI SAU — cầu nối cần đặt]:\\n${nextRow}`,\n  ].filter(Boolean);\n\n  return parts.join('\\n\\n') || framework.slice(0, 1500);\n}\n\n/**\n * Produces artifacts for a single lesson with support for dynamic pedagogy, HITL gating, and artifact scope.\n */\nexport async function produceSingleLesson(\n  storage: ICurriculumStorage,\n  projectId: string,\n  lessonId: string,\n  options: ProduceLessonOptions = {}\n): Promise<ProduceLessonResult> {\n  const {\n    artifactScope = ['LESSON', 'ACT', 'QUIZ', 'SLIDE'],\n    force = false,\n    approvedArtifacts = [],\n    onProgress\n  } = options;\n\n  // Gate Settings = nguồn quyết định DUY NHẤT cho \"ai kiểm artifact nào\".\n  const gates: ResolvedGateSettings = resolveGateSettings(options.gateSettings);\n\n  const metadata = await getLessonMetadata(storage, projectId, lessonId);\n  const { unitCode, lessonCode, lessonTitle, concept, prerequisites, bloomLevel } = metadata;\n\n  // Standards grounding (Registry packs truyền thẳng từ Composer nếu org có adopt).\n  // Không có packs → mọi thứ hoạt động y như cũ (không inject, không judge theo chuẩn).\n  const packs: FrameworkPack[] = options.standardsPacks?.length\n    ? options.standardsPacks\n    : resolveStandardsPacks(options.standardsPackIds);\n  let standardsContext = '';\n  let standardStatements: Record<string, string> = {};\n  if (packs.length > 0) {\n    const { block, selected } = buildStandardsContext({\n      packs,\n      gradeBand: options.gradeBand ?? [6, 12],\n      topicText: [lessonTitle, concept, prerequisites].filter(Boolean).join(' '),\n      conceptCodes: [],\n    });\n    standardsContext = block;\n    for (const s of selected) {\n      standardStatements[s.packId + ':' + s.statement.id] = Object.values(s.statement.texts)[0] || '';\n    }\n  }\n\n  // Read SOT references\n  const framework = (await storage.readSotDocument(projectId, 'CURRICULUM_FRAMEWORK.md')) || '';\n  const styleGuide = (await storage.readSotDocument(projectId, 'CONTENT_STYLE_GUIDE.md')) || '';\n  const refPack = (await storage.readSotDocument(projectId, 'REFERENCE_PACK.md')) || '';\n  // 5-Whys RC-staleness: current plan hash — stamped into every produced\n  // artifact and used to detect artifacts generated under a DEAD plan\n  // (plan changed after generation → the artifact teaches facts that belong\n  // to a plan nobody approved anymore).\n  let currentPlanHash: string | undefined;\n  try {\n    const planRaw0 = await storage.readArtifact(projectId, '_sot/CURRICULUM_PLAN.json');\n    if (planRaw0) currentPlanHash = (JSON.parse(planRaw0) as { plan_hash?: string }).plan_hash;\n  } catch {}\n  const learnerProfile = (await storage.readSotDocument(projectId, 'LEARNER_PROFILE.md')) || '';\n\n  // 5-Whys RC-staleness helpers: an artifact whose stamped plan_hash differs\n  // from the CURRENT plan was generated under a dead plan — regenerate it.\n  // No stamp (legacy artifact) or no current plan (legacy flow) → never stale.\n  const isStaleVsPlan = (content: string | null | undefined): boolean => {\n    if (!content || !currentPlanHash) return false;\n    const m = content.match(/plan_hash:\\s*\"([0-9a-f]+)\"/);\n    return !!m && m[1] !== currentPlanHash;\n  };\n  const stampPlanHash = (content: string): string => {\n    if (!currentPlanHash || content.includes('plan_hash: \"' + currentPlanHash + '\"')) return content;\n    return content + '\\n---\\nplan_hash: \"' + currentPlanHash + '\"\\n- **Plan reference:** ' + currentPlanHash + '\\n';\n  };\n  let targetLang = options.targetLanguage;\n  if (!targetLang) {\n    try {\n      const planRaw = await storage.readArtifact(projectId, '_sot/CURRICULUM_PLAN.json');\n      if (planRaw) {\n        const p = JSON.parse(planRaw);\n        targetLang = p?.translation?.target_language;\n      }\n    } catch {}\n  }\n  targetLang = targetLang || 'vi';\n\n  const languageDirective = buildLanguageDirective(targetLang);\n\n  // ── KNOWLEDGE_EXPOSITION: canonical knowledge source (plan-driven flow).\n  // Plan tồn tại → EXPOSITION là nguồn kiến thức chính tắc; không có plan →\n  // legacy flow chạy như cũ (explicit, không silent). ──\n  let expositionContext = '';\n  let expositionInjection: ContextInjectionMeta | undefined;\n  let lessonInjection: ContextInjectionMeta | undefined;\n  let sessionSliceContext = '';\n  try {\n    const exposition = await ensureExpositionForLesson(storage, projectId, lessonCode, {\n      gates: resolveGateSettings(options.gateSettings),\n      force: options.force,\n      targetLanguage: targetLang,\n      customInference: options.customInference,\n    });\n    if (exposition) {\n      // Cụm 5: build the injection AST-primary (semantic keys, whole\n      // sections, exclusive) and keep the verify metadata for observability\n      // (context-degraded telemetry). Micro-Examples stay trimmed out of the\n      // priority set to prevent LLM paraphrase bleed and cut prompt budget.\n      const expoExcerpt = canonicalExpositionSource(\n        exposition.rawContent || exposition.context,\n        ['keyTerms', 'conceptNarratives', 'commonMistakes'],\n        4000\n      );\n      expositionContext = expoExcerpt.excerpt || exposition.context;\n      expositionInjection = {\n        source: 'KNOWLEDGE_EXPOSITION',\n        verified: expoExcerpt.verified,\n        sectionAware: expoExcerpt.sectionAware,\n        issues: expoExcerpt.issues,\n      };\n      onProgress?.('@content', `[EXPOSITION] ${exposition.reused ? 'Reused' : 'Generated'} \\`\\${exposition.relPath}\\` (plan-driven knowledge source)...`);\n    } else {\n      onProgress?.('@content', '[EXPOSITION] No CURRICULUM_PLAN.json — running legacy knowledge flow (no plan-driven exposition).');\n    }\n    // Session slice [4][6][7]: machine-readable decisions for activity design\n    const planRaw = await storage.readArtifact(projectId, '_sot/CURRICULUM_PLAN.json');\n    if (planRaw) {\n      try {\n        const plan = JSON.parse(planRaw) as Parameters<typeof buildSessionSliceContext>[0];\n        sessionSliceContext = buildSessionSliceContext(plan, lessonCode);\n      } catch {\n        sessionSliceContext = ''; // malformed plan — exposition call above already failed hard if invalid\n      }\n    }\n  } catch (err) {\n    // Fail-closed: lỗi approval/judge/scope KHÔNG được nuốt — pipeline dừng rõ ràng.\n    throw new CurriculumError({\n      errorCode: 'ERR_SOT_INVALID_SCHEMA',\n      artifactType: 'KNOWLEDGE_EXPOSITION',\n      lessonId: lessonCode,\n      message: 'KNOWLEDGE_EXPOSITION failed: ' + (err instanceof Error ? err.message : String(err)),\n      suggestedAction: 'Fix the domain graph or re-approve the curriculum plan, then retry lesson production',\n      retryable: false,\n    });\n  }\n\n  // Detect project pedagogy dynamically from SOT\n  const pedagogy = detectProjectPedagogy(framework, styleGuide, options.pedagogy);\n  const pedagogyLabel = pedagogy.toUpperCase();\n\n  // ── G.1: Scoped GLOSSARY.json injection for terminology coherence ──\n  let glossaryContext = '';\n  try {\n    const glossaryRaw = await storage.readArtifact(projectId, '_sot/GLOSSARY.json');\n    if (glossaryRaw) {\n      let allTerms: Array<{ term: string; definition?: string; example?: string }> = [];\n      try {\n        allTerms = (JSON.parse(glossaryRaw) as { terms?: typeof allTerms }).terms ?? [];\n      } catch {}\n\n      let scopedTermsSet: Set<string> | null = null;\n      const planRaw = await storage.readArtifact(projectId, '_sot/CURRICULUM_PLAN.json');\n      if (planRaw) {\n        try {\n          const plan = JSON.parse(planRaw) as { glossary_scope?: Array<{ session_id: string; terms: string[] }> };\n          const sessionScope = plan.glossary_scope?.find((g) => g.session_id === lessonCode);\n          if (sessionScope?.terms?.length) {\n            scopedTermsSet = new Set(sessionScope.terms.map((t) => t.toLowerCase()));\n          }\n        } catch {}\n      }\n\n      const relevantTerms = scopedTermsSet\n        ? allTerms.filter((g) => scopedTermsSet!.has(g.term.toLowerCase()))\n        : allTerms.slice(0, 10);\n\n      if (relevantTerms.length > 0) {\n        const lines = relevantTerms.map(\n          (t) => `- **${t.term}**: ${t.definition || ''}${t.example ? ` (e.g. \\`${t.example}\\`)` : ''}`\n        );\n        glossaryContext = buildSectionAwareExcerpt(lines.join('\\n'), { budget: 800 }).excerpt;\n      }\n    }\n  } catch {}\n\n  // ── Whole-section selection per artifact type (RC 2026-09-30, all types 1.5.53) ──\n  // Measured on swift-for-dummy with the REAL builder (2026-09-30): the flat\n  // SG 2000 / RefPack 3500 budgets CUT real content (SG kept 1191 chars and\n  // resolved 1/3 priorities; RefPack truncated the Toolchain section and\n  // dropped Standards + Pedagogy). Each row below was VALIDATED ZERO-CUT on\n  // the real SOT files with `exclusive: true` — every listed section arrives\n  // COMPLETE for that artifact type. Selection logic: CODE gets Code\n  // Standards + Toolchain + Version Matrix (anti-hallucination); QUIZ/WKS get\n  // Standards Alignment (Bloom/CSTA grounding); GUIDE gets Pedagogy (teacher\n  // moves); HANDOUT/EXT are student-facing and stay light. Full runs (more\n  // than one artifact in scope) keep the historic flat budgets so the LESSON\n  // master prompt and its plan_hash are untouched.\n  const SOT_SELECT: Record<string, { sgBudget: number; sgPriorities: string[]; refBudget: number; refPriorities: string[] }> = {\n    SLIDE: {\n      sgBudget: 6000,\n      sgPriorities: ['toneAndDelivery', 'terminologyGlossary', 'codeStandards', 'languageAndExpression', 'assessmentAndFeedback'],\n      refBudget: 8300,\n      refPriorities: ['technicalOverviewArchitectureBlueprint', 'competencyMatrix', 'versionCompatibilityMatrix'],\n    },\n    ACT: {\n      sgBudget: 4000,\n      sgPriorities: ['toneAndDelivery', 'codeStandards', 'languageAndExpression'],\n      refBudget: 7400,\n      refPriorities: ['technicalOverviewArchitectureBlueprint', 'competencyMatrix'],\n    },\n    QUIZ: {\n      sgBudget: 2600,\n      sgPriorities: ['assessmentAndFeedback', 'languageAndExpression', 'toneAndDelivery'],\n      refBudget: 7100,\n      refPriorities: ['standardsAlignment', 'competencyMatrix'],\n    },\n    WKS: {\n      sgBudget: 3600,\n      sgPriorities: ['assessmentAndFeedback', 'codeStandards', 'languageAndExpression'],\n      refBudget: 7100,\n      refPriorities: ['standardsAlignment', 'competencyMatrix'],\n    },\n    GUIDE: {\n      sgBudget: 5000,\n      sgPriorities: ['toneAndDelivery', 'languageAndExpression', 'assessmentAndFeedback'],\n      refBudget: 6700,\n      refPriorities: ['pedagogicalFoundations', 'competencyMatrix', 'versionCompatibilityMatrix'],\n    },\n    CODE: {\n      sgBudget: 5000,\n      sgPriorities: ['terminologyGlossary', 'codeStandards', 'languageAndExpression'],\n      refBudget: 8300,\n      refPriorities: ['technicalOverviewArchitectureBlueprint', 'competencyMatrix', 'versionCompatibilityMatrix'],\n    },\n    HANDOUT: {\n      sgBudget: 3300,\n      sgPriorities: ['terminologyGlossary', 'languageAndExpression'],\n      refBudget: 6100,\n      refPriorities: ['technicalOverviewArchitectureBlueprint', 'versionCompatibilityMatrix'],\n    },\n    EXT: {\n      sgBudget: 3300,\n      sgPriorities: ['terminologyGlossary', 'languageAndExpression'],\n      refBudget: 4700,\n      refPriorities: ['versionCompatibilityMatrix', 'competencyMatrix'],\n    },\n  };\n  // Apply ONLY on satellite-scoped runs (artifactScope === [ONE type]) — full\n  // runs keep the historic flat budgets so the LESSON master prompt (and its\n  // plan_hash) is untouched.\n  const sotSelect = artifactScope.length === 1 ? SOT_SELECT[artifactScope[0] ?? ''] ?? null : null;\n\n  let effectiveRefPack = refPack\n    ? buildSectionAwareExcerpt(refPack, {\n        exclusive: !!sotSelect,\n        priorities: sotSelect?.refPriorities ?? [\n          // Toolchain/version matrix FIRST — the most-frequently-hallucinated\n          // facts are tool versions (\"Xcode 15\" vs ground truth \"Xcode 16\").\n          // The bilingual fuzzy matcher in contextBuilder resolves these keys\n          // even when the generated RefPack headings are Vietnamese.\n          'technicalOverviewArchitectureBlueprint',\n          'hardwarePinout',\n          'standardsAlignment',\n          'pedagogicalFoundations',\n        ],\n        budget: sotSelect?.refBudget ?? 3500,\n      }).excerpt\n    : '';\n\n  // ── G.2: Composite prompt budget calculation & adaptive trimming ──\n  const baseContextPrefix = `PROJECT & ACADEMIC CONTEXT:\n- Project ID: ${projectId}\n- Pedagogical Model: ${pedagogyLabel}\n- Lesson Code: ${lessonCode}\n- Lesson Title: ${lessonTitle}\n- Core Concept: ${concept}\n- Prerequisites: ${prerequisites}\n- Target Bloom Level: ${bloomLevel}\n\n[CURRICULUM FRAMEWORK EXCERPT]:\n${buildFrameworkExcerptForLesson(framework, lessonId)}`;\n\n  // ── Curriculum Horizon: 3-Tier Gradient Scaffolding & Boundary Enforcement ──\n  let horizon: CurriculumHorizon | null = null;\n  let horizonBlock = '';\n  try {\n    let planObj: any = null;\n    const planRaw = await storage.readArtifact(projectId, '_sot/CURRICULUM_PLAN.json');\n    if (planRaw) {\n      try {\n        planObj = JSON.parse(planRaw);\n      } catch {}\n    }\n    horizon = await extractCurriculumHorizon({\n      plan: planObj,\n      frameworkMarkdown: framework,\n      targetLessonId: lessonCode,\n      storage,\n      projectId,\n    });\n    if (horizon) {\n      horizonBlock = `\\n\\n${renderHorizonPromptBlock(horizon)}`;\n    }\n  } catch (hErr) {\n    console.warn(`[produceSingleLesson] Notice: Curriculum Horizon extraction:`, (hErr as Error)?.message || hErr);\n  }\n\n  let effectiveStyleGuide = styleGuide\n    ? buildSectionAwareExcerpt(styleGuide, {\n        priorities: sotSelect?.sgPriorities ?? ['voiceTone', 'terminologyGlossary', 'lessonContentStandards'],\n        budget: sotSelect?.sgBudget ?? 2000,\n        exclusive: !!sotSelect,\n      }).excerpt\n    : '';\n  // ── P46 Context De-duplication ──\n  // KNOWLEDGE_EXPOSITION and REFERENCE_PACK both carry canonical domain ground\n  // truth — merged into a single [GROUND TRUTH] block so every artifact (and\n  // both slide engines) receive identical knowledge sourcing. Built lazily so\n  // adaptive trimming of effectiveRefPack is reflected on re-assembly.\n  // productSpecBlock is kept separately: the SLIDE workflow reuses it for the\n  // blueprint prompt (which carries no groundContext — audit S-1).\n  let productSpecBlock = '';\n  // includeKx=false is used by hybrid context routing: the KX block moves out\n  // of the composite into a per-satellite-type scoped excerpt (contextSlots),\n  // so KX is injected exactly ONCE per satellite prompt.\n  const buildGroundTruthBlock = (includeKx = true): string => {\n    const parts: string[] = [];\n    if (includeKx && expositionContext) {\n      parts.push(`### KNOWLEDGE_EXPOSITION (CANONICAL KNOWLEDGE — teach from this, do not contradict)\\n${expositionContext}`);\n    }\n    if (effectiveRefPack) {\n      parts.push(`### REFERENCE PACK GROUND TRUTH\\n${effectiveRefPack}`);\n    }\n    // 5-Whys RC-canonicality: ONE product-spec decision block injected\n    // IDENTICALLY into every artifact prompt. Kills the per-artifact\n    // re-invention of template choice / versions (LESSON console-print vs\n    // satellites SwiftUI-App contradiction).\n    // skipToolchainList: the SAME RefPack excerpt rides in [GROUND TRUTH]\n    // above — repeating the list here doubled the tokens (prompt audit S-3).\n    productSpecBlock = buildProductSpecBlock({ refPack, briefing: options.briefing, skipToolchainList: true });\n    if (productSpecBlock) {\n      parts.push(productSpecBlock);\n    }\n    return parts.length > 0 ? `\\n\\n[GROUND TRUTH]:\\n${parts.join('\\n\\n')}` : '';\n  };\n\n  const glossaryBlock = glossaryContext ? `\\n\\n[GLOSSARY TERMS (use these exact definitions)]:\\n${glossaryContext}` : '';\n  const standardsBlock = standardsContext ? `\\n\\n${standardsContext}` : '';\n  const sessionSliceBlock = sessionSliceContext ? `\\n\\n${sessionSliceContext}` : '';\n\n  // Prompt-audit fix #4: the ANTI-CONTAMINATION / REAL-APIS-ONLY domain\n  // guardrail previously existed ONLY in the KX system prompt — LESSON and\n  // satellites (the artifacts most prone to Chinese leakage and version\n  // drift) generated without any platform anchor. Derive the platform from\n  // the caller's briefing (already plumbed for PRODUCT_SPEC).\n  const platformGuardrail = buildDomainLexiconGuardrail(\n    options.briefing?.techStack || options.briefing?.coreTechnology,\n    options.briefing?.hardwarePlatform,\n  );\n  const guardrailBlock = `\\n\\n${platformGuardrail}`;\n\n  const assembleCommonContext = (sg: string, includeKx = true) => `${baseContextPrefix}\n\n[CONTENT STYLE GUIDE EXCERPT]:\n${sg}${standardsBlock}${glossaryBlock}${buildGroundTruthBlock(includeKx)}${sessionSliceBlock}${horizonBlock}${guardrailBlock}`;\n\n  let commonContext = assembleCommonContext(effectiveStyleGuide);\n  const MAX_COMPOSITE_PROMPT_CHARS = 30000;\n\n  // P46 RC2: host-provided inference override — when present, ALL LLM calls\n  // of this production run route through it (AI SDK gateway → Langfuse).\n  const runnerOptions: import('../ai/streamRunner').StreamRunnerOptions = options.customInference\n    ? { customInference: options.customInference }\n    : {};\n\n  // Adaptive reverse-priority trimming: trim refPack first, then styleGuide, preserving canonical KX & framework\n  if (commonContext.length > MAX_COMPOSITE_PROMPT_CHARS && effectiveRefPack.length > 1000) {\n    effectiveRefPack = buildSectionAwareExcerpt(refPack, {\n      priorities: [\n        'technicalOverviewArchitectureBlueprint',\n        'hardwarePinout',\n      ],\n      budget: 1000,\n    }).excerpt;\n    commonContext = assembleCommonContext(effectiveStyleGuide);\n  }\n\n  if (commonContext.length > MAX_COMPOSITE_PROMPT_CHARS && effectiveStyleGuide.length > 1000) {\n    effectiveStyleGuide = buildSectionAwareExcerpt(styleGuide, {\n      priorities: ['voiceTone', 'terminologyGlossary'],\n      budget: 1000,\n    }).excerpt;\n    commonContext = assembleCommonContext(effectiveStyleGuide);\n  }\n\n  onProgress?.('@content', `[CONTEXT] Composite prompt ready (${commonContext.length} chars, adaptive budget <= ${MAX_COMPOSITE_PROMPT_CHARS})`, {\n    type: 'progress',\n    promptChars: commonContext.length,\n  } as any);\n\n  const producedArtifacts: string[] = [];\n  const lessonRelPath = `_content/${unitCode}/LESSON_${lessonCode}.md`;\n  const existingLessonContent = await storage.readArtifact(projectId, lessonRelPath);\n  let lessonContent = existingLessonContent || '';\n\n  // ─────────────────────────────────────────────────────────────\n  // 1. Produce LESSON Plan matching the detected pedagogy\n  // ─────────────────────────────────────────────────────────────\n  if (artifactScope.includes('LESSON') && (!existingLessonContent || force || isStaleVsPlan(existingLessonContent))) {\n    if (existingLessonContent && !force && isStaleVsPlan(existingLessonContent)) {\n      onProgress?.('@content', `[STALENESS] LESSON_${lessonCode} was generated under a different plan_hash — regenerating against the current plan.`);\n    }\n    onProgress?.('@content', `[1/4] Authoring Master Lesson Plan (${pedagogyLabel}): \\`LESSON_${lessonCode}.md\\` (${lessonTitle})...`);\n\n    const dateStr = new Date().toISOString().split('T')[0];\n    const mediaDirective = options.mediaPolicy && options.mediaPolicy.maxGenImagesPerArtifact > 0\n      ? `\\n\\nIMAGE PLANNING (media ledger) — QUOTA GEN: tối đa ${options.mediaPolicy.maxGenImagesPerArtifact} ảnh AI cho bài này (ảnh search kho không giới hạn).\\nKhi nội dung cần minh họa (diagram quy trình, sơ đồ khái niệm, step-by-step visual), chèn placeholder đúng format [IMAGE: slug] (slug chữ thường-gạch ngang, unique trong bài, vd img-for-loop-diagram) TẠI ĐÚNG CHỖ cần ảnh, trên dòng riêng. KHÔNG tự sinh ảnh, KHÔNG dùng markdown image — placeholder sẽ được thay bằng ảnh thật sau khi Media Curator duyệt. Chỉ đặt cho ảnh THỰC SỰ cần thiết.`\n      : '';\n    const lessonPrompt = buildLessonPrompt(\n      pedagogy,\n      lessonCode,\n      unitCode,\n      lessonTitle,\n      concept,\n      bloomLevel,\n      dateStr,\n      targetLang\n    ) + mediaDirective;\n\n    const rawLesson = await runCurriculumAIInference(\n      [{ role: 'user', content: lessonPrompt }],\n      commonContext,\n      runnerOptions,\n      (chunk: string, type?: ChunkType) => {\n        options.onProgress?.('@content', chunk, { type: type || 'content', artifactType: 'LESSON' });\n      }\n    );\n\n    if (!rawLesson || rawLesson.startsWith('⚠️') || rawLesson.length < 200) {\n      throw createAiInferenceError({\n        errorCode: 'ERR_AI_RESPONSE_MALFORMED',\n        agent: '@content',\n        artifactType: 'LESSON',\n        lessonId: lessonCode,\n        message: `Agent @content failed to author a valid Lesson Plan for ${lessonCode}.`,\n        rawError: rawLesson || 'Empty AI response'\n      });\n    }\n\n    // ── Deterministic gate: lint + auto-fix trước khi đốt tiền judge ──\n    // 0-token, hàng ms: bắt preamble/fence/postamble/mermaid hỏng/table lệch cột + tự sửa được\n    const lintReport = lintAndSanitizeArtifact(rawLesson, `LESSON_${lessonCode}.md`);\n    if (lintReport.fixedCount > 0) {\n      options.onProgress?.('@linter', `🛠️ Deterministic lint auto-fixed ${lintReport.fixedCount} issue(s) on LESSON_${lessonCode}: ${lintReport.issues.map(i => i.type).join(', ')}`);\n    }\n    const blockingIssues = lintReport.issues.filter((i) => i.severity === 'ERROR' && !i.autoFixable);\n    if (blockingIssues.length > 0) {\n      // Lỗi cấu trúc không tự sửa được → retry 1 lần với feedback cụ thể (repair có mục tiêu, không retry mù)\n      options.onProgress?.('@linter', `⚠️ ${blockingIssues.length} blocking lint issue(s): ${blockingIssues.map(i => i.message).join('; ')} — retrying once with targeted feedback`);\n      const retryRaw = await runCurriculumAIInference(\n        [{ role: 'user', content: lessonPrompt + `\\n\\nPREVIOUS ATTEMPT FAILED STRUCTURAL LINT:\\n${blockingIssues.map(i => '- ' + i.message).join('\\n')}\\nFix ALL issues above and output the complete corrected document.` }],\n        commonContext,\n        runnerOptions,\n        (chunk: string, type?: ChunkType) => {\n          options.onProgress?.('@content', chunk, { type: type || 'content', artifactType: 'LESSON' });\n        }\n      );\n      const retryLint = lintAndSanitizeArtifact(retryRaw, `LESSON_${lessonCode}.md`);\n      const stillBlocking = retryLint.issues.filter((i) => i.severity === 'ERROR' && !i.autoFixable);\n      if (stillBlocking.length > 0) {\n        throw createAiInferenceError({\n          errorCode: 'ERR_AI_RESPONSE_MALFORMED',\n          agent: '@content',\n          artifactType: 'LESSON',\n          lessonId: lessonCode,\n          message: `Lesson failed deterministic structural lint after 1 targeted retry: ${stillBlocking.map(i => i.message).join('; ')}`,\n          rawError: retryRaw.slice(0, 500)\n        });\n      }\n      lessonContent = retryLint.autoFixedContent || retryRaw;\n    } else {\n      lessonContent = lintReport.autoFixedContent || rawLesson;\n    }\n\n    // Post-validator: check LESSON OWNERSHIP boundary (Lesson Flow word budget per phase)\n    const ownershipIssue = checkLessonOwnership(lessonContent, 300);\n    if (ownershipIssue) {\n      options.onProgress?.('@linter', `⚠️ [LESSON_OWNERSHIP_EXCEEDED] ${ownershipIssue.detail} (Evidence: ${ownershipIssue.evidence.join('; ')})`);\n    }\n\n    const stampedLesson = stampPlanHash(lessonContent);\n    await storage.saveArtifact(projectId, lessonRelPath, stampedLesson);\n    producedArtifacts.push(`LESSON_${lessonCode}.md`);\n  }\n\n  // Compute content hash and load pipeline state\n  const contentHash = lessonContent ? computeContentHash(lessonContent) : undefined;\n  const pipelineState = await storage.getPipelineState(projectId);\n  const taskState = pipelineState.tasks[lessonCode] || {};\n  const currentLessonInfo = taskState.LESSON;\n\n  const lessonGate = gateModeFor(gates, 'LESSON');\n  // Gate semantics (P0 fix — semantics cũ `lessonGate !== 'HITL' || …` là dead code:\n  // nhánh LLM_JUDGE bên dưới không bao giờ chạy). Nghĩa đúng:\n  //   OFF       → không kiểm, xem như đã duyệt (trivially approved)\n  //   LLM_JUDGE → duyệt khi Judge PASS (hoặc đã được duyệt trước đó bởi judge/human)\n  //   HITL      → duyệt khi human approve (state approved / decision APPROVED / hint approvedArtifacts)\n  const humanApproved =\n    currentLessonInfo?.state === 'approved' ||\n    currentLessonInfo?.review?.decision === 'APPROVED' ||\n    approvedArtifacts.includes('LESSON') ||\n    approvedArtifacts.includes(lessonCode);\n  const needsJudge = lessonGate === 'LLM_JUDGE' && !humanApproved;\n  let isLessonApproved = lessonGate === 'OFF' || humanApproved;\n\n  // ─────────────────────────────────────────────────────────────\n  // 2. Gate LESSON: LLM_JUDGE = Agent kiểm · HITL = human duyệt (xử lý phía caller) · OFF = bỏ qua\n  // ─────────────────────────────────────────────────────────────\n  if (needsJudge && lessonContent) {\n    onProgress?.('@reviewer', `🤖 Executing LLM-as-Judge academic evaluation on LESSON_${lessonCode}.md...`);\n    try {\n      // 5-Whys RC-assertion: deterministic gates BEFORE the LLM judge. The\n      // Chinese-character leak in the LO table of L01 passed the LLM judge —\n      // a regex scan cannot miss it.\n      const lessonDet = validateArtifactDeterministic({ content: lessonContent, refPack });\n      if (!lessonDet.ok) {\n        const detCritique = validatorRepairPrompt(lessonDet.issues);\n        onProgress?.('@reviewer', `⛔ LESSON deterministic validator FAIL: ${detCritique.slice(0, 200)}`);\n        await storage.updateArtifactState(projectId, lessonCode, 'LESSON', {\n          state: 'rejected',\n          generatedAt: new Date().toISOString(),\n          contentHash: computeContentHash(lessonContent),\n          review: {\n            decision: 'NEEDS_REVISION',\n            reviewedBy: '@heuristic-linter',\n            reviewedAt: new Date().toISOString(),\n            score: 0,\n            critique: detCritique,\n          },\n        });\n        // Enter the SAME repair loop the LLM judge uses — reuse it by seeding\n        // the failure into the flow below via a synthetic judge result.\n      }\n      const judgeObjectives = parseLessonObjectives(lessonContent, concept, bloomLevel);\n      // Cụm 2: canonical knowledge for the judge goes through the builder —\n      // a section-aware excerpt (not a blind slice) so the judge sees the\n      // canonical Key Terms / Concept Narratives, not arbitrary bytes.\n      const judgeExpositionExcerpt = canonicalExpositionForJudge(expositionContext);\n      const judgeResult = await LLMJudgeEngine.evaluateArtifactWithLLM({\n        targetArtifactType: 'LESSON',\n        lessonId: lessonCode,\n        expectedLanguage: targetLang || 'en',\n        targetObjectives: judgeObjectives,\n        generatedContentJson: JSON.stringify({\n          lessonContent,\n          lessonId: lessonCode,\n          title: lessonTitle,\n          frameworkExcerpt: framework ? buildFrameworkExcerptForLesson(framework, lessonId) : undefined,\n          styleGuideExcerpt: effectiveStyleGuide || undefined,\n          canonicalExposition: judgeExpositionExcerpt,\n        }),\n        standardStatements: Object.keys(standardStatements).length > 0 ? standardStatements : undefined,\n      });\n\nfunction injectYamlReviewMetadata(content: string, meta: Record<string, string>): string {\n  const frontmatterMatch = content.match(/^---\\s*\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/);\n  if (!frontmatterMatch) {\n    const newYaml = Object.entries(meta)\n      .map(([k, v]) => `${k}: \"${v}\"`)\n      .join('\\n');\n    return `---\\n${newYaml}\\n---\\n\\n${content}`;\n  }\n\n  let yamlBlock = frontmatterMatch[1];\n  for (const [k, v] of Object.entries(meta)) {\n    const keyRegex = new RegExp(`^${k}:.*$`, 'm');\n    if (keyRegex.test(yamlBlock)) {\n      yamlBlock = yamlBlock.replace(keyRegex, `${k}: \"${v}\"`);\n    } else {\n      yamlBlock += `\\n${k}: \"${v}\"`;\n    }\n  }\n\n  return content.replace(frontmatterMatch[0], `---\\n${yamlBlock.trim()}\\n---\\n`);\n}\n\n      if (judgeResult.passed && judgeResult.score >= 85) {\n        isLessonApproved = true;\n        const reviewDate = new Date().toISOString();\n        const updatedLessonMarkdown = injectYamlReviewMetadata(lessonContent, {\n          review_status: 'APPROVED',\n          reviewed_by: '@reviewer (LLM-as-Judge)',\n          reviewed_at: reviewDate,\n          approved_by: '@reviewer',\n          review_decision: 'APPROVED'\n        });\n        await storage.saveArtifact(projectId, lessonRelPath, updatedLessonMarkdown);\n        const updatedHash = computeContentHash(updatedLessonMarkdown);\n\n        await storage.updateArtifactState(projectId, lessonCode, 'LESSON', {\n          state: 'approved',\n          generatedAt: reviewDate,\n          contentHash: updatedHash,\n          review: {\n            decision: 'APPROVED',\n            reviewedBy: '@agent-as-judge',\n            reviewedAt: reviewDate,\n            score: judgeResult.score,\n            critique: judgeResult.critique,\n          }\n        });\n        onProgress?.('@reviewer', `✅ LLM-as-Judge PASS (${judgeResult.score}/100): ${judgeResult.critique}. Auto-approved for satellite generation.`);\n      } else {\n        // ── Revision loop tự động (P0): NEEDS_REVISION → repair theo hướng dẫn của Judge → re-judge.\n        // Tối đa 2 vòng repair; vẫn fail mới pause HITL. autoRepairInstructions vốn có trong JudgeResult.\n        const MAX_REPAIR_ROUNDS = 2;\n        let currentContent = lessonContent;\n        let currentResult: JudgeEvaluationResult = judgeResult;\n        let repaired = false;\n\n        for (let round = 1; round <= MAX_REPAIR_ROUNDS; round++) {\n          const repairFeedback = [\n            currentResult.autoRepairInstructions || '',\n            ...currentResult.weaknesses.map((w) => `- ${w}`),\n          ].filter(Boolean).join('\\n');\n\n          onProgress?.('@repair', `🔧 Repair round ${round}/${MAX_REPAIR_ROUNDS} for LESSON_${lessonCode} (judge score ${currentResult.score}/100)...`);\n\n          const repairedRaw = await runCurriculumAIInference(\n            [{ role: 'user', content: `You previously authored \\`LESSON_${lessonCode}.md\\` and the academic Judge REJECTED it with the critique below.\\nRewrite the COMPLETE corrected document in language \"${targetLang}\": fix every listed issue, preserve exact frontmatter and mandatory sections (Objectives, Activity Sequence, Lesson Flow). Output 100% clean Markdown only.\\n\\nJUDGE CRITIQUE:\\n${repairFeedback}\\n\\nCURRENT DOCUMENT:\\n${currentContent}` }],\n            commonContext,\n            runnerOptions,\n            (chunk: string, type?: ChunkType) => {\n              options.onProgress?.('@repair', chunk, { type: type || 'content', artifactType: 'LESSON' });\n            }\n          );\n          // G.4: targeted repair excerpt — after a repair round, excerpt the\n          // repaired draft through the builder; when canonical resolution\n          // fails (drifted/dropped sections) the structural guard below\n          // rejects the draft instead of accepting a silently-degraded doc.\n          const repairedExcerptCheck = buildSectionAwareExcerpt(repairedRaw, {\n            priorities: DEFAULT_LESSON_PRIORITIES,\n            budget: 12000,\n            artifactType: 'LESSON',\n          });\n          if (repairedExcerptCheck.issues.includes('parse:no-priority-resolution')) {\n            onProgress?.('@repair', `⚠️ Repair round ${round} lost mandatory section structure (no priority section resolved) — rejecting repaired draft, retaining previous`);\n            break;\n          }\n\n          if (!repairedRaw || repairedRaw.startsWith('⚠️') || repairedRaw.length < 200) {\n            onProgress?.('@repair', `⚠️ Repair round ${round} produced invalid output — stopping repair loop`);\n            break;\n          }\n\n          // Lint + auto-fix bản repaired trước khi re-judge\n          const repairLint = lintAndSanitizeArtifact(repairedRaw, `LESSON_${lessonCode}.md`);\n          const candidateContent = repairLint.autoFixedContent || repairedRaw;\n\n          // G.4 structural guard: ensure repaired content is substantive and doesn't drop fundamental structure\n          const hasFrontmatter = /^---\\s*\\r?\\n[\\s\\S]*?\\r?\\n---/m.test(candidateContent);\n          if (!hasFrontmatter || candidateContent.length < Math.min(800, currentContent.length * 0.4)) {\n            onProgress?.('@repair', `⚠️ Repair round ${round} dropped critical structure (length or frontmatter missing) — rejecting repaired draft, retaining previous`);\n            break;\n          }\n          currentContent = candidateContent;\n\n          onProgress?.('@reviewer', `🤖 Re-judging repaired LESSON_${lessonCode} (round ${round})...`);\n          const reJudge = await LLMJudgeEngine.evaluateArtifactWithLLM({\n            targetArtifactType: 'LESSON',\n            lessonId: lessonCode,\n            expectedLanguage: targetLang || 'en',\n            targetObjectives: parseLessonObjectives(currentContent, concept, bloomLevel),\n            generatedContentJson: JSON.stringify({\n              lessonContent: currentContent,\n              lessonId: lessonCode,\n              title: lessonTitle,\n              frameworkExcerpt: framework ? buildFrameworkExcerptForLesson(framework, lessonId) : undefined,\n              styleGuideExcerpt: effectiveStyleGuide || undefined,\n              canonicalExposition: canonicalExpositionForJudge(expositionContext),\n            }),\n            standardStatements: Object.keys(standardStatements).length > 0 ? standardStatements : undefined,\n          });\n          currentResult = reJudge;\n          lessonContent = currentContent;\n          await storage.saveArtifact(projectId, lessonRelPath, currentContent);\n          producedArtifacts.push(`LESSON_${lessonCode}.md`);\n\n          if (reJudge.passed && reJudge.score >= 85) {\n            repaired = true;\n            break;\n          }\n        }\n\n        if (repaired) {\n          isLessonApproved = true;\n          const reviewDate = new Date().toISOString();\n          const repairedMarkdown = injectYamlReviewMetadata(lessonContent, {\n            review_status: 'APPROVED',\n            reviewed_by: '@reviewer (LLM-as-Judge)',\n            reviewed_at: reviewDate,\n            approved_by: '@reviewer',\n            review_decision: 'APPROVED'\n          });\n          await storage.saveArtifact(projectId, lessonRelPath, repairedMarkdown);\n          const repairedHash = computeContentHash(repairedMarkdown);\n          await storage.updateArtifactState(projectId, lessonCode, 'LESSON', {\n            state: 'approved',\n            generatedAt: reviewDate,\n            contentHash: repairedHash,\n            review: {\n              decision: 'APPROVED',\n              reviewedBy: '@agent-as-judge',\n              reviewedAt: reviewDate,\n              score: currentResult.score,\n              critique: `Repaired after ${MAX_REPAIR_ROUNDS > 0 ? 'revision loop' : 'first pass'} — ${currentResult.critique}`,\n            }\n          });\n          onProgress?.('@reviewer', `✅ Repair loop SUCCESS (${currentResult.score}/100) — LESSON_${lessonCode} auto-approved after revision`);\n        } else {\n          await storage.updateArtifactState(projectId, lessonCode, 'LESSON', {\n            state: 'rejected',\n            generatedAt: new Date().toISOString(),\n            contentHash: computeContentHash(lessonContent),\n            review: {\n              decision: 'NEEDS_REVISION',\n              reviewedBy: '@agent-as-judge',\n              reviewedAt: new Date().toISOString(),\n              score: currentResult.score,\n              critique: currentResult.critique,\n              feedback: currentResult.weaknesses.join('; '),\n            }\n          });\n          onProgress?.('@reviewer', `⚠️ LESSON_${lessonCode} still NEEDS_REVISION (${currentResult.score}/100) after ${MAX_REPAIR_ROUNDS} repair rounds: ${currentResult.weaknesses.join('; ')}`);\n          return {\n            lessonId: lessonCode,\n            pedagogy,\n            producedArtifacts,\n            pausedForReview: true,\n            gateStatus: 'judge_needs_revision',\n            contextInjection: expositionInjection || lessonInjection,\n            promptChars: commonContext.length,\n          };\n        }\n      }\n    } catch (judgeErr: any) {\n      // Fail-closed (P0): judge lỗi → KHÔNG âm thầm duyệt. Đánh dấu awaiting judge + trả paused để queue retry/hiện rõ.\n      console.error(`[produceSingleLesson] LLM-as-Judge failed for ${lessonCode}:`, judgeErr?.message || judgeErr);\n      await storage.updateArtifactState(projectId, lessonCode, 'LESSON', {\n        state: 'awaiting_review',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(lessonContent),\n        review: {\n          decision: 'NEEDS_REVISION',\n          reviewedBy: '@agent-as-judge',\n          reviewedAt: new Date().toISOString(),\n          critique: `Judge unavailable (fail-closed, KHÔNG tự duyệt): ${judgeErr?.message || String(judgeErr)}`,\n        }\n      });\n      onProgress?.('@reviewer', `❌ LLM-as-Judge failed for LESSON_${lessonCode} — fail-closed (bài KHÔNG được duyệt ngầm): ${judgeErr?.message || judgeErr}`);\n      return {\n        lessonId: lessonCode,\n        pedagogy,\n        producedArtifacts,\n        pausedForReview: true,\n        gateStatus: 'judge_error',\n        contextInjection: expositionInjection,\n        promptChars: commonContext.length,\n      };\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────\n  // 3. HITL Checkpoint for LESSON (chỉ khi Gate = HITL và chưa được duyệt)\n  // ─────────────────────────────────────────────────────────────\n  if (lessonGate === 'HITL' && !isLessonApproved) {\n    await storage.updateArtifactState(projectId, lessonCode, 'LESSON', {\n      state: 'awaiting_review',\n      generatedAt: new Date().toISOString(),\n      contentHash,\n    });\n\n    const satellites = artifactScope.filter(s => s !== 'LESSON');\n    for (const sat of satellites) {\n      const satRelPath = `_content/${unitCode}/${sat}_${lessonCode}.md`;\n      const satExists = await storage.readArtifact(projectId, satRelPath);\n      if (!satExists) {\n        await storage.updateArtifactState(projectId, lessonCode, sat, {\n          state: 'pending'\n        });\n      }\n    }\n\n    onProgress?.(\n      '@reviewer',\n      `🚦 HITL Review Gate Triggered: Completed \\`LESSON_${lessonCode}.md\\` (${pedagogyLabel}). Pausing for user approval before satellite artifact production (${satellites.join(', ')}).`,\n      { gate: 'LESSON', lessonId: lessonCode, status: 'awaiting_approval', paused: true }\n    );\n\n    return {\n      lessonId: lessonCode,\n      pedagogy,\n      producedArtifacts,\n      pausedForReview: true,\n      gateStatus: 'awaiting_approval',\n      contextInjection: expositionInjection,\n      promptChars: commonContext.length,\n    };\n  }\n\n  // If approved or autonomy, record approved state if not yet recorded\n  if (isLessonApproved && currentLessonInfo?.state !== 'approved') {\n    await storage.updateArtifactState(projectId, lessonCode, 'LESSON', {\n      state: 'approved',\n      generatedAt: new Date().toISOString(),\n      contentHash,\n    });\n  }\n\n  // Context derived from the canonical LESSON using section-aware priorities (12k budget).\n  // SATELLITE_LESSON_PRIORITIES: excludes 'Symbol & Identifier Ledger' — the symbol\n  // registry is injected as its own dedicated block below (no duplication).\n  const lessonExcerptResult = buildSectionAwareExcerpt(lessonContent, {\n    priorities: SATELLITE_LESSON_PRIORITIES,\n    budget: 12000,\n    artifactType: 'LESSON',\n  });\n  const lessonExcerpt = lessonExcerptResult.excerpt;\n  const lessonInjectionMeta: ContextInjectionMeta = {\n    source: 'LESSON',\n    verified: lessonExcerptResult.verified,\n    sectionAware: lessonExcerptResult.sectionAware,\n    issues: lessonExcerptResult.issues,\n  };\n  const symbolLedger = extractSymbolLedger(lessonContent);\n  const symbolLedgerBlock = symbolLedger.primarySymbol\n    ? `\\n\\n[MANDATORY CODE SYMBOL REGISTRY (Inherited from LESSON Plan)]:\n- Primary Struct / Class / Component: \\`${symbolLedger.primarySymbol}\\`\n- Entry Source File: \\`${symbolLedger.entryFileName || symbolLedger.primarySymbol}\\`\n- Key Identifiers to inherit verbatim: ${symbolLedger.keySymbols.map((s) => `\\`${s}\\``).join(', ')}\n- INVARIANT: You MUST use these exact identifier names in all code examples, exercises, and test assertions. Do NOT invent new struct/class names!`\n    : '';\n\n  // P49 G2: Micro-Slot context routing. 'hybrid' mode composes per-artifact\n  // context (LESSON-primary keep scoped lesson excerpts; KX-only types\n  // CODE/HANDOUT/EXT drop the 12k lesson excerpt for KX priorities + a\n  // row-level activity-contract mini-slot). 'legacy' keeps the exact\n  // pre-P49 composite so shadow comparison is byte-safe.\n  const routingMode: ContextRoutingMode = options.contextRoutingMode ?? 'legacy';\n  // Hybrid routing: satellites get the KX-FREE composite — the per-type scoped\n  // KX excerpt in contextSlots becomes the single canonical-knowledge block\n  // (KX injected exactly once, with type-appropriate section priorities).\n  const kxFreeCommonContext = routingMode === 'hybrid' ? assembleCommonContext(effectiveStyleGuide, false) : '';\n  const satelliteContexts: Record<string, string> = {};\n  const satelliteContextMeta: Record<string, SatContextResult> = {};\n  // Truncation telemetry (1.5.54): aggregate of every section dropped/truncated\n  // across all satellite contexts built in this run — surfaced on the result\n  // so the app's execution record / Langfuse metadata can persist it.\n  const contextDrops: Array<{ artifactType: string; slot: string; section: string; kind: 'dropped' | 'truncated' }> = [];\n  const satelliteContextFor = (artifactType: string): string => {\n    const key = artifactType.toUpperCase();\n    if (!satelliteContexts[key]) {\n      const built = buildSatelliteContext({\n        artifactType: key,\n        commonContext: routingMode === 'hybrid' ? kxFreeCommonContext : commonContext,\n        lessonContent,\n        lessonExcerpt: lessonExcerptResult,\n        expositionContent: expositionContext,\n        symbolLedgerBlock,\n        pedagogyLabel,\n        mode: routingMode,\n      });\n      satelliteContexts[key] = built.context;\n      satelliteContextMeta[key] = built;\n      onProgress?.(\n        '@content',\n        `[CONTEXT] ${key} satellite context: ${built.context.length} chars (${built.blocks.map((b) => `${b.slot}:${b.chars}`).join(', ')})`,\n        { type: 'progress', promptChars: built.context.length, artifactType: key },\n      );\n      // Truncation telemetry (1.5.54): every dropped/truncated canonical\n      // section is emitted per-artifact so the Inspector stream and the\n      // Langfuse trace (onProgress → workflow step records) show exactly\n      // which ground-truth sections a prompt ran WITHOUT. Aggregate also\n      // lands in ProduceLessonResult.contextDrops for the execution record.\n      const drops = built.blocks.flatMap((b) =>\n        b.issues\n          .filter((i) => i.startsWith('section:dropped:') || i.startsWith('section:truncated:'))\n          .map((i) => ({ artifactType: key, slot: b.slot, section: i.replace(/^section:(?:dropped|truncated):/, ''), kind: i.slice(0, i.indexOf(':')) as 'dropped' | 'truncated' }))\n      );\n      if (drops.length > 0) {\n        contextDrops.push(...drops);\n        onProgress?.(\n          '@reviewer',\n          `⚠️ [CONTEXT-TRUNCATION] ${key}: ${drops.map((d) => `${d.slot} ${d.kind} \"${d.section}\"`).join('; ')}`,\n          { type: 'warning', artifactType: key, contextDrops: drops },\n        );\n      }\n    }\n    return satelliteContexts[key];\n  };\n  // Legacy composite — kept for reference; all satellite call-sites now go\n  // through satelliteContextFor() which reproduces this byte-identically in\n  // 'legacy' mode (commonContext + [CANONICAL LESSON PLAN (...)] + ledger).\n\n  const judgeSat = (sat: string, content: string) => {\n    if (gateModeFor(gates, sat as any) !== 'LLM_JUDGE') return Promise.resolve();\n    // 5-Whys RC-assertion: deterministic gates FIRST — CJK purity + version\n    // ground truth are mechanically checkable and must not depend on a\n    // free-tier LLM judge noticing them. Any failure marks the satellite\n    // rejected with the mechanical critique (same contract as judge failure).\n    const det = validateArtifactDeterministic({ content, refPack });\n    if (!det.ok) {\n      const critique = validatorRepairPrompt(det.issues);\n      onProgress?.('@reviewer', `⛔ ${sat} deterministic validator FAIL: ${critique.slice(0, 200)}`);\n      return storage.updateArtifactState(projectId, lessonCode, sat, {\n        state: 'rejected',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(content),\n        review: {\n          decision: 'NEEDS_REVISION',\n          reviewedBy: '@heuristic-linter',\n          reviewedAt: new Date().toISOString(),\n          score: 0,\n          critique,\n        },\n      });\n    }\n    // P49 G3: activity-alignment drift check (deterministic, 0 token) against\n    // the canonical slot THIS artifact type consumed. Log-only until the\n    // shadow window closes (isActivityAlignmentLogOnly); in enforcing mode a\n    // drift failure rejects with the same mechanical critique contract.\n    const slotMeta = satelliteContextMeta[sat.toUpperCase()];\n    if (slotMeta) {\n      const alignment = evaluateActivityAlignment(slotMeta.canonicalExcerpt, content);\n      if (alignment.checked && alignment.passed === false) {\n        const note = `activity-alignment drift vs ${sat} contract slot (matched: ${alignment.matchedTokens.join(', ') || 'none'}); canonical tokens absent from output`;\n        if (alignment.mode === 'enforcing') {\n          const critique = validatorRepairPrompt([{ code: 'scope-drift', detail: note, evidence: alignment.missingTokens }]);\n          onProgress?.('@reviewer', `⛔ ${sat} activity-alignment drift FAIL: ${note}`);\n          return storage.updateArtifactState(projectId, lessonCode, sat, {\n            state: 'rejected',\n            generatedAt: new Date().toISOString(),\n            contentHash: computeContentHash(content),\n            review: {\n              decision: 'NEEDS_REVISION',\n              reviewedBy: '@heuristic-linter',\n              reviewedAt: new Date().toISOString(),\n              score: 0,\n              critique,\n            },\n          });\n        }\n        onProgress?.('@reviewer', `🧭 [log-only] ${sat} activity-alignment drift: ${note}`);\n      }\n    }\n    return judgeSatelliteArtifact({\n      storage,\n      projectId,\n      lessonCode,\n      sat,\n      content,\n      concept,\n      bloomLevel,\n      standardStatements,\n      onProgress,\n      targetLang,\n      canonicalLessonContent: lessonContent,\n      canonicalLessonExcerpt: slotMeta?.canonicalExcerpt ?? lessonExcerpt,\n    });\n  };\n\n  // ─────────────────────────────────────────────────────────────\n  // 4. Produce ACT (Hands-on Lab Exercise)\n  // ─────────────────────────────────────────────────────────────\n  const actRelPath = `_content/${unitCode}/ACT_${lessonCode}.md`;\n  const existingAct = await storage.readArtifact(projectId, actRelPath);\n  if (artifactScope.includes('ACT') && (!existingAct || force || isStaleVsPlan(existingAct))) {\n    onProgress?.('@activity', `[2/4] Authoring Hands-on Lab: \\`ACT_${lessonCode}.md\\`...`);\n\n    const actDateStr = new Date().toISOString().split('T')[0];\n    const actPrompt = buildSatellitePrompt('ACT', { lessonCode, dateStr: actDateStr }, languageDirective);\n\n    const rawAct = await runCurriculumAIInference(\n      [{ role: 'user', content: actPrompt }],\n      satelliteContextFor('ACT'),\n      runnerOptions,\n      (chunk: string, type?: ChunkType) => {\n        options.onProgress?.('@activity', chunk, { type: type || 'content', artifactType: 'ACT' });\n      }\n    );\n\n    if (!rawAct || rawAct.startsWith('⚠️') || rawAct.length < 200) {\n      throw createAiInferenceError({\n        errorCode: 'ERR_AI_RESPONSE_MALFORMED',\n        agent: '@activity',\n        artifactType: 'ACT',\n        lessonId: lessonCode,\n        message: `Agent @activity failed to author a valid ACT Lab for ${lessonCode}.`,\n        rawError: rawAct || 'Empty AI response'\n      });\n    }      await storage.saveArtifact(projectId, actRelPath, stampPlanHash(rawAct));\n    await storage.updateArtifactState(projectId, lessonCode, 'ACT', {\n      state: 'completed',\n      generatedAt: new Date().toISOString(),\n      contentHash: computeContentHash(rawAct)\n    });\n    producedArtifacts.push(`ACT_${lessonCode}.md`);\n    await judgeSat('ACT', rawAct);\n  }\n\n  // ─────────────────────────────────────────────────────────────\n  // 5. Produce QUIZ (Assessment Bank & Rubrics)\n  // ─────────────────────────────────────────────────────────────\n  const quizRelPath = `_content/${unitCode}/QUIZ_${lessonCode}.md`;\n  const existingQuiz = await storage.readArtifact(projectId, quizRelPath);\n  if (artifactScope.includes('QUIZ') && (!existingQuiz || force || isStaleVsPlan(existingQuiz))) {\n    onProgress?.('@assessor', `[3/4] Authoring Assessment Bank: \\`QUIZ_${lessonCode}.md\\`...`);\n\n    const quizDateStr = new Date().toISOString().split('T')[0];\n    const quizPrompt = buildSatellitePrompt('QUIZ', { lessonCode, dateStr: quizDateStr }, languageDirective);\n\n    const rawQuiz = await runCurriculumAIInference(\n      [{ role: 'user', content: quizPrompt }],\n      satelliteContextFor('QUIZ'),\n      runnerOptions,\n      (chunk: string, type?: ChunkType) => {\n        options.onProgress?.('@assessor', chunk, { type: type || 'content', artifactType: 'QUIZ' });\n      }\n    );\n\n    if (!rawQuiz || rawQuiz.startsWith('⚠️') || rawQuiz.length < 200) {\n      throw createAiInferenceError({\n        errorCode: 'ERR_AI_RESPONSE_MALFORMED',\n        agent: '@assessor',\n        artifactType: 'QUIZ',\n        lessonId: lessonCode,\n        message: `Agent @assessor failed to author a valid Quiz for ${lessonCode}.`,\n        rawError: rawQuiz || 'Empty AI response'\n      });\n    }      await storage.saveArtifact(projectId, quizRelPath, stampPlanHash(rawQuiz));\n    await storage.updateArtifactState(projectId, lessonCode, 'QUIZ', {\n      state: 'completed',\n      generatedAt: new Date().toISOString(),\n      contentHash: computeContentHash(rawQuiz)\n    });\n    producedArtifacts.push(`QUIZ_${lessonCode}.md`);\n    await judgeSat('QUIZ', rawQuiz);\n  }\n\n  // ─────────────────────────────────────────────────────────────\n  // 6. Produce SLIDE (Presentation Deck: HTML Deck or Marp format)\n  // ─────────────────────────────────────────────────────────────\n  const slideRelPath = `_content/${unitCode}/SLIDE_${lessonCode}.md`;\n  const existingSlide = await storage.readArtifact(projectId, slideRelPath);\n  if (artifactScope.includes('SLIDE') && (!existingSlide || force || isStaleVsPlan(existingSlide))) {\n    onProgress?.('@illustrator', `[4/4] Authoring Presentation Slide Deck: \\`SLIDE_${lessonCode}.md\\`...`);\n\n    // Defaults to HTML Slide Engine unless explicitly requested as 'marp'\n    const isHtmlEngine = options.slidesEngine !== 'marp';\n\n    if (isHtmlEngine) {\n      let presentationKitAi: any = null;\n      let presentationKitCore: any = null;\n      try {\n        presentationKitAi = await import('@thanh01.pmt/presentation-kit/ai');\n      } catch {}\n      try {\n        presentationKitCore = await import('@thanh01.pmt/presentation-kit');\n      } catch {}\n\n      const { executeSlideProductionWorkflow } = await import('./slideProductionWorkflow.js');\n\n      // Ground context for the HTML slide engine — identical knowledge blocks the\n      // HTML path receives via satelliteContextFor('SLIDE'), MINUS the canonical lesson excerpt\n      // (lesson phase content is injected separately via parseLessonFlow; symbol\n      // registry appended here so both engines inherit the identifier invariant).\n      const slideGroundContext = `${commonContext}${symbolLedgerBlock}`;\n\n      const workflowResult = await executeSlideProductionWorkflow({\n        lessonMarkdown: lessonContent || '',\n        lessonCode,\n        lessonTitle,\n        stylePresetId: 'blue-professional',\n        // RC 2026-09-23: engine MUST be explicit — the kit default 'hybrid'\n        // emits slot-template slides (mechanism 2), never the authored-HTML\n        // deck (mechanism 3) the frontend-slides skill promises. Bespoke is\n        // standard; callers may downgrade via slidesDeckEngine.\n        engine: options.slidesDeckEngine ?? 'bespoke',\n        language: targetLang || 'Vietnamese',\n        languageDirective,\n        headingDirective: buildHeadingDirective('SLIDE'),\n        groundContext: slideGroundContext,\n        productSpecBlock: productSpecBlock || undefined,\n        satelliteContext: satelliteContextFor('SLIDE'),\n        slidesOutline: options.slidesOutline,\n        runnerOptions,\n        onProgress: (agent: string, msg: string, meta?: any) => {\n          options.onProgress?.(agent, msg, meta || { type: 'content', artifactType: 'SLIDE' });\n        }\n      });\n\n      let deckJson = workflowResult.deckJson;\n      const markdownWrapper = workflowResult.markdownWrapper;\n\n      // Validate deck schema via presentation-kit if available, or fallback basic check\n      let validation = presentationKitAi?.validateHtmlSlideDeck\n        ? presentationKitAi.validateHtmlSlideDeck(deckJson, true)\n        : (deckJson && Array.isArray(deckJson.slides)\n            ? { valid: true, score: 95, issues: [], slideCount: deckJson.slides.length, notesCoveragePercent: 100 }\n            : { valid: false, score: 0, issues: [{ message: 'Malformed JSON slide deck' }], slideCount: 0, notesCoveragePercent: 0 });\n\n      await storage.saveArtifact(projectId, slideRelPath, stampPlanHash(markdownWrapper));\n      producedArtifacts.push(`SLIDE_${lessonCode}.md`);\n\n      // Compile and save companion HTML and .deck.json artifacts\n      if (deckJson) {\n        const deckJsonStr = JSON.stringify(deckJson, null, 2);\n        await storage.saveArtifact(projectId, `_content/${unitCode}/SLIDE_${lessonCode}.deck.json`, deckJsonStr);\n        producedArtifacts.push(`SLIDE_${lessonCode}.deck.json`);\n\n        // Preferred: the Node-only standalone compiler (embedded fonts + inlined\n        // layout utilities) so the deck needs no network. Runtime-assembled\n        // specifier: /node is an optional capability of newer presentation-kit.\n        let standaloneCompiler: any = null;\n        try {\n          const nodeEntry = '@thanh01.pmt/presentation-kit' + '/node';\n          const kitNode: any = await import(/* @vite-ignore */ nodeEntry);\n          if (typeof kitNode?.compileStandaloneHtmlDeck === 'function') {\n            standaloneCompiler = kitNode.compileStandaloneHtmlDeck;\n          }\n        } catch {\n          // Older presentation-kit — use the link-based compiler below.\n        }\n\n        const compiler = standaloneCompiler || presentationKitCore?.compileHtmlDeck || presentationKitAi?.compileHtmlDeck;\n        if (compiler) {\n          try {\n            const compiled = compiler(deckJson);\n            if (compiled?.html) {\n              await storage.saveArtifact(projectId, `_content/${unitCode}/SLIDE_${lessonCode}.html`, compiled.html);\n              producedArtifacts.push(`SLIDE_${lessonCode}.html`);\n              if (Array.isArray(compiled.embeddedFonts) && compiled.embeddedFonts.length > 0) {\n                onProgress?.('@illustrator', `[4/4] Deck tự chứa: nhúng font ${compiled.embeddedFonts.join(', ')} (không cần mạng).`);\n              }\n            }\n          } catch (compErr) {\n            console.warn(`[produceSingleLesson] Failed compiling HTML deck for ${lessonCode}:`, compErr);\n          }\n        }\n      }\n\n      // ── Gate handling per Project Settings (parity with Marp path) ──\n      // 1) Deterministic schema validation is a STRUCTURAL PRE-CHECK only:\n      //    when it fails the artifact is marked rejected regardless of gate mode\n      //    (malformed deck can never render).\n      // 2) When the gate is LLM_JUDGE, content quality is judged by judgeSat\n      //    exactly like the Marp path — the deterministic check must NEVER\n      //    auto-approve content on its own.\n      // 3) Gate none/HITL: record structural pre-check result only.\n      const structuralOk = Boolean(validation.valid && (validation.score ?? 100) >= 80);\n      const structuralScore = validation.score ?? (structuralOk ? 95 : 50);\n      const gateMode = gateModeFor(gates, 'SLIDE' as any);\n      if (!structuralOk) {\n        await storage.updateArtifactState(projectId, lessonCode, 'SLIDE', {\n          state: 'rejected',\n          generatedAt: new Date().toISOString(),\n          contentHash: computeContentHash(markdownWrapper),\n          review: {\n            decision: 'NEEDS_REVISION',\n            reviewedBy: '@heuristic-linter',\n            reviewedAt: new Date().toISOString(),\n            score: structuralScore,\n            critique: `HTML Slide Deck failed schema validation: ${(validation.issues || []).map((i: any) => i.message).join('; ')}`,\n          },\n        });\n        onProgress?.('@reviewer', `⚠️ SLIDE structural pre-check FAILED (${structuralScore}/100) [html-deck schema issues]`);\n      } else {\n        await storage.updateArtifactState(projectId, lessonCode, 'SLIDE', {\n          state: gateMode === 'LLM_JUDGE' ? 'pending' : 'completed',\n          generatedAt: new Date().toISOString(),\n          contentHash: computeContentHash(markdownWrapper),\n        });\n        onProgress?.('@reviewer', gateMode === 'LLM_JUDGE'\n          ? `✅ SLIDE structural pre-check PASS (${structuralScore}/100) — handing content review to LLM-as-Judge gate`\n          : `✅ SLIDE structural pre-check PASS (${structuralScore}/100) [gate=${gateMode}, no LLM judge]`);\n        // Content-quality judging per gate settings — identical contract to Marp.\n        // Feed the judge a text serialization of the deck slots (it cannot read JSON layout).\n        const deckTextForJudge = Array.isArray(deckJson?.slides)\n          ? deckJson.slides.map((s: any, i: number) => {\n              const slotLines = Object.entries(s.slots || {})\n                .map(([k, v]: [string, any]) => {\n                  if (Array.isArray(v)) return `- ${k}:\\n${v.map((item: any) => typeof item === 'object' ? `  - ${JSON.stringify(item)}` : `  - ${item}`).join('\\n')}`;\n                  if (v && typeof v === 'object') return `- ${k}: ${JSON.stringify(v, null, 1)}`;\n                  return `- ${k}: ${v}`;\n                })\n                .join('\\n');\n              return `## Slide ${i + 1} [${s.layoutId}]\\n${slotLines}\\n\\nPresenter Notes:\\n${s.notes || '(none)'}`;\n            }).join('\\n\\n')\n          : String(markdownWrapper);\n        await judgeSat('SLIDE', deckTextForJudge);\n      }\n    } else {\n      // ── Legacy / Rollback Marp Markdown path ──\n      const canonicalSlideTemplate = loadCurriculumTemplate('SLIDE_template.md');\n      const templateScaffold = canonicalSlideTemplate || `---\nmarp: true\ntheme: default\npaginate: true\nheader: \"${titleHeader(lessonTitle)}\"\nfooter: \"Curriculum OS • ${lessonCode} (${pedagogyLabel})\"\nstyle: |\n  section.cols2 { column-count: 2; column-gap: 2.2rem; }\n  section.cols3 { column-count: 3; column-gap: 1.6rem; }\n  section.cols2 hr, section.cols3 hr { border: 0; height: 0; margin: 0; break-after: column; }\n  blockquote { border-left: 4px solid #3b5bdb; background: #f4f6fb; padding: .3em .8em; border-radius: 6px; }\n  table { font-size: 0.82em; }\n---`;\n\n      const slidePrompt = buildMarpMarkdownSlidePrompt({\n        lessonCode,\n        lessonTitle,\n        pedagogyLabel,\n        templateScaffold,\n        languageDirective,\n        // Kit 1.5.64: slideHeadingDirective suppresses the template's\n        // MANDATORY section headings when a required outline is supplied —\n        // see languageDirective.slideHeadingDirective for the live evidence.\n        headingDirective: slideHeadingDirective(options.slidesOutline),\n        // Kit 1.5.55 anti-drift: bind the deck to the lesson's ACTUAL subject.\n        // L02 (2026-09-30) proved the scaffold + satellite context alone let the\n        // model author a completely different lesson (Python If/Else for a\n        // SwiftUI topic). Same phase-content source of truth the bespoke/hybrid\n        // engines embed in their prompts; capped like the hybrid excerpt (16k).\n        lessonFlowExcerpt: lessonExcerpt.slice(0, 16000),\n        // Kit 1.5.61: same structural ground truth as the HTML engines — when\n        // a slidesOutline is supplied, marp covers the same items in order.\n        slidesOutline: options.slidesOutline,\n      });\n\n      const rawSlide = await runCurriculumAIInference(\n        [{ role: 'user', content: slidePrompt }],\n        satelliteContextFor('SLIDE'),\n        runnerOptions,\n        (chunk: string, type?: ChunkType) => {\n          options.onProgress?.('@illustrator', chunk, { type: type || 'content', artifactType: 'SLIDE' });\n        }\n      );\n\n      if (!rawSlide || rawSlide.startsWith('⚠️') || rawSlide.length < 200) {\n        throw createAiInferenceError({\n          errorCode: 'ERR_AI_RESPONSE_MALFORMED',\n          agent: '@illustrator',\n          artifactType: 'SLIDE',\n          lessonId: lessonCode,\n          message: `Agent @illustrator failed to author valid Slides for ${lessonCode}.`,\n          rawError: rawSlide || 'Empty AI response'\n        });\n      }\n\n      await storage.saveArtifact(projectId, slideRelPath, stampPlanHash(rawSlide));\n      await storage.updateArtifactState(projectId, lessonCode, 'SLIDE', {\n        state: 'completed',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(rawSlide)\n      });\n      producedArtifacts.push(`SLIDE_${lessonCode}.md`);\n      await judgeSat('SLIDE', rawSlide);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────\n  // 7. Produce GUIDE (Teacher Instructional Guide)\n  // ─────────────────────────────────────────────────────────────\n  const guideRelPath = `_content/${unitCode}/GUIDE_${lessonCode}.md`;\n  const existingGuide = await storage.readArtifact(projectId, guideRelPath);\n  if (artifactScope.includes('GUIDE') && (!existingGuide || force || isStaleVsPlan(existingGuide))) {\n    onProgress?.('@content', `Authoring Teacher Guide: \\`GUIDE_${lessonCode}.md\\`...`, { artifactType: 'GUIDE' });\n\n    const guideDateStr = new Date().toISOString().split('T')[0];\n    const guidePrompt = buildSatellitePrompt('GUIDE', { lessonCode, dateStr: guideDateStr }, languageDirective);\n\n    const rawGuide = await runCurriculumAIInference(\n      [{ role: 'user', content: guidePrompt }],\n      satelliteContextFor('GUIDE'),\n      runnerOptions,\n      (chunk: string, type?: ChunkType) => {\n        options.onProgress?.('@content', chunk, { type: type || 'chunk', artifactType: 'GUIDE' });\n      }\n    );\n\n    if (rawGuide && !rawGuide.startsWith('⚠️') && rawGuide.length >= 200) {\n      await storage.saveArtifact(projectId, guideRelPath, stampPlanHash(rawGuide));\n      await storage.updateArtifactState(projectId, lessonCode, 'GUIDE', {\n        state: 'completed',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(rawGuide)\n      });\n      producedArtifacts.push(`GUIDE_${lessonCode}.md`);\n      await judgeSat('GUIDE', rawGuide);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────\n  // 8. Produce HANDOUT (Student Reference Notes)\n  // ─────────────────────────────────────────────────────────────\n  const handoutRelPath = `_content/${unitCode}/HANDOUT_${lessonCode}.md`;\n  const existingHandout = await storage.readArtifact(projectId, handoutRelPath);\n  if (artifactScope.includes('HANDOUT') && (!existingHandout || force || isStaleVsPlan(existingHandout))) {\n    onProgress?.('@content', `Authoring Student Handout: \\`HANDOUT_${lessonCode}.md\\`...`, { artifactType: 'HANDOUT' });\n\n    const handoutDateStr = new Date().toISOString().split('T')[0];\n    const handoutPrompt = buildSatellitePrompt('HANDOUT', { lessonCode, dateStr: handoutDateStr }, languageDirective);\n\n    const rawHandout = await runCurriculumAIInference(\n      [{ role: 'user', content: handoutPrompt }],\n      satelliteContextFor('HANDOUT'),\n      runnerOptions,\n      (chunk: string, type?: ChunkType) => {\n        options.onProgress?.('@content', chunk, { type: type || 'chunk', artifactType: 'HANDOUT' });\n      }\n    );\n\n    if (rawHandout && !rawHandout.startsWith('⚠️') && rawHandout.length >= 200) {\n      await storage.saveArtifact(projectId, handoutRelPath, stampPlanHash(rawHandout));\n      await storage.updateArtifactState(projectId, lessonCode, 'HANDOUT', {\n        state: 'completed',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(rawHandout)\n      });\n      producedArtifacts.push(`HANDOUT_${lessonCode}.md`);\n      await judgeSat('HANDOUT', rawHandout);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────\n  // 9. Produce WKS (Guided Student Worksheet)\n  // ─────────────────────────────────────────────────────────────\n  const wksRelPath = `_content/${unitCode}/WKS_${lessonCode}.md`;\n  const existingWks = await storage.readArtifact(projectId, wksRelPath);\n  if (artifactScope.includes('WKS') && (!existingWks || force || isStaleVsPlan(existingWks))) {\n    onProgress?.('@content', `Authoring Student Worksheet: \\`WKS_${lessonCode}.md\\`...`, { artifactType: 'WKS' });\n\n    const wksDateStr = new Date().toISOString().split('T')[0];\n    const wksPrompt = buildSatellitePrompt('WKS', { lessonCode, dateStr: wksDateStr }, languageDirective);\n\n    const rawWks = await runCurriculumAIInference(\n      [{ role: 'user', content: wksPrompt }],\n      satelliteContextFor('WKS'),\n      runnerOptions,\n      (chunk: string, type?: ChunkType) => {\n        options.onProgress?.('@content', chunk, { type: type || 'chunk', artifactType: 'WKS' });\n      }\n    );\n\n    if (rawWks && !rawWks.startsWith('⚠️') && rawWks.length >= 200) {\n      await storage.saveArtifact(projectId, wksRelPath, stampPlanHash(rawWks));\n      await storage.updateArtifactState(projectId, lessonCode, 'WKS', {\n        state: 'completed',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(rawWks)\n      });\n      producedArtifacts.push(`WKS_${lessonCode}.md`);\n      await judgeSat('WKS', rawWks);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────\n  // 10. Produce CODE / CODE_LAB (Executable Code Lab & Starter Projects)\n  // ─────────────────────────────────────────────────────────────\n  const codeRelPath = `_content/${unitCode}/CODE_${lessonCode}.md`;\n  const existingCode = await storage.readArtifact(projectId, codeRelPath);\n  if ((artifactScope.includes('CODE') || artifactScope.includes('CODE_LAB')) && (!existingCode || force || isStaleVsPlan(existingCode))) {\n    onProgress?.('@activity', `Authoring Executable Code Lab: \\`CODE_${lessonCode}.md\\`...`, { artifactType: 'CODE' });\n\n    const codeDateStr = new Date().toISOString().split('T')[0];\n    // Issue #2 (ticket 2026-09-27): domain-aware CODE contract. The IoT-era\n    // template forced \"Hardware Pinout & Wiring Configuration Matrix\" into\n    // every lab while the directive called it [CONDITIONAL] — a verbatim-copy\n    // contradiction the model resolves inconsistently (Swift/macOS labs\n    // shipped fabricated wiring tables). Hardware signals keep the Pinout\n    // row; software-only labs get a structure matrix instead, and the\n    // heading directive is built from the SAME resolved list so the\n    // frontmatter copy and the body headings can never disagree.\n    const hardwareSignal = [\n      options.briefing?.hardwarePlatform,\n      options.briefing?.techStack,\n      options.briefing?.coreTechnology,\n    ].filter(Boolean).join(' ');\n    const isHardwareLab = /arduino|esp32|esp8266|raspberry\\s*pico?|micro:bit|stm32|nucleo|gpio|breadboard/i.test(hardwareSignal);\n    const codePrompt = buildSatellitePrompt('CODE', { lessonCode, dateStr: codeDateStr, isHardwareLab }, languageDirective);\n\n    const rawCode = await runCurriculumAIInference(\n      [{ role: 'user', content: codePrompt }],\n      satelliteContextFor('CODE'),\n      runnerOptions,\n      (chunk: string, type?: ChunkType) => {\n        options.onProgress?.('@activity', chunk, { type: type || 'chunk', artifactType: 'CODE' });\n      }\n    );\n\n    if (rawCode && !rawCode.startsWith('⚠️') && rawCode.length >= 200) {\n      await storage.saveArtifact(projectId, codeRelPath, stampPlanHash(rawCode));\n      await storage.updateArtifactState(projectId, lessonCode, 'CODE', {\n        state: 'completed',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(rawCode)\n      });\n      await storage.updateArtifactState(projectId, lessonCode, 'CODE_LAB', {\n        state: 'completed',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(rawCode)\n      });\n      producedArtifacts.push(`CODE_${lessonCode}.md`);\n      await judgeSat('CODE', rawCode);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────\n  // 11. Produce EXT (Extension / Advanced Challenge)\n  // ─────────────────────────────────────────────────────────────\n  const extRelPath = `_content/${unitCode}/EXT_${lessonCode}.md`;\n  const existingExt = await storage.readArtifact(projectId, extRelPath);\n  if (artifactScope.includes('EXT') && (!existingExt || force || isStaleVsPlan(existingExt))) {\n    onProgress?.('@activity', `Authoring Advanced Extension Challenge: \\`EXT_${lessonCode}.md\\`...`, { artifactType: 'EXT' });\n\n    const extDateStr = new Date().toISOString().split('T')[0];\n    const extPrompt = buildSatellitePrompt('EXT', {\n      lessonCode,\n      dateStr: extDateStr,\n      zpdCeilingPrompt: zpdCeilingPrompt(horizon),\n      extHeadings: targetLang === 'vi' ? EXT_HEADINGS_VI : EXT_HEADINGS_EN,\n    }, languageDirective);\n\n    const rawExt = await runCurriculumAIInference(\n      [{ role: 'user', content: extPrompt }],\n      satelliteContextFor('EXT'),\n      runnerOptions,\n      (chunk: string, type?: ChunkType) => {\n        options.onProgress?.('@activity', chunk, { type: type || 'chunk', artifactType: 'EXT' });\n      }\n    );\n\n    if (rawExt && !rawExt.startsWith('⚠️') && rawExt.length >= 200) {\n      await storage.saveArtifact(projectId, extRelPath, stampPlanHash(rawExt));\n      await storage.updateArtifactState(projectId, lessonCode, 'EXT', {\n        state: 'completed',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(rawExt)\n      });\n      producedArtifacts.push(`EXT_${lessonCode}.md`);\n      await judgeSat('EXT', rawExt);\n    }\n  }\n\n  onProgress?.('@reviewer', `✅ Successfully authored all requested artifacts for \\`${lessonCode}\\` (${pedagogyLabel})!`);\n\n  // ── Cross-Artifact Drift Check (P1, deterministic markdown-level): quét satellites đã sinh trong lần chạy này\n  // kiểm frontmatter id/type khớp lessonCode + IDEA: phát hiện lệch ID sớm thay vì để Judge người dùng tự thấy.\n  if (producedArtifacts.some((a) => !a.startsWith('LESSON_'))) {\n    const driftFindings: string[] = [];\n    for (const artFile of producedArtifacts) {\n      if (artFile.startsWith('LESSON_')) continue;\n      const satType = artFile.split('_')[0];\n      const relPath = `_content/${unitCode}/${artFile}`;\n      const satContent = await storage.readArtifact(projectId, relPath);\n      if (!satContent) continue;\n      const idMatch = satContent.match(/^id:\\s*\"([^\"]+)\"/m);\n      const typeMatch = satContent.match(/^type:\\s*\"([^\"]+)\"/m);\n      if (idMatch && !idMatch[1].includes(lessonCode)) {\n        driftFindings.push(`${artFile}: frontmatter id \"${idMatch[1]}\" không chứa lessonId \"${lessonCode}\"`);\n      }\n      if (typeMatch && typeMatch[1] !== satType) {\n        driftFindings.push(`${artFile}: frontmatter type \"${typeMatch[1]}\" ≠ expected \"${satType}\"`);\n      }\n    }\n    if (driftFindings.length > 0) {\n      onProgress?.('@reviewer', `⚠️ Cross-artifact drift detected (${driftFindings.length}): ${driftFindings.join(' | ')}`);\n      // Ghi nhận vào state của LESSON để telemetry/queue thấy (không chặn — chỉ cảnh báo rõ ràng)\n      await storage.updateArtifactState(projectId, lessonCode, 'LESSON', {\n        state: isLessonApproved ? 'approved' : 'completed',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(lessonContent),\n        review: {\n          decision: isLessonApproved ? 'APPROVED' : 'NEEDS_REVISION',\n          reviewedBy: '@agent-as-judge',\n          reviewedAt: new Date().toISOString(),\n          critique: `Cross-artifact drift: ${driftFindings.slice(0, 5).join('; ')}`,\n        }\n      });\n    }\n  }\n\n  // ── Standards Coverage Verification Gate ──\n  let standardsCoverage: CoverageGateReport | undefined;\n  if (packs.length > 0 && lessonContent) {\n    try {\n      const objectives = parseLessonObjectivesWithStandards(lessonContent, concept, bloomLevel, packs);\n      const activities = parseActivitySequenceLo(lessonContent);\n      const quizContent = await storage.readArtifact(projectId, quizRelPath).catch(() => null);\n      const quizQuestions = quizContent ? parseQuizQuestionsLo(quizContent) : [];\n\n      // Scope các statements liên quan đến bài học (theo gradeBand, topic/concept hoặc được LO neo trực tiếp)\n      const selected = selectStatementsForLesson({\n        packs,\n        gradeBand: options.gradeBand ?? [6, 12],\n        topicText: `${lessonTitle} ${concept}`,\n      });\n      const targetStatementIds = new Set(selected.map((s) => s.statement.id.toLowerCase()));\n      for (const lo of objectives) {\n        for (const r of lo.standardRefs || []) {\n          targetStatementIds.add(r.replace(/^[^:]+:/, '').toLowerCase());\n        }\n      }\n\n      // Chỉ đưa các statements nằm trong phạm vi cam kết của bài học vào Gate\n      const scopedPacks = packs\n        .map((p) => ({\n          ...p,\n          statements: p.statements.filter((s) => targetStatementIds.has(s.id.toLowerCase())),\n        }))\n        .filter((p) => p.statements.length > 0);\n\n      if (scopedPacks.length > 0) {\n        standardsCoverage = evaluateStandardsCoverage({\n          packs: scopedPacks,\n          objectives,\n          activities,\n          quizQuestions,\n        });\n\n        onProgress?.(\n          '@reviewer',\n          `📊 Standards Coverage Gate: ${standardsCoverage.verdict} (${standardsCoverage.coveragePct}% coverage, ${standardsCoverage.rows.filter((r) => r.status === 'COVERED').length}/${standardsCoverage.rows.length} statements covered)`\n        );\n      } else {\n        if (targetStatementIds.size > 0) {\n          onProgress?.(\n            '@reviewer',\n            `⚠️ Standards Coverage Warning: Lesson cam kết ${targetStatementIds.size} standard refs (${Array.from(targetStatementIds).slice(0, 5).join(', ')}) nhưng không khớp với statements nào trong các packs đã cấu hình (${packs.map((p) => p.manifest.id).join(', ')}).`\n          );\n        } else {\n          onProgress?.(\n            '@reviewer',\n            `ℹ️ Standards Coverage Info: Các packs (${packs.map((p) => p.manifest.id).join(', ')}) đã cấu hình nhưng bài học không chỉ định standardRefs mục tiêu.`\n          );\n        }\n      }\n    } catch (covErr: any) {\n      console.warn('[lessonProductionService] Failed to evaluate standards coverage:', covErr?.message || covErr);\n    }\n  }\n\n  return {\n    lessonId: lessonCode,\n    pedagogy,\n    producedArtifacts,\n    pausedForReview: false,\n    contextInjection: lessonInjection && lessonInjection.verified\n      ? (expositionInjection || lessonInjection)\n      : (lessonInjection || expositionInjection),\n    promptChars: commonContext.length,\n    contextDrops: contextDrops.length > 0 ? contextDrops : undefined,\n    standardsCoverage,\n  };\n}\n\n/**\n * P0: Parse Learning Objectives THẬT từ markdown lesson (bảng LO hoặc bullet **LOx:**)\n * để Judge chấm đúng mục tiêu thay vì LO1 = concept hardcode. Fallback: concept duy nhất.\n */\nfunction parseLessonObjectives(lessonContent: string, concept: string, bloomLevel: string): Array<{ code: string; description: string; bloomLevel: string }> {\n  const objectives: Array<{ code: string; description: string; bloomLevel: string }> = [];\n  // Bảng: | LO1 | mô tả | ... | hoặc bullet: - **LO1:** mô tả\n  const tableRe = /\\|\\s*(LO\\d+)\\s*\\|([^|]+)\\|/g;\n  const bulletRe = /\\*\\*(LO\\d+)\\*\\*\\s*[:\\-–]\\s*([^\\n]+)/g;\n  let m: RegExpExecArray | null;\n  while ((m = tableRe.exec(lessonContent)) !== null) {\n    const desc = m[2].trim();\n    if (desc && desc.length > 5 && !/^\\**$/.test(desc)) objectives.push({ code: m[1], description: desc, bloomLevel });\n  }\n  if (objectives.length === 0) {\n    while ((m = bulletRe.exec(lessonContent)) !== null) {\n      objectives.push({ code: m[1], description: m[2].trim().slice(0, 200), bloomLevel });\n    }\n  }\n  if (objectives.length === 0) {\n    objectives.push({ code: 'LO1', description: concept, bloomLevel });\n  }\n  return objectives.slice(0, 6);\n}\n\n/**\n * Trích xuất learning objectives kèm standardRefs (CSTA, ACM, etc.) được neo trong bảng mục tiêu hoặc văn bản bài học.\n */\nfunction parseLessonObjectivesWithStandards(\n  lessonContent: string,\n  concept: string,\n  bloomLevel: string,\n  _packs: FrameworkPack[]\n): Array<{ code: string; description: string; bloomLevel: string; standardRefs?: string[] }> {\n  const baseObjectives = parseLessonObjectives(lessonContent, concept, bloomLevel);\n  const lines = lessonContent.split('\\n');\n\n  return baseObjectives.map((lo) => {\n    const refs = new Set<string>();\n    for (const line of lines) {\n      if (line.includes(lo.code)) {\n        const found = extractStandardRefs(line);\n        for (const r of found) refs.add(r);\n      }\n    }\n    return {\n      ...lo,\n      standardRefs: refs.size > 0 ? Array.from(refs) : undefined,\n    };\n  });\n}\n\n/**\n * Trích xuất ánh xạ Activity Sequence -> LOs từ lesson plan markdown.\n */\nfunction parseActivitySequenceLo(lessonContent: string): Array<{ seq?: number; lo: string[] }> {\n  const activities: Array<{ seq?: number; lo: string[] }> = [];\n  const lines = lessonContent.split('\\n');\n  let currentSeq = 1;\n\n  for (const line of lines) {\n    const matchActivity = line.match(/(?:Hoạt động|Activity|Phase|Giai đoạn)\\s*(\\d+)/i);\n    const loMatches = Array.from(line.matchAll(/\\b(LO\\d+)\\b/gi)).map((m) => m[1].toUpperCase());\n    if (matchActivity && loMatches.length > 0) {\n      activities.push({\n        seq: parseInt(matchActivity[1], 10),\n        lo: Array.from(new Set(loMatches)),\n      });\n    } else if (loMatches.length > 0 && line.trim().startsWith('|')) {\n      activities.push({\n        seq: currentSeq++,\n        lo: Array.from(new Set(loMatches)),\n      });\n    }\n  }\n\n  if (activities.length === 0) {\n    const allLos = Array.from(lessonContent.matchAll(/\\b(LO\\d+)\\b/gi)).map((m) => m[1].toUpperCase());\n    if (allLos.length > 0) {\n      activities.push({ seq: 1, lo: Array.from(new Set(allLos)) });\n    }\n  }\n\n  return activities;\n}\n\n/**\n * Trích xuất ánh xạ câu hỏi trắc nghiệm Quiz -> LO/AO từ quiz markdown.\n */\nfunction parseQuizQuestionsLo(quizContent: string): Array<{ alignedLO?: string; alignedAO?: string }> {\n  const questions: Array<{ alignedLO?: string; alignedAO?: string }> = [];\n  const lines = quizContent.split('\\n');\n  for (const line of lines) {\n    const loMatch = line.match(/\\b(LO\\d+)\\b/i);\n    const aoMatch = line.match(/\\b(AO\\d+)\\b/i);\n    if (loMatch || aoMatch) {\n      questions.push({\n        alignedLO: loMatch ? loMatch[1].toUpperCase() : undefined,\n        alignedAO: aoMatch ? aoMatch[1].toUpperCase() : undefined,\n      });\n    }\n  }\n  return questions;\n}\n\n/**\n * Per-artifact LLM-as-Judge cho satellite — CHỈ gọi khi gateModeFor(gates, sat) === 'LLM_JUDGE'.\n * Pass → state 'approved' + review record. Fail → state 'rejected' + review record.\n * KHÔNG chặn pipeline (khác LESSON): satellite kém chỉ bị đánh dấu, người duyệt quyết tiếp theo.\n */\nasync function judgeSatelliteArtifact(\n  ctx: {\n    storage: ICurriculumStorage;\n    projectId: string;\n    lessonCode: string;\n    sat: string;\n    content: string;\n    concept: string;\n    bloomLevel: string;\n    standardStatements: Record<string, string>;\n    onProgress?: (agent: string, message: string, meta?: any) => void;\n    targetLang?: string;\n    canonicalLessonContent?: string;\n    canonicalLessonExcerpt?: string;\n  }\n): Promise<void> {\n  const { storage, projectId, lessonCode, sat, content } = ctx;\n  try {\n    ctx.onProgress?.('@reviewer', `🤖 Judging ${sat}_${lessonCode}...`);\n    const targetObjectives = parseLessonObjectives(\n      ctx.canonicalLessonContent || content,\n      ctx.concept,\n      ctx.bloomLevel\n    );\n    const result = await LLMJudgeEngine.evaluateArtifactWithLLM({\n      targetArtifactType: sat,\n      lessonId: lessonCode,\n      expectedLanguage: ctx.targetLang || 'en',\n      targetObjectives,\n      generatedContentJson: JSON.stringify({\n        content,\n        artifactType: sat,\n        lessonId: lessonCode,\n        canonicalLessonExcerpt: ctx.canonicalLessonExcerpt,\n      }),\n      standardStatements: Object.keys(ctx.standardStatements).length > 0 ? ctx.standardStatements : undefined,\n    });\n    const passed = result.passed && result.score >= 85;\n    await storage.updateArtifactState(projectId, lessonCode, sat, {\n      state: passed ? 'approved' : 'rejected',\n      generatedAt: new Date().toISOString(),\n      contentHash: computeContentHash(content),\n      review: {\n        decision: passed ? 'APPROVED' : 'NEEDS_REVISION',\n        reviewedBy: '@agent-as-judge',\n        reviewedAt: new Date().toISOString(),\n        score: result.score,\n        critique: result.critique,\n        feedback: passed ? undefined : result.weaknesses.join('; '),\n      }\n    });\n    ctx.onProgress?.('@reviewer', passed\n      ? `\\u{2705} ${sat} judge PASS (${result.score}/100)`\n      : `\\u{26A0}\\u{FE0F} ${sat} judge NEEDS_REVISION (${result.score}/100)`);\n  } catch (err: any) {\n    // Fail-closed cho satellite: judge lỗi → state 'awaiting_review' + review record rõ ràng, KHÔNG âm thầm để completed\n    console.error(`[produceSingleLesson] satellite judge failed for ${sat}_${lessonCode}:`, err?.message || err);\n    try {\n      await storage.updateArtifactState(projectId, lessonCode, sat, {\n        state: 'awaiting_review',\n        generatedAt: new Date().toISOString(),\n        contentHash: computeContentHash(content),\n        review: {\n          decision: 'NEEDS_REVISION',\n          reviewedBy: '@agent-as-judge',\n          reviewedAt: new Date().toISOString(),\n          critique: `Judge unavailable (fail-closed): ${err?.message || String(err)}`,\n        }\n      });\n      ctx.onProgress?.('@reviewer', `❌ Judge failed for ${sat}_${lessonCode} — marked awaiting_review (fail-closed)`);\n    } catch (stateErr: any) {\n      console.error(`[produceSingleLesson] failed to persist judge-error state for ${sat}_${lessonCode}:`, stateErr?.message || stateErr);\n    }\n  }\n}\nfunction titleHeader(title: string): string {\n  return title.replace(/[\"\\n\\r]/g, '');\n}\n\n/**\n * Batch production orchestrator supporting Lesson-by-Lesson (Strategy A) or Artifact-by-Artifact (Strategy B) execution.\n */\nexport async function produceBatchLessons(\n  storage: ICurriculumStorage,\n  projectId: string,\n  lessonIds: string[],\n  options: ProduceLessonOptions = {}\n): Promise<{\n  totalLessons: number;\n  completedLessons: string[];\n  pausedLessonId?: string;\n  report: ProjectStatusReport;\n}> {\n  const { batchStrategy = 'depth_first_lesson', onProgress } = options;\n\n  // Gate-driven: có HITL ở bất kỳ gate nào (SOT hoặc artifact) → breadth-first để dừng duyệt sớm.\n  const gates = resolveGateSettings(options.gateSettings);\n  const hasHitl = Object.values(gates).some((m) => m === 'HITL');\n  const effectiveStrategy = hasHitl ? 'breadth_first_artifact' : batchStrategy;\n\n  const completedLessons: string[] = [];\n\n  // ─────────────────────────────────────────────────────────────\n  // Strategy B: Artifact-by-Artifact (Breadth-first) -> Used for HITL\n  // ─────────────────────────────────────────────────────────────\n  if (effectiveStrategy === 'breadth_first_artifact') {\n    onProgress?.('@router', `Bắt đầu sản xuất theo chiến lược [B] (Breadth-first): Chạy toàn bộ Lesson Plan (Giáo án) cho ${lessonIds.length} bài học trước...`);\n\n    // Phase 1: Build all LESSON plans\n    for (const lid of lessonIds) {\n      const res = await produceSingleLesson(storage, projectId, lid, {\n        ...options,\n        artifactScope: ['LESSON'], // Only produce LESSON\n      });\n      completedLessons.push(lid);\n\n      if (res.pausedForReview) {\n        const report = await storage.getProjectStatus(projectId);\n        return {\n          totalLessons: lessonIds.length,\n          completedLessons,\n          pausedLessonId: lid,\n          report,\n        };\n      }\n    }\n\n    // Check if HITL gate is enabled for LESSON\n    if (gates.LESSON === 'HITL') {\n      const pipelineState = await storage.getPipelineState(projectId);\n      const unapproved = lessonIds.filter(lid => pipelineState.tasks[lid]?.LESSON?.state !== 'approved');\n      if (unapproved.length > 0) {\n        onProgress?.(\n          '@reviewer',\n          `🚦 Dừng kiểm duyệt HITL tại Chốt Giáo án: Đã soạn thảo xong Giáo án cho ${lessonIds.length} bài học. Vui lòng kiểm tra và phê duyệt để tiếp tục sản xuất Lab, Quiz, Slide.`,\n          { gate: 'BATCH_LESSONS', status: 'awaiting_approval', paused: true }\n        );\n\n        const report = await storage.getProjectStatus(projectId);\n        return {\n          totalLessons: lessonIds.length,\n          completedLessons,\n          pausedLessonId: unapproved[0],\n          report,\n        };\n      }\n    }\n\n    // Phase 2: Build Satellite Artifacts after LESSON approval\n    const fullScope = options.artifactScope && options.artifactScope.length > 0 \n      ? options.artifactScope \n      : await getProjectArtifactScope(storage, projectId);\n    const satelliteScope = fullScope.filter(s => s !== 'LESSON');\n\n    onProgress?.('@router', `Tiếp tục sản xuất các học liệu vệ tinh (${satelliteScope.join(', ')}) cho ${lessonIds.length} bài học...`);\n    for (const lid of lessonIds) {\n      await produceSingleLesson(storage, projectId, lid, {\n        ...options,\n        artifactScope: satelliteScope,\n        approvedArtifacts: ['LESSON', lid], // LESSON is approved\n      });\n    }\n  } else {\n    // ─────────────────────────────────────────────────────────────\n    // Strategy A: Lesson-by-Lesson (Depth-first / Full Autonomy)\n    // ─────────────────────────────────────────────────────────────\n    onProgress?.('@router', `Bắt đầu sản xuất theo chiến lược [A] (Depth-first): Hoàn thành trọn gói từng bài học một...`);\n\n    for (const lid of lessonIds) {\n      onProgress?.('@router', `--- BẮT ĐẦU SẢN XUẤT BÀI HỌC: ${lid} ---`);\n      const res = await produceSingleLesson(storage, projectId, lid, options);\n\n      if (res.pausedForReview) {\n        const report = await storage.getProjectStatus(projectId);\n        return {\n          totalLessons: lessonIds.length,\n          completedLessons,\n          pausedLessonId: lid,\n          report,\n        };\n      }\n\n      completedLessons.push(lid);\n    }\n  }\n\n  const report = await storage.getProjectStatus(projectId);\n  return {\n    totalLessons: lessonIds.length,\n    completedLessons,\n    report,\n  };\n}\n\n","/**\n * Gate Settings — toàn bộ logic \"ai kiểm artifact nào\" nằm ở đây, trong kit.\n * Composer chỉ gọi: resolveGateSettings(projectConfig.gateModes) rồi dùng kết quả.\n *\n * Vocabulary chuẩn (duy nhất, không có biến thể thứ hai):\n *   'OFF'       — không kiểm\n *   'LLM_JUDGE' — Agent kiểm (LLM-as-Judge)\n *   'HITL'      — Human kiểm (human-in-the-loop)\n *\n * Phạm vi phủ: SOT foundation (Learner Profile, Framework, Style Guide — duyệt trước khi\n * sinh content) + toàn bộ content artifacts.\n */\n\nexport type CurriculumGateMode = 'OFF' | 'LLM_JUDGE' | 'HITL';\n\nexport type CurriculumArtifactType =\n  // SOT foundation gates (duyệt nền trước khi sinh content) — khớp SOT_EXECUTION_ORDER của Composer\n  | 'LEARNER_PROFILE'\n  | 'PROJECT_BRIEF'\n  | 'REFERENCE_PACK'\n  | 'CURRICULUM_FRAMEWORK'\n  | 'KNOWLEDGE_EXPOSITION'\n  | 'STYLE_GUIDE'\n  | 'ART_DIRECTION'\n  // content artifacts — khớp ARTIFACT_EXECUTION_ORDER của Composer\n  | 'LESSON'\n  | 'ACT'\n  | 'QUIZ'\n  | 'SLIDE'\n  | 'GUIDE'\n  | 'WKS'\n  | 'HANDOUT'\n  | 'EXT'\n  | 'CODE'\n  | 'MEDIA_SCRIPT'\n  | 'EXIT_TICKET';\n\nexport type GateSettings = Partial<Record<CurriculumArtifactType, CurriculumGateMode>>;\n\nexport type ResolvedGateSettings = Readonly<Record<CurriculumArtifactType, CurriculumGateMode>>;\n\n/**\n * Mặc định: KHÔNG KIỂM (all-OFF) — triết lý \"config là nguồn duy nhất\".\n * Không gate nào được hồi sinh ngầm khi thiếu key trong project.config.json.\n * Composer (apps/web) ghi gateModes đầy đủ tường minh lúc tạo project / lưu settings,\n * và user toàn quyền đổi qua Settings cho project/scratch đang chạy.\n */\nexport const DEFAULT_GATE_SETTINGS: ResolvedGateSettings = Object.freeze({\n  LEARNER_PROFILE: 'OFF',\n  PROJECT_BRIEF: 'OFF',\n  REFERENCE_PACK: 'OFF',\n  CURRICULUM_FRAMEWORK: 'OFF',\n  KNOWLEDGE_EXPOSITION: 'OFF',\n  STYLE_GUIDE: 'OFF',\n  ART_DIRECTION: 'OFF',\n  LESSON: 'OFF',\n  ACT: 'OFF',\n  QUIZ: 'OFF',\n  SLIDE: 'OFF',\n  GUIDE: 'OFF',\n  WKS: 'OFF',\n  HANDOUT: 'OFF',\n  EXT: 'OFF',\n  CODE: 'OFF',\n  MEDIA_SCRIPT: 'OFF',\n  EXIT_TICKET: 'OFF',\n});\n\nconst ALL_TYPES = Object.keys(DEFAULT_GATE_SETTINGS) as CurriculumArtifactType[];\n\nconst MODE_ALIASES: Record<string, CurriculumGateMode> = {\n  off: 'OFF',\n  none: 'OFF',\n  llm_judge: 'LLM_JUDGE',\n  judge: 'LLM_JUDGE',\n  hitl: 'HITL',\n  human: 'HITL',\n};\n\nconst TYPE_ALIASES: Record<string, CurriculumArtifactType> = {\n  code_lab: 'CODE',\n  gate1: 'LEARNER_PROFILE',\n  gate2: 'CURRICULUM_FRAMEWORK',\n  style_guide: 'STYLE_GUIDE',\n  content_style_guide: 'STYLE_GUIDE',\n  learner_profile: 'LEARNER_PROFILE',\n  project_brief: 'PROJECT_BRIEF',\n  reference_pack: 'REFERENCE_PACK',\n  curriculum_framework: 'CURRICULUM_FRAMEWORK',\n  art_direction: 'ART_DIRECTION',\n  media_script: 'MEDIA_SCRIPT',\n  exit_ticket: 'EXIT_TICKET',\n};\n\nfunction canonType(key: string): CurriculumArtifactType | undefined {\n  const k = key.trim().toLowerCase();\n  const t = TYPE_ALIASES[k] ?? (k.toUpperCase() as CurriculumArtifactType);\n  return ALL_TYPES.includes(t) ? t : undefined;\n}\n\nfunction canonMode(value: unknown): CurriculumGateMode | undefined {\n  if (typeof value !== 'string') return undefined;\n  return MODE_ALIASES[value.trim().toLowerCase()];\n}\n\n/**\n * Chuẩn hoá config thô (vd: gateModes đọc từ project.config.json của Composer) thành GateSettings.\n * Key/value không nhận diện được bị bỏ qua — config sai không bao giờ làm workflow chết.\n */\nexport function parseGateSettings(raw: unknown): GateSettings {\n  const out: GateSettings = {};\n  if (!raw || typeof raw !== 'object') return out;\n  for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n    const t = canonType(key);\n    const m = canonMode(value);\n    if (t && m) out[t] = m;\n  }\n  return out;\n}\n\n/**\n * Điểm vào DUY NHẤT: raw config (hoặc đã chuẩn hoá) → settings đầy đủ cho mọi artifact type.\n * Key không có trong config nhận DEFAULT_GATE_SETTINGS.\n */\nexport function resolveGateSettings(raw?: unknown): ResolvedGateSettings {\n  const parsed = parseGateSettings(raw);\n  const resolved = {} as Record<CurriculumArtifactType, CurriculumGateMode>;\n  for (const t of ALL_TYPES) resolved[t] = parsed[t] ?? DEFAULT_GATE_SETTINGS[t];\n  return resolved;\n}\n\n/** Mode đã resolve cho 1 artifact type. */\nexport function gateModeFor(resolved: ResolvedGateSettings, type: CurriculumArtifactType): CurriculumGateMode {\n  return resolved[type] ?? 'OFF';\n}\n","/**\n * Multilingual Semantic Header Matcher & Dictionary\n * \n * Maps headings (English, Vietnamese, with icons/emojis/numbers/system tags)\n * across 21 artifact types and SOT documents to stable semantic key paths.\n */\n/**\n * Strips formatting, markers, numbers, emojis, and duration annotations from heading text.\n */\nexport function cleanHeadingText(raw: string): string {\n  let s = raw.trim();\n  // Strip leading markdown hashes\n  s = s.replace(/^#+\\s*/, '');\n  let prev = '';\n  while (prev !== s) {\n    prev = s;\n    s = s.trim();\n    // Strip placeholders: `{{@ref}}`, `{{$name}}`, `{{NAME}}`, `{{ref_1_title}}`\n    // and `[SME_MANDATE]`-style all-caps tokens.\n    //\n    // Placeholder text is NOT part of a section's identity. `Code Anatomy:\n    // {{CONCEPT_1_NAME}}` trong template và `Code Anatomy: Biến đổi` trong bài\n    // đã sinh phải ra CÙNG một key — giữ placeholder thì mỗi bản sinh ra một\n    // key khác nhau. Đo 2026-10-03: 50 semantic key trong từ điển mang theo ký\n    // tự placeholder vì bước này không tồn tại.\n    s = s.replace(/\\{\\{\\s*[$@#]?[^{}]*\\}\\}/g, ' ');\n    s = s.replace(/\\[\\s*[A-Z][A-Z0-9_]*\\s*\\]/g, ' ');\n    // Strip system tags [REQUIRED], [OPTIONAL], [CONDITIONAL], [MANDATORY]\n    s = s.replace(/^\\[\\s*(REQUIRED|OPTIONAL|CONDITIONAL|MANDATORY)\\s*\\]\\s*/gi, '');\n    // Strip emojis and pictographs\n    s = s.replace(/[\\p{Extended_Pictographic}\\u{1F300}-\\u{1FAFF}\\u{2600}-\\u{27BF}\\uFE00-\\uFE0F]/gu, '');\n    // Strip leading section numbers and prefixes:\n    // e.g. \"A. \", \"B. \", \"1. \", \"2.1. \", \"Phase 1: \", \"Station 1: \", \"Part 1: \", \"Set A: \", \"Concept 1: \"\n    s = s.replace(/^([A-Z]|\\d+(\\.\\d+)*)\\.?\\s+/i, '');\n    s = s.replace(/^(Phase|Station|Part|Set|Step|Concept)\\s+([A-Z0-9]+|[\\p{L}\\d]+):?\\s+/iu, '');\n    // Strip trailing notes, duration, or timing:\n    // e.g. \"(10 mins)\", \"[30 mins]\", \"— [30 mins]\", \"(3 Mins)\", \"- 10 phút\"\n    s = s.replace(/[-–—]?\\s*[\\(\\[]\\s*\\d+\\s*(mins?|phút|hours?|giây|minutes?)\\s*[\\)\\]]$/i, '');\n  }\n  return s.trim();\n}\n/**\n * Normalizes a heading into a dictionary lookup key: lowercased, diacritics\n * folded, punctuation dropped.\n *\n * Unicode-aware on purpose. Stripping everything outside `[a-z0-9]` erased\n * every non-Latin script outright — '课程概览', 'Ключевые термины' and\n * 'キーワード' all normalized to the empty string, and because\n * `matchHeadingToSemanticKey` falls back to `'unrecognized'` for an empty\n * result, every distinct heading in those scripts collapsed onto ONE shared\n * key. Any project taught in Chinese, Russian, Japanese, Korean or Arabic lost\n * semantic resolution entirely and silently degraded to the regex fallback.\n * Keeping `\\p{L}\\p{N}` preserves each script's letters, so those headings stay\n * distinct.\n *\n * Latin input is unaffected: NFD plus diacritic folding maps Vietnamese onto\n * the same ASCII the dictionary was built from, so every existing key still\n * resolves. Only non-Latin input changes behaviour.\n *\n * NOTE: `norm()` in contextSlots.ts is deliberately NOT this function. It\n * compares an ASCII artifact-type code against a table cell, so it must fold\n * hard onto ASCII to match Vietnamese cells like 'Hoạt động' → 'HOATDONG'.\n */\nexport function normHeading(s: string): string {\n  return s\n    .toLowerCase()\n    .replace(/[đ]/g, 'd')\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .replace(/[^\\p{L}\\p{N}]+/gu, '');\n}\nexport interface SemanticHeaderEntry {\n  /** Stable semantic identifier (e.g. 'learningObjectives') */\n  key: string;\n  /** Optional preferred parent key path (e.g. 'lessonDesignPlan') */\n  parentKey?: string;\n  /** Human-readable canonical title */\n  canonicalTitle: string;\n}\n/**\n * Base dictionary of normalized heading patterns to canonical semantic keys.\n */\nconst RAW_DICTIONARY: Record<string, SemanticHeaderEntry> = {\n  // === LESSON: Section A (Design Plan) ===\n  'lessondesignplan': { key: 'lessonDesignPlan', canonicalTitle: 'Lesson Design Plan' },\n  'kehoachthietkebaichay': { key: 'lessonDesignPlan', canonicalTitle: 'Lesson Design Plan' },\n  'kehoachthietkebaihoc': { key: 'lessonDesignPlan', canonicalTitle: 'Lesson Design Plan' },\n  'kehoachthietkebaiday': { key: 'lessonDesignPlan', canonicalTitle: 'Lesson Design Plan' },\n  'designplan': { key: 'lessonDesignPlan', canonicalTitle: 'Lesson Design Plan' },\n  'learningobjectivesevidence': { key: 'learningObjectives', parentKey: 'lessonDesignPlan', canonicalTitle: 'Learning Objectives & Evidence' },\n  'muctieuhoctapminhchung': { key: 'learningObjectives', parentKey: 'lessonDesignPlan', canonicalTitle: 'Learning Objectives & Evidence' },\n  'learningobjectives': { key: 'learningObjectives', parentKey: 'lessonDesignPlan', canonicalTitle: 'Learning Objectives' },\n  'muctieuhoctap': { key: 'learningObjectives', parentKey: 'lessonDesignPlan', canonicalTitle: 'Learning Objectives' },\n  'muctieu': { key: 'learningObjectives', parentKey: 'lessonDesignPlan', canonicalTitle: 'Learning Objectives' },\n  'activitysequence': { key: 'activitySequence', parentKey: 'lessonDesignPlan', canonicalTitle: 'Activity Sequence' },\n  'chuoithoatdong': { key: 'activitySequence', parentKey: 'lessonDesignPlan', canonicalTitle: 'Activity Sequence' },\n  'chuoihoatdong': { key: 'activitySequence', parentKey: 'lessonDesignPlan', canonicalTitle: 'Activity Sequence' },\n  'hoatdonghoctap': { key: 'activitySequence', parentKey: 'lessonDesignPlan', canonicalTitle: 'Activity Sequence' },\n  'resourcemap': { key: 'resourceMap', parentKey: 'lessonDesignPlan', canonicalTitle: 'Resource Map' },\n  'bandotainguyen': { key: 'resourceMap', parentKey: 'lessonDesignPlan', canonicalTitle: 'Resource Map' },\n  'tainguyenhoctap': { key: 'resourceMap', parentKey: 'lessonDesignPlan', canonicalTitle: 'Resource Map' },\n  'assessmentmap': { key: 'assessmentMap', parentKey: 'lessonDesignPlan', canonicalTitle: 'Assessment Map' },\n  'matrandanhgia': { key: 'assessmentMap', parentKey: 'lessonDesignPlan', canonicalTitle: 'Assessment Map' },\n  'bandodanhgia': { key: 'assessmentMap', parentKey: 'lessonDesignPlan', canonicalTitle: 'Assessment Map' },\n  'artifactcontract': { key: 'artifactContract', parentKey: 'lessonDesignPlan', canonicalTitle: 'Artifact Contract' },\n  'rangbuocthanhpham': { key: 'artifactContract', parentKey: 'lessonDesignPlan', canonicalTitle: 'Artifact Contract' },\n  'hopdongthanhpham': { key: 'artifactContract', parentKey: 'lessonDesignPlan', canonicalTitle: 'Artifact Contract' },\n  // === LESSON: Section B (Lesson Flow) ===\n  'lessonflow': { key: 'lessonFlow', canonicalTitle: 'Lesson Flow' },\n  'kichbandayhoc': { key: 'lessonFlow', canonicalTitle: 'Lesson Flow' },\n  'tientrinhgiangdaychitiet': { key: 'lessonFlow', canonicalTitle: 'Lesson Flow' },\n  'tientrinhdayhoc': { key: 'lessonFlow', canonicalTitle: 'Lesson Flow' },\n  'flow': { key: 'lessonFlow', canonicalTitle: 'Lesson Flow' },\n  // 5E Phases\n  'engage': { key: 'phase1Engage', parentKey: 'lessonFlow', canonicalTitle: 'ENGAGE' },\n  'dannhap': { key: 'phase1Engage', parentKey: 'lessonFlow', canonicalTitle: 'ENGAGE' },\n  'khoidong': { key: 'phase1Engage', parentKey: 'lessonFlow', canonicalTitle: 'ENGAGE' },\n  'warmuphook': { key: 'phase1Engage', parentKey: 'lessonFlow', canonicalTitle: 'Warm-up / Hook' },\n  'hook': { key: 'phase1Engage', parentKey: 'lessonFlow', canonicalTitle: 'Warm-up / Hook' },\n  'askdefinetheproblem': { key: 'phase1Engage', parentKey: 'lessonFlow', canonicalTitle: 'ASK (Define the Problem)' },\n  'explore': { key: 'phase2Explore', parentKey: 'lessonFlow', canonicalTitle: 'EXPLORE' },\n  'khampha': { key: 'phase2Explore', parentKey: 'lessonFlow', canonicalTitle: 'EXPLORE' },\n  'coreconcepts': { key: 'phase2Explore', parentKey: 'lessonFlow', canonicalTitle: 'Core Concepts' },\n  'khainiemcotloi': { key: 'phase2Explore', parentKey: 'lessonFlow', canonicalTitle: 'Core Concepts' },\n  'imagineideate': { key: 'phase2Explore', parentKey: 'lessonFlow', canonicalTitle: 'IMAGINE (Ideate)' },\n  'explain': { key: 'phase3Explain', parentKey: 'lessonFlow', canonicalTitle: 'EXPLAIN' },\n  'giaithich': { key: 'phase3Explain', parentKey: 'lessonFlow', canonicalTitle: 'EXPLAIN' },\n  'plandesign': { key: 'phase3Explain', parentKey: 'lessonFlow', canonicalTitle: 'PLAN (Design)' },\n  'guidedpractice': { key: 'phase3Explain', parentKey: 'lessonFlow', canonicalTitle: 'Guided Practice' },\n  'thuchanhhuongdan': { key: 'phase3Explain', parentKey: 'lessonFlow', canonicalTitle: 'Guided Practice' },\n  'elaborate': { key: 'phase4Elaborate', parentKey: 'lessonFlow', canonicalTitle: 'ELABORATE' },\n  'thuchanhvandung': { key: 'phase4Elaborate', parentKey: 'lessonFlow', canonicalTitle: 'ELABORATE' },\n  'apvatrientu': { key: 'phase4Elaborate', parentKey: 'lessonFlow', canonicalTitle: 'ELABORATE' },\n  'createbuildcode': { key: 'phase4Elaborate', parentKey: 'lessonFlow', canonicalTitle: 'CREATE (Build & Code)' },\n  'independentpractice': { key: 'phase4Elaborate', parentKey: 'lessonFlow', canonicalTitle: 'Independent Practice' },\n  'thuchanhdoclap': { key: 'phase4Elaborate', parentKey: 'lessonFlow', canonicalTitle: 'Independent Practice' },\n  'evaluate': { key: 'phase5Evaluate', parentKey: 'lessonFlow', canonicalTitle: 'EVALUATE' },\n  'danhgia': { key: 'phase5Evaluate', parentKey: 'lessonFlow', canonicalTitle: 'EVALUATE' },\n  'testimproveiterate': { key: 'phase5Evaluate', parentKey: 'lessonFlow', canonicalTitle: 'TEST & IMPROVE (Iterate)' },\n  'shareevaluatepresent': { key: 'phase5Evaluate', parentKey: 'lessonFlow', canonicalTitle: 'SHARE & EVALUATE (Present)' },\n  'wrapupcheckpoint': { key: 'phase5Evaluate', parentKey: 'lessonFlow', canonicalTitle: 'Wrap-up & Checkpoint' },\n  'tongketkiemtra': { key: 'phase5Evaluate', parentKey: 'lessonFlow', canonicalTitle: 'Wrap-up & Checkpoint' },\n  // LESSON: Section C & Optional\n  'teachernotes': { key: 'teacherNotes', canonicalTitle: 'Teacher Notes' },\n  'teacherfacilitationnotes': { key: 'teacherNotes', canonicalTitle: 'Teacher Facilitation Notes' },\n  'ghichugiaovien': { key: 'teacherNotes', canonicalTitle: 'Teacher Notes' },\n  'artifactlinkagemasterindex': { key: 'artifactLinkage', canonicalTitle: 'Artifact Linkage (Master Index)' },\n  'artifactlinkage': { key: 'artifactLinkage', canonicalTitle: 'Artifact Linkage' },\n  'lienketthanhpham': { key: 'artifactLinkage', canonicalTitle: 'Artifact Linkage' },\n  // === KNOWLEDGE EXPOSITION (KX) ===\n  'sessionscope': { key: 'sessionScope', canonicalTitle: 'Session Scope' },\n  'phamvibuoihoct': { key: 'sessionScope', canonicalTitle: 'Session Scope' },\n  'phamvibuoihoch': { key: 'sessionScope', canonicalTitle: 'Session Scope' },\n  'keyterms': { key: 'keyTerms', canonicalTitle: 'Key Terms' },\n  'thuatnguthenchot': { key: 'keyTerms', canonicalTitle: 'Key Terms' },\n  'thuatngu': { key: 'keyTerms', canonicalTitle: 'Key Terms' },\n  'conceptnarratives': { key: 'conceptNarratives', canonicalTitle: 'Concept Narratives' },\n  'tuongthuatkhainiem': { key: 'conceptNarratives', canonicalTitle: 'Concept Narratives' },\n  'diengiaikhainiem': { key: 'conceptNarratives', canonicalTitle: 'Concept Narratives' },\n  'workedmicroexamples': { key: 'workedMicroExamples', canonicalTitle: 'Worked Micro-Examples' },\n  'vidumauminhhoa': { key: 'workedMicroExamples', canonicalTitle: 'Worked Micro-Examples' },\n  'vidumau': { key: 'workedMicroExamples', canonicalTitle: 'Worked Micro-Examples' },\n  // Bổ sung 2026-10-03 (2.0.23): hai biến thể tiếng Việt mà `findCanonicalFuzzy`\n  // giải quyết trước khi bị xoá (đo trên 2.0.21: KX tiếng Việt vẫn ra\n  // `workedMicroExamples` + `commonMistakes`). Bỏ chúng là mất khả năng đó —\n  // mục thành ưu tiên rơi xuống thành \"mục lấp ngân sách dư\", tức lặng lẽ.\n  'vidumauchitiet': { key: 'workedMicroExamples', canonicalTitle: 'Worked Micro-Examples' },\n  'loithuonggap': { key: 'commonMistakes', canonicalTitle: 'Common Mistakes' },\n  'commonmistakes': { key: 'commonMistakes', canonicalTitle: 'Common Mistakes' },\n  'loiphobien': { key: 'commonMistakes', canonicalTitle: 'Common Mistakes' },\n  'sailamthuonggap': { key: 'commonMistakes', canonicalTitle: 'Common Mistakes' },\n  'selfcheckquestions': { key: 'selfCheckQuestions', canonicalTitle: 'Self-Check Questions' },\n  'cauhoidanhgiayeutohoc': { key: 'selfCheckQuestions', canonicalTitle: 'Self-Check Questions' },\n  'cahoiotukiemtra': { key: 'selfCheckQuestions', canonicalTitle: 'Self-Check Questions' },\n  'cauhoitukiemtra': { key: 'selfCheckQuestions', canonicalTitle: 'Self-Check Questions' },\n  // === SOT: LEARNER PROFILE ===\n  'foundationalinfo': { key: 'foundationalInfo', canonicalTitle: 'Foundational Info' },\n  'thongtincoban': { key: 'foundationalInfo', canonicalTitle: 'Foundational Info' },\n  'entrylevel': { key: 'entryLevel', canonicalTitle: 'Entry Level' },\n  'nanglucdauvao': { key: 'entryLevel', canonicalTitle: 'Entry Level' },\n  'learningcontext': { key: 'learningContext', canonicalTitle: 'Learning Context' },\n  'boicanhhoctap': { key: 'learningContext', canonicalTitle: 'Learning Context' },\n  'clientobjectives': { key: 'clientObjectives', canonicalTitle: 'Client Objectives' },\n  'muctieukhachhang': { key: 'clientObjectives', canonicalTitle: 'Client Objectives' },\n  'studentcharacteristics': { key: 'studentCharacteristics', canonicalTitle: 'Student Characteristics' },\n  'dacdiemhocsinh': { key: 'studentCharacteristics', canonicalTitle: 'Student Characteristics' },\n  'specialconstraints': { key: 'specialConstraints', canonicalTitle: 'Special Constraints' },\n  'rangbuocdacbiet': { key: 'specialConstraints', canonicalTitle: 'Special Constraints' },\n  // === SOT: PROJECT BRIEF ===\n  'projectoverview': { key: 'projectOverview', canonicalTitle: 'Project Overview' },\n  'tongquanduan': { key: 'projectOverview', canonicalTitle: 'Project Overview' },\n  'audienceduration': { key: 'audienceAndDuration', canonicalTitle: 'Audience & Duration' },\n  'doituongthoiluong': { key: 'audienceAndDuration', canonicalTitle: 'Audience & Duration' },\n  'learningroadmap': { key: 'learningRoadmap', canonicalTitle: 'Learning Roadmap' },\n  'lotrinhhoctap': { key: 'learningRoadmap', canonicalTitle: 'Learning Roadmap' },\n  'learningoutcomesdeliverables': { key: 'learningOutcomesAndDeliverables', canonicalTitle: 'Learning Outcomes & Deliverables' },\n  'chudaurausanpham': { key: 'learningOutcomesAndDeliverables', canonicalTitle: 'Learning Outcomes & Deliverables' },\n  'technicalconstraints': { key: 'technicalConstraints', canonicalTitle: 'Technical Constraints' },\n  'rangbuockythuat': { key: 'technicalConstraints', canonicalTitle: 'Technical Constraints' },\n  'artifactscope': { key: 'artifactScope', canonicalTitle: 'Artifact Scope' },\n  'phamvithanhpham': { key: 'artifactScope', canonicalTitle: 'Artifact Scope' },\n  // === SOT: CURRICULUM FRAMEWORK ===\n  'courseoverview': { key: 'courseOverview', canonicalTitle: 'Course Overview' },\n  'tongquankhoahoc': { key: 'courseOverview', canonicalTitle: 'Course Overview' },\n  'globallearningobjectives': { key: 'globalLearningObjectives', canonicalTitle: 'Global Learning Objectives' },\n  'muctieutongthe': { key: 'globalLearningObjectives', canonicalTitle: 'Global Learning Objectives' },\n  'structuralhierarchyunitmodule': { key: 'structuralHierarchy', canonicalTitle: 'Structural Hierarchy' },\n  'structuralhierarchy': { key: 'structuralHierarchy', canonicalTitle: 'Structural Hierarchy' },\n  'cautrucphantang': { key: 'structuralHierarchy', canonicalTitle: 'Structural Hierarchy' },\n  'scopesequencedetailedroadmap': { key: 'scopeAndSequence', canonicalTitle: 'Scope & Sequence' },\n  'scopesequence': { key: 'scopeAndSequence', canonicalTitle: 'Scope & Sequence' },\n  'kehoachgiangdaychitiet': { key: 'scopeAndSequence', canonicalTitle: 'Scope & Sequence' },\n  'standardlessonformat': { key: 'standardLessonFormat', canonicalTitle: 'Standard Lesson Format' },\n  'cautrucbaichuandao': { key: 'standardLessonFormat', canonicalTitle: 'Standard Lesson Format' },\n  'standardsalignment': { key: 'standardsAlignment', canonicalTitle: 'Standards Alignment' },\n  'anhxachuandaotao': { key: 'standardsAlignment', canonicalTitle: 'Standards Alignment' },\n  // === SOT: REFERENCE PACK ===\n  // Hai nhóm bên dưới tồn tại vì lý do đo được 2026-10-03: `findCanonicalFuzzy`\n  // (bảng heading thứ hai trong `contextBuilder.ts`) là nơi duy nhất khớp được\n  // các mục này, vì heading file THẬT khác heading trong template. Xoá bảng đó\n  // thì phải đưa chúng vào đây, không thì RefPack/StyleGuide mất hết ngữ nghĩa.\n  // `scripts/verify-semantic-dictionary.mjs` chạy lúc build để một heading mới\n  // không lại rơi vào tình trạng “không ai biết nó là gì”.\n  'chuankynangtieuchidanhgia': { key: 'standardsAlignment', canonicalTitle: 'Standards Alignment' },\n  'moitruongphattrien': { key: 'technicalOverviewArchitectureBlueprint', canonicalTitle: 'Technical Overview & Architecture Blueprint' },\n  'developmentenvironment': { key: 'technicalOverviewArchitectureBlueprint', canonicalTitle: 'Technical Overview & Architecture Blueprint' },\n  'nentanggiaoduc': { key: 'pedagogicalFoundations', canonicalTitle: 'Pedagogical Foundations' },\n  'pedagogicalfoundations': { key: 'pedagogicalFoundations', canonicalTitle: 'Pedagogical Foundations' },\n  'kientruckythuat': { key: 'technicalArchitecture', canonicalTitle: 'Technical Architecture & Code Conventions' },\n  'technicalarchitecture': { key: 'technicalArchitecture', canonicalTitle: 'Technical Architecture & Code Conventions' },\n  'antoantuanthu': { key: 'safetyCompliance', canonicalTitle: 'Safety, Compliance & Policy' },\n  'safetycompliancepolicy': { key: 'safetyCompliance', canonicalTitle: 'Safety, Compliance & Policy' },\n  'matrankynangkienthuc': { key: 'competencyMatrix', canonicalTitle: 'Competency Matrix' },\n  'competencymatrix': { key: 'competencyMatrix', canonicalTitle: 'Competency Matrix' },\n  'ruirochienluoc': { key: 'riskMitigation', canonicalTitle: 'Risk Mitigation' },\n  'riskmitigation': { key: 'riskMitigation', canonicalTitle: 'Risk Mitigation' },\n  'tainguyenthamkha': { key: 'extendedReferences', canonicalTitle: 'Extended References' },\n  'extendedreferences': { key: 'extendedReferences', canonicalTitle: 'Extended References' },\n  'phulucswiftversion': { key: 'versionCompatibilityMatrix', canonicalTitle: 'Version & API Compatibility Matrix' },\n  'compatibilitymatrix': { key: 'versionCompatibilityMatrix', canonicalTitle: 'Version & API Compatibility Matrix' },\n  'ketluankhuyennghitrienkhai': { key: 'conclusionRecommendations', canonicalTitle: 'Conclusion & Implementation Recommendations' },\n  // === SOT: CONTENT STYLE GUIDE ===\n  'tamnhinvamuctieu': { key: 'visionGoals', canonicalTitle: 'Vision & Goals' },\n  'giongdieuvaphongcach': { key: 'toneAndDelivery', canonicalTitle: 'Tone & Delivery Style' },\n  'phongcachtruyendat': { key: 'toneAndDelivery', canonicalTitle: 'Tone & Delivery Style' },\n  'bangthuatngu': { key: 'terminologyGlossary', canonicalTitle: 'Terminology Glossary' },\n  'quychuanvietma': { key: 'codeStandards', canonicalTitle: 'Code Standards' },\n  'codestandards': { key: 'codeStandards', canonicalTitle: 'Code Standards' },\n  'cautrucbaihoc': { key: 'lessonStructure5E', canonicalTitle: 'Lesson Structure (5E)' },\n  'kehoachtiepcanbuoihoc': { key: 'sessionPacing', canonicalTitle: 'Session Pacing & Interruption Handling' },\n  'sessionpacing': { key: 'sessionPacing', canonicalTitle: 'Session Pacing & Interruption Handling' },\n  'ngonnguvacach': { key: 'languageAndExpression', canonicalTitle: 'Language & Expression' },\n  'danhgiavaphanhoi': { key: 'assessmentAndFeedback', canonicalTitle: 'Assessment & Feedback' },\n  'tailieuthamkha': { key: 'referencesAndSources', canonicalTitle: 'References & Sources' },\n  'luuytuanthu': { key: 'complianceNotes', canonicalTitle: 'Compliance Notes' },\n  // === LESSON: mục chỉ `findCanonicalFuzzy` từng biết ===\n  'hardwarepinout': { key: 'hardwarePinout', canonicalTitle: 'Hardware Pinout & Wiring Matrix' },\n  'wiringconfiguration': { key: 'hardwarePinout', canonicalTitle: 'Hardware Pinout Matrix' },\n  'symbolidentifierledger': { key: 'symbolLedger', canonicalTitle: 'Symbol & Identifier Ledger' },\n  'symbolledger': { key: 'symbolLedger', canonicalTitle: 'Symbol & Identifier Ledger' },\n  'bangdinhdanh': { key: 'symbolLedger', canonicalTitle: 'Symbol & Identifier Ledger' },\n  'coveragesummary': { key: 'coverageSummary', canonicalTitle: 'Coverage Summary' },\n  'deliveryenvironmentprofile': { key: 'deliveryEnvironmentProfile', canonicalTitle: 'Delivery Environment Profile' },\n  'detailedtechnicalreferences': { key: 'detailedTechnicalReferences', canonicalTitle: 'Detailed Technical References' },\n  'officialstandardsalignment': { key: 'officialStandardsAlignment', canonicalTitle: 'Official Standards Alignment' },\n  'pedagogicalreferencearchitecture': { key: 'pedagogicalReferenceArchitecture', canonicalTitle: 'Pedagogical Reference Architecture' },\n  'syntaxapiscopeconstraints': { key: 'syntaxAndApiScopeConstraints', canonicalTitle: 'Syntax & API Scope Constraints' },\n  // === ACT (Inquiry Activity) ===\n  'computationalthinkingfocus': { key: 'computationalThinkingFocus', canonicalTitle: 'Computational Thinking Focus' },\n  'trongtamtudymaytinh': { key: 'computationalThinkingFocus', canonicalTitle: 'Computational Thinking Focus' },\n  'trongtamtuduymaytinh': { key: 'computationalThinkingFocus', canonicalTitle: 'Computational Thinking Focus' },\n  'materialssetup': { key: 'materialsAndSetup', canonicalTitle: 'Materials & Setup' },\n  'vatlieuchuanbi': { key: 'materialsAndSetup', canonicalTitle: 'Materials & Setup' },\n  'materials': { key: 'materialsAndSetup', canonicalTitle: 'Materials & Setup' },\n  'vatlieu': { key: 'materialsAndSetup', canonicalTitle: 'Materials & Setup' },\n  'constraintssafety': { key: 'constraintsAndSafety', canonicalTitle: 'Constraints & Safety' },\n  'rangbuocantoan': { key: 'constraintsAndSafety', canonicalTitle: 'Constraints & Safety' },\n  'activelearningworkflow': { key: 'activeLearningWorkflow', canonicalTitle: 'Active Learning Workflow' },\n  'quytrinhhoctaptichcuc': { key: 'activeLearningWorkflow', canonicalTitle: 'Active Learning Workflow' },\n  '3tierdifferentiation': { key: 'tieredDifferentiation', canonicalTitle: '3-Tier Differentiation' },\n  'phanhoa3bac': { key: 'tieredDifferentiation', canonicalTitle: '3-Tier Differentiation' },\n  'reflection': { key: 'reflection', canonicalTitle: 'Reflection' },\n  'chiemnghiem': { key: 'reflection', canonicalTitle: 'Reflection' },\n  'suyngam': { key: 'reflection', canonicalTitle: 'Reflection' },\n  // === QUIZ ===\n  'metadataspecs': { key: 'metadataSpecs', canonicalTitle: 'Metadata Specs' },\n  'schemastructure': { key: 'schemaStructure', canonicalTitle: 'Schema Structure' },\n  'pedagogicalrules': { key: 'pedagogicalRules', canonicalTitle: 'Pedagogical Rules' },\n  'visuallayoutmarpinteractive': { key: 'visualLayout', canonicalTitle: 'Visual Layout' },\n  'visuallayout': { key: 'visualLayout', canonicalTitle: 'Visual Layout' },\n  // === SLIDES ===\n  'agendamilestonejourneymap': { key: 'agendaAndMilestones', canonicalTitle: 'Agenda & Milestone Journey Map' },\n  'agendamilestones': { key: 'agendaAndMilestones', canonicalTitle: 'Agenda & Milestone Journey Map' },\n  'warmupdiagnosticquickfire': { key: 'warmUp', canonicalTitle: 'Warm-Up: Diagnostic Quick-Fire' },\n  'hookscenariotheengineeringdilemma': { key: 'hookScenario', canonicalTitle: 'Hook Scenario' },\n  'hookscenario': { key: 'hookScenario', canonicalTitle: 'Hook Scenario' },\n  'thecoremendalmodel': { key: 'coreMentalModel', canonicalTitle: 'Core Mental Model' },\n  'thecorementalmodel': { key: 'coreMentalModel', canonicalTitle: 'Core Mental Model' },\n  'codeanatomy': { key: 'codeAnatomy', canonicalTitle: 'Code Anatomy' },\n  'quickmicropracticetryitnow': { key: 'quickMicroPractice', canonicalTitle: 'Quick Micro-Practice' },\n  'integratedhandsonlabcapstonemission': { key: 'integratedHandsOnLab', canonicalTitle: 'Integrated Hands-On Lab' },\n  'integratedhandsonlab': { key: 'integratedHandsOnLab', canonicalTitle: 'Integrated Hands-On Lab' },\n  'formativecheckpointstatuscalibration': { key: 'formativeCheckpoint', canonicalTitle: 'Formative Checkpoint' },\n  'formativecheckpoint': { key: 'formativeCheckpoint', canonicalTitle: 'Formative Checkpoint' },\n  'exitticketmetacognition': { key: 'exitTicket', canonicalTitle: 'Exit Ticket & Metacognition' },\n  'exitticket': { key: 'exitTicket', canonicalTitle: 'Exit Ticket' },\n  'summarykeytakeaways': { key: 'summaryAndKeyTakeaways', canonicalTitle: 'Summary & Key Takeaways' },\n  // === TIERED PRACTICE ===\n  'computationalobjectivetieramatrix': { key: 'tierMatrix', canonicalTitle: 'Tier Matrix' },\n  'computationalobjectivetiertrix': { key: 'tierMatrix', canonicalTitle: 'Tier Matrix' },\n  'bronzetierfoundationalscaffoldingbaselineforall': { key: 'bronzeTier', canonicalTitle: 'Bronze Tier' },\n  'bronzetierfoundationalscaffolding': { key: 'bronzeTier', canonicalTitle: 'Bronze Tier' },\n  'bronzetier': { key: 'bronzeTier', canonicalTitle: 'Bronze Tier' },\n  'silvertierindependentapplicationtargetmastery': { key: 'silverTier', canonicalTitle: 'Silver Tier' },\n  'silvertierindependentapplication': { key: 'silverTier', canonicalTitle: 'Silver Tier' },\n  'silvertier': { key: 'silverTier', canonicalTitle: 'Silver Tier' },\n  'goldtierenrichmentoptimizationopenextension': { key: 'goldTier', canonicalTitle: 'Gold Tier' },\n  'goldtierenrichmentoptimization': { key: 'goldTier', canonicalTitle: 'Gold Tier' },\n  'goldtier': { key: 'goldTier', canonicalTitle: 'Gold Tier' },\n  'automatedtestverificationmatrixmentorhints': { key: 'testVerificationMatrix', canonicalTitle: 'Test Verification Matrix' },\n  'automatedtestverificationmatrix': { key: 'testVerificationMatrix', canonicalTitle: 'Test Verification Matrix' },\n  // === WORKSHEET (WKS) ===\n  'knowledgecheck': { key: 'knowledgeCheck', canonicalTitle: 'Knowledge Check' },\n  'concepttracingdiagramfillin': { key: 'conceptTracing', canonicalTitle: 'Concept Tracing & Diagram Fill-in' },\n  'codeanalysisbughuntingchallenge': { key: 'codeAnalysis', canonicalTitle: 'Code Analysis & Bug Hunting Challenge' },\n  'synthesisproblemsolvingapplication': { key: 'synthesisApplication', canonicalTitle: 'Synthesis & Problem Solving' },\n  'selfreflectionlearninglog': { key: 'learningLog', canonicalTitle: 'Learning Log' },\n  // === HARDWARE & LAB ===\n  'startercodesandbox': { key: 'starterCodeSandbox', canonicalTitle: 'Starter Code Sandbox' },\n  'hardwarepinoutwiringconfigurationmatrix': { key: 'hardwarePinout', canonicalTitle: 'Hardware Pinout Matrix' },\n  'wiringdetailguidance': { key: 'wiringGuidance', canonicalTitle: 'Wiring Guidance' },\n  // === SEEDED FROM 21 REPO TEMPLATES ===\n  'planningdesign': { key: 'planningDesign', canonicalTitle: 'Planning & Design' },\n  'implementationdiscovery': { key: 'implementationDiscovery', canonicalTitle: 'Implementation & Discovery' },\n  'debuggingtesting': { key: 'debuggingTesting', canonicalTitle: 'Debugging & Testing' },\n  'verticalalignmenttracker': { key: 'verticalAlignmentTracker', canonicalTitle: 'Vertical Alignment Tracker' },\n  'horizontalprerequisitealignmentreport': { key: 'horizontalPrerequisiteAlignmentReport', canonicalTitle: 'Horizontal & Prerequisite Alignment Report' },\n  'feedbackrevisionlog': { key: 'feedbackRevisionLog', canonicalTitle: 'Feedback & Revision Log' },\n  'visualidentitymood': { key: 'visualIdentityMood', canonicalTitle: 'Visual Identity & Mood' },\n  'colorpalette': { key: 'colorPalette', canonicalTitle: 'Color Palette' },\n  'diagramstandardsmermaid': { key: 'diagramStandardsMermaid', canonicalTitle: 'Diagram Standards (Mermaid)' },\n  'imagecategoriestiers': { key: 'imageCategoriesTiers', canonicalTitle: 'Image Categories & Tiers' },\n  'typography': { key: 'typography', canonicalTitle: 'Typography' },\n  'summary': { key: 'summary', canonicalTitle: 'Summary' },\n  'referencedassets': { key: 'referencedAssets', canonicalTitle: 'Referenced Assets' },\n  'orphanassets': { key: 'orphanAssets', canonicalTitle: 'Orphan Assets' },\n  'cstak12computersciencestandards': { key: 'cSTAK12ComputerScienceStandards', canonicalTitle: 'CSTA K-12 Computer Science Standards' },\n  'ai4k12fivebigideasinai': { key: 'aI4K12FiveBigIdeasInAI', canonicalTitle: 'AI4K12 - Five Big Ideas in AI' },\n  'bloomstaxonomyforcsstem': { key: 'bloomSTaxonomyForCSSTEM', canonicalTitle: 'Bloom\\'s Taxonomy for CS/STEM' },\n  'weeklyobjectiveschedule': { key: 'weeklyObjectiveSchedule', canonicalTitle: 'Weekly Objective & Schedule' },\n  'day1mondaymentalmodelrecallanalogy': { key: 'day1MondayMentalModelRecallAnalogy', canonicalTitle: 'Day 1 (Monday): Mental Model Recall & Analogy' },\n  'day2tuesdayrapidcodetracing': { key: 'day2TuesdayRapidCodeTracing', canonicalTitle: 'Day 2 (Tuesday): Rapid Code Tracing' },\n  'day3wednesdayquickbughuntspotthedefect': { key: 'day3WednesdayQuickBugHuntSpotTheDefect', canonicalTitle: 'Day 3 (Wednesday): Quick Bug Hunt (Spot the Defect)' },\n  'day4thursdayvisualdiagramtracing': { key: 'day4ThursdayVisualDiagramTracing', canonicalTitle: 'Day 4 (Thursday): Visual Diagram Tracing' },\n  'day5fridaycreativesynthesisbridgeforward': { key: 'day5FridayCreativeSynthesisBridgeForward', canonicalTitle: 'Day 5 (Friday): Creative Synthesis & Bridge Forward' },\n  'teacheranswerkeyscoringguide': { key: 'teacherAnswerKeyScoringGuide', canonicalTitle: 'Teacher Answer Key & Scoring Guide' },\n  'historicallog': { key: 'historicalLog', canonicalTitle: 'Historical Log' },\n  'v01yyyymmdd': { key: 'v01YYYYMMDD', canonicalTitle: '[v0.1] - YYYY-MM-DD' },\n  'learninggoalsruleofchoice': { key: 'learningGoalsRuleOfChoice', canonicalTitle: 'Learning Goals & Rule of Choice' },\n  'the9squareactivitymatrix': { key: 'the9SquareActivityMatrix', canonicalTitle: 'The 9-Square Activity Matrix' },\n  'activitydetailedblueprintsselectedmodules': { key: 'activityDetailedBlueprintsSelectedModules', canonicalTitle: 'Activity Detailed Blueprints (Selected Modules)' },\n  'detailsquare1thebughunter': { key: 'detailSquare1TheBugHunter', canonicalTitle: 'Detail: Square 1 — The Bug Hunter' },\n  'detailsquare2thearchitectsblueprint': { key: 'detailSquare2TheArchitectSBlueprint', canonicalTitle: 'Detail: Square 2 — The Architect\\'s Blueprint' },\n  'detailsquare5coremasterchallengemandatorycenteroption': { key: 'detailSquare5CoreMasterChallengeMandatoryCenterOption', canonicalTitle: 'Detail:  Square 5 — Core Master Challenge (Mandatory Center Option)' },\n  'universalassessmentrubric': { key: 'universalAssessmentRubric', canonicalTitle: 'Universal Assessment Rubric' },\n  'technicaloverviewarchitectureblueprint': { key: 'technicalOverviewArchitectureBlueprint', canonicalTitle: 'Technical Overview & Architecture Blueprint' },\n  'verifiedreferencesolutioncode': { key: 'verifiedReferenceSolutionCode', canonicalTitle: 'Verified Reference Solution Code' },\n  'automatedtestverificationscript': { key: 'automatedTestVerificationScript', canonicalTitle: 'Automated Test / Verification Script' },\n  'commonsyntaxruntimepitfallsmatrix': { key: 'commonSyntaxRuntimePitfallsMatrix', canonicalTitle: 'Common Syntax & Runtime Pitfalls Matrix' },\n  'storylinecharacterdevelopment': { key: 'storylineCharacterDevelopment', canonicalTitle: 'Storyline & Character Development' },\n  'pedagogicalanalogiesconcepts': { key: 'pedagogicalAnalogiesConcepts', canonicalTitle: 'Pedagogical Analogies & Concepts' },\n  'multimediaassetslog': { key: 'multimediaAssetsLog', canonicalTitle: 'Multimedia Assets Log' },\n  'hardwarematerialsused': { key: 'hardwareMaterialsUsed', canonicalTitle: 'Hardware & Materials Used' },\n  'voicetone': { key: 'voiceTone', canonicalTitle: 'Voice & Tone' },\n  'standardterminologyglossary': { key: 'standardTerminologyGlossary', canonicalTitle: 'Standard Terminology (Glossary)' },\n  'examplescontextrules': { key: 'examplesContextRules', canonicalTitle: 'Examples & Context Rules' },\n  'lessoncontentstandards': { key: 'lessonContentStandards', canonicalTitle: 'Lesson Content Standards' },\n  'formattingcode': { key: 'formattingCode', canonicalTitle: 'Formatting & Code' },\n  'documentdependencyhierarchy': { key: 'documentDependencyHierarchy', canonicalTitle: 'Document Dependency Hierarchy' },\n  'cascadeimpactrules': { key: 'cascadeImpactRules', canonicalTitle: 'Cascade Impact Rules' },\n  'cascadeprocessingprotocol': { key: 'cascadeProcessingProtocol', canonicalTitle: 'Cascade Processing Protocol' },\n  'toolplatformdependencies': { key: 'toolPlatformDependencies', canonicalTitle: 'Tool & Platform Dependencies' },\n  'targetlearningobjectives': { key: 'targetLearningObjectives', canonicalTitle: 'Target Learning Objectives' },\n  'recallconceptualanchorprompt1': { key: 'recallConceptualAnchorPrompt1', canonicalTitle: 'Recall & Conceptual Anchor (Prompt 1)' },\n  'applicationbughuntprompt2': { key: 'applicationBugHuntPrompt2', canonicalTitle: 'Application & Bug Hunt (Prompt 2)' },\n  'metacognitivereflectionconfidencecheckprompt3': { key: 'metacognitiveReflectionConfidenceCheckPrompt3', canonicalTitle: 'Metacognitive Reflection & Confidence Check (Prompt 3)' },\n  'scoringteacherinterventiontrigger': { key: 'scoringTeacherInterventionTrigger', canonicalTitle: 'Scoring & Teacher Intervention Trigger' },\n  'foradvancedstudentsextratime': { key: 'forAdvancedStudentsExtraTime', canonicalTitle: 'For: Advanced Students / Extra Time' },\n  'challenge1challengenamedifficulty': { key: 'challenge1ChallengeNameDifficulty', canonicalTitle: 'Challenge 1: [Challenge Name] (Difficulty: )' },\n  'challenge2challengenamedifficulty': { key: 'challenge2ChallengeNameDifficulty', canonicalTitle: 'Challenge 2: [Challenge Name] (Difficulty: )' },\n  'termglossary': { key: 'termGlossary', canonicalTitle: 'Term Glossary' },\n  'termnameenglishterm': { key: 'termNameEnglishTerm*', canonicalTitle: '[Term Name] *(English Term)*' },\n  'termname2englishterm2': { key: 'termName2EnglishTerm2*', canonicalTitle: '[Term Name 2] *(English Term 2)*' },\n  'quickreferencetable': { key: 'quickReferenceTable', canonicalTitle: 'Quick Reference Table' },\n  'standardizedterms': { key: 'standardizedTerms', canonicalTitle: 'Standardized Terms' },\n  'visualparadigmoverview': { key: 'visualParadigmOverview', canonicalTitle: 'Visual Paradigm Overview' },\n  'organizer1architecturaldataflowmermaidflowchart': { key: 'organizer1ArchitecturalDataFlowMermaidFlowchart', canonicalTitle: 'Organizer 1: Architectural Data Flow (Mermaid Flowchart)' },\n  'organizer2comparativeanalysisvenndiagrammatrix': { key: 'organizer2ComparativeAnalysisVennDiagramMatrix', canonicalTitle: 'Organizer 2: Comparative Analysis (Venn Diagram / Matrix)' },\n  'organizer3statemachinelifecyclestatediagram': { key: 'organizer3StateMachineLifecycleStateDiagram', canonicalTitle: 'Organizer 3: State Machine & Lifecycle (State Diagram)' },\n  'studentfillinworksheetformatofflinehandout': { key: 'studentFillInWorksheetFormatOfflineHandout', canonicalTitle: 'Student Fill-in Worksheet Format (Offline Handout)' },\n  'objectivespreparation': { key: 'objectivesPreparation', canonicalTitle: 'Objectives & Preparation' },\n  'preparationchecklistworkstationsetup': { key: 'preparationChecklistWorkstationSetup', canonicalTitle: 'Preparation Checklist & Workstation Setup' },\n  'facilitationscripttimeline': { key: 'facilitationScriptTimeline', canonicalTitle: 'Facilitation Script & Timeline' },\n  'phase1namexminsfromlessonbflow': { key: 'phase1NameXMinsFromLESSONBFlow', canonicalTitle: '[Phase 1 name] — [X mins] (from LESSON B-flow)' },\n  'commonmisconceptionsdiagnosticremediationmatrix': { key: 'commonMisconceptionsDiagnosticRemediationMatrix', canonicalTitle: 'Common Misconceptions & Diagnostic Remediation Matrix' },\n  'differentiatedsupportstrategies': { key: 'differentiatedSupportStrategies', canonicalTitle: 'Differentiated Support Strategies' },\n  'coresyntaxmechanismcheatsheet': { key: 'coreSyntaxMechanismCheatSheet', canonicalTitle: 'Core Syntax & Mechanism Cheat Sheet' },\n  'visualmentalmodelarchitecturediagram': { key: 'visualMentalModelArchitectureDiagram', canonicalTitle: 'Visual Mental Model / Architecture Diagram' },\n  'stepbysteppracticalquickstartguide': { key: 'stepByStepPracticalQuickStartGuide', canonicalTitle: 'Step-by-Step Practical Quick-Start Guide' },\n  'selfcheckdiagnosticchecklist': { key: 'selfCheckDiagnosticChecklist', canonicalTitle: 'Self-Check Diagnostic Checklist' },\n  'handoverinformation': { key: 'handoverInformation', canonicalTitle: 'Handover Information' },\n  'deliverablesinventory': { key: 'deliverablesInventory', canonicalTitle: 'Deliverables Inventory' },\n  'commitmentvsrealitycheck': { key: 'commitmentVsRealityCheck', canonicalTitle: 'Commitment vs. Reality Check' },\n  'scopeexclusions': { key: 'scopeExclusions', canonicalTitle: 'Scope Exclusions' },\n  'gettingstartedguide': { key: 'gettingStartedGuide', canonicalTitle: 'Getting Started Guide' },\n  'posthandoversupportpolicy': { key: 'postHandoverSupportPolicy', canonicalTitle: 'Post-Handover Support Policy' },\n  'overview': { key: 'overview', canonicalTitle: 'Overview' },\n  'environmentsetup': { key: 'environmentSetup', canonicalTitle: 'Environment & Setup' },\n  'labtasks3tierdifferentiation': { key: 'labTasks3TierDifferentiation', canonicalTitle: 'Lab Tasks (3-Tier Differentiation)' },\n  'bronzefoundational': { key: 'bronzeFoundational', canonicalTitle: 'Bronze (Foundational)' },\n  'silverapplication': { key: 'silverApplication', canonicalTitle: 'Silver (Application)' },\n  'goldenrichmentcreative': { key: 'goldEnrichmentCreative', canonicalTitle: 'Gold (Enrichment/Creative)' },\n  'technicalreference': { key: 'technicalReference', canonicalTitle: 'Technical Reference ([SME_MANDATE])' },\n  'troubleshootingdebugging': { key: 'troubleshootingDebugging', canonicalTitle: 'Troubleshooting & Debugging' },\n  'submissioncheckoff': { key: 'submissionCheckOff', canonicalTitle: 'Submission & Check-off' },\n  'projectmetadata': { key: 'projectMetadata', canonicalTitle: 'Project Metadata' },\n  'whatworkedwellsuccesses': { key: 'whatWorkedWellSuccesses', canonicalTitle: 'What Worked Well (Successes)' },\n  'whatdidntworkfailuresbottlenecks': { key: 'whatDidnTWorkFailuresBottlenecks', canonicalTitle: 'What Didn\\'t Work (Failures/Bottlenecks)' },\n  'keydesigndecisionsarchitecturelog': { key: 'keyDesignDecisionsArchitectureLog', canonicalTitle: 'Key Design Decisions (Architecture Log)' },\n  'actionableimprovementsforfutureprojects': { key: 'actionableImprovementsForFutureProjects', canonicalTitle: 'Actionable Improvements for Future Projects' },\n  'openquestionspostdeploymentmonitoring': { key: 'openQuestionsPostDeploymentMonitoring', canonicalTitle: 'Open Questions / Post-Deployment Monitoring' },\n  'conceptnameifapplicable': { key: 'conceptNameIfApplicable', canonicalTitle: '[Concept Name] (if applicable)' },\n  'structuralconstraints': { key: 'structuralConstraints', canonicalTitle: 'Structural Constraints' },\n  'quantitativeconstraints': { key: 'quantitativeConstraints', canonicalTitle: 'Quantitative Constraints' },\n  'pedagogicalconstraints': { key: 'pedagogicalConstraints', canonicalTitle: 'Pedagogical Constraints' },\n  'codetechnicalconstraints': { key: 'codeTechnicalConstraints', canonicalTitle: 'Code & Technical Constraints' },\n  'languageconstraints': { key: 'languageConstraints', canonicalTitle: 'Language Constraints' },\n  'packagestructurerules': { key: 'packageStructureRules', canonicalTitle: 'Package Structure & Rules' },\n  'transformationrules': { key: 'transformationRules', canonicalTitle: 'Transformation Rules ()' },\n  'forstudentsstudentversion': { key: 'forStudentsStudentVersion', canonicalTitle: 'For Students (Student Version)' },\n  'forparentsparentversion': { key: 'forParentsParentVersion', canonicalTitle: 'For Parents (Parent Version)' },\n  'formanagersclientsclientversion': { key: 'forManagersClientsClientVersion', canonicalTitle: 'For Managers / Clients (Client Version)' },\n  'datasanitizationprotocol': { key: 'dataSanitizationProtocol', canonicalTitle: 'Data Sanitization Protocol' },\n  'sessioninformation': { key: 'sessionInformation', canonicalTitle: 'Session Information' },\n  'structuredfeedbackbylessonphase': { key: 'structuredFeedbackByLessonPhase', canonicalTitle: 'Structured Feedback by Lesson Phase' },\n  'generalobservations': { key: 'generalObservations', canonicalTitle: 'General Observations' },\n  'overallclassificationactionforsystemhumanpm': { key: 'overallClassificationActionForSystemHumanPM', canonicalTitle: 'Overall Classification & Action (For System / Human PM)' },\n  'projectsummary': { key: 'projectSummary', canonicalTitle: 'Project Summary' },\n  'macropipelinecourselifecycle': { key: 'macroPipelineCourseLifecycle', canonicalTitle: 'Macro Pipeline (Course Lifecycle)' },\n  'highlevelroadmap': { key: 'highLevelRoadmap', canonicalTitle: 'High-Level Roadmap' },\n  'micropipelineactiveproductionflowunit': { key: 'microPipelineActiveProductionFlowUnit', canonicalTitle: 'Micro Pipeline (Active Production Flow - Unit [XX])' },\n  'detailedprogresstracking': { key: 'detailedProgressTracking', canonicalTitle: 'Detailed Progress Tracking' },\n  'criticallinks': { key: 'criticalLinks', canonicalTitle: 'Critical Links' },\n  'changeloglatestonly': { key: 'changelogLatestOnly', canonicalTitle: 'Changelog (Latest Only)' },\n  'currentmilestonephase1rd': { key: 'currentMilestonePhase1RD', canonicalTitle: 'Current Milestone: Phase 1 - R&D' },\n  'activesprintunit': { key: 'activeSprintUnit', canonicalTitle: 'Active Sprint (Unit [XX])' },\n  'assessmentobjectives': { key: 'assessmentObjectives', canonicalTitle: 'Assessment Objectives' },\n  'multiplechoicequestionbank': { key: 'multipleChoiceQuestionBank', canonicalTitle: 'Multiple-Choice Question Bank' },\n  'q1questionstemscenarioordirectprobe': { key: 'q1QuestionStemScenarioOrDirectProbe]', canonicalTitle: 'Q1. [Question stem — scenario or direct probe]' },\n  'codeanalysisdebuggingquestion': { key: 'codeAnalysisDebuggingQuestion', canonicalTitle: 'Code Analysis / Debugging Question' },\n  'competencyrubric': { key: 'competencyRubric', canonicalTitle: 'Competency Rubric' },\n  'gamerulessetupguide': { key: 'gameRulesSetupGuide', canonicalTitle: 'Game Rules & Setup Guide' },\n  'round1rapidfirespeedround100200points': { key: 'round1RapidFireSpeedRound100200Points', canonicalTitle: 'Round 1: Rapid-Fire Speed Round (100–200 Points)' },\n  'question1100pts': { key: 'question1100Pts:', canonicalTitle: 'Question 1 (100 Pts):' },\n  'question2200pts': { key: 'question2200Pts:', canonicalTitle: 'Question 2 (200 Pts):' },\n  'round2codedueldebugging300400points': { key: 'round2CodeDuelDebugging300400Points', canonicalTitle: 'Round 2: Code Duel & Debugging (300–400 Points)' },\n  'challenge1300pts': { key: 'challenge1300Pts:', canonicalTitle: 'Challenge 1 (300 Pts):' },\n  'round3finalbossarchitecturechallenge500points': { key: 'round3FinalBossArchitectureChallenge500Points', canonicalTitle: 'Round 3: Final Boss Architecture Challenge (500 Points)' },\n  'kahootquizizzcsvexportformat': { key: 'kahootQuizizzCSVExportFormat', canonicalTitle: 'Kahoot / Quizizz CSV Export Format' },\n  'assessmentoverview': { key: 'assessmentOverview', canonicalTitle: 'Assessment Overview' },\n  'assessmentrubric': { key: 'assessmentRubric', canonicalTitle: 'Assessment Rubric' },\n  'studentselfassessmentchecklist': { key: 'studentSelfAssessmentChecklist', canonicalTitle: 'Student Self-Assessment Checklist' },\n  'guidinginquirydrivingquestion': { key: 'guidingInquiryDrivingQuestion', canonicalTitle: 'Guiding Inquiry & Driving Question' },\n  'hypothesisexperimentaldesign': { key: 'hypothesisExperimentalDesign', canonicalTitle: 'Hypothesis & Experimental Design' },\n  'controlledvariables': { key: 'controlledVariables:', canonicalTitle: 'Controlled Variables:' },\n  'datacollectioncodelabprotocol': { key: 'dataCollectionCodeLabProtocol', canonicalTitle: 'Data Collection & Code Lab Protocol' },\n  'labsetupinstrumentationcode': { key: 'labSetupInstrumentationCode:', canonicalTitle: 'Lab Setup & Instrumentation Code:' },\n  'datacollectiontable': { key: 'dataCollectionTable:', canonicalTitle: 'Data Collection Table:' },\n  'cerscientificconclusionclaimevidencereasoning': { key: 'cERScientificConclusionClaimEvidenceReasoning', canonicalTitle: 'CER Scientific Conclusion (Claim, Evidence, Reasoning)' },\n  'claimkhangdinh': { key: 'claimKhNgNh:', canonicalTitle: 'Claim (Khẳng định):' },\n  'evidencebangchungsolieu': { key: 'evidenceBNgChNgSLiU:', canonicalTitle: 'Evidence (Bằng chứng số liệu):' },\n  'reasoninglapluankhoahoc': { key: 'reasoningLPLuNKhoaHC:', canonicalTitle: 'Reasoning (Lập luận khoa học):' },\n  'peerreviewverificationprotocol': { key: 'peerReviewVerificationProtocol', canonicalTitle: 'Peer Review & Verification Protocol' },\n  'missionbriefingenvironmentsetup': { key: 'missionBriefingEnvironmentSetup', canonicalTitle: 'Mission Briefing & Environment Setup' },\n  'preflightchecklist': { key: 'preflightChecklist', canonicalTitle: 'Preflight Checklist' },\n  'progressivechallenges3tierdifferentiation': { key: 'progressiveChallenges3TierDifferentiation', canonicalTitle: 'Progressive Challenges (3-Tier Differentiation)' },\n  'challenge1foundationalcorebronzemins': { key: 'challenge1FoundationalCoreBronzeMins', canonicalTitle: 'Challenge 1: Foundational Core (Bronze) — ~{{BRONZE_MINS}} mins' },\n  'tasksimplementationdetails': { key: 'tasksImplementationDetails:', canonicalTitle: 'Tasks & Implementation Details:' },\n  'selfverificationcommand': { key: 'selfVerificationCommand:', canonicalTitle: 'Self-Verification Command:' },\n  'progressivehintsexpandonlyifstuck': { key: 'progressiveHintsExpandOnlyIfStuck:', canonicalTitle: 'Progressive Hints (Expand only if stuck):' },\n  'challenge2logicerrorhandlingsilvermins': { key: 'challenge2LogicErrorHandlingSilverMins', canonicalTitle: 'Challenge 2: Logic & Error Handling (Silver) — ~{{SILVER_MINS}} mins' },\n  'challenge3edgecasesoptimizationgoldmins': { key: 'challenge3EdgeCasesOptimizationGoldMins', canonicalTitle: 'Challenge 3: Edge Cases & Optimization (Gold) — ~{{GOLD_MINS}} mins' },\n  'selflearnertroubleshootingmatrix': { key: 'selfLearnerTroubleshootingMatrix', canonicalTitle: 'Self-Learner Troubleshooting Matrix' },\n  'finallabsubmissionmasterychecklist': { key: 'finalLabSubmissionMasteryChecklist', canonicalTitle: 'Final Lab Submission & Mastery Checklist' },\n  'priorknowledgerecall': { key: 'priorKnowledgeRecall', canonicalTitle: 'Prior Knowledge Recall' },\n  'architecturevisualized': { key: 'architectureVisualized', canonicalTitle: 'Architecture: {{CONCEPT_1_NAME}} Visualized' },\n  'implementationblueprint': { key: 'implementationBlueprint', canonicalTitle: 'Implementation Blueprint' },\n  'anatomymechanics': { key: 'anatomyMechanics', canonicalTitle: 'Anatomy & Mechanics' },\n  'starterhint': { key: 'starterHint:', canonicalTitle: 'Starter Hint:' },\n  'pacingsuccesscheck': { key: 'pacingSuccessCheck:', canonicalTitle: 'Pacing & Success Check:' },\n  'missionobjective': { key: 'missionObjective:', canonicalTitle: 'Mission Objective:' },\n  'corerulestoremember': { key: 'coreRulesToRemember:', canonicalTitle: 'Core Rules to Remember:' },\n  'timeroverview': { key: 'timerOverview', canonicalTitle: '& Timer Overview' },\n  'teacherledsmallgroupguidedinquiry': { key: 'teacherLedSmallGroupGuidedInquiry', canonicalTitle: 'Teacher-Led Small Group (Guided Inquiry)' },\n  'collaborativehandsonlabpairprogramming': { key: 'collaborativeHandsOnLabPairProgramming', canonicalTitle: 'Collaborative Hands-On Lab (Pair Programming)' },\n  'independentdigitalpracticeselfpacedcodelab': { key: 'independentDigitalPracticeSelfPacedCodeLab', canonicalTitle: 'Independent Digital Practice (Self-Paced Code Lab)' },\n  'offlinemodelingarchitecturenoscreens': { key: 'offlineModelingArchitectureNoScreens', canonicalTitle: 'Offline Modeling & Architecture (No Screens)' },\n  'sheetstudentpassport': { key: 'sheetStudentPassport', canonicalTitle: 'Sheet (Student Passport)' },\n  'deckoverviewprintinstructions': { key: 'deckOverviewPrintInstructions', canonicalTitle: 'Deck Overview & Print Instructions' },\n  'foundationalconceptscards14': { key: 'foundationalConceptsCards14', canonicalTitle: 'Foundational Concepts (Cards 1–4)' },\n  'codediagnosisdebuggingcards58': { key: 'codeDiagnosisDebuggingCards58', canonicalTitle: 'Code Diagnosis & Debugging (Cards 5–8)' },\n  'applicationsynthesiscards912': { key: 'applicationSynthesisCards912', canonicalTitle: 'Application & Synthesis (Cards 9–12)' },\n  'teacheranswerkeyscoringmatrix': { key: 'teacherAnswerKeyScoringMatrix', canonicalTitle: 'Teacher Answer Key & Scoring Matrix' },\n  'computationalobjectivetiermatrix': { key: 'computationalObjectiveTierMatrix', canonicalTitle: 'Computational Objective & Tier Matrix' },\n  'startercodefillinslots': { key: 'starterCodeFillInSlots:', canonicalTitle: 'Starter Code & Fill-in Slots:' },\n  'specificationrequirements': { key: 'specificationRequirements:', canonicalTitle: 'Specification & Requirements:' },\n  'implementationtarget': { key: 'implementationTarget:', canonicalTitle: 'Implementation Target:' },\n  'constraintsinvariants': { key: 'constraintsInvariants:', canonicalTitle: 'Constraints & Invariants:' },\n  'mentordebuggingcheatsheet': { key: 'mentorDebuggingCheatsheet:', canonicalTitle: 'Mentor Debugging Cheatsheet:' },\n  'updatetriggers': { key: 'updateTriggers', canonicalTitle: 'Update Triggers' },\n  'plannedreleases': { key: 'plannedReleases', canonicalTitle: 'Planned Releases' },\n  'shorttermupdatev11postpilot': { key: 'shortTermUpdateV11PostPilot', canonicalTitle: 'Short-term: Update v1.1 (Post-Pilot)' },\n  'longtermversionv20nextacademicyear': { key: 'longTermVersionV20NextAcademicYear', canonicalTitle: 'Long-term: Version v2.0 (Next Academic Year)' },\n  'resourcesarchiving': { key: 'resourcesArchiving', canonicalTitle: 'Resources & Archiving' },\n  'diagramfillin': { key: 'diagramFillIn', canonicalTitle: '& Diagram Fill-in' },\n};\nexport interface MatchHeadingResult {\n  /** The semantic key for this heading (e.g. 'learningObjectives') */\n  key: string;\n  /** Full semantic key path (e.g. 'lessonDesignPlan.learningObjectives') */\n  keyPath: string;\n  /** Whether the heading was recognized in the dictionary */\n  isKnown: boolean;\n  /** Canonical display title if known */\n  canonicalTitle?: string;\n}\n/**\n * Matches a raw markdown heading line/text to a stable semantic key path.\n *\n * @param rawHeading Raw heading string (e.g. \"### 2. Activity Sequence\" or \"## A. Kế hoạch Thiết kế Bài học\")\n * @param activeParentKeyPath Current active parent key path (e.g. \"lessonDesignPlan\" when parsing under H2)\n */\nexport function matchHeadingToSemanticKey(\n  rawHeading: string,\n  activeParentKeyPath?: string\n): MatchHeadingResult {\n  const cleaned = cleanHeadingText(rawHeading);\n  const normalized = normHeading(cleaned);\n  // CHÍNH SÁCH KHỚP LÀ MỘT: `lookupDictionaryEntry` (khớp chính xác → khớp\n  // chuỗi con), đúng cái `resolveSemanticKey` dùng. Trước đây hàm này chỉ tra\n  // `RAW_DICTIONARY[normalized]` — khớp CHÍNH XÁC — nên index ngữ nghĩa của AST\n  // và builder markdown dùng hai luật khác nhau trên cùng một từ điển.\n  //\n  // Đo 2026-10-04 trên REFERENCE_PACK.md thật của swift-for-dummy: heading file\n  // thật viết song ngữ kèm gloss trong ngoặc — `## 1. Chuẩn Kỹ Năng & Tiêu Chí\n  // Đánh Giá (Standards Alignment)`. Số đầu mục thì `cleanHeadingText` đã bóc\n  // sạch từ lâu; thứ làm hỏng là phần gloss, nên chuỗi chuẩn hoá là\n  // `chuankynangtieuchidanhgiastandardsalignment` chứ không phải khoá\n  // `chuankynangtieuchidanhgia`. Đo tiếp: index của AST giải được **1/9** khoá\n  // ưu tiên của slot reference pack (mục 10 — mục duy nhất không có gloss),\n  // còn luật khớp chuỗi con giải được **9/9**. Hệ quả: AST ship 3.025 chars\n  // của mục \"10. Kết Luận & Khuyến Nghị\" — vô dụng với bài đang soạn.\n  const entry = lookupDictionaryEntry(normalized);\n  if (entry) {\n    // If the entry already specifies a preferred parent, or if we have an active parent\n    let keyPath = entry.key;\n    if (activeParentKeyPath && !activeParentKeyPath.includes(entry.key)) {\n      keyPath = `${activeParentKeyPath}.${entry.key}`;\n    } else if (entry.parentKey && entry.key !== entry.parentKey) {\n      keyPath = `${entry.parentKey}.${entry.key}`;\n    }\n    return {\n      key: entry.key,\n      keyPath,\n      isKnown: true,\n      canonicalTitle: entry.canonicalTitle,\n    };\n  }\n  // Fallback: Heading is unrecognized in dictionary\n  const fallbackKey = normalized || 'unrecognized';\n  const keyPath = activeParentKeyPath ? `${activeParentKeyPath}.${fallbackKey}` : fallbackKey;\n  return {\n    key: fallbackKey,\n    keyPath,\n    isKnown: false,\n  };\n}\n/**\n * Chịu trôi dạng, nhưng CHỈ trong từ điển này.\n *\n * Lý do tồn tại: heading file THẬT khác heading trong template — ví dụ\n * `## 2. Môi Trường Phát Triển & Toolchain (Development Environment)` trong\n * `swift-for-dummy/_sot/REFERENCE_PACK.md`. Khớp chính xác không đủ, và trước\n * đây phần đó nằm ở `findCanonicalFuzzy` — một bảng thứ hai phải cập nhật tay\n * song song với bảng này, lệch nhau là hỏng.\n *\n * Hai ngưỡng đo được, không phải cảm tính:\n *  - heading ngắn (chuẩn hoá < 20 ký tự) chỉ dùng khớp chính xác. Heading ngắn\n *    đủ ổn định, và khớp chuỗi con ở đó chỉ tạo ra khớp nhầm.\n *  - từ khoá con phải dài ≥ 10 ký tự. `thuatng` (8 ký tự) sẽ nuốt “Thuật ngữ Then\n *    chốt” của KX — bài học đó đã từng mất `learningObjectives` vì một khớp sai.\n *\n * Khi nhiều từ khoá cùng khớp, lấy từ khoá DÀI nhất: “Ma Trận Kỹ Năng & Kiến Thức”\n * phải ra `competencyMatrix`, không phải từ khoá chung chung hơn.\n */\nconst MIN_HEADING_LEN_FOR_LOOSE_MATCH = 20;\nconst MIN_SUBSTRING_KEY_LEN = 10;\n/**\n * Tra từ điển: khớp chính xác trước, rồi mới khớp chuỗi con.\n *\n * Một chỗ duy nhất cho CẢ HAI lối vào từ điển (`matchHeadingToSemanticKey` của\n * AST và `resolveSemanticKey` của builder). Trước đây mỗi lối có một luật riêng\n * nên cùng một heading ra hai kết quả khác nhau — đó là gốc rễ của \"heading\n * reference pack không khớp từ điển\": heading THẬT có gloss trong ngoặc nên\n * chỉ lối chịu-trôi mới gọi được tên nó.\n */\nfunction lookupDictionaryEntry(normalized: string): SemanticHeaderEntry | undefined {\n  const exact = RAW_DICTIONARY[normalized];\n  if (exact) return exact;\n  if (normalized.length < MIN_HEADING_LEN_FOR_LOOSE_MATCH) return undefined;\n  let best: SemanticHeaderEntry | undefined;\n  let bestLen = 0;\n  for (const [pattern, entry] of Object.entries(RAW_DICTIONARY)) {\n    if (pattern.length < MIN_SUBSTRING_KEY_LEN || pattern.length <= bestLen) continue;\n    if (!normalized.includes(pattern)) continue;\n    best = entry;\n    bestLen = pattern.length;\n  }\n  return best;\n}\n\n/** Chỉ khoá ổn định của một heading, theo chính sách khớp duy nhất. */\nexport function resolveSemanticKey(rawHeading: string): string | undefined {\n  const normalized = normHeading(cleanHeadingText(rawHeading));\n  if (!normalized) return undefined;\n  return lookupDictionaryEntry(normalized)?.key;\n}\n/**\n * Returns the entire dictionary for validation and testing.\n */\nexport function getSemanticHeaderDictionary(): Readonly<Record<string, SemanticHeaderEntry>> {\n  return RAW_DICTIONARY;\n}","import type { z } from 'zod';\nimport type { ArtifactTypeContract } from './artifactTypeContract.js';\nimport type { ContextSourceKey } from '../services/contextRouting.js';\nimport {\n  LessonPlan5ESchema,\n  SlideDeckSchema,\n  ActivityLabSchema,\n  DiagnosticQuizSchema,\n  TeacherGuideSchema,\n  HandoutSchema,\n  WorksheetSchema,\n  RubricSchema,\n  ExtensionSchema,\n  GlossarySchema,\n  CodeLabSchema,\n  ExitTicketSchema,\n  TieredPracticeSchema,\n  ChoiceBoardSchema,\n  ScienceLabSchema,\n  TaskCardsSchema,\n  StationRotationSchema,\n  BellRingerSchema,\n  ReviewGameSchema,\n  GraphicOrganizerSchema,\n} from '../schemas/index.js';\n\ninterface RawArtifactMeta {\n  type: string;\n  canonicalName: string;\n  filenamePrefix: string;\n  persona: string;\n  templateFile: string;\n  outputSchema?: z.ZodTypeAny;\n  requiredSources: ContextSourceKey[];\n  optionalSources: ContextSourceKey[];\n  rationale?: string;\n  /**\n   * LESSON slot budget. `priorities` are SEMANTIC KEYS from headerDictionary.ts\n   * (e.g. 'lessonFlow', 'lessonDesignPlan') — NOT literal headings. The AST\n   * projection (resolveSlotNodes) matches semantic keys only; the markdown\n   * fallback (buildSectionAwareExcerpt) resolves them via the same dictionary.\n   */\n  lessonBudget?: { budget: number; priorities?: string[]; exclusive?: boolean };\n  /** KX (KNOWLEDGE_EXPOSITION) excerpt priorities — semantic keys from headerDictionary.ts. */\n  kxPriorities?: string[];\n  /** KX excerpt budget in characters. Defaults to DEFAULT_KX_SLOT_BUDGET when absent. */\n  kxBudget?: number;\n  kxOnly?: boolean;\n}\n\nconst RAW_METADATA: RawArtifactMeta[] = [\n  {\n    type: 'lesson',\n    canonicalName: 'Core Lesson Document',\n    filenamePrefix: 'LESSON',\n    persona: '@content',\n    templateFile: 'LESSON_5E_template.md',\n    outputSchema: LessonPlan5ESchema,\n    requiredSources: ['KNOWLEDGE_EXPOSITION', 'SESSION_SLICE', 'FRAMEWORK_EXCERPT'],\n    optionalSources: ['STYLE_GUIDE', 'REFERENCE_PACK'],\n    rationale: 'Dạy theo kiến thức chuẩn của plan, phân bổ mục tiêu và khung chương trình',\n    // Priorities match the registry default on purpose — the judge excerpt and\n    // the authoring path both consume these. Budget 4000 aligns with the\n    // plan-driven KX injection in lessonProductionService.\n    kxPriorities: ['keyTerms', 'conceptNarratives', 'workedMicroExamples'],\n    kxBudget: 4000,\n  },\n  {\n    type: 'slide',\n    canonicalName: 'Class Presentation Slides',\n    filenamePrefix: 'SLIDE',\n    persona: '@illustrator',\n    templateFile: 'SLIDE_template.md',\n    outputSchema: SlideDeckSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Slide bài giảng trình chiếu theo cấu trúc phân phối nội dung của giáo án',\n    // Không khai `priorities`: dùng chung DEFAULT_LESSON_SLOT. Xem giải thích\n    // ở khối 6 override bên dưới.\n    lessonBudget: { budget: 4500 },\n    kxPriorities: ['keyTerms', 'workedMicroExamples'],\n    kxBudget: 3000,\n  },\n  {\n    type: 'act',\n    canonicalName: 'STEM Activity Guide',\n    filenamePrefix: 'ACT',\n    persona: '@activity',\n    templateFile: 'ACT_template.md',\n    outputSchema: ActivityLabSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION', 'SESSION_SLICE'],\n    rationale: 'STEM Activity Lab bắt buộc phải khớp 100% Activity Sequence và Lesson Flow của LESSON',\n    // 8000 = 3661 (activitySequence) + 4165 (learningObjectives) trên fixture\n    // `lesson-slot-priority-overlap.test.ts`: hai bảng phải vừa CHẴNG, thiếu\n    // một chút là ACT mất activitySequence — đúng lỗi mà guard bên dưới chặn.\n    lessonBudget: { budget: 8000 },\n    kxPriorities: ['workedMicroExamples', 'commonMistakes'],\n    kxBudget: 5000,\n  },\n  {\n    type: 'quiz',\n    canonicalName: 'Competency Assessment Quiz',\n    filenamePrefix: 'QUIZ',\n    persona: '@assessor',\n    templateFile: 'QUIZ_v4.6_template.md',\n    outputSchema: DiagnosticQuizSchema,\n    requiredSources: ['KNOWLEDGE_EXPOSITION', 'CANONICAL_LESSON'],\n    optionalSources: ['SESSION_SLICE'],\n    rationale: 'Ngân hàng câu hỏi đánh giá cả kiến thức chuẩn mực (KX) lẫn mục tiêu bài dạy (LESSON)',\n    // 3500 → 8000 (2.0.29). Đo trên swift-for-dummy U01_M01_L01: activitySequence\n    // 3696 + learningObjectives 4278 = 7974. Ở 3500, câu hỏi sinh ra KHÔNG có\n    // bảng mục tiêu để bám — mà đó là thứ duy nhất một quiz phải canh. Cùng\n    // nguyên nhân với EXIT_TICKET; hai loại đánh giá nên có cùng ngân sách.\n    // ponytail: trần là bảng mục tiêu ~4.3k chars; bài có bảng lớn hơn thì nó\n    // bị rớt TRỌN (có báo `section:dropped:`), không bị cắt dở nữa. Muốn hết\n    // trần thì khai `priorities` riêng cho loại đánh giá, không phải nâng số.\n    lessonBudget: { budget: 8000 },\n    kxPriorities: ['commonMistakes', 'selfCheckQuestions', 'keyTerms', 'conceptNarratives'],\n    kxBudget: 4000,\n  },\n  {\n    type: 'guide',\n    canonicalName: 'Teacher Facilitator Guide',\n    filenamePrefix: 'GUIDE',\n    persona: '@content',\n    templateFile: 'GUIDE_template.md',\n    outputSchema: TeacherGuideSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['SESSION_SLICE'],\n    rationale: 'Kịch bản sư phạm giáo viên (Teacher Guide) bám sát timeline từng phút của LESSON',\n    lessonBudget: { budget: 6000 },\n    kxPriorities: ['commonMistakes', 'keyTerms', 'conceptNarratives'],\n    kxBudget: 4500,\n  },\n  {\n    type: 'handout',\n    canonicalName: 'Student Handout',\n    filenamePrefix: 'HANDOUT',\n    persona: '@content',\n    templateFile: 'HANDOUT_template.md',\n    outputSchema: HandoutSchema,\n    requiredSources: ['KNOWLEDGE_EXPOSITION'],\n    optionalSources: ['SESSION_SLICE'],\n    rationale: 'Tài liệu tự học — bám khái niệm chuẩn, không cần activity timeline',\n    kxPriorities: ['keyTerms', 'conceptNarratives', 'commonMistakes'],\n    kxBudget: 4000,\n    kxOnly: true,\n  },\n  {\n    type: 'worksheet',\n    canonicalName: 'Student Worksheet',\n    filenamePrefix: 'WKS',\n    persona: '@content',\n    templateFile: 'WKS_template.md',\n    outputSchema: WorksheetSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Phiếu học tập (Worksheet) luyện tập theo các chặng hoạt động của giáo án',\n    lessonBudget: { budget: 4500 },\n    kxPriorities: ['selfCheckQuestions', 'workedMicroExamples', 'keyTerms'],\n    kxBudget: 4000,\n  },\n  {\n    type: 'rubric',\n    canonicalName: 'Assessment Rubric',\n    filenamePrefix: 'RUBRIC',\n    persona: '@assessor',\n    templateFile: 'RUBRIC_template.md',\n    outputSchema: RubricSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['SESSION_SLICE'],\n    rationale: 'Tiêu chí đánh giá hoạt động học tập dựa trên bài học chính',\n    // Rubric chấm theo mục tiêu + minh chứng, không cần kịch bản lớp tiết.\n    // 3000 → 8000 (2.0.30). Ưu tiên đã đặt `learningObjectives` đầu tiên từ lâu,\n    // nhưng ngân sách nhỏ hơn bảng mục tiêu: đo trên swift-for-dummy\n    // U01_M01_L01, learningObjectives = 4278 chars > 3000, nên rubric ship\n    // 1769 chars (artifactContract) và báo `section:dropped:learningObjectives`.\n    // Một rubric không thấy mục tiêu thì không chấm theo mục tiêu được.\n    // ponytail: trần là bảng mục tiêu ~4.3k; bài có bảng dài hơn thì rớt trọn\n    // (có báo), không cắt dở. Guard chặn lặp lại: xem\n    // lesson-slot-priority-overlap.test.ts.\n    lessonBudget: { budget: 8000, priorities: ['learningObjectives', 'artifactContract'] },\n    kxPriorities: ['commonMistakes', 'keyTerms'],\n    kxBudget: 3000,\n  },\n  {\n    type: 'ext',\n    canonicalName: 'Extension Activity',\n    filenamePrefix: 'EXT',\n    persona: '@activity',\n    templateFile: 'EXT_template.md',\n    outputSchema: ExtensionSchema,\n    requiredSources: ['KNOWLEDGE_EXPOSITION'],\n    optionalSources: ['SESSION_SLICE'],\n    rationale: 'Thử thách mở rộng chuyên sâu bám khái niệm',\n    kxPriorities: ['workedMicroExamples', 'commonMistakes'],\n    kxBudget: 4000,\n    kxOnly: true,\n  },\n  {\n    type: 'glossary',\n    canonicalName: 'Terminology Glossary',\n    filenamePrefix: 'GLOSSARY',\n    persona: '@content',\n    templateFile: 'GLOSSARY_template.md',\n    outputSchema: GlossarySchema,\n    requiredSources: ['KNOWLEDGE_EXPOSITION'],\n    optionalSources: ['SESSION_SLICE'],\n    rationale: 'Từ điển thuật ngữ chuyên ngành',\n    // Glossary bám thuật ngữ chuẩn, không cần bài học.\n    kxPriorities: ['keyTerms', 'conceptNarratives'],\n    kxBudget: 4000,\n  },\n  {\n    type: 'codelab',\n    canonicalName: 'Code Lab & Exercises',\n    filenamePrefix: 'CODE',\n    persona: '@activity',\n    templateFile: 'ACT_template.md',\n    outputSchema: CodeLabSchema,\n    requiredSources: ['KNOWLEDGE_EXPOSITION'],\n    optionalSources: ['LESSON_OBJECTIVES'],\n    rationale: 'Code lab thực hành bám khái niệm kỹ thuật và ví dụ worked examples',\n    kxPriorities: ['workedMicroExamples', 'keyTerms', 'commonMistakes'],\n    kxBudget: 5000,\n    kxOnly: true,\n  },\n  {\n    type: 'bom',\n    canonicalName: 'Bill of Materials',\n    filenamePrefix: 'BOM',\n    persona: '@activity',\n    templateFile: 'PROJECT_BRIEF_template.md',\n    requiredSources: ['KNOWLEDGE_EXPOSITION'],\n    optionalSources: ['SESSION_SLICE'],\n    rationale: 'Bảng kê nguyên vật liệu và thiết bị phần cứng',\n    // BOM không khai báo CANONICAL_LESSON là nguồn bắt buộc — chỉ cần khái niệm.\n    kxPriorities: ['keyTerms'],\n    kxBudget: 2000,\n  },\n  {\n    type: 'exit_ticket',\n    canonicalName: 'Formative Exit Ticket',\n    filenamePrefix: 'EXIT_TICKET',\n    persona: '@assessor',\n    templateFile: 'EXIT_TICKET_template.md',\n    outputSchema: ExitTicketSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Phiếu thu hoạch nhanh cuối giờ dựa trên bài giảng',\n    // 3000 → 8000 (2.0.29): cùng lý do và cùng phép đo với QUIZ ở trên — phiếu\n    // cuối giờ hỏi về mục tiêu của bài nên cần bảng mục tiêu trọn vẹn.\n    lessonBudget: { budget: 8000 },\n    kxPriorities: ['selfCheckQuestions', 'keyTerms'],\n    kxBudget: 2500,\n  },\n  {\n    type: 'tiered_practice',\n    canonicalName: 'Differentiated Tiered Practice',\n    filenamePrefix: 'TIERED_PRACTICE',\n    persona: '@activity',\n    templateFile: 'TIERED_PRACTICE_template.md',\n    outputSchema: TieredPracticeSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Bài tập phân hóa theo năng lực người học',\n    lessonBudget: { budget: 4500, priorities: ['learningObjectives', 'activitySequence'] },\n    kxPriorities: ['workedMicroExamples', 'keyTerms'],\n    kxBudget: 4000,\n  },\n  {\n    type: 'choice_board',\n    canonicalName: 'Differentiated Choice Board',\n    filenamePrefix: 'CHOICE_BOARD',\n    persona: '@activity',\n    templateFile: 'CHOICE_BOARD_template.md',\n    outputSchema: ChoiceBoardSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Bảng lựa chọn nhiệm vụ học tập theo sở thích/năng lực',\n    // 4000 < learningObjectives (4278) nên bảng mục tiêu rơi khỏi slot này — và\n    // đây là CHỦ Ý, không phải sơ suất: danh sách ưu tiên do người viết đặt\n    // activitySequence lên đầu. Không tự nâng ngân sách để \"cho khớp\", vì sẽ\n    // phủ nhận lựa chọn nghiệp vụ mà không có đo để dựa vào. Nằm trong allowlist\n    // miễn trừ của guard, kèm lý do, để thấy rõ đang bảo vệ cái gì.\n    lessonBudget: { budget: 4000, priorities: ['activitySequence', 'learningObjectives'] },\n    kxPriorities: ['keyTerms', 'conceptNarratives'],\n    kxBudget: 3000,\n  },\n  {\n    type: 'science_lab',\n    canonicalName: 'Inquiry Science Lab',\n    filenamePrefix: 'SCIENCE_LAB',\n    persona: '@activity',\n    templateFile: 'SCIENCE_LAB_template.md',\n    outputSchema: ScienceLabSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Thực hành thí nghiệm khoa học khám phá',\n    lessonBudget: { budget: 8000, priorities: ['lessonFlow', 'activitySequence'] },\n    kxPriorities: ['workedMicroExamples', 'conceptNarratives'],\n    kxBudget: 5000,\n  },\n  {\n    type: 'task_cards',\n    canonicalName: 'Modular Task Cards',\n    filenamePrefix: 'TASK_CARDS',\n    persona: '@activity',\n    templateFile: 'TASK_CARDS_template.md',\n    outputSchema: TaskCardsSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Thẻ nhiệm vụ học tập vi mô',\n    lessonBudget: { budget: 6000, priorities: ['lessonFlow', 'activitySequence'] },\n    kxPriorities: ['workedMicroExamples', 'keyTerms'],\n    kxBudget: 3500,\n  },\n  {\n    type: 'station_rotation',\n    canonicalName: 'Station Rotation Plan',\n    filenamePrefix: 'STATION_ROTATION',\n    persona: '@content',\n    templateFile: 'STATION_ROTATION_template.md',\n    outputSchema: StationRotationSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['SESSION_SLICE'],\n    rationale: 'Kế hoạch xoay vòng trạm học tập',\n    lessonBudget: { budget: 6000, priorities: ['lessonFlow', 'activitySequence'] },\n    kxPriorities: ['workedMicroExamples', 'keyTerms'],\n    kxBudget: 3500,\n  },\n  {\n    type: 'bell_ringer',\n    canonicalName: 'Warm-up Bell Ringer',\n    filenamePrefix: 'BELL_RINGER',\n    persona: '@content',\n    templateFile: 'BELL_RINGER_template.md',\n    outputSchema: BellRingerSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Hoạt động khởi động đầu giờ học',\n    // Ô DUY NHẤT còn tự khai `priorities`: bell ringer dẫn bằng móc ENGAGE\n    // (1.414 chars) vì đó đúng là việc của loại này; phần còn lại theo thứ tự\n    // greedy của DEFAULT_LESSON_SLOT.\n    //\n    // 5 override cũ (SLIDE/QUIZ/WKS/EXIT_TICKET/GRAPHIC_ORGANIZER) từng khai\n    // parent key 'lessonDesignPlan'. Đo trên LESSON_U01_M01_L01 thật: parent\n    // đó serialize 13.265 chars (cha 398 + 5 lá) — lớn hơn MỌI ngân sách\n    // của registry — nên luật whole-section rơi nó TRỌN, và loại đó chỉ còn\n    // nhận được 'truncate phần đầu một mục cha' thay vì bảng ground truth trọn\n    // vẹn. Giờ chúng chỉ khai `budget` và kế thừa DEFAULT_LESSON_SLOT: thứ tự\n    // ưu tiên có đúng MỘT nguồn, không thể trôi khỏi nhau nữa.\n    // 2500 là trần CỐ Ý, và loại này là DUY NHẤT tự khai danh sách ưu tiên: nó là\n    // mở bài (bell ringer), cần `phase1Engage` chứ không cần bảng thiết kế. Bỏ\n    // nó khỏi allowlist miễn trừ của guard sẽ là xoá ý định, không phải sửa lỗi.\n    lessonBudget: { budget: 2500, priorities: ['phase1Engage', 'activitySequence', 'learningObjectives', 'artifactContract'] },\n    kxPriorities: ['keyTerms'],\n    kxBudget: 2000,\n  },\n  {\n    type: 'review_game',\n    canonicalName: 'Gamified Review Activity',\n    filenamePrefix: 'REVIEW_GAME',\n    persona: '@assessor',\n    templateFile: 'REVIEW_GAME_template.md',\n    outputSchema: ReviewGameSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Hoạt động trò chơi ôn tập kiến thức',\n    // 3500 → 8000 (2.0.30): cùng lý do và cùng phép đo với rubric ở trên — trò\n    // chơi ôn tập cũng hỏi về mục tiêu của bài.\n    lessonBudget: { budget: 8000, priorities: ['learningObjectives', 'artifactContract'] },\n    kxPriorities: ['keyTerms', 'commonMistakes', 'selfCheckQuestions'],\n    kxBudget: 3500,\n  },\n  {\n    type: 'graphic_organizer',\n    canonicalName: 'Visual Graphic Organizer',\n    filenamePrefix: 'GRAPHIC_ORGANIZER',\n    persona: '@illustrator',\n    templateFile: 'GRAPHIC_ORGANIZER_template.md',\n    outputSchema: GraphicOrganizerSchema,\n    requiredSources: ['CANONICAL_LESSON'],\n    optionalSources: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Sơ đồ tư duy trực quan hóa nội dung bài học',\n    // 4000 → 8000 (2.0.30). Loại này KẾ THỪA danh sách ưu tiên mặc định, nên ai\n    // cũng bỏ qua việc ngân sách có đủ cho learningObjectives hay không. Guard\n    // bắt được ở 2.0.30, không phải do đọc code: 4000 < 4162 chars (bảng mục\n    // tiêu đo trên fixture bài thật) nên nó rơi khỏi slot mà không ai hỏi.\n    // Khác choice_board/bell_ringer: hai loại đó có danh sách ưu tiên do người\n    // viết đặt tay — đó là tín hiệu cố ý. Ở đây không có tín hiệu nào.\n    lessonBudget: { budget: 8000 },\n    kxPriorities: ['keyTerms', 'conceptNarratives'],\n    kxBudget: 3000,\n  },\n];\n\nconst registry = new Map<string, ArtifactTypeContract>();\nconst lessonSlotBudgetsMap = new Map<string, { budget: number; priorities?: string[] }>();\nconst kxSlotPrioritiesMap = new Map<string, string[]>();\nconst kxSlotBudgetMap = new Map<string, number>();\nconst kxOnlyTypesSet = new Set<string>();\n\nfor (const meta of RAW_METADATA) {\n  const sourceSlots: ArtifactTypeContract['inputContract']['sourceSlots'] = {};\n\n  if (meta.lessonBudget) {\n    sourceSlots.CANONICAL_LESSON = {\n      sections: meta.lessonBudget.priorities ? [...meta.lessonBudget.priorities] : undefined,\n      budgetTokens: meta.lessonBudget.budget,\n      exclusive: meta.lessonBudget.exclusive,\n    };\n    lessonSlotBudgetsMap.set(meta.type, {\n      budget: meta.lessonBudget.budget,\n      priorities: meta.lessonBudget.priorities ? [...meta.lessonBudget.priorities] : undefined,\n    });\n    lessonSlotBudgetsMap.set(meta.type.toUpperCase(), {\n      budget: meta.lessonBudget.budget,\n      priorities: meta.lessonBudget.priorities ? [...meta.lessonBudget.priorities] : undefined,\n    });\n  }\n\n  if (meta.kxPriorities) {\n    sourceSlots.KNOWLEDGE_EXPOSITION = {\n      sections: [...meta.kxPriorities],\n    };\n    kxSlotPrioritiesMap.set(meta.type, [...meta.kxPriorities]);\n    kxSlotPrioritiesMap.set(meta.type.toUpperCase(), [...meta.kxPriorities]);\n  }\n\n  if (meta.kxBudget !== undefined) {\n    kxSlotBudgetMap.set(meta.type, meta.kxBudget);\n    kxSlotBudgetMap.set(meta.type.toUpperCase(), meta.kxBudget);\n  }\n\n  if (meta.kxOnly) {\n    kxOnlyTypesSet.add(meta.type);\n    kxOnlyTypesSet.add(meta.type.toUpperCase());\n    if (meta.type === 'codelab') {\n      kxOnlyTypesSet.add('CODE');\n    }\n  }\n\n  const contract: ArtifactTypeContract = {\n    type: meta.type,\n    canonicalName: meta.canonicalName,\n    filenamePattern: `${meta.filenamePrefix}_{lessonId}.md`,\n    persona: meta.persona,\n    templateFile: meta.templateFile,\n    outputSchema: meta.outputSchema,\n    inputContract: {\n      requiredSources: [...meta.requiredSources],\n      optionalSources: [...meta.optionalSources],\n      sourceSlots,\n    },\n  };\n\n  registry.set(meta.type, contract);\n  // Also register uppercase alias for compatibility\n  registry.set(meta.type.toUpperCase(), contract);\n}\n\n// Special aliases for common abbreviations\nconst codelabContract = registry.get('codelab');\nif (codelabContract) {\n  registry.set('code', codelabContract);\n  registry.set('CODE', codelabContract);\n}\n\nconst worksheetContract = registry.get('worksheet');\nif (worksheetContract) {\n  registry.set('wks', worksheetContract);\n  registry.set('WKS', worksheetContract);\n}\n\n// Special alias for CODE in kxSlotPriorities\nconst codelabKx = kxSlotPrioritiesMap.get('codelab');\nif (codelabKx) {\n  kxSlotPrioritiesMap.set('CODE', codelabKx);\n}\n\n// Satellite call-sites address worksheet by template prefix 'WKS' — alias its\n// slot specs too (getters fall back across case, mirroring the CODE alias).\nconst worksheetLesson = lessonSlotBudgetsMap.get('worksheet');\nif (worksheetLesson) {\n  lessonSlotBudgetsMap.set('WKS', worksheetLesson);\n}\nconst worksheetKx = kxSlotPrioritiesMap.get('worksheet');\nif (worksheetKx) {\n  kxSlotPrioritiesMap.set('WKS', worksheetKx);\n}\n\nexport function getContract(type: string): ArtifactTypeContract | undefined {\n  return registry.get(type.toLowerCase());\n}\n\nexport function getAllContracts(): ArtifactTypeContract[] {\n  // Deduplicate case-insensitively\n  const seen = new Set<string>();\n  const list: ArtifactTypeContract[] = [];\n  for (const [key, value] of registry.entries()) {\n    if (!seen.has(value.type)) {\n      seen.add(value.type);\n      list.push(value);\n    }\n  }\n  return list;\n}\n\nexport function hasContract(type: string): boolean {\n  return registry.has(type.toLowerCase());\n}\n\nexport function registerContract(contract: ArtifactTypeContract): void {\n  registry.set(contract.type.toLowerCase(), contract);\n  registry.set(contract.type.toUpperCase(), contract);\n}\n\n/** LESSON slot spec; `priorities` are semantic keys (headerDictionary.ts), NOT literal headings. */\nexport function getLessonSlotBudget(type: string): { budget: number; priorities?: string[] } | undefined {\n  return lessonSlotBudgetsMap.get(type) ?? lessonSlotBudgetsMap.get(type.toLowerCase()) ?? lessonSlotBudgetsMap.get(type.toUpperCase());\n}\n\n/**\n * Registry default for artifact types that declare no `lessonBudget`.\n *\n * SINGLE source of truth for the lesson-excerpt slot: the AST projection, the\n * markdown fallback, and the shared satellite excerpt all resolve priorities\n * from here. They used to carry private literal lists that disagreed — the AST\n * branch fell back to 2 keys while the markdown branch used 5, so the same\n * lesson yielded different excerpts depending on whether the AST overlay\n * resolved. 12k is the shared satellite excerpt budget.\n */\nexport const DEFAULT_LESSON_SLOT: { budget: number; priorities: string[] } = {\n  budget: 12_000,\n  // Leaf keys, highest-value first. The list used to LEAD with 'artifactContract'\n  // and name the parent 'lessonDesignPlan' next to its own children\n  // ('learningObjectives', 'activitySequence'). Because resolveSlotNodes\n  // prefix-expands a parent into its children, the parent slot serialized 13255\n  // chars as ONE unit — more than any real budget — so it was dropped WHOLE and\n  // the leaf keys behind it competed for what the cheap artifactContract had\n  // already spent. Measured on swift-for-dummy U01_M01_L01: ACT (budget 8000)\n  // shipped Artifact Contract + Learning Objectives and lost the Activity\n  // Sequence entirely; GUIDE (6000) flipped between objectives and activity\n  // sequence depending on how long the lesson was.\n  //\n  // The order below is the greedy fill that actually fits: on that lesson,\n  // activitySequence (3696) + learningObjectives (4278) = 7974 ≤ 8000, so both\n  // ground-truth tables reach ACT, and GUIDE still gets its activity sequence.\n  priorities: ['activitySequence', 'learningObjectives', 'artifactContract', 'resourceMap', 'assessmentMap', 'lessonFlow'],\n};\n\n// Một override chỉ nên khai thêm `budget` (hoặc chèn TIỀN TỐ đúng một key rẻ,\n// xem bell_ringer). Không khai lại cả danh sách: mỗi bản sao là một cơ hội\n// trôi khỏi thứ tự đo ở trên, và 5 bản sao đã trôi thật — chúng quay về dùng\n// dòng trên.\n\n/**\n * Registry default for artifact types that declare no `kxPriorities`. Same\n * single-source rule as DEFAULT_LESSON_SLOT — the KX default used to be copy\n * pasted into every consumer, so they could drift apart.\n */\nexport const DEFAULT_KX_SLOT_PRIORITIES: string[] = [\n  'keyTerms',\n  'conceptNarratives',\n  'workedMicroExamples',\n];\n\n/**\n * KX excerpt budget in characters, used when no per-type spec overrides it.\n * 4500 is the satellite-path value — the path that actually runs in production\n * under hybrid routing — so leaving types unset does not silently change what\n * satellites receive.\n */\nexport const DEFAULT_KX_SLOT_BUDGET = 4500;\n\n/** Effective lesson slot spec for a type: per-type entry, else the registry default. */\nexport function resolveLessonSlotSpec(type: string): { budget: number; priorities: string[] } {\n  const spec = getLessonSlotBudget(type);\n  return {\n    budget: spec?.budget ?? DEFAULT_LESSON_SLOT.budget,\n    priorities: spec?.priorities?.length ? [...spec.priorities] : [...DEFAULT_LESSON_SLOT.priorities],\n  };\n}\n\nexport function getKxSlotPriorities(type: string): string[] | undefined {\n  return kxSlotPrioritiesMap.get(type) ?? kxSlotPrioritiesMap.get(type.toLowerCase()) ?? kxSlotPrioritiesMap.get(type.toUpperCase());\n}\n\nexport function getKxSlotBudget(type: string): number | undefined {\n  return kxSlotBudgetMap.get(type) ?? kxSlotBudgetMap.get(type.toLowerCase()) ?? kxSlotBudgetMap.get(type.toUpperCase());\n}\n\n/**\n * Effective KX slot spec for a type: per-type priorities/budget, else the\n * registry defaults. KX budget used to be a bare literal in each consumer —\n * 4500 in the satellite path and 6000 in the single-artifact path — so the\n * same exposition was injected at two different sizes depending on which path\n * ran. One registry fact now decides.\n */\nexport function resolveKxSlotSpec(type: string): { budget: number; priorities: string[] } {\n  const priorities = getKxSlotPriorities(type);\n  return {\n    budget: getKxSlotBudget(type) ?? DEFAULT_KX_SLOT_BUDGET,\n    priorities: priorities && priorities.length > 0 ? [...priorities] : [...DEFAULT_KX_SLOT_PRIORITIES],\n  };\n}\n\nexport function isKxOnlyType(type: string): boolean {\n  return kxOnlyTypesSet.has(type) || kxOnlyTypesSet.has(type.toLowerCase()) || kxOnlyTypesSet.has(type.toUpperCase());\n}\n","// curriculumHorizon.ts\n//\n// Token-Efficient Curriculum Horizon Engine (v2 — 3-Tier Gradient Compression & Positive-Only Framing).\n//\n// Implements the architectural specification from:\n// `packages/curriculum-kit/docs/ideas/2026-09-13-cumulative-prior-knowledge-and-curriculum-horizon-scaffolding.md`\n//\n// Guarantees:\n// 1. Token Economy: ~200-350 tokens overhead regardless of lesson position (O(1) footprint).\n// 2. Positive-Only Allow List: Informs the model of its exact allowed vocabulary and prevents Negative Priming.\n// 3. I/O Performance: Reads at most 2 previous physical lesson files (Bridge window) or uses sidecar ledger.\n// 4. Fail-Fast: Throws descriptive CurriculumError if target lesson cannot be resolved from plan or framework.\n\nimport { CurriculumError } from '../errors';\nimport { extractSymbolLedger, type SymbolLedgerResult } from './contextBuilder';\n\nexport interface DetailedLessonBridge {\n  lessonId: string;\n  lessonIndex: number;\n  title: string;\n  proseObjective?: string;\n  keywords: string[];\n  /** Physical SOT symbol ledger extracted from disk (if physical artifact exists) */\n  symbolLedger?: {\n    primaryStructOrClass?: string;\n    mainEntryFile?: string;\n    keyVariables?: string[];\n  };\n}\n\nexport interface BoundaryPeek {\n  lessonId: string;\n  lessonIndex: number;\n  title: string;\n  keywords: string[];\n}\n\nexport interface HorizonSessionSnapshot {\n  id: string;\n  order?: number;\n  title: string;\n  prose_objective?: string;\n  new_keywords?: string[];\n  prerequisite_keywords?: string[];\n  depth_assignments?: Array<{\n    node_id: string;\n    depth: 'ulo' | 'cio' | 'sio';\n  }>;\n  // P50: ZPD cognitive load status\n  zpd_status?: {\n    verdict: 'OK' | 'TOO_MANY_NEW' | 'NO_ZPD_BRIDGE';\n    new_concept_count?: number;\n    known_concept_count?: number;\n    // 2026-09-19 (contract split): keyword axis carries its own fields.\n    new_keyword_count?: number;\n    known_keyword_count?: number;\n    issues?: string[];\n  };\n}\n\nexport interface CurriculumHorizon {\n  targetLessonId: string;\n  targetLessonIndex: number;\n  totalLessons: number;\n  targetTitle: string;\n  targetKeywords: string[];\n\n  // P50: ZPD cognitive load & Bruner spiral ceilings\n  zpdStatus?: {\n    verdict: 'OK' | 'TOO_MANY_NEW' | 'NO_ZPD_BRIDGE';\n    new_concept_count?: number;\n    known_concept_count?: number;\n    // 2026-09-19 (contract split): keyword axis carries its own fields.\n    new_keyword_count?: number;\n    known_keyword_count?: number;\n    issues?: string[];\n  };\n  spiralProgression?: Array<{\n    concept_code: string;\n    encounter_index: number;\n    bloom_cap: string;\n    depth: string;\n  }>;\n\n  /**\n   * TIER 2: Compact Mastery Set (L_1 .. L_{N-3})\n   * Flat deduplicated keyword and concept sets without per-lesson overhead.\n   * Target footprint: ~50-100 tokens.\n   */\n  compactMasterySet: {\n    masteredKeywords: string[];\n    masteredConcepts: string[];\n  };\n\n  /**\n   * TIER 1: Detailed Bridge (L_{N-2} and L_{N-1})\n   * Full lesson metadata and physical symbol ledger.\n   * Target footprint: ~120-200 tokens.\n   */\n  detailedBridge: DetailedLessonBridge[];\n\n  /**\n   * BOUNDARY PEEK: L_{N+1} (and optionally L_{N+2})\n   * Upcoming lesson concepts used for positive-only boundary enforcement.\n   * Target footprint: ~30-50 tokens.\n   */\n  boundaryPeek: BoundaryPeek[];\n}\n\nexport interface ExtractCurriculumHorizonOptions {\n  plan?: any | null;\n  frameworkMarkdown?: string | null;\n  targetLessonId: string;\n  storage?: any;\n  projectId?: string;\n}\n\nexport interface HorizonValidationResult {\n  compliant: boolean;\n  issues: string[];\n  forbiddenMatches: string[];\n}\n\nconst DETAILED_BRIDGE_WINDOW = 2; // Only detail L_{N-2} and L_{N-1}\nconst BOUNDARY_PEEK_WINDOW = 2;   // Only peek L_{N+1} and L_{N+2}\n\n/**\n * Parses all sessions deterministically from either CurriculumPlan JSON or CURRICULUM_FRAMEWORK.md Scope & Sequence.\n */\nexport function parseAllSessions(\n  plan?: any | null,\n  frameworkMarkdown?: string | null\n): HorizonSessionSnapshot[] {\n  // 1. Prefer machine-readable CurriculumPlan sessions\n  if (plan) {\n    const rawSessions = Array.isArray(plan.sessions)\n      ? plan.sessions\n      : Array.isArray(plan)\n      ? plan\n      : [];\n\n    if (rawSessions.length > 0) {\n      return rawSessions.map((s: any, idx: number) => ({\n        id: s.id || `L${String(idx + 1).padStart(2, '0')}`,\n        order: typeof s.order === 'number' ? s.order : idx + 1,\n        title: s.title || '',\n        prose_objective: s.prose_objective || s.objective || '',\n        new_keywords: Array.isArray(s.new_keywords)\n          ? s.new_keywords\n          : Array.isArray(s.keywords)\n          ? s.keywords\n          : [],\n        prerequisite_keywords: Array.isArray(s.prerequisite_keywords) ? s.prerequisite_keywords : [],\n        depth_assignments: Array.isArray(s.depth_assignments) ? s.depth_assignments : [],\n        zpd_status: s.zpd_status,\n      }));\n    }\n  }\n\n  // 2. Parse from CURRICULUM_FRAMEWORK.md Scope & Sequence table\n  if (frameworkMarkdown && typeof frameworkMarkdown === 'string') {\n    const lines = frameworkMarkdown.split('\\n');\n    let headerCols: string[] = [];\n    const sessions: HorizonSessionSnapshot[] = [];\n\n    for (const line of lines) {\n      const trimmed = line.trim();\n      if (!trimmed.startsWith('|')) continue;\n      const cols = trimmed.split('|').slice(1, -1).map((c) => c.trim());\n      const lower = cols.map((c) => c.toLowerCase());\n\n      if (lower.some((c) => c.includes('lesson code') || c === 'mã bài' || c.includes('mã bài học'))) {\n        headerCols = cols;\n        continue;\n      }\n      if (/^[-: |]+$/.test(trimmed.slice(1, -1))) continue;\n      if (cols.length < 3) continue;\n\n      let lessonCode = '';\n      let title = '';\n      let objective = '';\n      let concept = '';\n      let keywordsStr = '';\n\n      if (headerCols.length > 0) {\n        const col = (name: string): string => {\n          const idx = headerCols.findIndex((h) => h.toLowerCase().includes(name));\n          return idx >= 0 ? (cols[idx] || '') : '';\n        };\n        lessonCode = (col('lesson code') || col('mã bài') || cols[1] || '').replace(/\\*\\*/g, '').trim();\n        title = (col('title') || col('tên') || cols[2] || '').replace(/\\*\\*/g, '').trim();\n        objective = col('learning objective') || col('objective') || col('mục tiêu') || '';\n        concept = col('key concept') || col('concept') || col('khái niệm') || '';\n        keywordsStr = col('keywords') || col('từ khóa') || '';\n      } else {\n        lessonCode = (cols[1] || '').replace(/\\*\\*/g, '').trim();\n        title = (cols[2] || '').replace(/\\*\\*/g, '').trim();\n        objective = cols[5] || '';\n        concept = cols[4] || '';\n      }\n\n      if (lessonCode && /^[A-Za-z0-9_\\-]+$/.test(lessonCode)) {\n        const keywords = keywordsStr\n          ? keywordsStr.split(/[,;\\n]/).map((k) => k.trim().replace(/^`|`$/g, '')).filter(Boolean)\n          : concept\n          ? concept.split(/[,;\\n]/).map((k) => k.trim().replace(/^`|`$/g, '')).filter(Boolean)\n          : [];\n\n        sessions.push({\n          id: lessonCode,\n          order: sessions.length + 1,\n          title: title || lessonCode,\n          prose_objective: objective,\n          new_keywords: keywords,\n        });\n      }\n    }\n\n    if (sessions.length > 0) {\n      return sessions;\n    }\n  }\n\n  return [];\n}\n\n/**\n * Extracts the 3-Tier Curriculum Horizon for a target lesson.\n * Enforces fail-fast if the target lesson cannot be resolved from the SOT plan or framework.\n */\nexport async function extractCurriculumHorizon(\n  opts: ExtractCurriculumHorizonOptions\n): Promise<CurriculumHorizon> {\n  const { plan, frameworkMarkdown, targetLessonId, storage, projectId } = opts;\n\n  const sessions = parseAllSessions(plan, frameworkMarkdown);\n\n  if (sessions.length === 0) {\n    throw new CurriculumError({\n      errorCode: 'ERR_LESSON_NOT_IN_SOT',\n      lessonId: targetLessonId,\n      message: `[CurriculumHorizon] No sessions could be parsed from CURRICULUM_PLAN.json or CURRICULUM_FRAMEWORK.md. Fail fast — cannot construct curriculum horizon without SOT.`,\n      suggestedAction: 'Ensure CURRICULUM_PLAN.json or CURRICULUM_FRAMEWORK.md is generated and contains valid sessions.',\n      retryable: false,\n    });\n  }\n\n  const targetCodePattern = new RegExp('^' + targetLessonId.replace(/_/g, '[_-]') + '$', 'i');\n  const targetIndex = sessions.findIndex(\n    (s) => s.id === targetLessonId || targetCodePattern.test(s.id)\n  );\n\n  if (targetIndex < 0) {\n    throw new CurriculumError({\n      errorCode: 'ERR_LESSON_NOT_IN_SOT',\n      lessonId: targetLessonId,\n      message: `[CurriculumHorizon] Lesson \"${targetLessonId}\" was not found among the ${sessions.length} planned sessions. Fail fast — refusing to generate unanchored lesson.`,\n      suggestedAction: `Check lesson id against planned sessions: [${sessions.map((s) => s.id).join(', ')}]`,\n      retryable: false,\n    });\n  }\n\n  const currentSession = sessions[targetIndex]!;\n\n  // ── Tier 2: Compact Mastery Set (L_1 .. L_{N-3}) ──\n  const compactEnd = Math.max(0, targetIndex - DETAILED_BRIDGE_WINDOW);\n  const compactSessions = sessions.slice(0, compactEnd);\n\n  const masteredKeywords = Array.from(\n    new Set(\n      compactSessions\n        .flatMap((s) => s.new_keywords || [])\n        .map((k) => k.trim())\n        .filter(Boolean)\n    )\n  );\n\n  const masteredConcepts = Array.from(\n    new Set(\n      compactSessions\n        .map((s) => s.title || s.prose_objective || '')\n        .map((t) => t.trim())\n        .filter(Boolean)\n    )\n  );\n\n  // ── Tier 1: Detailed Bridge (L_{N-2} and L_{N-1}) ──\n  const bridgeStart = Math.max(0, targetIndex - DETAILED_BRIDGE_WINDOW);\n  const bridgeSessions = sessions.slice(bridgeStart, targetIndex);\n  const detailedBridge: DetailedLessonBridge[] = [];\n\n  for (const session of bridgeSessions) {\n    const bridgeIndex = sessions.indexOf(session) + 1;\n    const bridge: DetailedLessonBridge = {\n      lessonId: session.id,\n      lessonIndex: bridgeIndex,\n      title: session.title,\n      proseObjective: session.prose_objective,\n      keywords: session.new_keywords || [],\n    };\n\n    // If storage is provided, attempt to read physical lesson file to extract code symbols\n    if (storage && projectId) {\n      try {\n        // Try direct artifact paths\n        const candidates = [\n          `_content/${session.id.replace(/_L\\d+$/, '')}/LESSON_${session.id}.md`,\n          `_content/LESSON_${session.id}.md`,\n          `LESSON_${session.id}.md`,\n        ];\n\n        let lessonMd = '';\n        for (const c of candidates) {\n          try {\n            const raw = await storage.readArtifact(projectId, c);\n            if (raw) {\n              lessonMd = raw;\n              break;\n            }\n          } catch {\n            // continue\n          }\n        }\n\n        if (lessonMd) {\n          const ledger: SymbolLedgerResult = extractSymbolLedger(lessonMd);\n          if (ledger.primarySymbol || ledger.entryFileName || ledger.keySymbols.length > 0) {\n            bridge.symbolLedger = {\n              primaryStructOrClass: ledger.primarySymbol,\n              mainEntryFile: ledger.entryFileName,\n              keyVariables: ledger.keySymbols,\n            };\n          }\n        }\n      } catch {\n        // Non-blocking physical SOT lookup\n      }\n    }\n\n    detailedBridge.push(bridge);\n  }\n\n  // ── Boundary Peek (L_{N+1} and L_{N+2}) ──\n  const peekStart = targetIndex + 1;\n  const peekEnd = Math.min(sessions.length, peekStart + BOUNDARY_PEEK_WINDOW);\n  const boundaryPeek: BoundaryPeek[] = sessions.slice(peekStart, peekEnd).map((s, idx) => ({\n    lessonId: s.id,\n    lessonIndex: peekStart + idx + 1,\n    title: s.title,\n    keywords: s.new_keywords || [],\n  }));\n\n  const rawSpirals = Array.isArray(plan?.concept_spiral_progression) ? plan.concept_spiral_progression : [];\n  const sessionSpirals = rawSpirals.filter((e: any) => e.session_id === targetLessonId);\n\n  return {\n    targetLessonId,\n    targetLessonIndex: targetIndex + 1,\n    totalLessons: sessions.length,\n    targetTitle: currentSession.title,\n    targetKeywords: currentSession.new_keywords || [],\n    zpdStatus: currentSession.zpd_status,\n    spiralProgression: sessionSpirals,\n    compactMasterySet: {\n      masteredKeywords,\n      masteredConcepts,\n    },\n    detailedBridge,\n    boundaryPeek,\n  };\n}\n\n/**\n * Serializes the CurriculumHorizon into a token-efficient (~200-350 tokens)\n * Positive-Only Markdown prompt block.\n */\nexport function renderHorizonPromptBlock(horizon: CurriculumHorizon): string {\n  const {\n    targetLessonId,\n    targetLessonIndex,\n    totalLessons,\n    targetTitle,\n    targetKeywords,\n    zpdStatus,\n    spiralProgression,\n    compactMasterySet,\n    detailedBridge,\n    boundaryPeek,\n  } = horizon;\n\n  const lines: string[] = [\n    `# 🧭 CURRICULUM HORIZON & SCAFFOLDING MATRIX (Lesson ${targetLessonIndex}/${totalLessons}: \"${targetTitle}\" [${targetLessonId}])`,\n  ];\n\n  // P50: ZPD Alert & Cognitive Load Notice\n  if (zpdStatus && zpdStatus.verdict !== 'OK') {\n    lines.push(\n      `\\n> ⚠️ **ZPD COGNITIVE LOAD ALERT (${zpdStatus.verdict}):** ${zpdStatus.issues?.join('; ') || 'Scaffolding bridge mandated'}. Introduce minimal new syntax and anchor into known concepts.`\n    );\n  }\n\n  // P50: Bruner Spiral Ceiling & Depth Guidance\n  if (spiralProgression && spiralProgression.length > 0) {\n    const spiralNotes = spiralProgression.map(\n      (sp) => `\\`${sp.concept_code}\\` (Encounter #${sp.encounter_index}): Bloom Cap [${sp.bloom_cap}], Depth [${sp.depth.toUpperCase()}]`\n    );\n    lines.push(`\\n- **🌀 Bruner Spiral Curricula Guidance:** ${spiralNotes.join(' | ')}`);\n  }\n\n  // 1. Compact Mastery Set (Lessons 1..N-3)\n  if (compactMasterySet.masteredKeywords.length > 0 || compactMasterySet.masteredConcepts.length > 0) {\n    const rawKeywords = compactMasterySet.masteredKeywords;\n    const displayedKeywords = rawKeywords.length > 20 ? rawKeywords.slice(-20) : rawKeywords;\n    const vocab = displayedKeywords.map((k) => `\\`${k}\\``).join(', ');\n    const moreSuffix = rawKeywords.length > 20 ? ` *(+${rawKeywords.length - 20} earlier terms)*` : '';\n    const concepts = compactMasterySet.masteredConcepts.length > 0\n      ? `\\n- **Prior Concept Foundations:** ${compactMasterySet.masteredConcepts.slice(-3).join('; ')}`\n      : '';\n    lines.push(\n      `\\n## 1. 🎓 MASTERED VOCABULARY (Prior Lessons 1..${Math.max(1, targetLessonIndex - 3)} — Compact Set):`,\n      `- **Mastered Terms & Syntax:** ${vocab || '(Core fundamentals)'}${moreSuffix}${concepts}`\n    );\n  } else if (targetLessonIndex === 1) {\n    lines.push(\n      `\\n## 1. 🎓 PRIOR KNOWLEDGE FRONTIER:`,\n      `- **Entry Point:** Inaugural lesson (Lesson 1/${totalLessons}). Students have no prior course vocabulary. All concepts must be introduced from baseline.`\n    );\n  }\n\n  // 2. Detailed Bridge (L_{N-2} & L_{N-1})\n  if (detailedBridge.length > 0) {\n    lines.push(`\\n## 2. 🌉 IMMEDIATE PREDECESSOR CONTEXT (Bridge Lessons):`);\n    for (const bridge of detailedBridge) {\n      lines.push(`### Lesson ${bridge.lessonIndex} (${bridge.lessonId}): ${bridge.title}`);\n      if (bridge.proseObjective) {\n        const obj = bridge.proseObjective.length > 120 ? bridge.proseObjective.slice(0, 117) + '...' : bridge.proseObjective;\n        lines.push(`- **Objective:** ${obj}`);\n      }\n      if (bridge.keywords.length > 0) {\n        lines.push(`- **Keywords:** ${bridge.keywords.map((k) => `\\`${k}\\``).join(', ')}`);\n      }\n      if (bridge.symbolLedger) {\n        const parts: string[] = [];\n        if (bridge.symbolLedger.primaryStructOrClass) {\n          parts.push(`Primary Struct: \\`${bridge.symbolLedger.primaryStructOrClass}\\``);\n        }\n        if (bridge.symbolLedger.mainEntryFile) {\n          parts.push(`Entry File: \\`${bridge.symbolLedger.mainEntryFile}\\``);\n        }\n        if (bridge.symbolLedger.keyVariables?.length) {\n          parts.push(`Symbols: ${bridge.symbolLedger.keyVariables.map((v) => `\\`${v}\\``).join(', ')}`);\n        }\n        if (parts.length > 0) {\n          lines.push(`- **Code Symbol Ledger:** ${parts.join(' | ')}`);\n        }\n      }\n    }\n    lines.push(\n      `👉 INSTRUCTION: Seamlessly connect the opening Hook and Guided Practice by referencing the student's recent work from Lesson ${detailedBridge[detailedBridge.length - 1]?.lessonIndex}.`\n    );\n  }\n\n  // 3. Allowed Design Space (Positive-Only Allow List)\n  const currentKeywordsStr = targetKeywords.length > 0\n    ? targetKeywords.map((k) => `\\`${k}\\``).join(', ')\n    : '`Current Lesson Concepts`';\n\n  lines.push(\n    `\\n## 3. 🎯 ALLOWED DESIGN SPACE (Positive-Only Allow List):`,\n    `- **Student Toolkit:** Mastered Vocabulary + Immediate Bridge Keywords + Current Lesson Scope (${currentKeywordsStr}).`,\n    `- **MANDATE:** ALL extension challenges (EXT), hands-on activities (ACT), and assessment questions (QUIZ) MUST be 100% solvable using ONLY items within this toolkit. Do NOT require unintroduced APIs!`\n  );\n\n  // 4. Boundary Peek (Next lesson scope)\n  if (boundaryPeek.length > 0) {\n    const nextLesson = boundaryPeek[0]!;\n    const nextKeywords = nextLesson.keywords.length > 0\n      ? nextLesson.keywords.map((k) => `\\`${k}\\``).join(', ')\n      : 'upcoming features';\n    lines.push(\n      `\\n## 4. 🚧 BOUNDARY (Next Lesson Peek):`,\n      `- **Upcoming Lesson ${nextLesson.lessonIndex} (\"${nextLesson.title}\"):** Introduces ${nextKeywords}.`,\n      `- **BOUNDARY MANDATE:** These concepts are NOT yet available to the student. Do not introduce or require these future concepts.`\n    );\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Validates whether an artifact output adheres to the Curriculum Horizon boundary\n * (detects accidental future concept leaks).\n */\nexport function validateHorizonCompliance(\n  artifactContent: string,\n  horizon: CurriculumHorizon\n): HorizonValidationResult {\n  const issues: string[] = [];\n  const forbiddenMatches: string[] = [];\n\n  if (!artifactContent || horizon.boundaryPeek.length === 0) {\n    return { compliant: true, issues: [], forbiddenMatches: [] };\n  }\n\n  const contentLower = artifactContent.toLowerCase();\n\n  // Scan boundary peek keywords from the immediate next lesson\n  const immediateNext = horizon.boundaryPeek[0];\n  if (immediateNext && immediateNext.keywords.length > 0) {\n    for (const kw of immediateNext.keywords) {\n      const trimmed = kw.trim().toLowerCase();\n      if (trimmed.length <= 2) continue; // skip tiny tokens\n\n      // Word boundary regex check\n      const pattern = new RegExp(`\\\\b${trimmed.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`, 'i');\n      if (pattern.test(contentLower)) {\n        // Double check it wasn't already in mastered set or current scope\n        const inMastered = horizon.compactMasterySet.masteredKeywords.some(\n          (m) => m.toLowerCase() === trimmed\n        );\n        const inBridge = horizon.detailedBridge.some((b) =>\n          b.keywords.some((bk) => bk.toLowerCase() === trimmed)\n        );\n        const inCurrent = horizon.targetKeywords.some(\n          (ck) => ck.toLowerCase() === trimmed\n        );\n\n        if (!inMastered && !inBridge && !inCurrent) {\n          forbiddenMatches.push(kw);\n          issues.push(\n            `Artifact contains boundary concept \"${kw}\" scheduled for future Lesson ${immediateNext.lessonIndex} (\"${immediateNext.title}\").`\n          );\n        }\n      }\n    }\n  }\n\n  return {\n    compliant: issues.length === 0,\n    issues,\n    forbiddenMatches,\n  };\n}\n","// contextBuilder.ts\n//\n// P43 Cụm 1: Section-aware context builder for KX / LESSON / STYLE_GUIDE markdown.\n// Replaces blind `slice(0, N)` truncation with:\n// Parse (bilingual, SLC-aware) → Priority Excerpt → Fence-Aware Guard.\n//\n// Guarantees:\n// 1. Lossless degradation: falls back to fence-safe truncation if section parsing misses.\n// 2. Bilingual resolution: localized headings (e.g. Vietnamese) map to canonical keys via SLC.\n// 3. Whole-section preservation: never cuts mid-section while budget allows.\n\nimport {\n  getSemanticHeaderDictionary,\n  cleanHeadingText,\n  normHeading as normSemanticHeading,\n  resolveSemanticKey,\n} from '../parsers/headerDictionary.js';\nimport { DEFAULT_LESSON_SLOT, DEFAULT_KX_SLOT_PRIORITIES } from '../registry/artifactRegistry.js';\n\nexport interface ExcerptOptions {\n  /**\n   * Canonical (English) section keys to prioritize, in order.\n   * Each key's body is included before moving to the next priority.\n   */\n  priorities?: string[];\n  /** Character budget for the excerpt (default 12_000, ~3k tokens). */\n  budget?: number;\n  /** File name or artifact type hint (e.g. 'LESSON', 'KNOWLEDGE_EXPOSITION'). */\n  artifactType?: string;\n  /**\n   * Source file name (e.g. `LESSON_U03_M01_L06.md`) — artifact type derived\n   * from it when `artifactType` is not given. Matches the web app's builder\n   * option so both call-sites share one contract.\n   */\n  fileName?: string;\n  /** Min chars below which the excerpt is flagged as insufficient (default 400). */\n  minContentChars?: number;\n  /**\n   * Whole-section selection mode (RC 2026-09-30): when true, ONLY the priority\n   * sections are eligible — canonical/unmatched leftovers are NOT appended\n   * under leftover budget. Used by per-artifact SOT selection (e.g. SLIDE\n   * takes exactly style-guide §2/3/4/7/8) so non-selected sections never\n   * dilute the prompt. Default false keeps the historical append behavior.\n   */\n  exclusive?: boolean;\n}\n\nexport interface ExcerptResult {\n  /** Excerpt markdown safe to inject into prompt context blocks. */\n  excerpt: string;\n  /** True when the source parsed cleanly, passed sufficiency checks, and resolved priorities. */\n  verified: boolean;\n  /** True when canonical section resolution matched at least one priority section. */\n  sectionAware: boolean;\n  /** Canonical section keys included in the excerpt, in order. */\n  includedSections: string[];\n  /** Warning or error flags explaining why verified === false. */\n  issues: string[];\n  /** Approximate token count (chars / 4). */\n  tokenEstimate: number;\n}\n\n/**\n * Semantic keys, không phải heading. Trước 2026-10-03 bảng này viết bằng\n * heading tiếng Anh và chỉ khớp được vì `findCanonicalFuzzy` trả về đúng dạng\n * đó; bảng đó bị xoá thì bảng này không còn resolve gì — `parse:no-priority-\n * resolution` và `verified: false`.\n */\n// Không có `symbolLedger`: không template nào có mục đó và bài học thật cũng\n// không (`swift-for-dummy`, đo 2026-10-03). Nội dung nó được bơm riêng qua khối\n// [MANDATORY CODE SYMBOL REGISTRY], không qua excerpt.\n//\n// Bảng này từng là một bản sao RIÊNG của danh sách ưu tiên lesson, đặt sai\n// thứ tự và vẫn chứa parent key 'lessonDesignPlan'. Parent đó serialize 13.265\n// chars trên bài thật — lớn hơn mọi ngân sách — nên luật whole-section rơi nó\n// TRỌN, và danh sách phía sau nó phải tranh giành phần ngân sách còn lại. Giờ\n// nó kế thừa DEFAULT_LESSON_SLOT: một danh sách, một nguồn, không thể trôi.\nexport const DEFAULT_LESSON_PRIORITIES: string[] = [...DEFAULT_LESSON_SLOT.priorities];\n\n/**\n * Priorities for the canonical-lesson excerpt injected into SATELLITE artifact\n * contexts (ACT, QUIZ, SLIDE, ...). Excludes 'Symbol & Identifier Ledger' —\n * the symbol registry is injected as its own dedicated block\n * ([MANDATORY CODE SYMBOL REGISTRY]) to avoid duplicated ground truth.\n *\n * Derived from the registry default (semantic keys) so excerpt priority has a\n * SINGLE source of truth. This list used to be a private literal set of English\n * headings that could silently drift away from the registry specs the AST\n * projection uses.\n */\nexport const SATELLITE_LESSON_PRIORITIES: string[] = [...DEFAULT_LESSON_SLOT.priorities];\n\n/**\n * Không một bảng ưu tiên lesson nào trong kit được phép chứa parent key\n * 'lessonDesignPlan'. Guard ở lesson-slot-priority-overlap.test.ts chỉ bắt\n * được parent CHUNG VỚI lá của nó trong cùng danh sách; một danh sách chỉ chứa\n * parent (như bảng cũ ở trên) lọt qua. Đây là hệ quả đo được trên bài thật.\n */\n\nexport const DEFAULT_KX_PRIORITIES: string[] = [...DEFAULT_KX_SLOT_PRIORITIES];\n\ninterface ParsedSection {\n  rawHeading: string;\n  cleanTitle: string;\n  /** Semantic key ưu tiên (tra từ điển trước). */\n  canonicalKey?: string;\n  /**\n   * Key dạng khớp-chính-xác của từ điển (ví dụ 'lessonDesignPlan'), giữ lại khi\n   * khác `canonicalKey`. `DEFAULT_LESSON_PRIORITIES` / `DEFAULT_KX_PRIORITIES` viết\n   * bằng dạng heading nên node phải đăng ký dưới cả hai — chỉ dùng một thì bộ\n   * ưu tiên cũ hỏng.\n   */\n  legacyKey?: string;\n  /** Chỉ phần nội dung thuộc riêng node này, KHÔNG gồm mục con. */\n  body: string;\n  level: number;\n  children: ParsedSection[];\n}\n\nexport function buildSectionAwareExcerpt(\n  markdown: string,\n  opts: ExcerptOptions = {}\n): ExcerptResult {\n  const budget = opts.budget ?? 12_000;\n  const issues: string[] = [];\n  const source = (markdown || '').trim();\n\n  if (!source) {\n    return {\n      excerpt: '',\n      verified: false,\n      sectionAware: false,\n      includedSections: [],\n      issues: ['empty-source'],\n      tokenEstimate: 0,\n    };\n  }\n\n  const minContentChars = opts.minContentChars !== undefined ? opts.minContentChars : Math.min(400, source.length);\n\n  const effectiveArtifactType = opts.artifactType || deriveArtifactTypeFromFileName(opts.fileName);\n  const roots = parseMarkdownSections(source);\n  const sections = flattenSections(roots);\n  const metaBlock = buildMetaBlock(source, effectiveArtifactType);\n\n  if (sections.length === 0) {\n    issues.push('parse:no-sections');\n    const excerpt = truncateByBudget(source, budget);\n    const verified = excerpt.length >= minContentChars;\n    if (excerpt.length < minContentChars) issues.push('content:insufficient');\n    return {\n      excerpt,\n      verified,\n      sectionAware: false,\n      includedSections: [],\n      issues,\n      tokenEstimate: Math.round(excerpt.length / 4),\n    };\n  }\n\n  const byCanonical = new Map<string, ParsedSection>();\n  const byCleanTitle = new Map<string, ParsedSection>();\n  // `unmatched` và `topLevelCanonical` CHỈ gồm node gốc: vòng lấp nốt cuối\n  // duyệt hai cái này, còn node lồng thì đi kèm khi cha nó được lấy.\n  const unmatched: ParsedSection[] = [];\n  const topLevelCanonical = new Map<string, ParsedSection>();\n\n  for (const s of sections) {\n    if (s.canonicalKey && !byCanonical.has(s.canonicalKey)) {\n      byCanonical.set(s.canonicalKey, s);\n    }\n    if (s.legacyKey && !byCanonical.has(s.legacyKey)) {\n      byCanonical.set(s.legacyKey, s);\n    }\n    const norm = normalizeHeading(s.cleanTitle);\n    if (!byCleanTitle.has(norm)) {\n      byCleanTitle.set(norm, s);\n    }\n  }\n\n  for (const root of roots) {\n    const topKey = root.legacyKey ?? root.canonicalKey;\n    if (topKey) {\n      if (!topLevelCanonical.has(topKey)) {\n        topLevelCanonical.set(topKey, root);\n      }\n    } else {\n      unmatched.push(root);\n    }\n  }\n\n  const priorities = opts.priorities ?? DEFAULT_LESSON_PRIORITIES;\n  // GĐ 2.3 — single semantic source (plan A.6): registry slot `sections` are\n  // SEMANTIC KEYS ('lessonFlow'), not literal headings ('B. Lesson Flow').\n  // The AST projection matches semantic keys directly; this markdown excerpt\n  // builder resolves the same keys through the SAME dictionary the AST parser\n  // uses: each parsed section's canonical heading is re-identified by its\n  // dictionary form, so one registry entry steers both views. Heading-form\n  // priorities keep working via the same lookup.\n  const keyByNorm = new Map<string, string>();\n  for (const [norm, entry] of Object.entries(getSemanticHeaderDictionary())) {\n    if (!keyByNorm.has(norm)) keyByNorm.set(norm, entry.key);\n  }\n  const semanticCanonical = new Map<string, string>();\n  for (const canonical of byCanonical.keys()) {\n    const semanticKey = keyByNorm.get(normSemanticHeading(cleanHeadingText(canonical)));\n    if (semanticKey && !semanticCanonical.has(semanticKey)) {\n      semanticCanonical.set(semanticKey, canonical);\n    }\n  }\n  const includedSections: string[] = [];\n  const blocks: string[] = [];\n  const initialOverhead = metaBlock ? metaBlock.length + 2 : 0;\n  let used = initialOverhead;\n\n  // Các node đã vào excerpt. Dùng để KHÔNG in lại một mục con khi cha của nó\n  // đã được lấy trọn (tránh lặp nguyên văn), và để bỏ qua node đã lấy rồi.\n  const includedNodes = new Set<ParsedSection>();\n\n  /** Nội dung của node = phần riêng + các mục con CHƯA bị lấy riêng trước đó. */\n  const renderContent = (node: ParsedSection, rendered?: Set<ParsedSection>): string => {\n    const parts: string[] = [];\n    const own = node.body.trim();\n    if (own) parts.push(own);\n    for (const child of node.children) {\n      if (includedNodes.has(child)) continue;\n      const childHeading = `## ${child.cleanTitle}\\n\\n`;\n      parts.push(childHeading + renderContent(child, rendered));\n      // GHI LẠI node đã in ra. Đo 2026-10-03 trên swift-for-dummy: mục con H3 được\n      // render theo nhánh cha rồi lại bị ưu tiên của chính nó kéo thêm một lần —\n      // `## 2. Activity Sequence` lặp NGUYÊN VĂN 2.271 ký tự (19,4% ngân sách),\n      // và `learningObjectives` bị báo `section:dropped` dù nội dung của nó đã có\n      // trong excerpt. Ghi vào đây (chứ không phải trong renderContent) vì chỉ khi\n      // khối cha THẬT SỰ vừa budget thì các con mới thật sự vào excerpt.\n      rendered?.add(child);\n    }\n    return parts.join('\\n\\n');\n  };\n\n  const tryAdd = (node: ParsedSection, key: string, report = true): boolean => {\n    // Cha đã lấy trọn cả nhánh thì node này đã có mặt — coi như thành công.\n    if (includedNodes.has(node)) return true;\n    const rendered = new Set<ParsedSection>();\n    const content = renderContent(node, rendered);\n    if (!content.trim()) return false;\n    const heading = `## ${node.cleanTitle}\\n\\n`;\n    const block = heading + content;\n    if (used + block.length <= budget) {\n      blocks.push(block);\n      used += block.length;\n      includedSections.push(key);\n      includedNodes.add(node);\n      for (const child of rendered) includedNodes.add(child);\n      return true;\n    }\n    // WHOLE-SECTION INVARIANT (RC 2026-09-30): never ship half a section — a\n    // truncated canonical table (Competency Matrix, Version Matrix, glossary)\n    // is worse than no section: the model silently learns an incomplete ground\n    // truth. A section that does not fit is dropped WHOLE; the caller reads\n    // `issues`/`verified` to notice. The ONLY exception is the first priority\n    // section when it ALONE exceeds the budget — dropping it would leave an\n    // empty excerpt (fail-open), so it is still partially truncated and the\n    // truncation is reported via `section:truncated:<key>`.\n    if (includedSections.length === 0 && budget >= minContentChars) {\n      const allowedBody = budget - used - heading.length;\n      if (allowedBody > 50) {\n        const truncated = truncateByBudget(content, allowedBody).trim();\n        if (truncated.length > 0) {\n          const partialBlock = heading + truncated;\n          blocks.push(partialBlock);\n          used += partialBlock.length;\n          includedSections.push(key);\n          includedNodes.add(node);\n          for (const child of rendered) includedNodes.add(child);\n          issues.push(`section:truncated:${key}`);\n          return true;\n        }\n      }\n    }\n    // Chỉ vòng priority báo `dropped`. Vòng lấp nốt cuối là cơ hội (leftover\n    // budget), không phải cam kết — báo ở đó chỉ nhân bản issue của vòng\n    // priority và làm telemetry khó đọc (đo: 17 issue trên 1 bài trước khi sửa).\n    if (report) issues.push(`section:dropped:${key}`);\n    return false;\n  };\n\n  // Frontmatter meta first (id/type/title anchors the excerpt for the LLM).\n  blocks.push(metaBlock);\n\n  let sectionAware = false;\n  // Priority được yêu cầu nhưng tài liệu KHÔNG có mục tương ứng. Khác hẳn với\n  // priority có mặt mà bị rớt vì ngân sách — cái đó đã có `section:dropped:`.\n  const absent: string[] = [];\n  for (const key of priorities) {\n    let node = byCanonical.get(key) || byCleanTitle.get(normalizeHeading(key));\n    if (!node) {\n      // Registry keys arrive as semantic keys ('lessonFlow'); map them to the\n      // canonical heading form the parsed sections are indexed by.\n      const resolved = semanticCanonical.get(key);\n      if (!resolved) {\n        absent.push(key);\n        continue;\n      }\n      node = byCanonical.get(resolved);\n      if (!node) {\n        absent.push(key);\n        continue;\n      }\n    }\n    sectionAware = true;\n    // Node này ĐÃ nằm trong excerpt (cha nó được lấy trọn cả nhánh). Không in lại,\n    // và — quan trọng hơn — không báo `section:dropped`: nội dung có mặt, chỉ là\n    // không có riêng một khối. Trước đây vòng này gọi thẳng `tryAdd`, nên node đã\n    // bị render theo cha vẫn được kéo thêm lần nữa hoặc bị báo là rớt budget.\n    if (includedNodes.has(node)) {\n      includedSections.push(key);\n      continue;\n    }\n    // A dropped (too-big) section consumes no budget — keep trying the next\n    // priorities so smaller canonical sections still make the excerpt.\n    tryAdd(node, key);\n  }\n\n  // Include remaining TOP-LEVEL sections under budget (skipped in exclusive\n  // whole-section mode — non-priority sections must not leak into the prompt).\n  // Chỉ duyệt node gốc: node lồng đã đi kèm khi cha nó được lấy, duyệt thêm sẽ\n  // in trùng hoặc biến một '#### Bước 3' mồ côi thành heading cấp 2.\n  // KHÔNG break khi một section không vừa: nó không tiêu budget, và section\n  // nhỏ hơn đứng sau vẫn còn chỗ (cùng lý do vòng priority ở trên).\n  if (!opts.exclusive) {\n    for (const [key, node] of topLevelCanonical) {\n      if (includedNodes.has(node)) continue;\n      if (used >= budget) break;\n      tryAdd(node, key, false);\n    }\n\n    // Include unmatched top-level sections under budget\n    for (const node of unmatched) {\n      if (includedNodes.has(node)) continue;\n      if (used >= budget) break;\n      tryAdd(node, node.cleanTitle, false);\n    }\n  }\n\n  // Sanity: if NO canonical key resolved (e.g. SLC missing + fully drifted\n  // headings), the excerpt is still complete and budget-safe, but the caller\n  // must know canonical resolution contributed nothing.\n  if (includedSections.length === 0 && unmatched.length > 0) {\n    issues.push('parse:no-canonical-resolution');\n  }\n\n  if (priorities.length > 0 && !priorities.some((k) => includedSections.includes(k))) {\n    issues.push(sections.length === 0 ? 'parse:no-sections' : 'parse:no-priority-resolution');\n  }\n\n  // Đo được 2026-10-03 trên swift-for-dummy: trước 2.0.19, 5/6 key của\n  // SATELLITE_LESSON_PRIORITIES không có mục tương ứng trong bài học — nhưng\n  // `verified` vẫn `true` vì chỉ hỏi \"có ÍT NHẤT một priority resolve\", và\n  // `issues` chỉ ghi `section:dropped:<mục cha>` của vòng lấy nốt, trông y hệt\n  // một lỗi ngân sách. Đó là lý do lỗi đó bị chẩn đoán sai hai lần.\n  //\n  // `verified` GIỮ NGUYÊN nghĩa (\"resolve được\", không phải \"đầy đủ\" — xem\n  // `contextSlots.ts`) vì đổi nó sẽ lật trạng thái của mọi prompt vệ tinh đang\n  // chạy. Tỉ lệ đi vào `issues` để telemetry đọc được mà không đổi hợp đồng.\n  if (priorities.length > 0 && absent.length > 0) {\n    issues.push(\n      `parse:partial-priority-resolution:${priorities.length - absent.length}/${priorities.length}` +\n        ` absent=${absent.join(',')}`,\n    );\n  }\n\n  let excerpt = blocks.join('\\n\\n');\n  if (excerpt.length > budget) {\n    excerpt = truncateByBudget(excerpt, budget);\n  }\n\n  if (excerpt.length - metaBlock.length < minContentChars) {\n    issues.push('content:insufficient');\n  }\n\n  const verified =\n    !issues.includes('parse:no-priority-resolution') &&\n    !issues.includes('parse:no-canonical-resolution') &&\n    excerpt.length - metaBlock.length >= minContentChars;\n\n  return {\n    excerpt,\n    verified,\n    sectionAware: sectionAware || unmatched.length === 0,\n    includedSections,\n    issues,\n    tokenEstimate: Math.round(excerpt.length / 4),\n  };\n}\n\nexport function buildExpositionExcerpt(\n  markdown: string,\n  opts: ExcerptOptions = {}\n): ExcerptResult {\n  return buildSectionAwareExcerpt(markdown, {\n    ...opts,\n    priorities: opts.priorities ?? DEFAULT_KX_PRIORITIES,\n  });\n}\n\nexport function buildLessonExcerpt(\n  markdown: string,\n  opts: ExcerptOptions = {}\n): ExcerptResult {\n  return buildSectionAwareExcerpt(markdown, {\n    ...opts,\n    priorities: opts.priorities ?? DEFAULT_LESSON_PRIORITIES,\n  });\n}\n\n/**\n * Tìm ưu tiên viết dạng HEADING trong mã nguồn — `['Key Terms', 'A. Lesson Design Plan']`.\n *\n * Ưu tiên phải là semantic key (`keyTerms`, `lessonDesignPlan`). Trước 2.0.22 còn\n * một bảng heading thứ hai nên heading-form vẫn khớp được và lỗi này im lặng;\n * sau 2.0.22 nó biến thành `verified: false` → caller rơi vào fallback cắt cụt.\n * Lỗi đã xảy ra ở chính repo này VÀ ở app (lib/sot/graph-tasks.ts) — app gọi\n * builder qua `@thanh01.pmt/curriculum-kit` nên phải dùng chung một luật kiểm,\n * không tự viết lần hai.\n *\n * Trả về danh sách chuỗi vi phạm; chuỗi rỗng = sạch.\n */\nexport function findHeadingFormPriorities(source: string): string[] {\n  const LITERAL = /(?:sgPriorities|refPriorities|priorities)\\s*:\\s*\\[([^\\]]*)\\]/g;\n  const KEYLIKE = /^[a-z][A-Za-z0-9]*$/;\n  const found: string[] = [];\n  for (const m of source.matchAll(LITERAL)) {\n    for (const raw of m[1].split(',')) {\n      const key = raw.trim().replace(/^['\"]|['\"]$/g, '');\n      if (key && !KEYLIKE.test(key) && !found.includes(key)) found.push(key);\n    }\n  }\n  return found;\n}\n\n\n\n/**\n * Parses markdown into a section TREE with reverse SLC resolution.\n *\n * Bài học thật (EDP) xếp mục con ở H3 nằm trong H2: `## A. Lesson Design Plan`\n * chứa `### 1. Learning Objectives & Evidence`, `### 2. Activity Sequence`…\n * Bản cũ chọn regex theo `hasH2 ? /^##\\s+/ : /^#{2,3}\\s+/`, nên chỉ khi tài liệu\n * KHÔNG có H2 nào thì H3 mới thành section. Đo trên swift-for-dummy U01_M01_L01:\n * `hasH2 === true`, 5 semantic key mà SATELLITE_LESSON_PRIORITIES đặt tên\n * (activitySequence, learningObjectives, artifactContract, resourceMap,\n * assessmentMap) không tồn tại trong `byCanonical` nên không bao giờ resolve —\n * excerpt chỉ còn `lessonFlow`. Đây là cây để H3 vẫn gọi tên được bằng semantic\n * key của nó, còn H2 vẫn render trọn cả nhánh con nên không mất nội dung nào.\n */\nfunction parseMarkdownSections(\n  markdown: string\n): ParsedSection[] {\n  const roots: ParsedSection[] = [];\n  const stack: ParsedSection[] = [];\n  const dictionary = getSemanticHeaderDictionary();\n  let current: ParsedSection | null = null;\n  let currentBody: string[] = [];\n\n  const flush = () => {\n    if (current) current.body = currentBody.join('\\n');\n    currentBody = [];\n  };\n\n  for (const line of markdown.split('\\n')) {\n    const match = line.match(/^(#{2,4})\\s+(.*)$/);\n    if (match) {\n      flush();\n      const level = match[1].length;\n      const cleanTitle = match[2].trim();\n      // Một nguồn duy nhất: `resolveSemanticKey` (khớp chính xác rồi khớp chuỗi con).\n      // `findCanonicalFuzzy` — bảng heading thứ hai viết tay — đã bị xoá ngày\n      // 2026-10-03. Lý do: nó phải cập nhật tay song song với từ điển, lệch nhau\n      // là hỏng; đo được 202 trường hợp khớp qua nó. Phần “chịu trôi dạt” của nó\n      // nay nằm trong chính từ điển, có ngưỡng đo được để không khớp nhầm.\n      const canonicalKey = resolveSemanticKey(cleanTitle);\n      const legacyKey = dictionary[normSemanticHeading(cleanHeadingText(cleanTitle))]?.key;\n      const node: ParsedSection = {\n        rawHeading: line.trim(),\n        cleanTitle,\n        canonicalKey,\n        legacyKey: legacyKey !== canonicalKey ? legacyKey : undefined,\n        body: '',\n        level,\n        children: [],\n      };\n      while (stack.length && stack[stack.length - 1].level >= level) stack.pop();\n      (stack.length ? stack[stack.length - 1].children : roots).push(node);\n      stack.push(node);\n      current = node;\n    } else {\n      currentBody.push(line);\n    }\n  }\n  flush();\n\n  return roots;\n}\n\n/** Duyệt cây theo thứ tự tài liệu, cha trước con. */\nfunction flattenSections(nodes: ParsedSection[]): ParsedSection[] {\n  const out: ParsedSection[] = [];\n  const walk = (list: ParsedSection[]) => {\n    for (const n of list) {\n      out.push(n);\n      walk(n.children);\n    }\n  };\n  walk(nodes);\n  return out;\n}\n\nfunction normalizeHeading(str: string): string {\n  return str\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .replace(/[^\\w\\s]/g, ' ')\n    .replace(/\\s+/g, ' ')\n    .trim();\n}\n\nfunction truncateByBudget(source: string, budget: number): string {\n  if (source.length <= budget) return source;\n  let cut = source.slice(0, budget);\n  const fenceCount = (cut.match(/^```/gm) || []).length;\n  if (fenceCount % 2 === 1) cut += '\\n```';\n  return cut;\n}\n\n/** Frontmatter meta comment anchoring the excerpt for the LLM (same contract\n *  as the web app's artifact-context-builder — one shared excerpt shape). */\nfunction buildMetaBlock(source: string, artifactType?: string): string {\n  const fm = source.match(/^---\\s*\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n  const pick = (key: string): string => {\n    if (!fm) return '';\n    const m = fm[1].match(new RegExp(`^${key}:\\\\s*\"?([^\\\"\\\\n]+)\"?`, 'm'));\n    return (m?.[1] || '').trim();\n  };\n  const id = pick('id');\n  const title = pick('title');\n  const type = pick('type') || artifactType || '';\n  return `<!-- SOURCE: ${type || 'ARTIFACT'} | ${id || 'unknown'}${title ? ` — ${title}` : ''} (section-aware excerpt; canonical knowledge, do not contradict) -->`;\n}\n\nfunction deriveArtifactTypeFromFileName(fileName?: string): string | undefined {\n  if (!fileName) return undefined;\n  const base = fileName.replace(/\\.md$/i, '');\n  const multiWord = base.match(/^(KNOWLEDGE_EXPOSITION|CONTENT_STYLE_GUIDE|CURRICULUM_FRAMEWORK|LEARNER_PROFILE|PROJECT_BRIEF|REFERENCE_PACK|CURRICULUM_PLAN)/i);\n  if (multiWord) return multiWord[1].toUpperCase();\n  const token = base.match(/^([A-Z][A-Z0-9_]*?)(?=_|$)/);\n  return token ? token[1] : undefined;\n}\n\n/**\n * Extracts code symbol & identifier contracts from LESSON markdown.\n * Provides deterministic symbol names (Primary Struct/Class, Entry File, Key Functions)\n * so all satellite agents (@activity, @illustrator, @assessor) inherit them verbatim.\n */\nexport interface SymbolLedgerResult {\n  primarySymbol?: string;\n  entryFileName?: string;\n  keySymbols: string[];\n  rawBlock: string;\n}\n\nexport function extractSymbolLedger(lessonMarkdown: string): SymbolLedgerResult {\n  const result: SymbolLedgerResult = {\n    keySymbols: [],\n    rawBlock: '',\n  };\n\n  if (!lessonMarkdown) return result;\n\n  // 1. Look for explicit Symbol & Identifier Ledger or Artifact Contract block\n  const ledgerMatch = lessonMarkdown.match(/###?\\s*(?:Symbol & Identifier Ledger|Bảng Định Danh|Artifact Contract)[\\s\\S]*?(?=\\n##|\\n---|$)/i);\n  if (ledgerMatch) {\n    result.rawBlock = ledgerMatch[0].trim();\n  }\n\n  // 2. Extract Primary Struct / Class / Function / Module\n  const structMatch = lessonMarkdown.match(/(?:Primary Struct|Primary Class|Primary Function|Main Component|Primary Module|Struct chính|Class chính|Hàm chính)[:\\s*`]+([A-Za-z0-9_]+)/i);\n  if (structMatch) {\n    result.primarySymbol = structMatch[1];\n    result.keySymbols.push(structMatch[1]);\n  } else {\n    // Generic scan for primary type declaration across languages\n    const codeStructMatch = lessonMarkdown.match(/(?:struct|class|interface|type|def|function)\\s+([A-Za-z0-9_]+)/);\n    if (codeStructMatch) {\n      const sym = codeStructMatch[1];\n      result.primarySymbol = sym;\n      result.keySymbols.push(sym);\n    }\n  }\n\n  // 3. Extract Entry File Name\n  const fileMatch = lessonMarkdown.match(/(?:Entry File|Source File|Target File|Tên file mã nguồn)[:\\s*`]+([A-Za-z0-9_\\-\\.]+\\.[a-z0-9_]+)/i);\n  if (fileMatch) {\n    result.entryFileName = fileMatch[1];\n  } else {\n    // Generic search for file comments like // ContentView.swift or # main.py or /* App.tsx */\n    const codeFileComment = lessonMarkdown.match(/(?:\\/\\/\\s*|#\\s*|\\/\\*\\s*)([A-Za-z0-9_\\-]+\\.[a-zA-Z0-9]+)/);\n    if (codeFileComment) {\n      result.entryFileName = codeFileComment[1];\n    }\n  }\n\n  return result;\n}\n\nexport {\n  type DetailedLessonBridge,\n  type BoundaryPeek,\n  type HorizonSessionSnapshot,\n  type CurriculumHorizon,\n  type ExtractCurriculumHorizonOptions,\n  type HorizonValidationResult,\n  parseAllSessions,\n  extractCurriculumHorizon,\n  renderHorizonPromptBlock,\n  validateHorizonCompliance,\n} from './curriculumHorizon';\n","/**\n * artifact-validators.ts — Deterministic post-generation validators (5-Whys\n * RC-assertion, 2026-09-13).\n *\n * Root cause closed: every hard invariant (output language purity, tool-version\n * fidelity, session scope) was previously enforced ONLY by prompt instructions\n * and verified only by an LLM judge — the same free-tier model class that\n * produced the violations. All three invariants are MECHANICALLY checkable,\n * so they now fail closed BEFORE the LLM judge runs:\n *\n *   1. CJK scan        — no Chinese/Japanese/Korean characters may appear in a\n *                        Vietnamese/English course artifact.\n *   2. Version grep    — tool version claims (e.g. \"Xcode 15\") are matched\n *                        against the REFERENCE_PACK ground truth; contradicting\n *                        versions are extracted for the repair prompt.\n *   3. Scope crosscheck— concept blocks in KX must trace back to the session's\n *                        node_ids / new_keywords in CURRICULUM_PLAN.\n */\n\nexport interface ValidatorIssue {\n  code: 'cjk-leak' | 'version-contradiction' | 'scope-drift' | 'identifier-casing' | 'lesson-ownership';\n  detail: string;\n  /** Offending substrings (for CJK) or found numbers (for versions). */\n  evidence: string[];\n}\n\nexport interface ValidatorResult {\n  ok: boolean;\n  issues: ValidatorIssue[];\n}\n\nconst CJK_RE = /[\\u3400-\\u4DBF\\u4E00-\\u9FFF\\u3040-\\u30FF\\uAC00-\\uD7AF]/g;\n\n/** 1. Scan for CJK character leaks (any amount fails — even one glyph is a defect). */\nexport function scanCjkLeaks(content: string): ValidatorIssue | null {\n  const matches = content.match(CJK_RE);\n  if (!matches || matches.length === 0) return null;\n  const lines: string[] = [];\n  for (const line of content.split('\\n')) {\n    if (CJK_RE.test(line)) lines.push(line.trim().slice(0, 160));\n  }\n  return {\n    code: 'cjk-leak',\n    detail: `Phát hiện ${matches.length} ký tự CJK (Trung/Nhật/Hàn) trong artifact ngôn ngữ Việt/Anh. Bị cấm tuyệt đối.`,\n    evidence: lines.slice(0, 5),\n  };\n}\n\n/** Extract every \"<Tool> <number>\" claim (e.g. \"Xcode 15\", \"iOS 18\", \"Swift 5.9\"). */\nconst VERSION_CLAIM_RE = /\\b([A-Z][A-Za-z+#.\\-]{1,24})\\s+(\\d{1,2}(?:\\.\\d{1,2})?)\\b/g;\n\n/**\n * 2. Compare version claims against REFERENCE_PACK ground truth.\n * A claim fails only when the SAME tool appears in the refPack with a DIFFERENT\n * version — unknown tools (not mentioned in RefPack) are allowed to stay\n * generic rather than forced to fail.\n */\nexport function checkVersionGroundTruth(content: string, refPack: string): ValidatorIssue | null {\n  if (!refPack || !refPack.trim()) return null; // no ground truth → skip (generic docs allowed)\n  const packLower = refPack.toLowerCase();\n\n  const claims = new Map<string, string>(); // tool → claimed version (first wins)\n  for (const m of content.matchAll(VERSION_CLAIM_RE)) {\n    const tool = m[1];\n    if (claims.size === 0 || !claims.has(tool)) claims.set(tool, m[2]);\n  }\n\n  const contradictions: string[] = [];\n  for (const [tool, claimed] of claims) {\n    const toolRe = new RegExp(`\\\\b${tool.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\s+(\\\\d{1,2}(?:\\\\.\\\\d{1,2})?)\\\\b`, 'i');\n    const packMatch = packLower.match(toolRe);\n    if (packMatch && packMatch[1] !== claimed) {\n      contradictions.push(`${tool}: artifact nói ${claimed}, REFERENCE_PACK chốt ${packMatch[1]}`);\n    }\n  }\n  if (contradictions.length === 0) return null;\n  return {\n    code: 'version-contradiction',\n    detail: `Version mâu thuẫn với ground truth REFERENCE_PACK: ${contradictions.join('; ')}. Sửa theo bản trong REFERENCE_PACK.`,\n    evidence: contradictions,\n  };\n}\n\n/**\n * 3. KX scope crosscheck — bold concept headers (e.g. \"**Pair Programming (WHAT & WHY):**\")\n * must correspond to the session's scoped keywords or graph node keywords.\n * Tolerant matching: keyword tokens may appear in any order inside the header.\n */\nexport function checkScopeDrift(\n  content: string,\n  scopedKeywords: string[],\n  tolerance = 0,\n): ValidatorIssue | null {\n  const conceptHeaders = new Set<string>();\n  for (const m of content.matchAll(/\\*\\*([^*\\n]{3,60}?)\\s*\\((?:WHAT|CIO|SIO|ULO)[^)]*\\):\\*\\*/g)) {\n    conceptHeaders.add(m[1].toLowerCase());\n  }\n  if (conceptHeaders.size === 0) return null;\n\n  const drift: string[] = [];\n  for (const header of conceptHeaders) {\n    const hit = scopedKeywords.some((kw) => {\n      const k = kw.toLowerCase().trim();\n      if (!k) return false;\n      const tokens = k.split(/\\s+/);\n      const present = tokens.filter((t) => header.includes(t)).length;\n      return present >= Math.max(1, tokens.length - tolerance);\n    });\n    if (!hit) drift.push(header);\n  }\n  if (drift.length === 0) return null;\n  return {\n    code: 'scope-drift',\n    detail: `Các khái niệm sau KHÔNG thuộc scope của buổi học (không có trong new_keywords/graph node keywords): ${drift.join(' | ')}. Xoá hoàn toàn hoặc thay bằng khái niệm trong scope.`,\n    evidence: drift,\n  };\n}\n\n/**\n * 4. Identifier casing ground truth (2026-09-18 swift-for-dummy `Print` incident).\n *\n * Root cause: glossary term names are pedagogical concept labels extracted by\n * the planner (\"Print\" = the *act of printing* as a topic), but the generator\n * DERIVED code identifier casing from the term name and even fabricated a\n * \"Swift is case-sensitive, use Print\" rule. Deterministic check: collect the\n * ground-truth identifier vocabulary from REFERENCE_PACK code spans (backtick\n * spans and call-position tokens — `print(...)`, `@State`, `struct Foo`), then\n * scan every fenced code block of the artifact for call-position tokens whose\n * canonical form (case/underscore-insensitive) matches a REFERENCE_PACK\n * identifier with DIFFERENT casing. Only call-position + fence-scoped tokens\n * are flagged (prose uses Title Case legitimately).\n *\n * ponytail: naive fence scan — tokens inside string literals/comments may be\n * flagged; acceptable because false positives require a refPack identifier\n * colliding with a string token in call position. Upgrade: lightweight Swift\n * tokenizer if this ever fires spuriously.\n */\nexport function checkIdentifierCasing(content: string, refPack: string): ValidatorIssue | null {\n  if (!refPack || !refPack.trim()) return null;\n\n  // Ground truth: identifiers from REFERENCE_PACK. Call position (`name(`) is\n  // the strongest signal; bare backtick spans are kept as a secondary source.\n  const canonical = new Map<string, string>(); // key: lowercased no-underscore → real spelling\n  const remember = (id: string) => {\n    if (id.length < 2) return;\n    const key = id.toLowerCase().replace(/_/g, '');\n    // First occurrence wins — refPack is the single source of truth.\n    if (!canonical.has(key)) canonical.set(key, id);\n  };\n  for (const m of refPack.matchAll(/`([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g)) remember(m[1]);\n  for (const m of refPack.matchAll(/\\b([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g)) remember(m[1]);\n  for (const m of refPack.matchAll(/`([A-Za-z_][A-Za-z0-9_]*)`/g)) remember(m[1]);\n  if (canonical.size === 0) return null;\n\n  // Control-flow / declaration keywords must never be treated as API calls.\n  const RESERVED = new Set(['if', 'for', 'while', 'switch', 'func', 'return', 'guard', 'catch', 'else', 'in']);\n\n  const violations: string[] = [];\n  const fenceRe = /```[a-zA-Z]*\\n([\\s\\S]*?)```/g;\n  for (const fence of content.matchAll(fenceRe)) {\n    for (const m of fence[1].matchAll(/\\b([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g)) {\n      const tok = m[1];\n      if (RESERVED.has(tok.toLowerCase())) continue;\n      const real = canonical.get(tok.toLowerCase().replace(/_/g, ''));\n      if (real && real !== tok && !violations.includes(`${tok} → ${real}`)) {\n        violations.push(`${tok} → ${real}`);\n      }\n    }\n  }\n  if (violations.length === 0) return null;\n  return {\n    code: 'identifier-casing',\n    detail: `Code dùng identifier lệch casing so với REFERENCE_PACK (nguồn sự thật kỹ thuật): ${violations.join(', ')}. Identifier trong code PHẢI copy nguyên dạng từ REFERENCE_PACK — KHÔNG suy ra casing từ tên keyword/concept (chúng là nhãn sư phạm, không phải API).`,\n    evidence: violations.slice(0, 5),\n  };\n}\n\n/**\n * 4. Check LESSON OWNERSHIP boundary (Lesson Flow word count per phase).\n * Warns/flags when any single phase in section B exceeds the maximum word budget (default 300 words).\n */\nexport function checkLessonOwnership(content: string, maxWordsPerPhase = 300): ValidatorIssue | null {\n  const flowMatch = content.match(/##\\s*(?:\\[?REQUIRED\\]?\\s*)?B\\.\\s*Lesson Flow([\\s\\S]*?)(?=\\n##\\s+|$)/i);\n  if (!flowMatch) return null;\n  const flowSection = flowMatch[1];\n\n  const phaseRegex = /###\\s*(?:(\\d+)\\.\\s*)?([^\\n]+)\\n([\\s\\S]*?)(?=(?:###\\s*(?:\\d+\\.)?|$))/gi;\n  let pMatch: RegExpExecArray | null;\n  const overages: string[] = [];\n\n  while ((pMatch = phaseRegex.exec(flowSection)) !== null) {\n    const heading = pMatch[2].trim();\n    const body = pMatch[3].trim();\n    // Count words in phase body (ignore markdown markers and whitespace)\n    const words = body.split(/\\s+/).filter(w => w.length > 0);\n    if (words.length > maxWordsPerPhase) {\n      overages.push(`${heading}: ${words.length} words (limit: ${maxWordsPerPhase})`);\n    }\n  }\n\n  if (overages.length === 0) return null;\n  return {\n    code: 'lesson-ownership',\n    detail: `Lesson Flow phases exceed ownership word limit (${maxWordsPerPhase} words/phase): ${overages.join('; ')}. Delegate deep step-by-step activities to ACT or concept details to KX.`,\n    evidence: overages,\n  };\n}\n\n/** Run the full deterministic battery for one artifact. */\nexport function validateArtifactDeterministic(input: {\n  content: string;\n  refPack?: string;\n  scopedKeywords?: string[];\n  isLesson?: boolean;\n}): ValidatorResult {\n  const issues: ValidatorIssue[] = [];\n  const cjk = scanCjkLeaks(input.content);\n  if (cjk) issues.push(cjk);\n  if (input.refPack) {\n    const ver = checkVersionGroundTruth(input.content, input.refPack);\n    if (ver) issues.push(ver);\n    const casing = checkIdentifierCasing(input.content, input.refPack);\n    if (casing) issues.push(casing);\n  }\n  if (input.scopedKeywords && input.scopedKeywords.length > 0) {\n    const scope = checkScopeDrift(input.content, input.scopedKeywords);\n    if (scope) issues.push(scope);\n  }\n  if (input.isLesson) {\n    const ownership = checkLessonOwnership(input.content);\n    if (ownership) issues.push(ownership);\n  }\n  return { ok: issues.length === 0, issues };\n}\n\n/** Human-readable repair block from validator issues (fed back into the LLM). */\nexport function validatorRepairPrompt(issues: ValidatorIssue[]): string {\n  return [\n    'DETERMINISTIC VALIDATOR FAILURES (mechanically detected — non-negotiable, fix ALL):',\n    ...issues.map((i, n) => `${n + 1}. [${i.code}] ${i.detail}${i.evidence.length ? `\\n   Evidence: ${i.evidence.join(' | ').slice(0, 400)}` : ''}`),\n  ].join('\\n');\n}\n","/**\n * product-spec.ts — Canonical PRODUCT_SPEC block (5-Whys RC-canonicality,\n * 2026-09-13).\n *\n * Root cause closed: deliverable shape (SwiftUI App vs Command Line Tool),\n * tool versions, and template choices were re-invented INDEPENDENTLY by every\n * artifact type from prose SOT documents — LESSON chose \"console print\", ACT\n * chose \"SwiftUI App\", KX hedged \"both templates\". Cross-artifact contradiction\n * was the DEFAULT behavior of that design.\n *\n * The fix: extract the product-defining decisions ONCE from REFERENCE_PACK +\n * briefing into a machine-stable block and inject the IDENTICAL text into every\n * artifact prompt (KX, LESSON, satellites). One decision, seen by all writers.\n */\n\nimport { buildSectionAwareExcerpt } from './contextBuilder.js';\n\nexport interface ProductSpecInput {\n  /** Raw REFERENCE_PACK.md content (ground truth for versions/toolchain). */\n  refPack?: string;\n  /** Project briefing fields (from project.config.json). */\n  briefing?: {\n    techStack?: string;\n    coreTechnology?: string;\n    topic?: string;\n    hardwarePlatform?: string;\n    studentEquipment?: string;\n    classDynamic?: string;\n    language?: string;\n  };\n  /** Explicit overrides — wins over extraction when provided. */\n  overrides?: {\n    deliverableTemplate?: string;\n    primaryLanguage?: string;\n  };\n  /** Skip the toolchain fact list (caller already injects the same RefPack\n   *  excerpt as GROUND TRUTH — avoids double injection). */\n  skipToolchainList?: boolean;\n}\n\n/**\n * Extract the toolchain/version facts sentence from REFERENCE_PACK by scanning\n * the toolchain-focused section (bilingual fuzzy resolution via contextBuilder)\n * and pulling only lines that carry version numbers or named tools.\n */\nfunction extractToolchainFacts(refPack: string): string[] {\n  const { excerpt } = buildSectionAwareExcerpt(refPack, {\n    priorities: ['technicalOverviewArchitectureBlueprint', 'hardwarePinout'],\n    budget: 4000,\n  });\n  if (!excerpt) return [];\n  const factLines: string[] = [];\n  for (const rawLine of excerpt.split('\\n')) {\n    const line = rawLine.trim();\n    if (!line || line.startsWith('#') || line.startsWith('<!--')) continue;\n    // Skip narrative intro lines (no tool-name, no version).\n    if (!/\\d{1,2}(?:\\.\\d{1,2})?/.test(line) && !/Xcode|Swift|macOS|iOS|SDK|Node|Python|JDK|\\.NET/i.test(line)) continue;\n    factLines.push(line.replace(/^[*\\-•]\\s*/, '- '));\n    if (factLines.length >= 8) break;\n  }\n  return factLines;\n}\n\n/**\n * Derive the canonical PRIMARY TECHNOLOGY from toolchain facts (language +\n * framework + IDE). Prose descriptions (course summaries pasted into\n * `topic`) are REJECTED — the audit caught a 370-char marketing sentence\n * posing as a \"CANONICAL, BINDING\" platform spec.\n */\nfunction derivePrimaryTechnology(facts: string[], briefing: ProductSpecInput['briefing']): string {\n  // 1. Explicit structured fields win.\n  const explicit = (briefing?.coreTechnology || briefing?.techStack || '').trim();\n  if (explicit && explicit.length <= 80) return explicit;\n  // 2. Extract canonical tech names from the toolchain facts.\n  const found: string[] = [];\n  const CANON = ['Swift', 'SwiftUI', 'macOS', 'iOS', 'Xcode', 'SwiftData', 'Node.js', 'TypeScript', 'Python', 'React'];\n  for (const name of CANON) {\n    if (facts.some((f) => f.includes(name)) && !found.includes(name)) found.push(name);\n  }\n  if (found.length > 0) return found.slice(0, 4).join(' + ');\n  // 3. Briefing topic only when SHORT (a real tech label, not prose).\n  const topic = (briefing?.topic || '').trim();\n  return topic && topic.length <= 60 ? topic : '';\n}\n\n/**\n * Build the canonical PRODUCT_SPEC markdown block. Returns '' when there is\n * nothing to say (no RefPack and no briefing) — callers skip injection then.\n */\nexport function buildProductSpecBlock(input: ProductSpecInput): string {\n  const b = input.briefing || {};\n\n  const toolchainFacts = input.refPack ? extractToolchainFacts(input.refPack) : [];\n  const platform = (input.overrides?.primaryLanguage\n    || derivePrimaryTechnology(toolchainFacts, b)\n    || '').trim();\n  const hardware = (b.hardwarePlatform || b.studentEquipment || b.classDynamic || '').trim();\n\n  const lines: string[] = [];\n  lines.push('[PRODUCT SPEC — CANONICAL, BINDING FOR EVERY ARTIFACT OF THIS PROJECT]:');\n  lines.push('All decisions below are PROJECT-WIDE. Every artifact (LESSON, satellites, KX)');\n  lines.push('must describe the SAME product. Contradicting or re-deciding any line here is a');\n  lines.push('consistency failure — if a needed decision is absent, stay GENERIC, never invent.');\n  lines.push('');\n  if (platform) {\n    lines.push(`- Primary technology: ${platform}`);\n  }\n  if (hardware) {\n    lines.push(`- Hardware / classroom setup: ${hardware}`);\n  }\n  if (input.overrides?.deliverableTemplate) {\n    lines.push(`- Deliverable template: ${input.overrides.deliverableTemplate}`);\n  }\n  // RC-dedup: when the same RefPack excerpt is already injected as GROUND\n  // TRUTH by the caller, repeating the fact list here doubles the tokens\n  // (audit S-3). Skip the list; the platform line above still names the canon.\n  if (toolchainFacts.length > 0 && !input.skipToolchainList) {\n    lines.push('- Toolchain & versions (ground truth):');\n    for (const f of toolchainFacts) lines.push(`  ${f}`);\n  }\n  if (lines.length <= 5) return ''; // nothing substantive\n  return lines.join('\\n');\n}\n","import { createHash } from 'node:crypto';\nimport { validateCurriculumPlan, type CurriculumPlan, type SessionPlan } from '../schemas/curriculumPlanSchema';\nimport { gateModeFor, type ResolvedGateSettings } from '../workflow/gateSettings';\n\n/**\n * KNOWLEDGE_EXPOSITION service — canonical knowledge reference per session,\n * generated ON DEMAND after framework approval (design doc: option b).\n *\n * Guarantees:\n *  - fail-closed: refuses without approval.status === 'approved'\n *  - hash invalidation: regenerates when plan_hash changed after approval\n *  - scope-locked: covers exactly the session's nodes/keywords/depths\n *  - student-facing: no teacher-only content (LESSON owns activities)\n */\n\nexport interface ExpositionLlmFn {\n  (systemPrompt: string, userPrompt: string): Promise<string>;\n}\n\nexport interface ExpositionStorage {\n  readArtifact(projectId: string, relPath: string): Promise<string | null>;\n  saveArtifact(projectId: string, relPath: string, content: string): Promise<void>;\n}\n\nexport const EXPOSITION_REL = (lessonCode: string): string => {\n  const match = lessonCode.match(/^(U\\d+)/i);\n  const unitCode = match ? match[1].toUpperCase() : 'U01';\n  return `_content/${unitCode}/EXPOSITION_${lessonCode}.md`;\n};\n\nexport class ExpositionApprovalError extends Error {\n  constructor(message: string) { super(message); this.name = 'ExpositionApprovalError'; }\n}\n\n/** Determine whether an existing EXPOSITION can be reused for this lesson. */\nexport function isExpositionFresh(\n  existing: string | null,\n  plan: CurriculumPlan,\n  lessonCode: string,\n): boolean {\n  if (!existing) return false;\n  if (plan.approval.status !== 'approved' || plan.approval.plan_hash !== plan.plan_hash) return false;\n  return existing.includes('plan_hash: \"' + plan.plan_hash + '\"');\n}\n\nimport {\n  buildLanguageDirective,\n  buildHeadingDirective,\n  extractSectionHeadings,\n  resolveTargetLanguageCode,\n} from './languageDirective';\n\nconst DEPTH_RULES: Record<string, string> = {\n  ulo: 'Write WHAT + WHY only: what it is, why it exists, technology-independent. Do NOT explain internal mechanisms.',\n  cio: 'Write WHAT + WHY + HOW: include the mechanism, step by step, still technology-independent.',\n  sio: 'Write WHAT + WHY + HOW + SPECIFIC: include concrete implementations and how the real project keywords are used.',\n};\n\nexport interface DepthViolation {\n  nodeId: string;\n  depth: string;\n  message: string;\n  severity: 'ERROR' | 'WARNING';\n}\n\n/**\n * Validates depth compliance for KX Concept Narratives.\n * - SIO: requires at least 1 fenced code block.\n * - ULO: warns if fenced code blocks are present (concept should be technology-independent WHAT+WHY).\n * - CIO: code blocks optional.\n */\nexport function validateDepthCompliance(\n  kxMarkdown: string,\n  depthAssignments: Array<{ node_id: string; depth: string }>\n): { ok: boolean; issues: DepthViolation[] } {\n  const issues: DepthViolation[] = [];\n  if (!depthAssignments || depthAssignments.length === 0) return { ok: true, issues };\n\n  // Locate Concept Narratives section\n  const narrativesMatch = kxMarkdown.match(/##\\s*(?:\\[?REQUIRED\\]?\\s*)?(?:Concept Narratives|Khái niệm|Diễn giải)([\\s\\S]*?)(?=\\n##\\s+|$)/i);\n  const narrativeContent = narrativesMatch ? narrativesMatch[1] : kxMarkdown;\n\n  // Split narrative content by H3 subsections\n  const subRegex = /###\\s*([^\\n]+)\\n([\\s\\S]*?)(?=(?:###\\s*|$))/gi;\n  const subsections: Array<{ heading: string; body: string }> = [];\n  let sMatch: RegExpExecArray | null;\n  while ((sMatch = subRegex.exec(narrativeContent)) !== null) {\n    subsections.push({ heading: sMatch[1].trim(), body: sMatch[2].trim() });\n  }\n\n  for (const assignment of depthAssignments) {\n    const depth = (assignment.depth || '').toLowerCase();\n    const nodeId = assignment.node_id;\n    const nodeNormalized = nodeId.toLowerCase().replace(/[^a-z0-9]/g, '');\n\n    // Match subsection by node ID or heading keywords\n    const sub = subsections.find(s => {\n      const hNorm = s.heading.toLowerCase().replace(/[^a-z0-9]/g, '');\n      return hNorm.includes(nodeNormalized) || nodeNormalized.includes(hNorm);\n    });\n\n    // If subsection found, verify fenced code blocks\n    if (sub) {\n      const fenceMatches = sub.body.match(/```[a-zA-Z0-9_\\-]*\\n[\\s\\S]*?```/g) || [];\n      const codeBlockCount = fenceMatches.length;\n\n      if (depth === 'sio' && codeBlockCount === 0) {\n        issues.push({\n          nodeId,\n          depth,\n          severity: 'ERROR',\n          message: `SIO node \"${nodeId}\" under heading \"${sub.heading}\" MUST include at least 1 concrete implementation code block.`,\n        });\n      } else if (depth === 'ulo' && codeBlockCount > 0) {\n        issues.push({\n          nodeId,\n          depth,\n          severity: 'WARNING',\n          message: `ULO node \"${nodeId}\" under heading \"${sub.heading}\" should be technology-independent WHAT+WHY; found ${codeBlockCount} code block(s).`,\n        });\n      }\n    }\n  }\n\n  const hasErrors = issues.some(i => i.severity === 'ERROR');\n  return { ok: !hasErrors, issues };\n}\n\nexport function buildDomainLexiconGuardrail(techStack?: string, hardwarePlatform?: string): string {\n  const targetTech = (techStack || '').trim();\n  const targetHw = (hardwarePlatform || '').trim();\n  const platformAnchor = [targetTech, targetHw].filter(Boolean).join(' | ');\n\n  if (!platformAnchor) {\n    return `- 🔒 TECHNICAL DOMAIN ANCHOR: Strictly adhere to the declared curriculum domain. Use ONLY native, standard, idiomatic syntax and mechanisms. Strictly FORBIDDEN from using foreign paradigms, cross-domain jargon, or hallucinated APIs.`;\n  }\n\n  return `- 🔒 STRICT DOMAIN & TECHNICAL PLATFORM ANCHOR:\n  • Declared Platform: \"${platformAnchor}\"\n  • NATIVE PARADIGM ONLY: You MUST strictly use standard, idiomatic syntax, conventions, naming patterns, and mental models of \"${platformAnchor}\".\n  • ANTI-CONTAMINATION INVARIANT: Strictly FORBIDDEN from importing or using syntax, units, keywords, tags, or concepts from unrelated/foreign ecosystems (e.g., do NOT leak Web/HTML/CSS tags or units into native mobile/embedded stacks, do NOT leak dynamic scripting into statically typed systems, do NOT use hardware/circuit terminology in pure-software courses).\n  • REAL APIS ONLY: Every method, modifier, property, and API referenced must exist in the standard SDK of \"${platformAnchor}\".`;\n}\n\nfunction buildSystemPrompt(targetLanguage = 'vi', techStack?: string, hardwarePlatform?: string): string {\n  const langDirective = buildLanguageDirective(targetLanguage);\n  const domainGuardrails = buildDomainLexiconGuardrail(techStack, hardwarePlatform);\n  return [\n    'You write KNOWLEDGE_EXPOSITION: self-study reading material for a student in a teacherless program.',\n    'Rules:',\n    '1. Cover EXACTLY the scoped keywords and concepts — nothing beyond the session scope.',\n    '2. Every Key Term definition must be consistent with the glossary entry provided.',\n    '3. IDENTIFIER GROUND TRUTH: glossary/keyword names are pedagogical concept labels — NEVER derive code identifier casing or spelling from them. In code samples, copy identifiers EXACTLY from the REFERENCE_PACK ground truth (e.g. the standard library function is `print` lowercase; \"Print\" as a topic label is not an API symbol).',\n    '4. Respect each concept depth target (ULO/CIO/SIO) — do not overshoot.',\n    '5. Student-facing only: no teacher instructions, no classroom management text.',\n    '6. Output the full markdown document following the provided section skeleton exactly (headers and placeholders preserved).',\n    domainGuardrails,\n    langDirective,\n  ].join('\\n');\n}\n\nexport function buildUserPrompt(\n  session: SessionPlan,\n  plan: CurriculumPlan,\n  glossary: Array<{ term: string; definition?: string; example?: string }>,\n  targetLanguage = 'vi',\n  refPack?: string,\n): string {\n  const depthLines = session.depth_assignments\n    .map((d) => '- ' + d.node_id + ' [' + d.depth.toUpperCase() + ']: ' + DEPTH_RULES[d.depth])\n    .join('\\n');\n  const termLines = glossary\n    .map((g) => '- ' + g.term + (g.definition ? ' — ' + g.definition : '') + (g.example ? ' (example: ' + g.example + ')' : ''))\n    .join('\\n');\n\n  // P53 — heading defaults derived from the KX template's own echo (single\n  // source); the inline fallback map that lived here is deleted.\n  const headings = extractSectionHeadings('KNOWLEDGE_EXPOSITION');\n\n  const hScope = headings['Session Scope'] || 'Session Scope';\n  const hTerms = headings['Key Terms'] || 'Key Terms';\n  const hNarratives = headings['Concept Narratives'] || 'Concept Narratives';\n  const hExamples = headings['Worked Micro-Examples'] || 'Worked Micro-Examples';\n  const hMistakes = headings['Common Mistakes'] || 'Common Mistakes';\n  const hQuestions = headings['Self-Check Questions'] || 'Self-Check Questions';\n\n  const skeleton = `## ${hScope} / ## ${hTerms} / ## ${hNarratives} / ## ${hExamples} / ## ${hMistakes} / ## ${hQuestions}`;\n  const headingDirective = buildHeadingDirective('KNOWLEDGE_EXPOSITION');\n\n  // 5-Whys RC-vacuum: technical ground truth. Without versions/APIs in the\n  // prompt the model regresses to pretrained facts (\"Xcode 15\" vs RefPack's\n  // \"Xcode 16\"). The block is BINDING: contradicting it is a judge failure.\n  let refPackBlock = '';\n  if (refPack && refPack.trim()) {\n    const refExcerpt = buildSectionAwareExcerpt(refPack, {\n      priorities: [\n        'technicalOverviewArchitectureBlueprint',\n        'hardwarePinout',\n        'standardsAlignment',\n      ],\n      budget: 2500,\n    }).excerpt;\n    if (refExcerpt) {\n      refPackBlock = [\n        '',\n        '[GROUND TRUTH — BINDING, from REFERENCE_PACK.md]:',\n        'Tool versions, APIs, and platform facts below are CANONICAL. Do NOT',\n        'contradict them; do NOT substitute versions from memory. If a fact you',\n        'need is not stated here, stay generic rather than inventing specifics.',\n        '',\n        refExcerpt,\n      ].join('\\n');\n    }\n  }\n\n  const prereqKeywords = session.prerequisite_keywords || [];\n  const prereqBlock = prereqKeywords.length > 0\n    ? [\n        'Prerequisite keywords (ALREADY TAUGHT — assume known, DO NOT re-explain):',\n        prereqKeywords.join(', '),\n        '',\n        'CRITICAL: If a concept was already covered in a previous session (listed above),',\n        'reference it briefly (\"as covered earlier\") but do NOT provide a full explanation.',\n        'Focus 90% of narrative depth on THIS session\\'s new_keywords only.',\n      ].join('\\n')\n    : 'Prerequisite keywords (assume known): (none)';\n\n  return [\n    'Session: ' + session.id + ' — ' + session.title,\n    'Objective: ' + session.prose_objective,\n    'New keywords: ' + (session.new_keywords.join(', ') || '(none)'),\n    prereqBlock,\n    'Exit evidence: ' + session.exit_evidence.join('; '),\n    '',\n    'Depth targets per concept:',\n    depthLines,\n    '',\n    (() => {\n      const parts: string[] = [];\n      for (const assignment of (session.depth_assignments || [])) {\n        const dc = assignment.depth_context;\n        const displayName = assignment.node_name || assignment.node_id;\n        if (assignment.depth === 'sio' && dc?.sio && dc.sio.length > 0) {\n          parts.push(\n            `SIO Implementation Tasks for \"${displayName}\" (MUST be covered with concrete code):\\n` +\n            dc.sio.map((s, i) => `  ${i + 1}. ${s}`).join('\\n')\n          );\n        } else if (assignment.depth === 'cio' && dc?.cio) {\n          parts.push(\n            `CIO Mechanism for \"${displayName}\": ${dc.cio.slice(0, 200)}`\n          );\n        } else if (assignment.depth === 'ulo' && dc?.ulo) {\n          parts.push(\n            `ULO Learning Outcome for \"${displayName}\": ${dc.ulo.slice(0, 200)}`\n          );\n        }\n      }\n      return parts.length > 0 ? parts.join('\\n\\n') + '\\n' : '';\n    })(),\n    'Glossary terms (definitions are canonical):',\n    termLines || '(none provided — write definitions and mark them for glossary sync)',\n    refPackBlock,\n    '',\n    'Section skeleton to fill (replace ONLY the {{placeholders}}):',\n    skeleton,\n    headingDirective ? '\\n' + headingDirective : '',\n    'Plan hash: ' + plan.plan_hash,\n  ].filter(Boolean).join('\\n');\n}\n\nexport interface GenerateExpositionOptions {\n  projectId: string;\n  lessonCode: string;\n  plan: CurriculumPlan;\n  glossary: Array<{ term: string; definition?: string; example?: string }>;\n  llmFn: ExpositionLlmFn;\n  storage: ExpositionStorage;\n  gates?: ResolvedGateSettings;\n  targetLanguage?: string;\n  techStack?: string;\n  hardwarePlatform?: string;\n  /** REFERENCE_PACK.md raw content — technical ground truth (versions, APIs).\n   *  5-Whys RC-vacuum: without it the KX model regresses to pretrained facts. */\n  refPack?: string;\n  /** 5-Whys RC-canonicality: canonical PRODUCT_SPEC fields so KX does not\n   *  re-decide the deliverable shape that LESSON/satellites already share. */\n  productSpec?: { deliverableTemplate?: string; primaryLanguage?: string };\n}\n\nexport interface ExpositionResult {\n  relPath: string;\n  content: string;\n  reused: boolean;\n  gateMode: 'OFF' | 'LLM_JUDGE' | 'HITL';\n}\n\n/**\n * Generate (or reuse) the KNOWLEDGE_EXPOSITION for one lesson.\n * Throws ExpositionApprovalError when the plan is not approved or approval\n * hash mismatches the current plan — callers must NOT proceed to LESSON.\n */\nexport async function ensureKnowledgeExposition(options: GenerateExpositionOptions): Promise<ExpositionResult> {\n  const { projectId, lessonCode, plan, glossary, llmFn, storage, techStack, hardwarePlatform, refPack } = options;\n  const session = plan.sessions.find((s) => s.id === lessonCode);\n  if (!session) throw new Error('Session ' + lessonCode + ' not found in plan ' + plan.plan_id);\n\n  // Auto-derive prerequisite keywords from preceding sessions if not already populated\n  const sessionIndex = plan.sessions.findIndex((s) => s.id === lessonCode);\n  if (!session.prerequisite_keywords || session.prerequisite_keywords.length === 0) {\n    const derivedPrereqs: string[] = [];\n    for (let i = 0; i < sessionIndex; i++) {\n      derivedPrereqs.push(...(plan.sessions[i].new_keywords || []));\n    }\n    session.prerequisite_keywords = derivedPrereqs.slice(-15);\n  }\n\n  const existing = await storage.readArtifact(projectId, EXPOSITION_REL(lessonCode));\n  if (isExpositionFresh(existing, plan, lessonCode)) {\n    return { relPath: EXPOSITION_REL(lessonCode), content: existing!, reused: true, gateMode: gateModeFor(options.gates ?? ({} as ResolvedGateSettings), 'KNOWLEDGE_EXPOSITION') };\n  }\n\n  // Fail-closed approval check (only needed when regenerating)\n  if (plan.approval.status !== 'approved') {\n    throw new ExpositionApprovalError('Plan ' + plan.plan_id + ' is not approved — approve CURRICULUM_FRAMEWORK before generating KNOWLEDGE_EXPOSITION');\n  }\n  if (plan.approval.plan_hash !== plan.plan_hash) {\n    throw new ExpositionApprovalError('Approval hash ' + plan.approval.plan_hash + ' does not match current plan hash ' + plan.plan_hash + ' — re-approve after plan changes');\n  }\n\n  const targetLanguage = options.targetLanguage || plan.translation?.target_language || 'vi';\n  // Build ONCE so generation and any judge repair round share the exact same\n  // spec (5-Whys RC-repair: the repair path previously discarded this input).\n  const originalSystemPrompt = buildSystemPrompt(targetLanguage, techStack, hardwarePlatform);\n  // 5-Whys RC-canonicality: KX receives the SAME canonical PRODUCT_SPEC block\n  // as LESSON/satellites so it cannot re-decide deliverable shape (the \"both\n  // templates\" hedge came exactly from this vacuum).\n  const productSpecBlock = buildProductSpecBlock({\n    refPack,\n    briefing: techStack || hardwarePlatform ? { techStack, hardwarePlatform } : undefined,\n    overrides: options.productSpec,\n    skipToolchainList: true, // same RefPack excerpt already in [GROUND TRUTH]\n  });\n  const originalUserPrompt = buildUserPrompt(session, plan, glossary, targetLanguage, refPack)\n    + (productSpecBlock ? '\\n\\n' + productSpecBlock : '');\n  const content = (await llmFn(\n    originalSystemPrompt,\n    originalUserPrompt,\n  )).trim();\n\n  if (content.length < 200) {\n    throw new Error('EXPOSITION too short for ' + lessonCode + ' (' + content.length + ' chars) — refusing to save');\n  }\n\n  const hasKeyTerms = content.includes('Key Terms') || content.includes('Thuật ngữ');\n  const hasNarratives = content.includes('Concept Narratives') || content.includes('Khái niệm') || content.includes('Diễn giải');\n  const hasSelfCheck = content.includes('Self-Check') || content.includes('Tự kiểm tra') || content.includes('Câu hỏi');\n  if (!hasKeyTerms || !hasNarratives || !hasSelfCheck) {\n    throw new Error('EXPOSITION missing required sections for ' + lessonCode + ' — refusing to save');\n  }\n\n  // Gate: KNOWLEDGE_EXPOSITION default LLM_JUDGE — focused checks on scope,\n  // glossary consistency and depth adherence. Fail-closed: failing verdict\n  // triggers one repair round, then throws with the critique.\n  // 5-Whys RC-repair: the repair call previously discarded the ENTIRE original\n  // user prompt (session scope, depth rules, skeleton) — the model repaired\n  // against a degraded spec. Repair now re-sends the original input with the\n  // flawed draft + critique appended.\n  const gateMode = gateModeFor(options.gates ?? ({} as ResolvedGateSettings), 'KNOWLEDGE_EXPOSITION');\n  let finalContent = content;\n  if (gateMode === 'LLM_JUDGE') {\n    const judgeOnce = async (candidate: string): Promise<{ verdict: string; score: number; critique: string }> => {\n      const judgePrompt = [\n        'Judge this KNOWLEDGE_EXPOSITION document for session ' + lessonCode + '.',\n        'Plan scope: nodes=' + session.node_ids.join(',') + '; new keywords=' + session.new_keywords.join(',') + '; depth targets=' + session.depth_assignments.map((d) => d.node_id + ':' + d.depth).join(','),\n        'Glossary terms that MUST be covered: ' + (glossary.map((g) => g.term).join(', ') || '(none scoped)'),\n        'Check: (1) covers every scoped keyword and concept, (2) NO content beyond session scope, (3) depth of each concept matches its target (ulo=what+why, cio=+how, sio=+specific), (4) student-facing self-study tone.',\n        'Reply ONLY JSON: {\"verdict\":\"APPROVED|NEEDS_REVISION|REJECTED\",\"score\":0-100,\"critique\":\"one paragraph\"}',\n        '',\n        '--- DOCUMENT ---',\n        candidate,\n      ].join('\\n');\n      const raw = await llmFn('You are a strict curriculum judge. Output JSON only.', judgePrompt);\n      const match = raw.match(/\\{[\\s\\S]*\\}/);\n      if (!match) return { verdict: 'NEEDS_REVISION', score: 0, critique: 'Judge returned non-JSON output' };\n      const parsed = JSON.parse(match[0]) as { verdict?: string; score?: number; critique?: string };\n      return { verdict: parsed.verdict ?? 'NEEDS_REVISION', score: parsed.score ?? 0, critique: parsed.critique ?? '' };\n    };\n    // 5-Whys RC-assertion: run DETERMINISTIC validators BEFORE the LLM judge.\n    // Mechanically checkable invariants (CJK purity, version ground truth,\n    // session scope) must not depend on a free-tier model noticing them.\n    const scopedKeywords = [\n      ...session.new_keywords,\n      ...glossary.map((g) => g.term),\n    ];\n    const runDeterministic = (candidate: string) => {\n      const basic = validateArtifactDeterministic({\n        content: candidate,\n        refPack,\n        scopedKeywords,\n      });\n      const depthCheck = validateDepthCompliance(candidate, session.depth_assignments);\n      const issues = [...basic.issues];\n      for (const dIssue of depthCheck.issues) {\n        if (dIssue.severity === 'ERROR') {\n          issues.push({\n            code: 'scope-drift' as const,\n            detail: `[DEPTH_NON_COMPLIANCE] ${dIssue.message}`,\n            evidence: [dIssue.nodeId],\n          });\n        }\n      }\n      return { ok: issues.length === 0, issues };\n    };\n\n    let det = runDeterministic(finalContent);\n    let verdict = det.ok ? await judgeOnce(finalContent) : { verdict: 'NEEDS_REVISION' as const, score: 0, critique: validatorRepairPrompt(det.issues) };\n    if (verdict.verdict !== 'APPROVED') {\n      const repairPrompt = [\n        originalUserPrompt,\n        '',\n        '--- YOUR PREVIOUS DRAFT (REJECTED, fix ALL issues below) ---',\n        finalContent,\n        '',\n        '--- CRITIQUE (fix ALL issues, output the COMPLETE corrected document) ---',\n        verdict.critique,\n      ].join('\\n');\n      finalContent = (await llmFn(originalSystemPrompt, repairPrompt)).trim();\n      // Deterministic gate runs again after repair; LLM judge re-runs only if mechanics pass.\n      det = runDeterministic(finalContent);\n      verdict = det.ok ? await judgeOnce(finalContent) : { verdict: 'NEEDS_REVISION' as const, score: 0, critique: validatorRepairPrompt(det.issues) };\n    }\n    if (verdict.verdict !== 'APPROVED') {\n      throw new Error('EXPOSITION failed judge for ' + lessonCode + ' (verdict ' + verdict.verdict + ', score ' + verdict.score + '): ' + verdict.critique);\n    }\n  }\n\n  const stamped = finalContent\n    + '\\n---\\nplan_hash: \"' + plan.plan_hash + '\"'\n    + '\\n- **Plan reference:** ' + plan.plan_hash\n    + '\\n- **Last Updated:** ' + new Date().toISOString() + '\\n';\n  await storage.saveArtifact(projectId, EXPOSITION_REL(lessonCode), stamped);\n  return { relPath: EXPOSITION_REL(lessonCode), content: stamped, reused: false, gateMode: gateModeFor(options.gates ?? ({} as ResolvedGateSettings), 'KNOWLEDGE_EXPOSITION') };\n}\n\nimport { buildExpositionExcerpt, buildSectionAwareExcerpt } from './contextBuilder';\nimport { validateArtifactDeterministic, validatorRepairPrompt } from './artifactValidators';\nimport { buildProductSpecBlock } from './productSpec';\n\n/** Build a compact exposition context block for LESSON / satellite prompts. */\nexport function buildExpositionContext(expositionContent: string, maxChars = 6000): string {\n  if (!expositionContent || !expositionContent.trim()) return '';\n  return buildExpositionExcerpt(expositionContent, { budget: maxChars }).excerpt;\n}\n\n/** Integrity hash helper for cache bookkeeping. */\nexport function expositionCacheKey(planHash: string, lessonCode: string): string {\n  return createHash('sha256').update(planHash + '|' + lessonCode).digest('hex').slice(0, 16);\n}\n\n// ─── Composer/produce integration (lazy import to avoid cycles) ─────────────\n\nimport type { ICurriculumStorage } from '../storage';\n\n/**\n * End-to-end helper for the produce flow: read plan + glossary from SOT\n * storage, ensure approval, generate/reuse the EXPOSITION, return a compact\n * context block. Returns null when no plan exists (legacy flow) — callers\n * render that state explicitly in telemetry, never silently.\n */\nexport async function ensureExpositionForLesson(\n  storage: ICurriculumStorage,\n  projectId: string,\n  lessonCode: string,\n  options: {\n    gates?: ResolvedGateSettings;\n    force?: boolean;\n    targetLanguage?: string;\n    customInference?: import('../ai/streamRunner').StreamRunnerOptions['customInference'];\n    techStack?: string;\n    hardwarePlatform?: string;\n  } = {},\n): Promise<{ relPath: string; context: string; reused: boolean; rawContent?: string } | null> {\n  const planRaw = await storage.readArtifact(projectId, '_sot/CURRICULUM_PLAN.json');\n  if (!planRaw) return null; // legacy flow — explicit, logged by caller\n  const plan = validateCurriculumPlan(JSON.parse(planRaw)) as CurriculumPlan;\n  const session = plan.sessions.find((s) => s.id === lessonCode);\n  if (!session) return null; // plan exists but lesson outside plan — explicit\n\n  // Auto-derive prerequisite keywords from preceding sessions if not already populated\n  const sessionIndex = plan.sessions.findIndex((s) => s.id === lessonCode);\n  if (!session.prerequisite_keywords || session.prerequisite_keywords.length === 0) {\n    const derivedPrereqs: string[] = [];\n    for (let i = 0; i < sessionIndex; i++) {\n      derivedPrereqs.push(...(plan.sessions[i].new_keywords || []));\n    }\n    // Cap at 15 keywords max (take last 15 to stay focused on recent context)\n    session.prerequisite_keywords = derivedPrereqs.slice(-15);\n  }\n\n  let glossary: Array<{ term: string; definition?: string; example?: string }> = [];\n  const glossaryRaw = await storage.readArtifact(projectId, '_sot/GLOSSARY.json');\n  if (glossaryRaw) {\n    try { glossary = (JSON.parse(glossaryRaw) as { terms?: typeof glossary }).terms ?? []; } catch { glossary = []; }\n  }\n  const scopedTerms = new Set(plan.glossary_scope.find((g) => g.session_id === lessonCode)?.terms ?? []);\n  glossary = glossary.filter((g) => scopedTerms.has(g.term));\n\n  // Fail-open fallback: if scoped glossary is empty but session has new_keywords,\n  // inject matching terms from the full glossary as a safety net.\n  if (glossary.length === 0 && session.new_keywords?.length) {\n    const keywordsSet = new Set(\n      session.new_keywords.map((k) => k.toLowerCase())\n    );\n    const allTermsParsed = glossaryRaw\n      ? (JSON.parse(glossaryRaw) as { terms?: typeof glossary }).terms ?? []\n      : [];\n    glossary = allTermsParsed.filter((g) =>\n      keywordsSet.has(g.term.toLowerCase())\n    );\n    if (glossary.length > 0) {\n      console.warn(\n        `[KX] Glossary scope miss for ${lessonCode} — ` +\n        `injected ${glossary.length} terms via keyword fallback`\n      );\n    }\n  }\n\n  // Extract platform context from Learner Profile or Framework if not explicitly given.\n  // 5-Whys RC-vacuum: the previous single regex failed on free-form Vietnamese\n  // markdown, silently downgrading the domain guardrail to its weak variant.\n  // Multiple patterns + a primary tool/IDE line from REFERENCE_PACK as fallback.\n  let hw = options.hardwarePlatform;\n  let tech = options.techStack;\n  if (!hw || !tech) {\n    try {\n      const lpRaw = await storage.readSotDocument(projectId, 'LEARNER_PROFILE.md');\n      if (lpRaw) {\n        const hwPatterns = [\n          // \"Cơ sở phần cứng (Hardware Ecosystem): Học sinh thực hành trên máy...\"\n          // — the audit: the old pattern captured the parenthetical label\n          // \"(Hardware Ecosystem):\" itself. Capture AFTER the closing paren + colon.\n          /\\([^)]*Ecosystem[^)]*\\)\\s*:\\s*([^\\n\\r]+)/i,\n          /(?:Student Equipment|Hardware|Platform|Thiết bị|Thiết bị học tập)\\s*(?:\\(|:|\\*)*\\s*([^\\n\\r]+?)(?:\\s*\\*\\*|[.).]?\\s*$)/i,\n          /(?:máy|device|machine)\\s+([^,.;\\n]{4,60}(?:M\\d|Intel|PC|computer|mini)[^,.;\\n]{0,30})/i,\n        ];\n        for (const p of hwPatterns) {\n          const m = lpRaw.match(p);\n          if (m && m[1] && !hw) {\n            const firstSentence = (m[1].split(/(?<=[.!?])\\s/)[0] || m[1]);\n            hw = firstSentence.replace(/\\*+/g, '').replace(/\\s+/g, ' ').trim().slice(0, 140);\n            break;\n          }\n        }\n      }\n      // Fallback: REFERENCE_PACK hardware ecosystem section (canonical ground truth).\n      if (!hw) {\n        const rpRaw = await storage.readSotDocument(projectId, 'REFERENCE_PACK.md');\n        if (rpRaw) {\n          const rp = rpRaw.match(/(?:School Lab|Thiết bị lớp học)[^\\n]*\\*\\*([^*]+(?:M\\d|Mac)[^*]*)\\*\\*/i);\n          if (rp && rp[1]) hw = rp[1].trim();\n        }\n      }\n    } catch {}\n  }\n\n  // REFERENCE_PACK ground truth — the KX prompt previously generated with ZERO\n  // technical facts; the model regressed to pretrained versions (\"Xcode 15\").\n  let refPackContent: string | undefined;\n  try {\n    refPackContent = (await storage.readSotDocument(projectId, 'REFERENCE_PACK.md')) || undefined;\n  } catch { refPackContent = undefined; }\n\n  const { runCurriculumAIInference } = await import('../ai/streamRunner');\n  const targetLang = options.targetLanguage || plan.translation?.target_language || 'vi';\n  const result = await ensureKnowledgeExposition({\n    projectId,\n    lessonCode,\n    plan,\n    glossary,\n    targetLanguage: targetLang,\n    techStack: tech,\n    hardwarePlatform: hw,\n    refPack: refPackContent,\n    llmFn: async (systemPrompt, userPrompt) => {\n      const runnerOpts = options.customInference ? { customInference: options.customInference } : {};\n      const out = await runCurriculumAIInference(\n        [{ role: 'user', content: userPrompt + '\\n\\n[SYSTEM RULES]:\\n' + systemPrompt }],\n        `You are generating KNOWLEDGE_EXPOSITION - canonical self-study knowledge for one session in ${targetLang === 'vi' ? 'VIETNAMESE' : targetLang}. Output the complete markdown document only.`,\n        runnerOpts,\n      );\n      return out;\n    },\n    storage,\n    gates: options.gates,\n  });\n  return { relPath: result.relPath, context: buildExpositionContext(result.content), reused: result.reused, rawContent: result.content };\n}\n","import type { PlanningNode, DependencyEdge } from '../schemas/curriculumPlanSchema';\nimport type { PackingSpec } from './curriculumPlannerService';\n\n/**\n * P52/T3.2+T3.3 — depth reconcile (plan P52, Gap 3).\n *\n * When the bottom-up minute total exceeds the course budget\n * (total_sessions × contentBudget), the planner historically had only one\n * way out: stretch time (part-sessions). The reconciler adds the missing\n * direction: LOWER KNOWLEDGE DEPTH along the Bruner spiral (SIO→CIO→ULO),\n * never below the ULO floor, never on core concepts (is_core → escalate).\n *\n * Pedagogical downgrade priority (least pedagogical loss first):\n *   1. `advanced` revisits (second pass — review, not first teach)\n *   2. SIO→CIO on LEAF concepts (no other concept depends on them)\n *   3. SIO→CIO on non-leaf non-core concepts\n *   4. CIO→ULO on leaf concepts\n *   5. CIO→ULO on non-leaf non-core concepts\n *\n * After each downgrade round the caller re-runs its fail-closed verifications\n * (teaching-order audit + ZPD) — the reconciler returns per-node evidence so\n * that re-audit has the exact change-set, and reports exhausted candidates as\n * a structured escalation (never a silent phase cut).\n */\n\nexport interface ReconcileCandidate {\n  nodeId: string;\n  fromDepth: 'ulo' | 'cio' | 'sio';\n  toDepth: 'ulo' | 'cio' | 'sio';\n  minutesSaved: number;\n  reason: string;\n}\n\nexport interface ReconcileResult {\n  /** true when total fit inside the budget without any downgrade. */\n  unchanged: boolean;\n  /** Applied downgrades in application order (fixed-point evidence). */\n  applied: ReconcileCandidate[];\n  /** Nodes mutated, for targeted re-audit by the caller. */\n  mutatedNodeIds: string[];\n  /** True when candidates were exhausted while still over budget. */\n  escalate: boolean;\n  deficitMinutes: number;\n}\n\n/** Priority tier of a downgrade — lower = applied earlier. */\nfunction tierOf(node: PlanningNode, isLeaf: boolean): number {\n  // Same advanced-revisit convention as the planner: __ADVxx ids.\n  if (node.phase_id !== '' && /__ADV\\d{2}$/.test(node.id)) return 1;\n  const depth = node.depth_hint ?? 'cio';\n  if (depth === 'sio') return isLeaf ? 2 : 3;\n  if (depth === 'cio') return isLeaf ? 4 : 5;\n  return -1; // ulo — floor, never downgraded\n}\n\n/**\n * Compute leaf-ness on the CONCEPT level: a concept is a leaf when no other\n * concept lists it as a prerequisite. Node-level attributes (introduce_aspect\n * advanced, __ADV ids) map back to their base concept id.\n */\nexport function classifyDepthCandidates(\n  nodes: PlanningNode[],\n  edges: DependencyEdge[],\n): Map<string, boolean> {\n  const baseConcept = (id: string): string => id.replace(/__(ADV|PREV)\\d{2}$/, '');\n  const conceptIds = new Set(nodes.filter((n) => n.kind === 'concept').map((n) => baseConcept(n.id)));\n  const hasDependent = new Set<string>();\n  for (const e of edges) {\n    if (e.kind !== 'knowledge') continue;\n    const from = baseConcept(e.from);\n    const to = baseConcept(e.to);\n    if (conceptIds.has(from) && conceptIds.has(to)) hasDependent.add(from);\n  }\n  const isLeaf = new Map<string, boolean>();\n  for (const n of nodes) {\n    if (n.kind !== 'concept') continue;\n    const base = baseConcept(n.id);\n    if (!isLeaf.has(base)) isLeaf.set(base, !hasDependent.has(base));\n  }\n  return isLeaf;\n}\n\n/**\n * Apply depth downgrades until total ≤ budget, the candidate pool is empty,\n * or MAX_ROUNDS is reached (fixed-point with a bounded loop — escalate on\n * non-convergence). Mutates `nodes` in place (minutes/depth_hint) and returns\n * the evidence.\n */\nexport function reconcilePlanDepth(\n  nodes: PlanningNode[],\n  edges: DependencyEdge[],\n  spec: PackingSpec,\n  budgetMinutes: number,\n): ReconcileResult {\n  const MAX_ROUNDS = 5;\n  const total = (): number => nodes.reduce((acc, n) => acc + n.estimated_minutes, 0);\n  const isLeaf = classifyDepthCandidates(nodes, edges);\n  const baseConcept = (id: string): string => id.replace(/__(ADV|PREV)\\d{2}$/, '');\n\n  const applied: ReconcileCandidate[] = [];\n  const mutated = new Set<string>();\n  let rounds = 0;\n\n  while (total() > budgetMinutes && rounds < MAX_ROUNDS) {\n    rounds++;\n    let overBy = total() - budgetMinutes;\n\n    type Ranked = ReconcileCandidate & { node: PlanningNode; tier: number; index: number };\n    const candidates: Ranked[] = [];\n    for (let i = 0; i < nodes.length; i++) {\n      const n = nodes[i]!;\n      if (n.kind !== 'concept') continue; // build work (product steps) has no depth to cut\n      if (n.is_core) continue; // T3.4: core concepts are never downgraded\n      if (n.depth_hint == null) continue; // never guess — only act on DECLARED depth\n      const base = baseConcept(n.id);\n      const leaf = isLeaf.get(base) ?? true;\n      const tier = tierOf(n, leaf);\n      if (tier < 0) continue; // ULO floor\n      // Skip nodes already carrying a pending downgrade from this round-set:\n      // depth_hint is the source of truth for the CURRENT depth.\n      const depth = n.depth_hint ?? 'cio';\n      const toDepth: 'ulo' | 'cio' = depth === 'sio' ? 'cio' : 'ulo';\n      const variants = n.depth_variants;\n      const target = variants ? variants[toDepth] : Math.max(5, Math.round(n.estimated_minutes * 0.6));\n      const saved = n.estimated_minutes - target;\n      if (saved <= 0) continue; // already at/below target — no gain\n      candidates.push({\n        nodeId: n.id,\n        fromDepth: depth,\n        toDepth,\n        minutesSaved: saved,\n        reason: n.depth_scaffold_candidates?.find((c) => c.to_depth === toDepth)?.reason\n          ?? `depth downgrade ${depth}→${toDepth} (tier ${tier}${leaf ? ', leaf' : ''})`,\n        node: n,\n        tier,\n        index: i,\n      });\n    }\n\n    if (candidates.length === 0) break;\n\n    // Least pedagogical loss first; within a tier, biggest saving first.\n    candidates.sort((a, b) => a.tier - b.tier || b.minutesSaved - a.minutesSaved);\n\n    for (const c of candidates) {\n      if (overBy <= 0) break;\n      const n = c.node;\n      const target = n.depth_variants ? n.depth_variants[c.toDepth] : Math.max(5, Math.round(n.estimated_minutes * 0.6));\n      const saved = n.estimated_minutes - target;\n      if (saved <= 0) continue;\n      n.estimated_minutes = target;\n      n.depth_hint = c.toDepth;\n      applied.push({ nodeId: n.id, fromDepth: c.fromDepth, toDepth: c.toDepth, minutesSaved: saved, reason: c.reason });\n      mutated.add(n.id);\n      overBy -= saved;\n    }\n  }\n\n  const finalTotal = total();\n  const deficitMinutes = Math.max(0, finalTotal - budgetMinutes);\n  return {\n    unchanged: applied.length === 0,\n    applied,\n    mutatedNodeIds: [...mutated],\n    escalate: deficitMinutes > 0,\n    deficitMinutes,\n  };\n}\n","import { createHash } from 'node:crypto';\nimport {\n  CurriculumPlanSchema, PlanningGraphSchema, type CurriculumPlan,\n  type PlanningGraph, type PlanningNode, type DependencyEdge,\n  type PlanConstraints, type TranslationPolicy, type BloomLevel, type DepthLevel,\n  type ZpdVerdict, type SessionZpdStatus, type ConceptSpiralEncounter,\n  type WalkingSkeleton, type MasteryGate, type UnitPlan,\n  type PrerequisiteDecision, type ConceptPrerequisiteEdge,\n  type PlanValidationIssue, type PlanValidationResult, type LoTimeEstimate,\n} from '../schemas/curriculumPlanSchema';\nimport {\n  SESSION_CUT_TOLERANCE,\n  MAX_NEW_CONCEPTS_PER_SESSION_K12,\n  MAX_NEW_CONCEPTS_PER_SESSION_ADULT,\n  FIRST_SESSION_MAX_NEW_CONCEPTS_BEGINNER,\n  MAX_NEW_KEYWORDS_PER_SESSION_K12,\n  SESSION_COGNITIVE_BUDGET_K12,\n  SESSION_COGNITIVE_BUDGET_ADULT,\n  FIRST_SESSION_COGNITIVE_BUDGET_BEGINNER,\n  WEIGHT_ULO,\n  WEIGHT_CIO,\n  WEIGHT_SIO,\n  DEFAULT_LO_WEIGHT,\n} from '../constants/pedagogy';\nimport { reconcilePlanDepth, type ReconcileResult } from './depthReconciler';\nimport { estimateByBundleTemplate, referenceFallbackEstimate, TIME_DIVERGENCE_THRESHOLD, aggregateBuffer } from './loTimeEstimator';\nimport { CurriculumError } from '../errors';\n\n/**\n * Curriculum Planner — turns a domain planning graph + constraints into a\n * validated CurriculumPlan (planner outputs [1]-[7] from the design doc).\n *\n * Deterministic-first: LLM is optional and only used for prose objectives via\n * the `llmFn` hook. Packing, depth and prereq/scaffold decisions are pure\n * functions — testable, replayable, no silent fallbacks.\n */\n\nexport interface PlannerLlmFn {\n  (systemPrompt: string, userPrompt: string): Promise<string>;\n}\n\nexport interface PlanOptions {\n  constraints: PlanConstraints;\n  translation?: TranslationPolicy;\n  /** Optional LLM for prose objectives; absent => deterministic templates. */\n  llmFn?: PlannerLlmFn;\n  /**\n   * LO time-estimation mode (plan 2026-10-09-lo-time-estimation-model-implementation-plan, phase B/C):\n   * - 'observe' (default): compute estimates, attach plan.time_estimates and\n   *   emit `time_estimate:` divergence warnings — NEVER mutates minutes.\n   * - 'authoritative': single price source (plan C1) — writes model minutes\n   *   back and regenerates depth_variants/depth_scaffold_candidates from the\n   *   estimator. Opt-in: the default flips only after data gate TC6 (step TC7);\n   *   reference data is still missing — see the plan.\n   */\n  time_estimate_mode?: 'observe' | 'authoritative';\n}\n\nexport interface PlanResult {\n  plan: CurriculumPlan;\n  warnings: string[];\n}\n\n// ─── helpers ────────────────────────────────────────────────────────────────\n\ntype Raw = Record<string, unknown>;\nconst asArr = (v: unknown): Raw[] => (Array.isArray(v) ? (v as Raw[]) : []);\nconst asStr = (v: unknown, dflt = ''): string => (typeof v === 'string' ? v : dflt);\nconst asNum = (v: unknown, dflt: number): number => (typeof v === 'number' && Number.isFinite(v) ? v : dflt);\nconst asStrArr = (v: unknown): string[] => (Array.isArray(v) ? v.filter((x): x is string => typeof x === 'string') : []);\n\nconst BLOOM_ORDER: BloomLevel[] = ['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create'];\n\nconst pad2 = (n: number): string => String(n).padStart(2, '0');\n\nfunction titleCase(s: string): string {\n  return s.replace(/[_-]+/g, ' ').trim().replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n// ─── Stage 0: tolerant normalization of raw domain-kit shapes ───────────────\n\n/**\n * Normalize any accepted input shape into a PlanningGraph.\n * Accepted: CurriculumFeed v2 (learning_nodes), knowledge_graph (concepts),\n * AssembledRoadmap (phases/milestones), raw project_graph (features/steps),\n * hybrid (concepts + features/roadmap + links). Throws on unusable input.\n */\nexport function normalizePlanningGraph(raw: unknown): PlanningGraph {\n  if (!raw || typeof raw !== 'object') throw new Error('Planner input graph is missing or not an object');\n  const r = raw as Raw;\n  const warnings: string[] = [];\n  const nodes: PlanningNode[] = [];\n  const edges: DependencyEdge[] = [];\n  const groupings: PlanningGraph['groupings'] = [];\n  const phases: PlanningGraph['phases'] = [];\n  let graphType: PlanningGraph['graph_type'] = 'project_graph';\n\n  if (Array.isArray(r.learning_nodes)) {\n    // ── CurriculumFeed v2 (preferred shape) ──\n    graphType = 'curriculum_feed';\n    for (const n of asArr(r.learning_nodes)) {\n      const kw = (n.keywords ?? {}) as Raw;\n      const scaff = (n.scaffolding ?? {}) as Raw;\n      nodes.push({\n        id: asStr(n.id),\n        kind: (asStr(n.kind, 'skill') as PlanningNode['kind']),\n        name: asStr(n.name, asStr(n.id)),\n        concept_codes: asStrArr(n.concept_codes),\n        keywords: asStrArr(kw.all),\n        new_keywords: asStrArr(kw.new),\n        prerequisite_keywords: asStrArr(kw.prerequisite),\n        estimated_minutes: Math.max(0, Math.round(asNum(n.estimated_minutes, 30))),\n        bloom_hint: (asStr(n.bloom_hint) || null) as PlanningNode['bloom_hint'],\n        depth_hint: (asStr(n.depth_hint) || null) as PlanningNode['depth_hint'],\n        completion_level: (asStr(n.completion_level, 'standard') as PlanningNode['completion_level']),\n        scaffold_candidates: asArr(scaff.scaffold_candidates).map((c) => ({\n          item: asStr(c.item),\n          reason: asStr(c.reason),\n          minutes_saved: Math.max(0, Math.round(asNum(c.minutes_saved, 0))),\n          suggest: (asStr(c.suggest, 'provide_full') as PlanningNode['scaffold_candidates'][number]['suggest']),\n        })),\n        references: asArr(n.references).map((ref) => ({ file: asStr(ref.file), evidence: asStr(ref.evidence) })).filter((ref) => ref.file),\n        phase_id: asStr(n.phase_id),\n        user_visible_deliverable: asStr(n.user_visible_deliverable),\n        depth_variants: (() => {\n          const dv = n.depth_variants as Raw | undefined;\n          if (!dv) return undefined;\n          return { ulo: Math.max(0, Math.round(asNum(dv.ulo, 0))), cio: Math.max(0, Math.round(asNum(dv.cio, 0))), sio: Math.max(0, Math.round(asNum(dv.sio, 0))) };\n        })(),\n        depth_scaffold_candidates: asArr(n.depth_scaffold_candidates).map((c) => ({\n          from_depth: (asStr(c.from_depth, 'sio') as 'ulo' | 'cio' | 'sio'),\n          to_depth: (asStr(c.to_depth, 'cio') as 'ulo' | 'cio' | 'sio'),\n          minutes_saved: Math.max(0, Math.round(asNum(c.minutes_saved, 0))),\n          reason: asStr(c.reason),\n        })),\n        depth_context: (() => {\n          const dc = n.depth_context as Raw | undefined;\n          if (!dc) return undefined;\n          return {\n            ulo: asStr(dc.ulo),\n            cio: asStr(dc.cio),\n            sio: asStrArr(dc.sio),\n          };\n        })(),\n        is_core: n.is_core === true,\n      });\n    }\n    for (const e of asArr(r.dependency_edges)) {\n      edges.push({\n        from: asStr(e.from),\n        to: asStr(e.to),\n        kind: (asStr(e.kind, 'knowledge') as DependencyEdge['kind']),\n        reason: asStr(e.reason),\n      });\n    }\n    for (const g of asArr(r.suggested_groupings)) {\n      groupings.push({ id: asStr(g.id), name: asStr(g.name, asStr(g.id)), node_ids: asStrArr(g.node_ids), rationale: asStr(g.rationale) });\n    }\n    for (const ph of asArr(r.phases)) {\n      phases.push({\n        id: asStr(ph.id),\n        order: Math.max(1, Math.round(asNum(ph.order, phases.length + 1))),\n        name: asStr(ph.name, asStr(ph.id)),\n        product_completion: asStr(ph.product_completion),\n        node_ids: asStrArr(ph.node_ids),\n      });\n    }\n  } else {\n    const concepts = asArr(r.concepts);\n    if (concepts.length > 0) {\n      // ── knowledge_graph / hybrid: concept nodes with prerequisite edges ──\n      graphType = Array.isArray(r.features) || Array.isArray(r.phases) ? 'hybrid_graph' : 'knowledge_graph';\n      for (const c of concepts) {\n        const pt = asArr(c.problem_types)[0];\n        nodes.push({\n          id: asStr(c.id),\n          kind: 'concept',\n          name: asStr(c.name, asStr(c.id)),\n          // standardized/proposed concept code (STEP_2_5) preferred over raw id\n          concept_codes: [asStr(c.code) || asStr(c.id)].filter(Boolean),\n          keywords: asStrArr(c.keywords),\n          new_keywords: [],\n          prerequisite_keywords: [],\n          estimated_minutes: Math.max(0, Math.round(asNum(c.estimated_minutes, 30))),\n          bloom_hint: (pt ? asStr(pt.bloom_level, 'Understand') : 'Understand') as BloomLevel,\n          depth_hint: (c.depth_hint ? asStr(c.depth_hint) : (c.depth ? asStr(c.depth) : null)) as DepthLevel | null,\n          completion_level: 'standard',\n          scaffold_candidates: [],\n          references: [],\n          phase_id: '',\n          user_visible_deliverable: '',\n          depth_context: (() => {\n            if (!c.ulo && !c.cio && !Array.isArray(c.sio)) return undefined;\n            return {\n              ulo: asStr(c.ulo),\n              cio: asStr(c.cio),\n              sio: asStrArr(c.sio),\n            };\n          })(),\n          is_core: false,\n        });\n        for (const p of asStrArr(c.prerequisites)) {\n          edges.push({ from: p, to: asStr(c.id), kind: 'knowledge', reason: 'concept prerequisite' });\n        }\n      }\n      let ci = 0;\n      for (const cat of asArr(r.categories)) {\n        ci += 1;\n        const ids = asStrArr(cat.concept_ids);\n        if (ids.length > 0) groupings.push({ id: asStr(cat.id, 'cat' + ci), name: asStr(cat.name, 'Category ' + ci), node_ids: ids, rationale: asStr(cat.description) });\n      }\n    }\n    if (Array.isArray(r.phases)) {\n      // ── AssembledRoadmap: phases → milestones ──\n      if (concepts.length === 0) graphType = 'project_graph';\n      for (const ph of asArr(r.phases)) {\n        const phName = asStr(ph.phase_name, 'Phase');\n        const msIds: string[] = [];\n        let prev = '';\n        for (const m of asArr(ph.milestones)) {\n          const id = asStr(m.id);\n          if (!id) continue;\n          msIds.push(id);\n          nodes.push({\n            id,\n            kind: 'skill',\n            name: asStr(m.name, id),\n            concept_codes: asStrArr(String(m.concept_code ?? '').split(',').map((s) => s.trim())).filter(Boolean),\n            keywords: asStrArr(m.all_keywords),\n            new_keywords: asStrArr(m.new_keywords),\n            prerequisite_keywords: asStrArr(m.prerequisite_keywords),\n            estimated_minutes: Math.max(0, Math.round(asNum(m.estimated_minutes, 45))),\n            bloom_hint: null,\n            depth_hint: null,\n            completion_level: 'standard',\n            scaffold_candidates: [],\n            references: [],\n            phase_id: '',\n            user_visible_deliverable: '',\n            is_core: false,\n          });\n          if (prev) edges.push({ from: prev, to: id, kind: 'task', reason: 'roadmap sequence' });\n          prev = id;\n        }\n        if (msIds.length > 0) {\n          const gid = asStr(ph.phase_id) ? 'P' + asStr(ph.phase_id) : phName;\n          groupings.push({ id: gid, name: phName, node_ids: msIds, rationale: asStr(ph.description ?? ph.target_outcome) });\n        }\n      }\n    } else if (concepts.length === 0 && Array.isArray(r.features)) {\n      // ── raw project_graph: features → steps ──\n      graphType = 'project_graph';\n      for (const f of asArr(r.features)) {\n        const fid = asStr(f.id);\n        const steps = asArr(f.steps);\n        let prev = '';\n        let stepCount = 0;\n        for (let i = 0; i < steps.length; i++) {\n          const s = steps[i];\n          const id = asStr(s.id, fid + '-S' + pad2(i + 1));\n          if (!asStr(s.id) && !fid) continue;\n          stepCount += 1;\n          nodes.push({\n            id,\n            kind: 'product_step',\n            name: asStr(s.name, id),\n            concept_codes: asStrArr(s.concept_codes),\n            keywords: asStrArr(s.keywords),\n            new_keywords: [],\n            prerequisite_keywords: [],\n            estimated_minutes: Math.max(0, Math.round(asNum(s.estimated_minutes, 45))),\n            bloom_hint: 'Apply',\n            depth_hint: null,\n            completion_level: 'standard',\n            scaffold_candidates: [],\n            references: [],\n            phase_id: '',\n            user_visible_deliverable: '',\n            is_core: false,\n          });\n          if (prev) edges.push({ from: prev, to: id, kind: 'task', reason: 'feature build order' });\n          prev = id;\n        }\n        if (stepCount === 0 && fid) {\n          nodes.push({ id: fid, kind: 'skill', name: asStr(f.name, fid), concept_codes: [], keywords: [], new_keywords: [], prerequisite_keywords: [], estimated_minutes: 45, bloom_hint: 'Apply', depth_hint: null, completion_level: 'standard', scaffold_candidates: [], references: [], phase_id: '', user_visible_deliverable: '', is_core: false });\n        }\n      }\n    }\n    // hybrid links: concept knowledge-edges into the feature's nodes\n    for (const l of asArr(r.links)) {\n      const conceptId = asStr(l.concept_id);\n      const featureId = asStr(l.feature_id);\n      if (!conceptId || !featureId) continue;\n      const target = nodes.find((n) => n.id === featureId) ?? nodes.find((n) => n.id.startsWith(featureId + '-'));\n      if (target) edges.push({ from: conceptId, to: target.id, kind: 'knowledge', reason: asStr(l.relationship, 'hybrid link') });\n    }\n  }\n\n  const validIds = new Set(nodes.map((n) => n.id).filter(Boolean));\n  const keptNodes = nodes.filter((n) => n.id);\n  const keptEdges = edges.filter((e) => validIds.has(e.from) && validIds.has(e.to) && e.from !== e.to);\n  const droppedEdges = edges.length - keptEdges.length;\n  if (droppedEdges > 0) warnings.push(droppedEdges + ' edge(s) dropped (unknown endpoint or self-loop)');\n  if (keptNodes.length === 0) throw new Error('Planner input produced zero planning nodes — unusable graph');\n  if (new Set(keptNodes.map((n) => n.id)).size !== keptNodes.length) throw new Error('Planning graph contains duplicate node ids');\n\n  return PlanningGraphSchema.parse({\n    graph_type: graphType,\n    warnings,\n    hallucination_count: Math.max(0, Math.round(asNum(r.hallucination_count, 0))),\n    nodes: keptNodes,\n    edges: keptEdges,\n    groupings,\n    phases,\n  });\n}\n\n// ─── Cycle guard + topo order (planner never trusts upstream ordering) ──────\n\nexport function assertAcyclic(nodes: PlanningNode[], edges: DependencyEdge[]): void {\n  const adj = new Map<string, string[]>();\n  for (const n of nodes) adj.set(n.id, []);\n  for (const e of edges) adj.get(e.to)!.push(e.from); // to depends on from\n  const state = new Map<string, 0 | 1 | 2>();\n  const stack: string[] = [];\n  const visit = (id: string): void => {\n    const st = state.get(id) ?? 0;\n    if (st === 1) {\n      const start = Math.max(0, stack.indexOf(id));\n      throw new Error('Dependency cycle detected: ' + [...stack.slice(start), id].join(' -> '));\n    }\n    if (st === 2) return;\n    state.set(id, 1);\n    stack.push(id);\n    for (const dep of adj.get(id) ?? []) visit(dep);\n    stack.pop();\n    state.set(id, 2);\n  };\n  for (const n of nodes) visit(n.id);\n}\n\nexport function topoSort(nodes: PlanningNode[], edges: DependencyEdge[]): string[] {\n  const indeg = new Map<string, number>(nodes.map((n) => [n.id, 0]));\n  const out = new Map<string, string[]>(nodes.map((n) => [n.id, []]));\n  for (const e of edges) { out.get(e.from)!.push(e.to); indeg.set(e.to, (indeg.get(e.to) ?? 0) + 1); }\n  const order: string[] = [];\n  const queue = nodes.filter((n) => (indeg.get(n.id) ?? 0) === 0).map((n) => n.id);\n  while (queue.length > 0) {\n    const id = queue.shift()!;\n    order.push(id);\n    for (const nxt of out.get(id) ?? []) {\n      const d = (indeg.get(nxt) ?? 1) - 1;\n      indeg.set(nxt, d);\n      if (d === 0) queue.push(nxt);\n    }\n  }\n  if (order.length !== nodes.length) throw new Error('Dependency cycle detected during topo sort');\n  return order;\n}\n\n// ─── Stage 1-2: course + unit structure ─────────────────────────────────────\n\nconst MAX_SESSION_NODES = 4;\n// 2026-09-19 (session-count closed loop): strand-guard thresholds — split a\n// node across a session boundary when the stranded gap is worth filling\n// (≥ 20m); the remainder only needs to clear sliver territory (≥ 5m) since\n// it OPENS the next session and keeps absorbing successors (continuation\n// warm-up, same machinery as oversized-node parts).\nconst STRAND_SPLIT_MIN_MINUTES = 20;\nconst STRAND_REST_MIN_MINUTES = 5;\n\ninterface UnitGrouping { key: string; name: string; orderedIds: string[]; rationale: string; phaseIds: string[]; productCompletion: string }\n\n/**\n * Estimated session count of a group: content minutes over the per-session\n * content budget, inflated by a bin-packing loss factor — nodes cannot be\n * split arbitrarily, so real packing always loses some budget per session\n * (observed ~15% on live runs). Without the factor a unit that estimates at\n * 11.4 sessions packs out to 14.\n */\nfunction groupSessionEstimate(g: UnitGrouping, nodeMinutes: Map<string, number>, sessionMinutes: number, overheadRatio: number): number {\n  const PACKING_LOSS = 1.15;\n  const total = g.orderedIds.reduce((acc, id) => acc + (nodeMinutes.get(id) || 45), 0);\n  const perSession = sessionMinutes * (1 - overheadRatio);\n  return Math.max(1, (total / Math.max(1, perSession)) * PACKING_LOSS);\n}\n\n/**\n * Merge consecutive phase groups into units sized by MINUTES (not node count):\n * a unit targets minSessions..maxSessions sessions of real content. A phase is\n * never split — an oversized phase becomes one big unit, never two halves.\n */\nfunction mergeGroupsIntoUnits(\n  groups: UnitGrouping[],\n  minSessions: number,\n  maxSessions: number,\n  nodeMinutes: Map<string, number>,\n  sessionMinutes: number,\n  overheadRatio: number,\n): UnitGrouping[] {\n  const merged: UnitGrouping[] = [];\n  let cur: UnitGrouping | null = null;\n  let span = 0;\n  for (const g of groups) {\n    const gSpan = groupSessionEstimate(g, nodeMinutes, sessionMinutes, overheadRatio);\n    // close current unit when the next group would overflow it; a whole phase\n    // that alone exceeds maxSessions stays alone rather than being split later\n    const overflow = cur !== null && span + gSpan > maxSessions + 1e-9;\n    if (overflow && cur) {\n      merged.push(cur);\n      cur = null;\n      span = 0;\n    }\n    if (!cur) {\n      cur = { key: g.key, name: g.name, orderedIds: [...g.orderedIds], rationale: g.rationale, phaseIds: [...g.phaseIds], productCompletion: g.productCompletion };\n    } else {\n      cur.orderedIds.push(...g.orderedIds);\n      cur.phaseIds.push(...g.phaseIds);\n      if (!cur.name.includes(g.name)) {\n        if (g.orderedIds.length > cur.orderedIds.length) {\n          cur.name = g.name.length <= 45 ? g.name : g.name.slice(0, 42).trim() + '...';\n        }\n      }\n      if (cur.name.length > 45) {\n        cur.name = cur.name.slice(0, 42).trim() + '...';\n      }\n      cur.productCompletion = cur.productCompletion || g.productCompletion;\n      cur.rationale = cur.rationale + ' + ' + g.rationale;\n    }\n    span += gSpan;\n  }\n  if (cur) merged.push(cur);\n  return merged;\n}\n\nfunction buildUnitGroupings(graph: PlanningGraph, orderedIds: string[]): UnitGrouping[] {\n  const pos = new Map(orderedIds.map((id, i) => [id, i]));\n  const result: UnitGrouping[] = [];\n  const covered = new Set<string>();\n  // Phase-driven: when the feed carries development phases, they ARE the\n  // teaching sequence and the unit backbone (progressive completion).\n  if (graph.phases.length > 0) {\n    const phases = [...graph.phases].sort((a, b) => a.order - b.order);\n    const phaseNodeIds = new Map(phases.map((p) => [p.id, p.node_ids.filter((id) => pos.has(id))]));\n    // nodes referenced by no phase (defensive — emitter fail-closes earlier)\n    const rest: string[] = orderedIds.filter((id) => !phases.some((p) => p.node_ids.includes(id)));\n    for (const ph of phases) {\n      const ids = phaseNodeIds.get(ph.id) ?? [];\n      if (ids.length === 0) continue;\n      for (const id of ids) {\n        if (covered.has(id)) throw new Error('Node ' + id + ' appears in multiple phases — cannot form units');\n        covered.add(id);\n      }\n      result.push({\n        key: ph.id,\n        name: ph.name,\n        orderedIds: [...ids].sort((a, b) => pos.get(a)! - pos.get(b)!),\n        rationale: ph.product_completion || 'Phase ' + ph.order + ' completion level',\n        phaseIds: [ph.id],\n        productCompletion: ph.product_completion,\n      });\n    }\n    if (rest.length > 0) {\n      for (let i = 0; i < rest.length; i += MAX_SESSION_NODES) {\n        const chunk = rest.slice(i, i + MAX_SESSION_NODES);\n        result.push({ key: 'R' + pad2(result.length + 1), name: 'Integration ' + pad2(result.length + 1), orderedIds: chunk, rationale: 'Nodes outside declared phases', phaseIds: [], productCompletion: '' });\n      }\n    }\n    if (result.length === 0) throw new Error('Planning graph produced no unit groupings');\n    return result;\n  }\n  const groupings = [...graph.groupings];\n  for (const g of groupings) {\n    const inGraph = g.node_ids.filter((id) => pos.has(id));\n    if (inGraph.length === 0) continue;\n    for (const id of inGraph) {\n      if (covered.has(id)) throw new Error('Node ' + id + ' appears in multiple groupings — cannot form units');\n      covered.add(id);\n    }\n    result.push({ key: g.id, name: g.name, orderedIds: [...inGraph].sort((a, b) => pos.get(a)! - pos.get(b)!), rationale: g.rationale || 'Domain grouping ' + g.id, phaseIds: [], productCompletion: '' });\n  }\n  const rest = orderedIds.filter((id) => !covered.has(id));\n  for (let i = 0; i < rest.length; i += MAX_SESSION_NODES) {\n    const chunk = rest.slice(i, i + MAX_SESSION_NODES);\n    result.push({ key: 'R' + pad2(result.length + 1), name: 'Unit ' + pad2(result.length + 1), orderedIds: chunk, rationale: 'Topo-order remainder grouping', phaseIds: [], productCompletion: '' });\n  }\n  if (result.length === 0) throw new Error('Planning graph produced no unit groupings');\n  return result;\n}\n\n// ─── Stage 3: session packing ───────────────────────────────────────────────\n\nexport interface PackingSpec {\n  contentBudget: number;\n  overheadMinutes: number;\n  sessionDurationMinutes: number;\n  ageBand?: [number, number];\n  /** 2026-09-18 RC-2: cognitive budget — max DISTINCT new concepts per\n   * session (Vygotsky ZPD constant). 0 disables the check.\n   * @deprecated Retained for backward-compat; prefer sessionCognitiveBudget (ADR-0007). */\n  maxNewConceptsPerSession?: number;\n  /** 2026-09-19 (age-band granularity gate): max DISTINCT new concepts for\n   * the FIRST teaching session of a BEGINNER course — 1.\n   * @deprecated Retained for backward-compat; prefer firstSessionCognitiveBudget (ADR-0007). */\n  firstSessionMaxNewConcepts?: number;\n  /** Language-exposure ceiling for K-12: max NEW keywords per session\n   * (noisy proxy — reported in zpd_status, never a hard gate). */\n  maxNewKeywordsPerSession?: number;\n  /** ADR-0007: Cognitive budget in points (ULO=3, CIO=2, SIO=1, fallback=2).\n   * K-12 default: 10 pts; Adult default: 15 pts. */\n  sessionCognitiveBudget?: number;\n  /** ADR-0007: Beginner first session cognitive budget (defaults to FIRST_SESSION_COGNITIVE_BUDGET_BEGINNER = 3 pts). */\n  firstSessionCognitiveBudget?: number;\n}\n\nexport function computePackingSpec(constraints: PlanConstraints): PackingSpec {\n  const overheadMinutes = Math.round(constraints.session_duration_minutes * constraints.overhead_ratio);\n  // K-12 age bands (upper bound ≤ 15) get the ZPD concept budget; adults keep\n  // the looser ADULT constant. Unknown/missing age bands fall back to K-12\n  // (stricter) — under-loading a session wastes minutes, over-loading one\n  // breaks cognition.\n  const upperAge = constraints.age_band?.[1];\n  const isAdult = upperAge !== undefined && upperAge > 15;\n  const maxNew = isAdult ? MAX_NEW_CONCEPTS_PER_SESSION_ADULT : MAX_NEW_CONCEPTS_PER_SESSION_K12;\n  // Age-band granularity gate (2026-09-19): beginners' FIRST session is\n  // capped at 1 new concept (it also carries environment setup); adults\n  // exempt. Keyword ceiling is K-12-only and evidence-only (noisy proxy).\n  const isBeginner = (constraints.entry_level ?? 'beginner') === 'beginner';\n  const sessionCognitiveBudget = isAdult ? SESSION_COGNITIVE_BUDGET_ADULT : SESSION_COGNITIVE_BUDGET_K12;\n  const firstSessionCognitiveBudget = !isAdult && isBeginner ? FIRST_SESSION_COGNITIVE_BUDGET_BEGINNER : undefined;\n\n  return {\n    contentBudget: constraints.session_duration_minutes - overheadMinutes,\n    overheadMinutes,\n    sessionDurationMinutes: constraints.session_duration_minutes,\n    ageBand: constraints.age_band,\n    maxNewConceptsPerSession: maxNew,\n    firstSessionMaxNewConcepts: !isAdult && isBeginner ? FIRST_SESSION_MAX_NEW_CONCEPTS_BEGINNER : undefined,\n    maxNewKeywordsPerSession: isAdult ? undefined : MAX_NEW_KEYWORDS_PER_SESSION_K12,\n    sessionCognitiveBudget,\n    firstSessionCognitiveBudget,\n  };\n}\n\ninterface PackedEntry {\n  id: string;\n  minutes: number;\n  nominal_minutes?: number;\n  part: number;\n  totalParts: number;\n}\n\nexport interface PackedSession {\n  groupId: string;\n  nodeIds: string[];\n  entries: PackedEntry[];\n  knowledgeMinutes: number;\n  practiceMinutes: number;\n  oversized: boolean;\n  /** Distinct NEW concepts counted against the ZPD budget at flush time —\n   * product sessions legitimately restate already-taught concepts, so the\n   * load that matters is what is unseen, not the concept_codes union. */\n  cognitiveNew: number;\n  /** ADR-0007: Cumulative cognitive load points for this session */\n  cognitiveLoad: number;\n}\n\nconst filledOf = (s: PackedSession): number => s.knowledgeMinutes + s.practiceMinutes;\n\n/**\n * P52/T2.2: when a node overflows the content budget, prefer ending the\n * session at the LATEST user-visible checkpoint whose cumulative minutes lie\n * in [budget×(1−TOLERANCE), budget] — ending mid-step with nothing to show\n * kills momentum. Returns the nodes displaced off the session tail so the\n * caller can requeue them (they must never be dropped). Multi-part entries\n * (oversized splits) are never displaced or used as cut anchors. With no\n * valid candidate the raw cut stands and a warning is recorded — the natural\n * trigger for the existing scaffold_candidates machinery.\n */\nfunction cutBackToCheckpoint(\n  current: PackedSession,\n  nodeById: Map<string, PlanningNode>,\n  spec: PackingSpec,\n  warnings: string[],\n): PlanningNode[] {\n  const budget = spec.contentBudget;\n  const minFill = budget * (1 - SESSION_CUT_TOLERANCE);\n  // hasPartAfter[i] = some multi-part entry sits at i+1..end — a cut before it\n  // would break the oversized-node continuation chain.\n  const hasPartAfter: boolean[] = new Array(current.entries.length).fill(false);\n  let seenPart = false;\n  for (let i = current.entries.length - 1; i >= 0; i--) {\n    hasPartAfter[i] = seenPart;\n    if (current.entries[i]!.totalParts > 1) seenPart = true;\n  }\n  let bestIdx = -1;\n  let cumulative = 0;\n  for (let i = 0; i < current.entries.length; i++) {\n    const e = current.entries[i]!;\n    cumulative += e.minutes;\n    if (hasPartAfter[i] || e.totalParts > 1) continue;\n    const n = nodeById.get(e.id);\n    if (!n || n.user_visible_deliverable.trim().length === 0) continue;\n    if (cumulative > budget || cumulative < minFill) continue;\n    bestIdx = i; // last valid wins = cut closest to the budget\n  }\n  if (bestIdx < 0) {\n    warnings.push('no-checkpoint-within-tolerance: session cut at ' + filledOf(current) + 'm without a user-visible deliverable');\n    return [];\n  }\n  const displacedEntries = current.entries.splice(bestIdx + 1);\n  for (const e of displacedEntries) {\n    if (nodeById.get(e.id)?.kind === 'concept') current.knowledgeMinutes -= e.minutes;\n    else current.practiceMinutes -= e.minutes;\n  }\n  current.nodeIds = current.entries.map((e) => e.id);\n  return displacedEntries\n    .map((e) => nodeById.get(e.id))\n    .filter((n): n is PlanningNode => n != null);\n}\n\n// Exported (pure) for checkpoint-cut regression tests — P52/T2.2.\n/**\n * Coalesce eligibility (2026-09-18 regen4 audit): a merge must never break\n * the ZPD cognitive budget the packer enforces. Guard = the MERGED session's\n * unique new-concept count ≤ maxNew — the same invariant checkSessionZpd\n * enforces per session. A per-side check is NOT sufficient ({C1,C2} +\n * {C3,C4} passes per-side but merges to a 4-concept monster — exactly how\n * L01 got overloaded). When the guard blocks every candidate pair, sessions\n * stay separate and the shortfall is surfaced via warnings for HITL instead\n * of silently overloading sessions.\n */\n/**\n * 2026-09-19 (session-count closed loop): a spiral REVISIT node (C5__ADV03)\n * re-teaches an already-encountered concept at greater depth — pedagogically\n * it is known material, not new learning. Comparing raw codes made every\n * revisit count against the ZPD cap and block coalescing (regen8: 9\n * concept-only sessions of 24-40m at unit starts). Stripping the suffix\n * restores the semantics: revisit ≡ base concept for load accounting.\n * Coverage/gates elsewhere still see the distinct revisit code. Exported so\n * downstream evidence builders share the ONE normalization (5-WHY chain 2:\n * a single semantics for \"new concept\").\n */\nexport function zpdConceptKey(code: string): string {\n  return code.replace(/__ADV\\d+$/, '');\n}\n\n/**\n * THE one place that decides which concepts a session introduces as NEW vs\n * KNOWN. Semantics (shared by checkSessionZpd, the packer's cognitive flush,\n * coalesce, and the app's judge-evidence TRUE-counter):\n *   1. a session's concepts = distinct zpdConceptKey-normalized codes of its\n *      nodes (spiral revisits C5__ADV03 ≡ base C5 — revisiting is knowing);\n *   2. NEW = not present in the normalized seen set at session start, with\n *      the session-local union deduped in (repeat nodes on one concept don't\n *      double-count);\n *   3. the returned nextSeen set is the cumulative state to feed the NEXT\n *      session (add concepts, then update, never update-then-add).\n *\n * zpdConceptKey alone is the key NORMALIZATION; this function owns the\n * COUNTING so the packer and the ZPD checker cannot drift again (5-WHY\n * chain 2: two hand-rolled seen-set implementations disagreed on revisits).\n */\nexport function splitZpdConceptLoad<T extends { concept_codes?: readonly string[] | null } | readonly string[]>(\n  nodeIds: readonly string[],\n  nodeById: ReadonlyMap<string, T>,\n  seenBefore: ReadonlySet<string>,\n): { concepts: string[]; newConcepts: string[]; knownConcepts: string[]; nextSeen: Set<string> } {\n  // Node payloads come in two shapes: PlanningNode (.concept_codes) and the\n  // app's bare feed map (string[] directly). One function, both shapes.\n  const conceptsOf = (n: T | undefined): readonly string[] => {\n    if (n == null) return [];\n    if (Array.isArray(n as unknown)) return n as unknown as readonly string[];\n    return (n as { concept_codes?: readonly string[] | null }).concept_codes ?? [];\n  };\n  const concepts = [...new Set(nodeIds.flatMap((id) => conceptsOf(nodeById.get(id))).map(zpdConceptKey))];\n  const seenNorm = new Set([...seenBefore].map(zpdConceptKey));\n  const newConcepts = concepts.filter((c) => !seenNorm.has(c));\n  const knownConcepts = concepts.filter((c) => seenNorm.has(c));\n  const nextSeen = new Set([...seenBefore, ...concepts]);\n  return { concepts, newConcepts, knownConcepts, nextSeen };\n}\n\n/**\n * Resolves the Learning Objective (LO) abstraction level for a node:\n * - 'ulo': Universal / Conceptual understanding (Why) -> highest cognitive abstraction\n * - 'cio': Common / Algorithmic implementation (How) -> intermediate procedural design\n * - 'sio': Specific / Syntax execution (Action) -> concrete implementation\n */\nexport function getNodeLoType(node: PlanningNode | undefined | null): 'ulo' | 'cio' | 'sio' | undefined {\n  if (!node) return undefined;\n  if (node.depth_hint === 'ulo' || node.depth_hint === 'cio' || node.depth_hint === 'sio') {\n    return node.depth_hint;\n  }\n  const id = (node.id || '').toUpperCase();\n  if (/(^|[_-])ULO([_-]|$)/.test(id)) return 'ulo';\n  if (/(^|[_-])CIO([_-]|$)/.test(id)) return 'cio';\n  if (/(^|[_-])SIO([_-]|$)/.test(id)) return 'sio';\n  if (node.depth_context) {\n    if (node.depth_context.ulo) return 'ulo';\n    if (node.depth_context.cio) return 'cio';\n    if (node.depth_context.sio && node.depth_context.sio.length > 0) return 'sio';\n  }\n  return undefined;\n}\n\n/**\n * Returns the cognitive weight for a node based on its LO type (ADR-0007).\n * Fallback to DEFAULT_LO_WEIGHT (2.0) if type is unspecified.\n */\nexport function getNodeCognitiveWeight(node: PlanningNode | undefined | null): number {\n  const loType = getNodeLoType(node);\n  switch (loType) {\n    case 'ulo':\n      return WEIGHT_ULO;\n    case 'cio':\n      return WEIGHT_CIO;\n    case 'sio':\n      return WEIGHT_SIO;\n    default:\n      return DEFAULT_LO_WEIGHT;\n  }\n}\n\n/**\n * Calculates total cognitive load points for a collection of nodes or node IDs (ADR-0007).\n */\nexport function calculateCognitiveLoad(\n  nodesOrIds: readonly (PlanningNode | string)[],\n  nodeById?: ReadonlyMap<string, PlanningNode>,\n): number {\n  let total = 0;\n  for (const item of nodesOrIds) {\n    const node = typeof item === 'string' ? nodeById?.get(item) : item;\n    total += getNodeCognitiveWeight(node);\n  }\n  return total;\n}\n\nexport function canCoalesceWithinZpdBudget(\n  curr: { nodeIds: string[] },\n  next: { nodeIds: string[] },\n  nodeById: Map<string, PlanningNode>,\n  maxNewOrBudget: number,\n): boolean {\n  if (maxNewOrBudget > 4) {\n    const mergedNodes = [...curr.nodeIds, ...next.nodeIds];\n    const learningNodes = mergedNodes.filter((nid) => {\n      const n = nodeById.get(nid);\n      const codes = n?.concept_codes || [];\n      return codes.length > 0 || n?.kind === 'concept';\n    });\n    const totalLoad = calculateCognitiveLoad(learningNodes, nodeById);\n    return totalLoad <= maxNewOrBudget;\n  }\n  const seen = new Set<string>();\n  for (const s of [curr, next]) {\n    for (const nid of s.nodeIds) {\n      for (const c of nodeById.get(nid)?.concept_codes || []) seen.add(zpdConceptKey(c));\n    }\n  }\n  return seen.size <= maxNewOrBudget;\n}\n\nexport function packUnitSessions(\n  group: UnitGrouping,\n  nodeById: Map<string, PlanningNode>,\n  spec: PackingSpec,\n  warnings: string[],\n  // Number of sessions already packed in EARLIER groups of this course. The\n  // beginner first-session cap applies to the course's FIRST session only —\n  // without the offset every unit's first session inherited the 1-concept\n  // cap and fragmented the plan (regen10: 31 packed sessions from 24).\n  sessionOffset = 0,\n): PackedSession[] {\n  const sessions: PackedSession[] = [];\n  const fresh = (): PackedSession => ({\n    groupId: group.key,\n    nodeIds: [],\n    entries: [],\n    knowledgeMinutes: 0,\n    practiceMinutes: 0,\n    oversized: false,\n    cognitiveNew: 0,\n    cognitiveLoad: 0,\n  });\n  let current = fresh();\n  // Course-wide seen state for new-count math — advanced ONLY via\n  // splitZpdConceptLoad.nextSeen at flush, exactly like checkSessionZpd.\n  let seenConcepts = new Set<string>();\n  const flush = () => {\n    if (current.entries.length > 0) {\n      // nextSeen includes the session's own concepts, so repeating a node\n      // within the session can't count its concept twice.\n      seenConcepts = splitZpdConceptLoad(current.nodeIds, nodeById, seenConcepts).nextSeen;\n      sessions.push(current);\n    }\n    current = fresh();\n  };\n  const filled = () => current.knowledgeMinutes + current.practiceMinutes;\n  const ids = [...group.orderedIds];\n  while (ids.length > 0) {\n    const id = ids.shift()!;\n    const node = nodeById.get(id)!;\n    const isKnowledge = node.kind === 'concept';\n    if (node.estimated_minutes > spec.contentBudget) {\n      // If the node is near the session boundary (e.g. 90m node vs 76m contentBudget in a 90m session),\n      // clamp to contentBudget so it occupies 1 full session instead of creating a tiny zombie split fragment.\n      if (node.estimated_minutes <= spec.sessionDurationMinutes || node.estimated_minutes <= spec.contentBudget * 1.25) {\n        if (current.entries.length > 0) flush();\n        const entry: PackedEntry = { id, minutes: spec.contentBudget, nominal_minutes: node.estimated_minutes, part: 1, totalParts: 1 };\n        if (isKnowledge) current.knowledgeMinutes += entry.minutes; else current.practiceMinutes += entry.minutes;\n        current.entries.push(entry);\n        current.nodeIds.push(id);\n        current.oversized = false;\n        flush();\n        continue;\n      }\n\n      // Split the oversized node into consecutive part-sessions so the full\n      // estimated time is scheduled (no silent clamping). Each part starts its\n      // own session — the continuation chain stays consecutive by construction.\n      const parts: number[] = [];\n      let remaining = node.estimated_minutes;\n      while (remaining > 0) {\n        const take = Math.min(remaining, spec.contentBudget);\n        parts.push(take);\n        remaining -= take;\n      }\n      warnings.push('Node ' + id + ' (' + node.estimated_minutes + 'm) spans ' + parts.length + ' consecutive sessions at ' + spec.contentBudget + 'm budget each');\n      for (let pi = 0; pi < parts.length; pi++) {\n        if (current.entries.length > 0) flush();\n        const entry: PackedEntry = { id, minutes: parts[pi]!, nominal_minutes: parts[pi]!, part: pi + 1, totalParts: parts.length };\n        if (isKnowledge) current.knowledgeMinutes += entry.minutes; else current.practiceMinutes += entry.minutes;\n        current.entries.push(entry);\n        current.nodeIds.push(id);\n        current.oversized = true;\n        if (filled() >= spec.contentBudget) flush();\n      }\n      continue;\n    }\n    const minutes = node.estimated_minutes;\n    // New = unseen before this session STARTS. The session-local union is\n    // included so repeat nodes on the same concept don't double-count —\n    // exactly checkSessionZpd's semantics.\n    const seenWithSession = new Set([...seenConcepts, ...current.nodeIds.flatMap((nid) => nodeById.get(nid)?.concept_codes || [])]);\n    const nodeNew = splitZpdConceptLoad([id], nodeById, seenWithSession).newConcepts.length;\n\n    // ADR-0007: Cognitive Load calculation by LO type weights\n    const nodeWeight = getNodeCognitiveWeight(node);\n    const isRepeatOfPriorSession = (node.concept_codes || []).length > 0 && (node.concept_codes || []).every((c) => seenConcepts.has(zpdConceptKey(c)));\n    const nodeLoad = isRepeatOfPriorSession ? 0 : ((isKnowledge || nodeNew > 0) ? nodeWeight : 0);\n\n    // ADR-0007: COGNITIVE flush before minute flush based on cognitive load budget points.\n    const isFirstSession = sessionOffset + sessions.length === 0;\n    const hasFirstSessionGate = isFirstSession && spec.firstSessionMaxNewConcepts !== undefined;\n    const cognitiveBudget = spec.sessionCognitiveBudget !== undefined\n      ? (hasFirstSessionGate && spec.firstSessionCognitiveBudget !== undefined\n        ? spec.firstSessionCognitiveBudget\n        : spec.sessionCognitiveBudget)\n      : (spec.maxNewConceptsPerSession !== undefined && spec.maxNewConceptsPerSession > 0\n        ? (hasFirstSessionGate && spec.firstSessionMaxNewConcepts !== undefined\n          ? spec.firstSessionMaxNewConcepts * DEFAULT_LO_WEIGHT\n          : spec.maxNewConceptsPerSession * DEFAULT_LO_WEIGHT)\n        : SESSION_COGNITIVE_BUDGET_K12);\n\n    if (\n      cognitiveBudget !== undefined && cognitiveBudget > 0 &&\n      current.entries.length > 0 &&\n      current.cognitiveLoad + nodeLoad > cognitiveBudget\n    ) {\n      warnings.push(`ZPD pack flush: session ${group.key}#${sessions.length + 1} cut at ${current.cognitiveLoad} cognitive points (budget ${cognitiveBudget})`);\n      flush();\n    }\n    if (current.entries.length > 0 && filled() + minutes > spec.contentBudget) {\n      // P52/T2.2: try to end this session at a user-visible checkpoint first.\n      // Displaced tail nodes AND the overflowing node are requeued in order\n      // (nothing dropped, teaching order preserved); the no-checkpoint path\n      // stays identical to the legacy raw-minute cut.\n      const displaced = cutBackToCheckpoint(current, nodeById, spec, warnings);\n      if (displaced.length > 0) {\n        ids.unshift(id); // overflowing node is re-placed AFTER the requeued tail\n        for (let di = displaced.length - 1; di >= 0; di--) ids.unshift(displaced[di]!.id);\n        flush();\n        continue;\n      }\n      // 2026-09-19 (session-count closed loop): STRAND GUARD. Without a\n      // checkpoint cut, flushing here strands the current session far below\n      // budget (regen8: 9 concept-only sessions of 24-40m at unit starts —\n      // the following step is 58-72m and can never fit the gap). Splitting\n      // the incoming node across the boundary reuses the oversized-node\n      // machinery: part 1 fills the strand to the budget, part 2 opens the\n      // next session and keeps absorbing (nothing dropped, order preserved,\n      // continuation chain consecutive).\n      const strandGap = spec.contentBudget - filled();\n      // Only a genuinely STRANDED session (less than half the budget filled)\n      // justifies splitting the incoming node; lightly-full sessions flush\n      // as before (splitting those fragmented plans and duplicated\n      // milestones — caught by curriculum-planner.test.ts).\n      if (filled() < spec.contentBudget * 0.5 && strandGap >= STRAND_SPLIT_MIN_MINUTES && minutes - strandGap >= STRAND_REST_MIN_MINUTES) {\n        warnings.push('strand-guard split: node ' + id + ' (' + minutes + 'm) fills a ' + strandGap + 'm strand gap, ' + (minutes - strandGap) + 'm continues next session');\n        if (isKnowledge) current.knowledgeMinutes += strandGap; else current.practiceMinutes += strandGap;\n        current.cognitiveNew += nodeNew;\n        current.cognitiveLoad += nodeLoad;\n        current.entries.push({ id, minutes: strandGap, nominal_minutes: strandGap, part: 1, totalParts: 2 });\n        current.nodeIds.push(id);\n        current.oversized = true;\n        flush();\n        const restMinutes = minutes - strandGap;\n        if (isKnowledge) current.knowledgeMinutes += restMinutes; else current.practiceMinutes += restMinutes;\n        current.entries.push({ id, minutes: restMinutes, nominal_minutes: restMinutes, part: 2, totalParts: 2 });\n        current.nodeIds.push(id);\n        if (filled() >= spec.contentBudget) flush();\n        continue;\n      }\n      flush();\n    }\n    if (isKnowledge) {\n      current.knowledgeMinutes += minutes;\n      current.cognitiveNew += nodeNew;\n      current.cognitiveLoad += nodeLoad;\n    } else {\n      current.practiceMinutes += minutes;\n      current.cognitiveNew += nodeNew;\n      current.cognitiveLoad += nodeLoad;\n    }\n    current.entries.push({ id, minutes, nominal_minutes: minutes, part: 1, totalParts: 1 });\n    current.nodeIds.push(id);\n    if (filled() >= spec.contentBudget && current.entries.length >= MAX_SESSION_NODES) {\n      flush();\n    } else if (!isKnowledge && current.entries.length < MAX_SESSION_NODES) {\n      // 2026-09-19 (regen6 audit): absorb the next knowledge node into this\n      // product session's spare minutes when it fits BOTH budgets. Flushing\n      // it alone strands up to half a session of paid time; with absorption\n      // a concept never opens a session of its own unless nothing can take\n      // it. Order-preserving: only the immediate next node is considered.\n      while (ids.length > 0 && current.entries.length < MAX_SESSION_NODES) {\n        const nxtId = ids[0]!;\n        const nxt = nodeById.get(nxtId);\n        if (!nxt || nxt.kind !== 'concept' || nxt.estimated_minutes > spec.contentBudget) break;\n        const seenWithNxt = new Set([...seenConcepts, ...current.nodeIds.flatMap((nid) => nodeById.get(nid)?.concept_codes || [])]);\n        const nxtNew = splitZpdConceptLoad([nxtId], nodeById, seenWithNxt).newConcepts.length;\n        const nxtWeight = getNodeCognitiveWeight(nxt);\n        const nxtRepeat = (nxt.concept_codes || []).length > 0 && (nxt.concept_codes || []).every((c) => seenConcepts.has(zpdConceptKey(c)));\n        const nxtLoad = nxtRepeat ? 0 : nxtWeight;\n\n        if (cognitiveBudget !== undefined && cognitiveBudget > 0 && current.cognitiveLoad + nxtLoad > cognitiveBudget) break;\n        if (filled() + nxt.estimated_minutes > spec.contentBudget) break;\n        ids.shift()!;\n        current.knowledgeMinutes += nxt.estimated_minutes;\n        current.cognitiveNew += nxtNew;\n        current.cognitiveLoad += nxtLoad;\n        current.entries.push({ id: nxtId, minutes: nxt.estimated_minutes, nominal_minutes: nxt.estimated_minutes, part: 1, totalParts: 1 });\n        current.nodeIds.push(nxtId);\n      }\n    }\n  }\n  flush();\n  return sessions;\n}\n\n/**\n * 2026-09-23 (swift-101 F5-S1): a node split across sessions (strand-guard /\n * oversized) must appear in exactly `totalParts` entries with parts in order\n * 1..totalParts, in the same or consecutive sessions (coalesce may merge the\n * parts into one session). The old seenNodes invariant only whitelisted\n * multi-part repeats — it could not catch a broken continuation chain (part 2\n * without part 1, non-consecutive parts, wrong part count), which downstream\n * consumers would read as a duplicate assignment.\n */\nexport function assertSplitPartsConsecutive(packed: PackedSession[]): void {\n  const progress = new Map<string, { part: number; totalParts: number; prevSession: number }>();\n  for (let i = 0; i < packed.length; i++) {\n    for (const e of packed[i]!.entries) {\n      if (e.totalParts <= 1) continue;\n      const prev = progress.get(e.id);\n      if (!prev) {\n        if (e.part !== 1) throw new Error('Split-parts violation: node ' + e.id + ' starts at part ' + e.part + '/' + e.totalParts + ' (must start at part 1)');\n      } else {\n        if (e.part !== prev.part + 1) throw new Error('Split-parts violation: node ' + e.id + ' jumps from part ' + prev.part + ' to part ' + e.part);\n        if (e.totalParts !== prev.totalParts) throw new Error('Split-parts violation: node ' + e.id + ' changes totalParts ' + prev.totalParts + ' → ' + e.totalParts + ' mid-chain');\n        // Same session is legal: the total_sessions coalesce may merge the\n        // part-1 and part-2 sessions into one (node taught in one block).\n        if (i !== prev.prevSession && i !== prev.prevSession + 1) throw new Error('Split-parts violation: node ' + e.id + ' part ' + e.part + ' is not in the same or immediately following session of part ' + prev.part);\n      }\n      progress.set(e.id, { part: e.part, totalParts: e.totalParts, prevSession: i });\n    }\n  }\n  for (const [id, p] of progress) {\n    if (p.part !== p.totalParts) throw new Error('Split-parts violation: node ' + id + ' chain ends at part ' + p.part + '/' + p.totalParts + ' (missing continuation)');\n  }\n}\n\n// ─── Stage 5: prerequisite + scaffold decisions (deterministic rules) ───────\n\ninterface SessionContext {\n  lessonCode: string;\n  sessionIndex: number;\n  nodeIds: string[];\n  packedMinutes: number;\n  contentBudget: number;\n}\n\nfunction decidePrerequisites(\n  session: SessionContext,\n  nodeById: Map<string, PlanningNode>,\n  edges: DependencyEdge[],\n  sessionIndexByNode: Map<string, number>,\n  sessionOrderByIndex: Map<number, string>,\n  constraints: PlanConstraints,\n): CurriculumPlan['sessions'][number]['prerequisite_decisions'] {\n  const decisions: CurriculumPlan['sessions'][number]['prerequisite_decisions'] = [];\n  const entryKw = new Set(constraints.entry_keywords.map((k) => k.toLowerCase()));\n  const inSession = new Set(session.nodeIds);\n  for (const nodeId of session.nodeIds) {\n    const node = nodeById.get(nodeId)!;\n    // Entry-level keyword mastery → not taught at all\n    const masteredKw = node.keywords.filter((k) => entryKw.has(k.toLowerCase()));\n    if (node.keywords.length > 0 && masteredKw.length === node.keywords.length) {\n      decisions.push({ node_id: nodeId, decision: 'mastered_before_course', reason: 'All keywords already mastered at entry level: ' + masteredKw.slice(0, 5).join(', ') });\n      continue;\n    }\n    const prereqEdges = edges.filter((e) => e.to === nodeId);\n    if (prereqEdges.length === 0) {\n      if (masteredKw.length > 0) {\n        decisions.push({ node_id: nodeId, decision: 'jit_introduce_in_lesson', reason: 'New material but builds on mastered keywords: ' + masteredKw.slice(0, 5).join(', ') });\n      }\n      continue;\n    }\n    const prior: string[] = [];\n    const sameSession: string[] = [];\n    const future: string[] = [];\n    for (const e of prereqEdges) {\n      const fromIdx = sessionIndexByNode.get(e.from);\n      if (fromIdx === undefined) { prior.push(e.from); continue; }\n      if (fromIdx < session.sessionIndex) prior.push(e.from);\n      else if (fromIdx === session.sessionIndex) sameSession.push(e.from);\n      else future.push(e.from);\n    }\n    if (future.length > 0) {\n      // Teaching-order violation: a prerequisite must be taught BEFORE (or with)\n      // its consumer — never after. Fail-closed: the plan would teach material\n      // it assumes known.\n      throw new Error(\n        'Teaching-order violation in session ' + session.lessonCode + ': prerequisite(s) '\n        + future.map((id) => nodeById.get(id)?.name ?? id).join('; ')\n        + ' are scheduled AFTER this session (prerequisite sessions must come first)',\n      );\n    }\n    if (prior.length > 0) {\n      decisions.push({ node_id: nodeId, decision: 'taught_in_prior_lesson', reason: 'Prerequisites taught earlier: ' + prior.map((id) => nodeById.get(id)?.name ?? id).join('; ') });\n    } else if (sameSession.length > 0) {\n      decisions.push({ node_id: nodeId, decision: 'recap_in_lesson', reason: 'Same-session prerequisites to recap first: ' + sameSession.map((id) => nodeById.get(id)?.name ?? id).join('; ') });\n    }\n  }\n  return decisions;\n}\n\nfunction decideScaffolds(\n  session: SessionContext,\n  nodeById: Map<string, PlanningNode>,\n  warnings: string[],\n): CurriculumPlan['sessions'][number]['scaffold_decisions'] {\n  const decisions: CurriculumPlan['sessions'][number]['scaffold_decisions'] = [];\n  const candidates = session.nodeIds.flatMap((id) => (nodeById.get(id)!.scaffold_candidates ?? []).map((c) => ({ ...c, nodeId: id })));\n  if (candidates.length === 0) return decisions;\n  // Default: core value → student builds. Only escalate to provide_* under time pressure.\n  const roomNeeded = candidates.reduce((acc, c) => acc + c.minutes_saved, 0);\n  const overBudget = session.packedMinutes + Math.round(roomNeeded * 0.5) > session.contentBudget;\n  const sorted = [...candidates].sort((a, b) => b.minutes_saved - a.minutes_saved);\n  let freed = 0;\n  for (const c of sorted) {\n    const lowValue = c.minutes_saved > 0 && c.suggest === 'provide_full';\n    if (overBudget && lowValue && freed < roomNeeded) {\n      decisions.push({ item: c.item, decision: 'provide_full', minutes_saved: c.minutes_saved, reason: 'Time pressure: boilerplate with zero learning value, saves ' + c.minutes_saved + 'm' });\n      freed += c.minutes_saved;\n    } else if (c.suggest === 'provide_partial' || c.suggest === 'provide_reference') {\n      decisions.push({ item: c.item, decision: c.suggest, minutes_saved: c.minutes_saved, reason: 'Domain hint: ' + (c.reason || 'scaffold candidate') });\n    } else {\n      decisions.push({ item: c.item, decision: 'student_builds', minutes_saved: 0, reason: 'Core learning value — student builds it' });\n    }\n  }\n  if (overBudget && freed < roomNeeded) {\n    warnings.push('Session ' + session.lessonCode + ' remains tight after scaffolding — consider splitting');\n  }\n  return decisions;\n}\n\n// ─── Stage 6: depth assignment & macro-pedagogy algorithms ──────────────────\n\n// Concept depth is decided by ONE rule: how many times the learner has met it\n// (Bruner spiral, P50-G2). It is a property of the concept AT that encounter —\n// never of its position in a session's node array.\n//\n// A previous version escalated a node whenever it matched the PREVIOUS node's\n// depth (\"avoid a flat session\"). That keyed depth to array order, so the same\n// concept got CIO or SIO depending on where it sat, produced zig-zag sequences\n// (n first-encounter concepts → cio,sio,cio,sio,…) and contradicted\n// concept_spiral_progression in the very same plan. Intra-session variety is a\n// Bloom-level / artifact-type concern (Remember→Apply across QUIZ/ACT/EXT),\n// not a depth concern; depth drives minutes, session packing and what the LLM\n// is told to write, so it must stay invariant.\nexport function assignDepths(\n  nodeIds: string[],\n  nodeById: Map<string, PlanningNode>,\n  conceptEncounterMap?: Map<string, number>,\n  partInfo?: Map<string, { part: number; totalParts: number; inherited?: { depth: DepthLevel; source: 'feed_hint' | 'planner' | 'escalated' } }>,\n): CurriculumPlan['sessions'][number]['depth_assignments'] {\n  const assignments: CurriculumPlan['sessions'][number]['depth_assignments'] = [];\n  for (const id of nodeIds) {\n    const node = nodeById.get(id)!;\n    let depth: DepthLevel;\n    let source: 'feed_hint' | 'planner' | 'escalated';\n    if (node.kind === 'concept') {\n      const primaryCode = node.concept_codes[0];\n      const encounters = primaryCode && conceptEncounterMap ? (conceptEncounterMap.get(primaryCode) ?? 1) : 1;\n      const advanced = node.phase_id !== '' && /__ADV\\d{2}$/.test(node.id);\n      // Bruner spiral: first encounter is CIO (conceptual/algorithmic), subsequent encounters or __ADV are SIO (practical implementation)\n      if (encounters >= 2 || advanced) {\n        depth = 'sio';\n      } else {\n        depth = 'cio';\n      }\n      source = 'planner';\n    } else {\n      depth = (node.depth_hint ?? 'cio') as DepthLevel;\n      source = node.depth_hint ? 'feed_hint' : 'planner';\n    }\n    const parts = partInfo?.get(id);\n    let assignment: CurriculumPlan['sessions'][number]['depth_assignments'][number];\n    if (parts && parts.part > 1 && parts.inherited) {\n      // 2026-09-23 (swift-101 F5-S1): continuation parts keep part 1's depth —\n      // one node = one teaching depth; re-deriving per session produced\n      // sio in the split session and cio in the continuation.\n      assignment = { node_id: id, node_name: node.name, depth: parts.inherited.depth, source: parts.inherited.source, part: parts.part, total_parts: parts.totalParts, depth_context: node.depth_context };\n    } else if (parts) {\n      assignment = { node_id: id, node_name: node.name, depth, source, part: parts.part, total_parts: parts.totalParts, depth_context: node.depth_context };\n    } else {\n      assignment = { node_id: id, node_name: node.name, depth, source, depth_context: node.depth_context };\n    }\n    assignments.push(assignment);\n  }\n  return assignments;\n}\n\n/**\n * Bruner's Spiral Curriculum progression tracker across the entire course.\n * Tracks encounter count per concept code:\n * Encounter 1 -> Bloom ceiling: Understand, Depth: CIO\n * Encounter 2 -> Bloom ceiling: Apply, Depth: SIO\n * Encounter 3+ -> Bloom ceiling: Analyze, Depth: SIO\n */\nexport function computeConceptSpiralProgression(\n  sessions: Array<{ id: string; node_ids: string[] }>,\n  nodeById: Map<string, PlanningNode>,\n): ConceptSpiralEncounter[] {\n  const encounters: ConceptSpiralEncounter[] = [];\n  const conceptCounts = new Map<string, number>();\n\n  for (const s of sessions) {\n    const sessionConcepts = [...new Set(s.node_ids.flatMap((id) => nodeById.get(id)?.concept_codes || []))];\n    for (const cCode of sessionConcepts) {\n      const count = (conceptCounts.get(cCode) || 0) + 1;\n      conceptCounts.set(cCode, count);\n\n      let bloomCap: BloomLevel;\n      let depth: DepthLevel;\n      if (count === 1) {\n        bloomCap = 'Understand';\n        depth = 'cio';\n      } else if (count === 2) {\n        bloomCap = 'Apply';\n        depth = 'sio';\n      } else {\n        bloomCap = 'Analyze';\n        depth = 'sio';\n      }\n\n      encounters.push({\n        concept_code: cCode,\n        session_id: s.id,\n        encounter_index: count,\n        bloom_cap: bloomCap,\n        depth,\n      });\n    }\n  }\n\n  return encounters;\n}\n\n/**\n * P50-G2 — ONE depth computation for the whole course.\n *\n * Spec: \"kết quả được cập nhật trực tiếp vào `s.depth_assignments`\". Before\n * this, assignDepths and computeConceptSpiralProgression ran as two independent\n * computations — one counting encounters inline per session, one scanning the\n * finished session list — so the same node could be recorded as SIO in\n * `depth_assignments` and CIO in `concept_spiral_progression`, and BOTH shipped\n * in one plan feeding different subsystems (KX reads depth_assignments; the\n * curriculumHorizon prompt reads the spiral).\n *\n * Now the spiral is computed once, and this pass drives every\n * `depth_assignments` from it. Two invariants:\n *  - one node = one teaching depth: a node split across sessions keeps the\n *    depth of its FIRST occurrence. The spiral counts encounters per session,\n *    so it would otherwise treat a split tail as a second encounter and\n *    promote it to SIO mid-teach;\n *  - product steps are untouched — the spiral tracks concept_codes only, and\n *    step depth stays driven by the feed hint (P52/T3.1 prices scaffolding\n *    candidates off it).\n *\n * Returns the number of assignments written, for caller-side evidence.\n */\nexport function assignDepthsForSessions(\n  sessions: Array<{ id: string; node_ids: string[]; depth_assignments: CurriculumPlan['sessions'][number]['depth_assignments'] }>,\n  nodeById: Map<string, PlanningNode>,\n  spiral: ConceptSpiralEncounter[],\n  entriesBySession: Map<string, PackedEntry[]>,\n): number {\n  // Build lookup: session_id -> Map<concept_code, encounter_index>\n  // Preserves per-session encounter indices so a concept revisited in session 5\n  // does not overwrite its first encounter in session 1 to SIO.\n  const encountersBySession = new Map<string, Map<string, number>>();\n  for (const e of spiral) {\n    let sessionMap = encountersBySession.get(e.session_id);\n    if (!sessionMap) {\n      sessionMap = new Map();\n      encountersBySession.set(e.session_id, sessionMap);\n    }\n    sessionMap.set(e.concept_code, e.encounter_index);\n  }\n\n  const splitInherited = new Map<string, { depth: DepthLevel; source: 'feed_hint' | 'planner' | 'escalated' }>();\n  let written = 0;\n  for (const s of sessions) {\n    const sessionEncounters = encountersBySession.get(s.id) || new Map<string, number>();\n    const localParts = new Map<string, { part: number; totalParts: number; inherited?: { depth: DepthLevel; source: 'feed_hint' | 'planner' | 'escalated' } }>();\n    for (const e of entriesBySession.get(s.id) ?? []) {\n      if (e.totalParts <= 1) continue;\n      localParts.set(e.id, { part: e.part, totalParts: e.totalParts, inherited: e.part > 1 ? splitInherited.get(e.id) : undefined });\n    }\n    const da = assignDepths(s.node_ids, nodeById, sessionEncounters, localParts);\n    for (const a of da) {\n      if (a.part === 1) splitInherited.set(a.node_id, { depth: a.depth, source: a.source });\n    }\n    s.depth_assignments = da;\n    written += da.length;\n  }\n  return written;\n}\n\n/**\n * P50-G1: Vygotsky ZPD & Cognitive Overload Guard.\n * Evaluates session cognitive capacity against the cumulative horizon:\n * - TOO_MANY_NEW: More than 2 new concepts (or >4 new keywords if conceptless) introduced in 1 session\n * - NO_ZPD_BRIDGE: Session index > 0 with >1 new concepts and 0 known concepts from prior sessions\n * Self-healing: If NO_ZPD_BRIDGE, injects a recap anchor into prerequisite decisions.\n */\nexport function checkSessionZpd(\n  sessionIndex: number,\n  nodeIds: string[],\n  nodeById: Map<string, PlanningNode>,\n  allSeenConcepts: Set<string>,\n  allSeenKeywords: Set<string>,\n  entryKw: Set<string>,\n  warnings: string[],\n  conceptPrereqMap?: Map<string, string[]>,\n  spec?: PackingSpec,\n): { status: SessionZpdStatus; bridgeRepair?: { node_id: string; decision: PrerequisiteDecision; reason: string } } {\n  // THE shared semantics (splitZpdConceptLoad): distinct normalized session\n  // concepts, NEW = unseen in the seen set at session start, session-local\n  // union deduped. The packer's cognitive flush counts with the same\n  // function, so checker and packer cannot drift (5-WHY chain 2).\n  const { concepts, newConcepts, knownConcepts } = splitZpdConceptLoad(nodeIds, nodeById, allSeenConcepts);\n\n  const allKeywords = [...new Set(nodeIds.flatMap((id) => nodeById.get(id)?.keywords || []))];\n  const newKeywords = allKeywords.filter((k) => !allSeenKeywords.has(k.toLowerCase()) && !entryKw.has(k.toLowerCase()));\n  const knownKeywords = allKeywords.filter((k) => allSeenKeywords.has(k.toLowerCase()) || entryKw.has(k.toLowerCase()));\n\n  const issues: string[] = [];\n  let verdict: ZpdVerdict = 'OK';\n\n  // 2026-09-18: the two axes are assessed INDEPENDENTLY (the old `else if`\n  // short-circuited the keyword axis whenever concepts were present, so a\n  // session with 1 concept + 26 new keywords passed silently).\n  // Concept count is a STRUCTURAL gate: Vygotsky ZPD empirical constant, no\n  // interpretation needed — the deterministic linter escalates it to CRITICAL.\n  // Keyword count is a NOISY PROXY only (var/let/Int/String are one concept\n  // family): reported as evidence for the LLM judge, never a hard gate.\n  // ADR-0007: Calculate session cognitive load from nodes introducing new concepts or skills\n  const newLearningNodes = nodeIds.filter((nid) => {\n    const n = nodeById.get(nid);\n    if (!n) return false;\n    const codes = n.concept_codes || [];\n    if (codes.length === 0) return n.kind === 'concept';\n    return codes.some((c) => newConcepts.includes(zpdConceptKey(c)));\n  });\n  const sessionCognitiveLoad = calculateCognitiveLoad(newLearningNodes, nodeById);\n\n  const isFirstSession = sessionIndex === 0;\n  const hasFirstSessionCap = isFirstSession && spec?.firstSessionMaxNewConcepts !== undefined;\n  const effectiveCognitiveBudget = spec?.sessionCognitiveBudget !== undefined\n    ? (hasFirstSessionCap && spec.firstSessionCognitiveBudget !== undefined\n      ? spec.firstSessionCognitiveBudget\n      : spec.sessionCognitiveBudget)\n    : (spec?.maxNewConceptsPerSession !== undefined && spec.maxNewConceptsPerSession > 0\n      ? (hasFirstSessionCap && spec.firstSessionMaxNewConcepts !== undefined\n        ? spec.firstSessionMaxNewConcepts * DEFAULT_LO_WEIGHT\n        : spec.maxNewConceptsPerSession * DEFAULT_LO_WEIGHT)\n      : (isFirstSession ? FIRST_SESSION_COGNITIVE_BUDGET_BEGINNER : SESSION_COGNITIVE_BUDGET_K12));\n\n  const upperAge = spec?.ageBand?.[1];\n  const isAdult = upperAge !== undefined && upperAge > 15;\n  const hardConceptCap = spec?.maxNewConceptsPerSession ?? (isAdult ? MAX_NEW_CONCEPTS_PER_SESSION_ADULT : MAX_NEW_CONCEPTS_PER_SESSION_K12);\n\n  if (newConcepts.length > hardConceptCap) {\n    verdict = 'TOO_MANY_NEW';\n    issues.push(`${newConcepts.length} new concepts exceed ZPD limit (max ${hardConceptCap} concepts per session)`);\n  }\n\n  if (sessionCognitiveLoad > effectiveCognitiveBudget) {\n    verdict = 'TOO_MANY_NEW';\n    issues.push(`${newConcepts.length} new concepts (cognitive load ${sessionCognitiveLoad} pts) exceed ZPD limit / budget (max ${effectiveCognitiveBudget} pts)`);\n  }\n\n  // 2026-09-19 (age-band granularity gate): a beginner's FIRST session gets\n  // the stricter 1-new-concept cap — structural, same as the main ZPD gate.\n  if (spec && spec.firstSessionMaxNewConcepts !== undefined && sessionIndex === 0 && newConcepts.length > spec.firstSessionMaxNewConcepts) {\n    verdict = 'TOO_MANY_NEW';\n    issues.push(`first session carries ${newConcepts.length} new concepts (beginner gate: max ${spec.firstSessionMaxNewConcepts})`);\n  }\n  if (newKeywords.length > (spec?.maxNewKeywordsPerSession ?? 4)) {\n    issues.push(`Evidence for judge: ${newKeywords.length} new keywords in session (noisy proxy, not a gate)`);\n  }\n\n  // 2026-09-18 (regen4 audit): verdict PRECEDENCE — a session that is both\n  // overloaded and un-bridged must surface the OVERLOAD (TOO_MANY_NEW), the\n  // strictly more severe finding, not have it masked by the bridge verdict.\n  // The bridge issues still land in `issues` for the judge either way.\n  if (sessionIndex > 0) {\n    if (concepts.length > 1 && knownConcepts.length === 0) {\n      if (verdict !== 'TOO_MANY_NEW') verdict = 'NO_ZPD_BRIDGE';\n      // 2026-09-18 (repair-session follow-up): the prior session ALWAYS\n      // ends with a recap of one of its concepts — and that concept is\n      // typically a declared prerequisite of what we're teaching now. The\n      // raw seen-set can't see that linkage; without this check the bridge\n      // verdict fires on sessions whose prerequisite bridge is already\n      // scheduled (regen6: L02 bridges from L01's C2 via prereq C2→C3/C4).\n      const seenList = [...allSeenConcepts];\n      const prevConcept = seenList[seenList.length - 1];\n      const bridgedByPrereq = prevConcept !== undefined && concepts.some((c) => (conceptPrereqMap?.get(c) || []).includes(prevConcept));\n      if (bridgedByPrereq) {\n        verdict = verdict === 'TOO_MANY_NEW' ? verdict : 'OK';\n        issues.push(`Bridge satisfied via prerequisite: prior session ended with recap of ${prevConcept}, a declared prerequisite of this session's concepts`);\n      } else {\n        issues.push('No known concepts from previous sessions to bridge new learning');\n      }\n    } else if (concepts.length === 0 && allKeywords.length > 2 && knownKeywords.length === 0) {\n      if (verdict !== 'TOO_MANY_NEW') verdict = 'NO_ZPD_BRIDGE';\n      issues.push('No known keywords from previous sessions to bridge new learning');\n    }\n  }\n\n  let bridgeRepair: { node_id: string; decision: PrerequisiteDecision; reason: string } | undefined;\n  if (verdict === 'NO_ZPD_BRIDGE' && (allSeenConcepts.size > 0 || allSeenKeywords.size > 0)) {\n    const bridgeAnchor = [...allSeenConcepts].pop() || [...allSeenKeywords].pop() || 'prior knowledge';\n    bridgeRepair = {\n      node_id: nodeIds[0]!,\n      decision: 'recap_in_lesson',\n      reason: `ZPD self-healing: recap anchor (${bridgeAnchor}) to bridge into new material`,\n    };\n    warnings.push(`ZPD bridge self-healing: session ${sessionIndex + 1} injected recap anchor (${bridgeAnchor})`);\n  }\n\n  for (const c of concepts) allSeenConcepts.add(c);\n  for (const k of allKeywords) allSeenKeywords.add(k.toLowerCase());\n\n  return {\n    status: {\n      verdict,\n      // 2026-09-19 (contract split): concept and keyword axes report their\n      // OWN counts. The old writer filled new_concept_count with a KEYWORD\n      // count whenever a session had no concept links — judges then read the\n      // field name as truth (regen7: 40 judge points lost to that proxy).\n      // With the split the fields mean what they say; the keyword proxy\n      // stays visible through new_keyword_count without polluting the\n      // concept gate.\n      new_concept_count: newConcepts.length,\n      known_concept_count: knownConcepts.length,\n      new_keyword_count: newKeywords.length,\n      known_keyword_count: knownKeywords.length,\n      cognitive_load: sessionCognitiveLoad,\n      issues,\n    },\n    bridgeRepair,\n  };\n}\n\n/**\n * P50-G3: Reigeluth Walking Skeleton Validator.\n * Formulates Unit 1 as the Epitome (minimal end-to-end working software slice),\n * and subsequent Units as Elaborations that deepen and expand specific subsystems.\n */\nexport function buildWalkingSkeleton(\n  units: UnitPlan[],\n  sessions: Array<{ id: string; unit_id: string; exit_evidence?: string[] }>,\n): WalkingSkeleton {\n  const epitomeUnit = units[0];\n  const epitomeId = epitomeUnit?.id || 'U01';\n  const epitomeDeliverables = sessions\n    .filter((s) => s.unit_id === epitomeId)\n    .flatMap((s) => s.exit_evidence || [])\n    .slice(0, 8);\n\n  const elaborations = units.slice(1).map((u, i) => {\n    const priorUnit = units[i];\n    const priorDeliverables = priorUnit\n      ? sessions\n          .filter((s) => s.unit_id === priorUnit.id)\n          .flatMap((s) => s.exit_evidence || [])\n          .slice(0, 4)\n      : [];\n    return {\n      unit_id: u.id,\n      focus_area: u.name,\n      elaborates_on: priorDeliverables.length > 0 ? priorDeliverables : epitomeDeliverables.slice(0, 3),\n    };\n  });\n\n  return {\n    epitome_unit_id: epitomeId,\n    epitome_deliverables: epitomeDeliverables,\n    elaborations,\n  };\n}\n\n/**\n * P50-G4: Inter-Phase Mastery Gates & Remediation Sprints.\n * Builds formal competency gates between consecutive units with measurable\n * acceptance criteria and a targeted 15-minute remediation protocol.\n */\nexport function buildMasteryGates(\n  units: UnitPlan[],\n  sessions: Array<{ id: string; unit_id: string; exit_evidence?: string[] }>,\n  options?: { includeFinalCapstoneGate?: boolean },\n): MasteryGate[] {\n  const gates: MasteryGate[] = [];\n  const includeCapstone = options?.includeFinalCapstoneGate ?? true;\n\n  const sanitizeCriteria = (text: string): string => {\n    return text\n      .replace(/\\s*\\((?:preview|advanced|part\\s+\\d+\\/\\d+)\\)/gi, '')\n      .trim();\n  };\n\n  const sampleEvidence = (evidenceList: string[], maxItems = 8): string[] => {\n    const cleaned = evidenceList.map(sanitizeCriteria).filter(Boolean);\n    const unique = [...new Set(cleaned)];\n    if (unique.length <= maxItems) return unique;\n    // Sample across start, middle, and end so later milestones are not dropped\n    const step = (unique.length - 1) / (maxItems - 1);\n    const sampled: string[] = [];\n    for (let i = 0; i < maxItems; i++) {\n      const idx = Math.min(unique.length - 1, Math.round(i * step));\n      if (!sampled.includes(unique[idx]!)) {\n        sampled.push(unique[idx]!);\n      }\n    }\n    return sampled;\n  };\n\n  for (let i = 0; i < units.length - 1; i++) {\n    const cur = units[i]!;\n    const next = units[i + 1]!;\n    const allEvidence = sessions\n      .filter((s) => s.unit_id === cur.id)\n      .flatMap((s) => s.exit_evidence || []);\n    const unitEvidence = sampleEvidence(allEvidence, 8);\n    const remediationMinutes = Math.min(45, Math.max(15, Math.round(allEvidence.length * 2.5)));\n\n    gates.push({\n      phase_or_unit_id: cur.id,\n      gate_name: `${cur.name} Mastery Gate`,\n      exit_criteria: unitEvidence.length > 0 ? unitEvidence : [`Master all deliverables for ${cur.name}`],\n      next_unit_id: next.id,\n      remediation: {\n        trigger: 'FAIL_GATE_CRITERIA',\n        focus_minutes: remediationMinutes,\n        action: `Review and complete failing practical criteria for ${cur.name} before starting ${next.name}`,\n      },\n    });\n  }\n\n  // Final Unit Capstone Gate (Showcase & Demo Day Gate)\n  if (includeCapstone && units.length > 0) {\n    const last = units[units.length - 1]!;\n    const allLastEvidence = sessions\n      .filter((s) => s.unit_id === last.id)\n      .flatMap((s) => s.exit_evidence || []);\n    const capstoneEvidence = sampleEvidence(allLastEvidence, 8);\n    const remediationMinutes = Math.min(45, Math.max(15, Math.round(allLastEvidence.length * 2.5)));\n\n    gates.push({\n      phase_or_unit_id: last.id,\n      gate_name: `${last.name} Capstone Showcase Gate`,\n      exit_criteria: capstoneEvidence.length > 0 ? capstoneEvidence : [`Complete and verify all capstone deliverables for ${last.name}`],\n      next_unit_id: 'COURSE_COMPLETION',\n      remediation: {\n        trigger: 'FAIL_GATE_CRITERIA',\n        focus_minutes: remediationMinutes,\n        action: `Polish, debug, and complete essential project features for ${last.name} before Demo Day showcase`,\n      },\n    });\n  }\n\n  return gates;\n}\n\n/**\n * Drops symmetric edges (A->B and B->A) and performs DFS cycle detection\n * to guarantee an acyclic concept prerequisite graph (curriculum_graph.py port).\n */\nexport function dropCyclicConceptEdges(edges: ConceptPrerequisiteEdge[]): ConceptPrerequisiteEdge[] {\n  const pairSet = new Set(edges.map((e) => `${e.concept_code}|${e.requires}`));\n  const nonSymmetric = edges.filter((e) => !pairSet.has(`${e.requires}|${e.concept_code}`));\n\n  const deps = new Map<string, Set<string>>();\n\n  const createsCycle = (a: string, b: string): boolean => {\n    const stack = [b];\n    const seen = new Set<string>();\n    while (stack.length > 0) {\n      const n = stack.pop()!;\n      if (n === a) return true;\n      if (seen.has(n)) continue;\n      seen.add(n);\n      const targets = deps.get(n);\n      if (targets) {\n        for (const t of targets) stack.push(t);\n      }\n    }\n    return false;\n  };\n\n  const out: ConceptPrerequisiteEdge[] = [];\n  for (const e of nonSymmetric) {\n    if (createsCycle(e.concept_code, e.requires)) continue;\n    if (!deps.has(e.concept_code)) deps.set(e.concept_code, new Set());\n    deps.get(e.concept_code)!.add(e.requires);\n    out.push(e);\n  }\n  return out;\n}\n\n/**\n * Gagné Cross-Concept Prerequisite DAG (ADR-0005 & curriculum_graph.py port).\n * Derives cross-concept dependency edges from planning node dependencies,\n * validates structure support (taught earlier in teaching order), flags hubs (fan-out >= 6),\n * and eliminates cycles.\n */\nexport function buildConceptPrerequisites(\n  sessions: Array<{ id: string; node_ids: string[] }>,\n  nodeById: Map<string, PlanningNode>,\n  edges: DependencyEdge[],\n): ConceptPrerequisiteEdge[] {\n  const firstSeen = new Map<string, number>();\n  for (let i = 0; i < sessions.length; i++) {\n    const s = sessions[i]!;\n    for (const nid of s.node_ids) {\n      const codes = nodeById.get(nid)?.concept_codes || [];\n      for (const c of codes) {\n        if (!firstSeen.has(c)) firstSeen.set(c, i);\n      }\n    }\n  }\n\n  const rawEdges: ConceptPrerequisiteEdge[] = [];\n  const seenPair = new Set<string>();\n\n  for (const e of edges) {\n    const fromNode = nodeById.get(e.from);\n    const toNode = nodeById.get(e.to);\n    if (!fromNode || !toNode) continue;\n    const fromCodes = fromNode.concept_codes || [];\n    const toCodes = toNode.concept_codes || [];\n    for (const tc of toCodes) {\n      for (const fc of fromCodes) {\n        if (tc === fc) continue;\n        const key = `${tc}|${fc}`;\n        if (seenPair.has(key)) continue;\n        seenPair.add(key);\n\n        const firstSeenTc = firstSeen.get(tc) ?? 999;\n        const firstSeenFc = firstSeen.get(fc) ?? 999;\n        const supported = firstSeenFc <= firstSeenTc;\n\n        rawEdges.push({\n          concept_code: tc,\n          requires: fc,\n          source: 'CONCEPT_LEVEL_PREREQ',\n          confidence: supported ? 0.8 : 0.6,\n          rationale: e.reason || `Derived from planning node dependency: ${fromNode.name} -> ${toNode.name}`,\n          structure_supported: supported,\n          needs_review: !supported,\n          hub: false,\n        });\n      }\n    }\n  }\n\n  // Hub detection (fan-out >= 6)\n  const fanOut = new Map<string, number>();\n  for (const re of rawEdges) {\n    fanOut.set(re.concept_code, (fanOut.get(re.concept_code) || 0) + 1);\n  }\n  for (const re of rawEdges) {\n    if ((fanOut.get(re.concept_code) || 0) >= 6) {\n      re.hub = true;\n      re.confidence = Math.min(re.confidence, 0.5);\n      re.needs_review = true;\n    }\n  }\n\n  return dropCyclicConceptEdges(rawEdges);\n}\n\n// ─── Orchestration: build the full plan ─────────────────────────────────────\n\n/**\n * LO time estimation hook (plan 2026-10-09, phases A/B/C): per-node estimate\n * via bundle template when depth+bloom metadata exists, otherwise an honest\n * L0 reference-class fallback that KEEPS the incoming minutes.\n *\n * mode 'observe' (default): attaches estimates only — no mutation of\n * estimated_minutes / depth_variants.\n * mode 'authoritative': SINGLE PRICE SOURCE (plan C1) — regenerates\n * depth_variants for all three depths from the same estimator, sets\n * estimated_minutes to the price at the node's own depth, and rebuilds\n * depth_scaffold_candidates from that same table. Opt-in until TC7 flips the\n * default (data gate TC6 not yet passed).\n */\nexport function applyLoTimeEstimates(\n  graph: PlanningGraph,\n  constraints: PlanConstraints,\n  mode: 'observe' | 'authoritative',\n): LoTimeEstimate[] {\n  const estimates: LoTimeEstimate[] = [];\n  for (const node of graph.nodes) {\n    let est: LoTimeEstimate;\n    if (node.depth_hint && node.bloom_hint) {\n      est = estimateByBundleTemplate({\n        lo_id: node.id,\n        depth: node.depth_hint,\n        bloom: node.bloom_hint,\n        ageBand: constraints.age_band,\n        sioCount: node.depth_context && node.depth_context.sio.length > 0\n          ? node.depth_context.sio.length\n          : undefined,\n      });\n      const incoming = node.estimated_minutes;\n      if (incoming > 0 && Math.abs(incoming - est.minutes.likely) / incoming > TIME_DIVERGENCE_THRESHOLD) {\n        graph.warnings.push(\n          `time_estimate: ${node.id}: ${incoming}m → ${est.minutes.likely}m (basis ${est.basis}, conf ${est.confidence})`,\n        );\n      }\n      if (mode === 'authoritative') {\n        writeBackSinglePriceSource(node, constraints);\n      }\n      // observe: NO write-back — estimated_minutes / depth_variants untouched.\n    } else {\n      est = referenceFallbackEstimate(node.id, node.estimated_minutes);\n    }\n    estimates.push(est);\n  }\n  return estimates;\n}\n\n/**\n * C1 — one price, one table. Reprice the node at ALL three depths with the\n * same estimator, clamp to the depth_variants contract (ULO ≤ CIO ≤ SIO),\n * then set estimated_minutes = variants[depth_hint] so\n * `estimated_minutes === depth_variants[depth_hint]` holds by construction\n * (validated by TIME_PRICE_INCONSISTENCY in validatePlan).\n */\nfunction writeBackSinglePriceSource(\n  node: PlanningNode,\n  constraints: PlanConstraints,\n): void {\n  const price = (depth: DepthLevel): number =>\n    estimateByBundleTemplate({\n      lo_id: node.id,\n      depth,\n      bloom: node.bloom_hint!,\n      ageBand: constraints.age_band,\n      sioCount: depth === 'sio' && node.depth_context && node.depth_context.sio.length > 0\n        ? node.depth_context.sio.length\n        : undefined,\n    }).minutes.likely;\n\n  const rawUlo = price('ulo');\n  const rawCio = price('cio');\n  const rawSio = price('sio');\n  // Contract: ULO ≤ CIO ≤ SIO. Bloom floors can make raw ULO exceed raw CIO\n  // (a ULO·Apply bundle gains practice a CIO bundle already has) — clamp UP,\n  // never down: the deepest price must not lose content.\n  const variants = {\n    ulo: rawUlo,\n    cio: Math.max(rawCio, rawUlo),\n    sio: Math.max(rawSio, Math.max(rawCio, rawUlo)),\n  };\n\n  node.depth_variants = variants;\n  node.estimated_minutes = variants[node.depth_hint!];\n\n  // Rebuild the downgrade price list from the SAME table (previously a third,\n  // independently-derived price — deep review B5 \"3 giá cho 1 sự kiện\").\n  const candidates: PlanningNode['depth_scaffold_candidates'] = [];\n  if (variants.sio > variants.cio) {\n    candidates.push({\n      from_depth: 'sio',\n      to_depth: 'cio',\n      minutes_saved: variants.sio - variants.cio,\n      reason: 'SIO implementation practice deferred — CIO mechanism suffices (estimator price list)',\n    });\n  }\n  const at = variants[node.depth_hint!];\n  if (at > variants.ulo) {\n    candidates.push({\n      from_depth: node.depth_hint!,\n      to_depth: 'ulo',\n      minutes_saved: at - variants.ulo,\n      reason: 'Mechanism deferred — ULO awareness suffices (estimator price list)',\n    });\n  }\n  node.depth_scaffold_candidates = candidates;\n}\n\nexport async function buildCurriculumPlan(rawGraph: unknown, options: PlanOptions): Promise<PlanResult> {\n  const { constraints } = options;\n  const warnings: string[] = [];\n\n  const graph = normalizePlanningGraph(rawGraph);\n  // LO time-estimation (plan phase B): compute BEFORE packing/reconcile so\n  // divergence warnings land in graph.warnings → source.warnings AND the\n  // local copy pushed on the next line.\n  const timeEstimates = applyLoTimeEstimates(graph, constraints, options.time_estimate_mode ?? 'observe');\n  warnings.push(...graph.warnings);\n  assertAcyclic(graph.nodes, graph.edges);\n\n  // P52/T3.3: depth reconcile BEFORE unit building/packing. When the course\n  // budget is fixed (total_sessions set) and the bottom-up minute total\n  // overshoots it, lower knowledge depth along the spiral (never below ULO,\n  // never on core concepts) instead of only stretching time. Downgrades\n  // mutate minutes/depth_hint only — no edges added/removed, no reordering —\n  // so the teaching-order invariant is preserved by construction, and the\n  // single ZPD pass later in this function naturally re-runs over the\n  // ALREADY-reconciled nodes (structural fixed-point, not a parallel guard).\n  let reconcileSummary: ReconcileResult | null = null;\n  if (typeof constraints.total_sessions === 'number' && constraints.total_sessions > 0) {\n    const spec0 = computePackingSpec(constraints);\n    const budgetMinutes = constraints.total_sessions * spec0.contentBudget;\n    reconcileSummary = reconcilePlanDepth(graph.nodes, graph.edges, spec0, budgetMinutes);\n    if (!reconcileSummary.unchanged) {\n      const saved = reconcileSummary.applied.reduce((a, x) => a + x.minutesSaved, 0);\n      warnings.push(`depth reconcile: ${reconcileSummary.applied.length} downgrade(s), saved ${saved}m across ${reconcileSummary.mutatedNodeIds.length} node(s)`);\n    }\n    if (reconcileSummary.escalate) {\n      // P52/T3.4: structured escalation — surface to HITL; cutting\n      // phases/features is NEVER automatic.\n      warnings.push(`budget_escalation: deficit ${reconcileSummary.deficitMinutes}m after exhausting non-core depth candidates (budget ${constraints.total_sessions * computePackingSpec(constraints).contentBudget}m) — human review required`);\n    }\n  }\n\n  const orderedIds = topoSort(graph.nodes, graph.edges);\n  const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n\n  const spec = computePackingSpec(constraints);\n  const rawGroups = buildUnitGroupings(graph, orderedIds);\n  // Target unit size ~10-12 sessions measured in CONTENT MINUTES: merge small\n  // phase groups by estimated session count, never split a phase across units\n  // (phase order is preserved by construction).\n  const nodeMinutes = new Map(graph.nodes.map((n) => [n.id, n.estimated_minutes]));\n  const groups = mergeGroupsIntoUnits(\n    rawGroups,\n    10,\n    12,\n    nodeMinutes,\n    constraints.session_duration_minutes,\n    constraints.overhead_ratio,\n  );\n\n  // [1] Course objectives derived from unit groupings, citing sources\n  const courseObjectives = groups.map((g, i) => {\n    const codes = [...new Set(g.orderedIds.flatMap((id) => nodeById.get(id)!.concept_codes))];\n    const blooms = g.orderedIds.map((id) => nodeById.get(id)!.bloom_hint).filter((b): b is BloomLevel => !!b);\n    blooms.sort((a, b) => BLOOM_ORDER.indexOf(a) - BLOOM_ORDER.indexOf(b));\n    // 75th percentile bloom of the unit's nodes — avoids pulling entry-level units to 'Create'\n    // while honoring high-level synthesis units appropriately.\n    const p75Idx = Math.min(blooms.length - 1, Math.floor(blooms.length * 0.75));\n    const bloom = blooms[p75Idx] ?? 'Apply';\n\n    // Synthesize competency statement with Bloom action verb\n    const distinctNodeNames = [...new Set(g.orderedIds.map((id) => nodeById.get(id)!.name))];\n    const topNodeNames = distinctNodeNames.join(', ');\n    const verbByBloom: Record<BloomLevel, string> = {\n      Remember: 'Recall and describe',\n      Understand: 'Explain and trace',\n      Apply: 'Apply and implement',\n      Analyze: 'Analyze and integrate',\n      Evaluate: 'Evaluate and optimize',\n      Create: 'Architect and build',\n    };\n    const actionVerb = verbByBloom[bloom] || 'Apply and implement';\n    const targetDesc = g.productCompletion\n      ? ` to ${g.productCompletion.toLowerCase().replace(/^(to\\s+|build\\s+|implement\\s+)/i, '')}`\n      : '';\n    const statement = `${actionVerb} ${topNodeNames}${targetDesc}.`.replace(/\\.\\.$/, '.');\n\n    return {\n      id: 'CO' + pad2(i + 1),\n      statement,\n      bloom,\n      sources: { node_ids: g.orderedIds, concept_codes: codes },\n    };\n  });\n\n  // [2] Units\n  const units = groups.map((g, i) => ({\n    id: 'U' + pad2(i + 1),\n    name: g.name,\n    objectives: [courseObjectives[i]],\n    node_ids: g.orderedIds,\n    total_minutes: g.orderedIds.reduce((acc, id) => acc + nodeById.get(id)!.estimated_minutes, 0),\n    rationale: g.rationale,\n    phase_ids: [...new Set(g.phaseIds)],\n    product_completion: g.productCompletion,\n  }));\n  const unitIndexByGroup = new Map(groups.map((g, i) => [g.key, i]));\n\n  // [3] Pack sessions\n  const packed: PackedSession[] = [];\n  let sessionOffset = 0;\n  for (const g of groups) {\n    const groupPacked = packUnitSessions(g, nodeById, spec, warnings, sessionOffset);\n    sessionOffset += groupPacked.length;\n    packed.push(...groupPacked);\n  }\n\n  // Closed-loop session constraint enforcement (BUG-05)\n  if (constraints.total_sessions && packed.length > constraints.total_sessions) {\n    warnings.push(`Initial packing produced ${packed.length} sessions, coalescing to satisfy total_sessions constraint (${constraints.total_sessions})`);\n    for (let i = 0; i < packed.length - 1 && packed.length > constraints.total_sessions; i++) {\n      const curr = packed[i]!;\n      const next = packed[i + 1]!;\n      if (curr.groupId === next.groupId) {\n        const currMins = curr.knowledgeMinutes + curr.practiceMinutes;\n        const nextMins = next.knowledgeMinutes + next.practiceMinutes;\n        const totalContent = currMins + nextMins;\n\n        // 2026-09-18 (regen4 audit): a coalesce must NEVER break the ZPD\n        // cognitive budget it sits below — merging two ZPD-safe sessions can\n        // otherwise produce 4-new-concept monsters (L01 = C1..C4 + step came\n        // exactly from here). canCoalesceWithinZpdBudget checks the MERGED\n        // union against maxNew — the same invariant checkSessionZpd enforces.\n        // Minute scaling stays as the kit's documented total_sessions flex —\n        // concept load is what ZPD guards; dropping nodes would silently\n        // break downstream session coverage (fail-closed). If merges are\n        // blocked, sessions stay separate and the shortfall surfaces as a\n        // warning (counted by the deterministic gate) instead of overload.\n        // Cumulative-aware ZPD check (splitZpdConceptLoad): the pair is one\n        // session in a course SEQUENCE — concepts already taught in earlier\n        // sessions are KNOWN, not new. The old pair-union check over-counted\n        // revisits and blocked pedagogically legal merges (regen10: stuck\n        // at 27 of 24). The merged first session also inherits the beginner\n        // 1-concept cap when it sits at index 0.\n        const seenBeforePair = new Set<string>();\n        for (let j = 0; j < i; j++) {\n          for (const nid of packed[j]!.nodeIds) {\n            for (const c of nodeById.get(nid)?.concept_codes || []) seenBeforePair.add(c);\n          }\n        }\n        const pairCap = i === 0 && spec.firstSessionCognitiveBudget !== undefined\n          ? spec.firstSessionCognitiveBudget\n          : (spec.sessionCognitiveBudget ?? (spec.maxNewConceptsPerSession ? spec.maxNewConceptsPerSession * DEFAULT_LO_WEIGHT : Infinity));\n\n        const mergedNodes = [...curr.nodeIds, ...next.nodeIds];\n        const mergedNewNodes = mergedNodes.filter((nid) => {\n          const n = nodeById.get(nid);\n          const codes = n?.concept_codes || [];\n          if (codes.length === 0) return n?.kind === 'concept';\n          return codes.some((c) => !seenBeforePair.has(zpdConceptKey(c)));\n        });\n        const mergedLoad = calculateCognitiveLoad(mergedNewNodes, nodeById);\n        const mergedUniqueNodes = new Set(mergedNodes).size;\n        const totalNominal = [...curr.entries, ...next.entries].reduce((sum, e) => sum + (e.nominal_minutes ?? e.minutes), 0);\n\n        // Fail-Closed Guardrails:\n        // 1. Session node count cannot exceed MAX_SESSION_NODES (4)\n        // 2. Total nominal minutes cannot exceed contentBudget * 1.35\n        // 3. Cognitive load points cannot exceed pairCap\n        if (\n          mergedUniqueNodes <= MAX_SESSION_NODES &&\n          totalNominal <= spec.contentBudget * 1.35 &&\n          mergedLoad <= pairCap\n        ) {\n          const scale = totalNominal > spec.contentBudget ? Math.max(0.85, spec.contentBudget / totalNominal) : 1;\n          for (const e of curr.entries) {\n            e.minutes = Math.max(5, Math.round((e.nominal_minutes ?? e.minutes) * scale));\n          }\n          for (const e of next.entries) {\n            e.minutes = Math.max(5, Math.round((e.nominal_minutes ?? e.minutes) * scale));\n            curr.entries.push(e);\n          }\n\n          // 2026-10-08: Re-merge split entries of the same node if coalescing brought all parts together\n          const mergedEntries: PackedEntry[] = [];\n          const entriesByNodeId = new Map<string, PackedEntry[]>();\n          for (const e of curr.entries) {\n            const list = entriesByNodeId.get(e.id) || [];\n            list.push(e);\n            entriesByNodeId.set(e.id, list);\n          }\n          for (const [nodeId, list] of entriesByNodeId.entries()) {\n            if (list.length === 1) {\n              mergedEntries.push(list[0]!);\n            } else {\n              // Node has multiple parts in this same session now\n              const totalParts = list[0]!.totalParts;\n              if (list.length === totalParts) {\n                // All parts of this node are now in this session -> collapse back to 1 unified entry!\n                const totalMins = list.reduce((sum, item) => sum + item.minutes, 0);\n                const totalNom = list.reduce((sum, item) => sum + (item.nominal_minutes ?? item.minutes), 0);\n                mergedEntries.push({ id: nodeId, minutes: totalMins, nominal_minutes: totalNom, part: 1, totalParts: 1 });\n              } else {\n                // Partial set of parts; keep existing entries\n                mergedEntries.push(...list);\n              }\n            }\n          }\n          curr.entries = mergedEntries;\n          curr.nodeIds = [...new Set([...curr.nodeIds, ...next.nodeIds])];\n\n          curr.knowledgeMinutes = curr.entries\n            .filter((e) => nodeById.get(e.id)?.kind === 'concept')\n            .reduce((sum, e) => sum + e.minutes, 0);\n          curr.practiceMinutes = curr.entries\n            .filter((e) => nodeById.get(e.id)?.kind !== 'concept')\n            .reduce((sum, e) => sum + e.minutes, 0);\n          curr.oversized = false;\n          packed.splice(i + 1, 1);\n          i--;\n        }\n      }\n    }\n    if (packed.length > constraints.total_sessions) {\n      warnings.push(`budget_escalation: unable to compress ${packed.length} sessions to target ${constraints.total_sessions} without violating node count (<=4) or capacity limits`);\n    }\n  }\n\n  // Under-capacity session constraint enforcement & Elastic Practice Padding\n  if (constraints.total_sessions && packed.length < constraints.total_sessions) {\n    for (let i = 0; i < packed.length && packed.length < constraints.total_sessions; i++) {\n      const curr = packed[i]!;\n      if (curr.entries.length >= 2) {\n        // Safely split off the last entry into an adjacent session within the same group\n        const lastEntry = curr.entries.pop()!;\n        const lastNode = nodeById.get(lastEntry.id)!;\n        const isKnowledge = lastNode.kind === 'concept';\n        const entryK = isKnowledge ? lastEntry.minutes : 0;\n        const entryP = isKnowledge ? 0 : lastEntry.minutes;\n\n        curr.nodeIds = curr.entries.map((e) => e.id);\n        const currTotalK = curr.entries.reduce((sum, e) => sum + (nodeById.get(e.id)?.kind === 'concept' ? e.minutes : 0), 0);\n        curr.knowledgeMinutes = currTotalK;\n        curr.practiceMinutes = Math.max(0, curr.entries.reduce((sum, e) => sum + e.minutes, 0) - currTotalK);\n        curr.cognitiveLoad = calculateCognitiveLoad(curr.nodeIds, nodeById);\n\n        const newPackedSession: PackedSession = {\n          groupId: curr.groupId,\n          nodeIds: [lastEntry.id],\n          knowledgeMinutes: entryK,\n          practiceMinutes: entryP,\n          entries: [lastEntry],\n          oversized: false,\n          cognitiveNew: 0,\n          cognitiveLoad: calculateCognitiveLoad([lastEntry.id], nodeById),\n        };\n        packed.splice(i + 1, 0, newPackedSession);\n        i++; // skip newly inserted session\n      }\n    }\n  }\n\n  // Elastic Practice Padding: expand existing practice entries up to spec.contentBudget\n  // to avoid under-utilized learning time and ensure rich hands-on practice.\n  // CRITICAL (Bug 2): Never create phantom practice minutes without backing entries!\n  for (const s of packed) {\n    const practiceEntries = s.entries.filter((e) => nodeById.get(e.id)?.kind !== 'concept');\n    const currentTotal = s.entries.reduce((sum, e) => sum + e.minutes, 0);\n    const headroom = spec.contentBudget - currentTotal;\n    if (headroom > 0 && practiceEntries.length > 0) {\n      const perEntry = Math.floor(headroom / practiceEntries.length);\n      let remainder = headroom % practiceEntries.length;\n      for (const pe of practiceEntries) {\n        pe.minutes += perEntry + (remainder > 0 ? 1 : 0);\n        if (remainder > 0) remainder--;\n      }\n    }\n    s.knowledgeMinutes = s.entries\n      .filter((e) => nodeById.get(e.id)?.kind === 'concept')\n      .reduce((sum, e) => sum + e.minutes, 0);\n    s.practiceMinutes = s.entries\n      .filter((e) => nodeById.get(e.id)?.kind !== 'concept')\n      .reduce((sum, e) => sum + e.minutes, 0);\n  }\n\n  // Codes + indexes for prerequisite reasoning\n  const lessonCodes = packed.map((_, i) => 'U' + pad2(Math.min(units.length, 99)).replace('U', 'U') /* placeholder replaced below */);\n  void lessonCodes;\n  const sessionUnitIdx = packed.map((s) => unitIndexByGroup.get(s.groupId) ?? 0);\n  const lessonCodeOf = new Map<number, string>();\n  const perUnitLesson = new Map<number, number>();\n  packed.forEach((_, i) => {\n    const u = sessionUnitIdx[i];\n    const n = (perUnitLesson.get(u) ?? 0) + 1;\n    perUnitLesson.set(u, n);\n    lessonCodeOf.set(i, 'U' + pad2(u + 1) + '_M01_L' + pad2(n));\n  });\n  const sessionIndexByNode = new Map<string, number>();\n  packed.forEach((s, i) => { for (const id of s.nodeIds) if (!sessionIndexByNode.has(id)) sessionIndexByNode.set(id, i); });\n  const sessionOrderByIndex = new Map<number, string>();\n  lessonCodeOf.forEach((code, i) => sessionOrderByIndex.set(i, code));\n\n  // 2026-09-23 (swift-101 F5-S1): fail-closed invariant — every split node\n  // (strand-guard / oversized) must chain part 1..totalParts through\n  // CONSECUTIVE sessions. Run AFTER coalesce so a merge breaking a chain is\n  // caught too.\n  assertSplitPartsConsecutive(packed);\n\n  // Part metadata for depth_assignments: continuation parts inherit part 1's\n  // depth (one node = one teaching depth), so downstream consumers see a\n  // continuation, not a duplicate with an unrelated depth. Part numbers come\n  // from each session's own entries; only the inherited depth is cross-session.\n  const splitInherited = new Map<string, { depth: DepthLevel; source: 'feed_hint' | 'planner' | 'escalated' }>();\n  // Packed entries per session id — the post-packing depth pass needs part\n  // metadata (which entry is part 2 of 3) and the session loop is the only\n  // place that still has the PackedSession objects.\n  const entriesBySession = new Map<string, PackedEntry[]>();\n\n  // [4][5][6] Per-session content\n  const seenNodes = new Set<string>();\n  // Continuation parts legitimately repeat a node across consecutive sessions;\n  // coverage (fail-closed) is computed over the full multi-session span.\n  const multiPartNodes = new Set(packed.flatMap((s) => s.entries.filter((e) => e.totalParts > 1).map((e) => e.id)));\n  const sessions = [];\n  const allSeenConcepts = new Set<string>();\n  const allSeenKeywords = new Set<string>();\n  const conceptEncounterMap = new Map<string, number>(); // filled by the post-packing depth pass from the spiral\n  // Concept-level prerequisite map derived from the same dependency edges\n  // buildConceptPrerequisites consumes — lets the ZPD bridge check see\n  // scheduled linkage (prior session's recap concept is often a declared\n  // prerequisite of the session being evaluated).\n  const conceptPrereqMap = new Map<string, string[]>();\n  for (const e of graph.edges) {\n    for (const to of nodeById.get(e.to)?.concept_codes || []) {\n      for (const from of nodeById.get(e.from)?.concept_codes || []) {\n        if (to === from) continue;\n        const list = conceptPrereqMap.get(to) || [];\n        if (!list.includes(from)) list.push(from);\n        conceptPrereqMap.set(to, list);\n      }\n    }\n  }\n\n  for (let i = 0; i < packed.length; i++) {\n    const s = packed[i];\n    for (const id of s.nodeIds) {\n      if (seenNodes.has(id) && multiPartNodes.has(id)) continue;\n      if (seenNodes.has(id)) throw new Error('Node ' + id + ' assigned to multiple sessions');\n      seenNodes.add(id);\n    }\n    const partLabel = (id: string, idx: number): string => {\n      const e = s.entries[idx]!;\n      return e.totalParts > 1 ? nodeById.get(id)!.name + ' (part ' + e.part + '/' + e.totalParts + ')' : nodeById.get(id)!.name;\n    };\n    const nodeNames = s.entries.map((e, idx) => partLabel(e.id, idx));\n    const lessonCode = lessonCodeOf.get(i)!;\n    const unit = units[sessionUnitIdx[i]];\n    // Grammar-safe prose objective: the node's role decides the verb phrase —\n    // concept names are nouns ('SwiftUI State'), skill names are activities,\n    // product steps are deliverables. Verb phrases stay grammatical for any\n    // node-naming style (verified with real domain-graph node names).\n    const verbFor = (kind: string): string => kind === 'concept' ? 'explain and apply' : kind === 'product_step' ? 'complete' : 'carry out';\n    const phrases = s.entries.map((e, idx) => {\n      const node = nodeById.get(e.id)!;\n      return verbFor(node.kind) + ' ' + partLabel(e.id, idx);\n    });\n    const joined = phrases.length === 1\n      ? phrases[0]!\n      : phrases.slice(0, -1).join(', ') + ', and ' + phrases[phrases.length - 1]!;\n    let proseObjective =\n      'By the end of this session, students will be able to ' +\n      joined +\n      (s.nodeIds.length > 1 ? ' — combined in the unit deliverable.' : ' independently in the unit deliverable.');\n    const ctx: SessionContext = { lessonCode, sessionIndex: i, nodeIds: s.nodeIds, packedMinutes: s.knowledgeMinutes + s.practiceMinutes, contentBudget: spec.contentBudget };\n    const nodeKeywords = (ids: string[]) => [...new Set(ids.flatMap((id) => nodeById.get(id)!.keywords))];\n    const allKw = nodeKeywords(s.nodeIds);\n    const entryKw = new Set(constraints.entry_keywords.map((k) => k.toLowerCase()));\n    const MACHINE_ID_PATTERN = /^[A-Za-z]\\d+-(?:S\\d+|[A-Za-z0-9_-]+)$|^[CF]\\d+(?:__ADV\\d+)?$/i;\n    const newKw = [...new Set(s.nodeIds.flatMap((id) => nodeById.get(id)!.new_keywords))]\n      .filter((k) => !entryKw.has(k.toLowerCase()) && !MACHINE_ID_PATTERN.test(k));\n    const prereqKw = allKw.filter((k) => !newKw.includes(k));\n    const sessionPhaseIds = [...new Set(s.nodeIds.flatMap((id) => nodeById.get(id)!.phase_id ? [nodeById.get(id)!.phase_id] : []).filter((x): x is string => !!x))];\n    const pureRevisit = s.nodeIds.length > 0 && s.nodeIds.every((id) => /__ADV\\d{2}$/.test(id));\n    const sessionMinutes = pureRevisit\n      ? {\n          knowledge: Math.min(s.knowledgeMinutes, 15),\n          practice: s.practiceMinutes + (s.knowledgeMinutes - Math.min(s.knowledgeMinutes, 15)),\n        }\n      : {\n          knowledge: s.knowledgeMinutes || 0,\n          practice: s.practiceMinutes || 0,\n        };\n\n    // P50-G2: encounter counts are NOT accumulated here. The Bruner spiral is\n    // computed ONCE for the whole course after packing finishes, so a session's\n    // node order can never change a concept's depth. This loop only records\n    // what the post-packing depth pass needs.\n    entriesBySession.set(lessonCode, s.entries);\n\n    // P50-G1: Vygotsky ZPD & Cognitive Overload Guard. Prereq map lets the\n    // bridge check see scheduled linkage (prior session's recap concept is\n    // often a declared prerequisite — not a missing bridge).\n    const zpdResult = checkSessionZpd(i, s.nodeIds, nodeById, allSeenConcepts, allSeenKeywords, entryKw, warnings, conceptPrereqMap, spec);\n    const prereqDecisions = decidePrerequisites(ctx, nodeById, graph.edges, sessionIndexByNode, sessionOrderByIndex, constraints);\n    if (zpdResult.bridgeRepair) {\n      prereqDecisions.unshift(zpdResult.bridgeRepair);\n    }\n\n    sessions.push({\n      id: lessonCode,\n      unit_id: unit.id,\n      order: i + 1,\n      phase_ids: sessionPhaseIds,\n      // 2026-09-23 (swift-101): 'A + N more' titles hid 1-6 real node names\n      // per session from every downstream artifact. Enumerate instead.\n      title: nodeNames.join(' & '),\n      prose_objective: proseObjective,\n      node_ids: s.nodeIds,\n      allocated_entries: s.entries.map((e) => ({\n        id: e.id,\n        minutes: e.minutes,\n        nominal_minutes: e.nominal_minutes ?? e.minutes,\n        part: e.part,\n        total_parts: e.totalParts,\n      })),\n      new_keywords: newKw,\n      prerequisite_keywords: prereqKw,\n      knowledge_minutes: sessionMinutes.knowledge,\n      // Practice-shaping rules (never exceeding the content budget):\n      // 1. Knowledge-only sessions get a small practice top-up when spare\n      //    budget allows (no phantom minutes).\n      // 2. PURE-REVISIT sessions (every teachable node is an advanced revisit\n      //    of already-introduced concepts) are practice-dominant: the revisit\n      //    re-explains at most 15 minutes, the rest is guided application.\n      //    Spiral pedagogy = apply at greater depth, not re-lecture.\n      practice_minutes: sessionMinutes.practice,\n      overhead_minutes: spec.overheadMinutes,\n      // Filled by the post-packing depth pass (assignDepthsForSessions) so the\n      // whole course reads ONE spiral instead of accumulating a parallel count.\n      depth_assignments: [] as CurriculumPlan['sessions'][number]['depth_assignments'],\n      prerequisite_decisions: prereqDecisions,\n      scaffold_decisions: decideScaffolds(ctx, nodeById, warnings),\n      // Deliverable phrasing follows the node role: concept → evidence is the\n      // explanation, product_step/skill → the artifact or activity itself.\n      exit_evidence: s.entries.map((e) => {\n        const node = nodeById.get(e.id)!;\n        const label = e.totalParts > 1 ? node.name + ' (part ' + e.part + '/' + e.totalParts + ')' : node.name;\n        if (node.kind === 'concept') return 'Student explains and applies ' + label;\n        if (node.kind === 'product_step') return 'Deliverable: ' + label;\n        return 'Student completes ' + label;\n      }),\n      differentiation: {\n        bronze: 'Complete the core deliverable for ' + nodeNames[0] + ' with provided scaffolding.',\n        silver: 'Complete all session deliverables independently.',\n        gold: 'Extend the deliverable: combine ' + nodeNames.join(', ') + ' in a self-chosen variant.',\n      },\n      // P50: ZPD cognitive load status for this session\n      zpd_status: zpdResult.status,\n    });\n  }\n\n  // 2026-09-23 (token budget): ONE batched LLM pass replaces the former\n  // per-session objective loop (24 calls per plan on swift-101). Same\n  // prompt opening line as the old per-session call — pack-routing.ts\n  // recognises it and keeps fan-out on `mid-range`. Failure or a missing\n  // session entry falls back to the deterministic template already stored\n  // in prose_objective (module contract: planning stays replayable).\n  if (options.llmFn && sessions.length > 0) {\n    try {\n      const objectiveSummaries = sessions\n        .map((s) => `${s.id}|${s.title}|template: ${s.prose_objective}`)\n        .join('\\n');\n      const sys = 'You write ONE concise learning objective sentence (max 40 words) for a training session. Output the sentence only.';\n      const sysBatch = 'You write ONE concise learning objective sentence (max 40 words) per session. Output ONLY a JSON object mapping session-id to the sentence. Same language as the session titles.';\n      const usrBatch = `Course goals: ${constraints.course_goals.join('; ') || 'n/a'}.\nSessions:\n${objectiveSummaries}\n\nReturn the JSON object.`;\n      const raw = (await options.llmFn(sysBatch, usrBatch)).trim();\n      const match = raw.match(/\\{[\\s\\S]*\\}/);\n      if (match) {\n        const parsed = JSON.parse(match[0]) as Record<string, unknown>;\n        let upgraded = 0;\n        for (const s of sessions) {\n          const v = parsed[s.id];\n          if (typeof v === 'string' && v.trim().length >= 10) {\n            s.prose_objective = v.trim();\n            upgraded++;\n          }\n        }\n        if (upgraded < sessions.length) {\n          warnings.push(`prose_objective_llm_partial:${upgraded}/${sessions.length}`);\n        }\n      } else {\n        warnings.push('prose_objective_llm_unparseable');\n      }\n    } catch (e) {\n      warnings.push('prose_objective_llm_failed:' + (e instanceof Error ? e.message.slice(0, 80) : String(e).slice(0, 80)));\n    }\n  }\n\n  // Coverage: fail-closed\n  const unassigned = graph.nodes.map((n) => n.id).filter((id) => !seenNodes.has(id));\n  if (unassigned.length > 0) throw new Error('Coverage violation: unassigned nodes ' + unassigned.join(', '));\n\n  // P49: session differentiation (Bronze/Silver/Gold) is STUDENT-FACING task\n  // phrasing — template strings here produced identical generic ladders for\n  // every session of every course (audit 2026-09-16). One batched LLM pass\n  // rewrites them per session; deterministic templates remain the fallback\n  // (llmFn absent / failure) so planning stays replayable.\n  if (options.llmFn && sessions.length > 0) {\n    try {\n      const sessionSummaries = sessions\n        .map((s) => `${s.id}|${s.title}|objective: ${s.prose_objective.slice(0, 120)}|keywords: ${s.new_keywords.join('/')}`)\n        .join('\\n');\n      const dSys = 'You differentiate learning tasks. Output ONLY a JSON object mapping session-id to {\"bronze\":string,\"silver\":string,\"gold\":string}. Each tier ONE sentence: bronze = foundational task with provided scaffolding; silver = independent application; gold = creative extension combining session concepts. Same language as the objectives.';\n      const dUsr = `Age band: ${constraints.age_band[0]}-${constraints.age_band[1]}. Entry level: ${constraints.entry_level}.\\nSessions:\\n${sessionSummaries}`;\n      const raw = (await options.llmFn(dSys, dUsr)).trim();\n      const match = raw.match(/\\{[\\s\\S]*\\}/);\n      if (match) {\n        const parsed = JSON.parse(match[0]) as Record<string, { bronze?: string; silver?: string; gold?: string }>;\n        let upgraded = 0;\n        for (const s of sessions) {\n          const d = parsed[s.id];\n          if (d && typeof d.bronze === 'string' && d.bronze.length >= 10 && typeof d.silver === 'string' && d.silver.length >= 10 && typeof d.gold === 'string' && d.gold.length >= 10) {\n            s.differentiation = { bronze: d.bronze, silver: d.silver, gold: d.gold };\n            upgraded++;\n          }\n        }\n        if (upgraded < sessions.length) warnings.push(`differentiation_llm_partial:${upgraded}/${sessions.length}`);\n      } else {\n        warnings.push('differentiation_llm_unparseable');\n      }\n    } catch (e) {\n      warnings.push('differentiation_llm_failed:' + (e instanceof Error ? e.message.slice(0, 80) : String(e).slice(0, 80)));\n    }\n  }\n\n  // 2026-09-18 (regen4 audit, exit-evidence rule): template exit evidence\n  // (\"Student explains and applies X\") is not observable — the SME judge\n  // flagged sessions for vague exit evidence. One batched LLM pass rewrites\n  // each session's exit_evidence as an observable artifact (a running\n  // screen, a passing test, a saved file). Deterministic templates remain\n  // the fallback (llmFn absent / failure) so planning stays replayable.\n  if (options.llmFn && sessions.length > 0) {\n    try {\n      const eSys = 'You write OBSERVABLE exit evidence for curriculum sessions. Output ONLY a JSON object mapping session-id to an array of 1-3 short strings. Each string must name what a bystander can SEE or VERIFY at the end of the session: a running screen, a passing test, a saved file, correct printed output, a working interaction. NEVER write \"Student understands/explains/applies X\" — describe the artifact or observable result instead. Same language as the session objectives.';\n      const eUsr = `Age band: ${constraints.age_band[0]}-${constraints.age_band[1]}. Entry level: ${constraints.entry_level}.\\nSessions (current exit evidence to improve):\\n${sessions.map((s) => `${s.id}|objective: ${s.prose_objective.slice(0, 100)}|current: ${s.exit_evidence.join(' ; ')}`).join('\\n')}`;\n      const raw = (await options.llmFn(eSys, eUsr)).trim();\n      const match = raw.match(/\\{[\\s\\S]*\\}/);\n      if (match) {\n        const parsed = JSON.parse(match[0]) as Record<string, unknown>;\n        let upgraded = 0;\n        for (const s of sessions) {\n          const arr = parsed[s.id];\n          if (Array.isArray(arr) && arr.length > 0 && arr.every((x) => typeof x === 'string' && x.trim().length >= 8)) {\n            s.exit_evidence = (arr as string[]).map((x) => x.trim());\n            upgraded++;\n          }\n        }\n        if (upgraded < sessions.length) warnings.push(`exit_evidence_llm_partial:${upgraded}/${sessions.length}`);\n      } else {\n        warnings.push('exit_evidence_llm_unparseable');\n      }\n    } catch (e) {\n      warnings.push('exit_evidence_llm_failed:' + (e instanceof Error ? e.message.slice(0, 80) : String(e).slice(0, 80)));\n    }\n  }\n\n  const glossaryScope = sessions.map((s) => ({\n    session_id: s.id,\n    terms: [...new Set(s.node_ids.flatMap((id) => nodeById.get(id)!.keywords))],\n  }));\n\n  // P50: Macro-pedagogical course structures\n  const conceptSpiralProgression = computeConceptSpiralProgression(sessions, nodeById);\n  // P50-G2: ONE depth computation for the whole course. Runs AFTER packing (the\n  // spiral needs the final session order) but BEFORE planPayload, so plan_hash\n  // covers the real depths and every downstream reader (session-slice context,\n  // KX prompt) sees them.\n  assignDepthsForSessions(sessions, nodeById, conceptSpiralProgression, entriesBySession);\n  const walkingSkeleton = buildWalkingSkeleton(units, sessions);\n  const masteryGates = buildMasteryGates(units, sessions);\n  const conceptPrerequisites = buildConceptPrerequisites(sessions, nodeById, graph.edges);\n\n  const planPayload = {\n    units,\n    sessions,\n    course: { objectives: courseObjectives },\n    constraints,\n    walking_skeleton: walkingSkeleton,\n    mastery_gates: masteryGates,\n    concept_spiral_progression: conceptSpiralProgression,\n    concept_prerequisites: conceptPrerequisites,\n  };\n  const planHash = createHash('sha256').update(JSON.stringify(planPayload)).digest('hex').slice(0, 16);\n\n  const plan = CurriculumPlanSchema.parse({\n    schema_version: 1,\n    plan_id: 'plan-' + planHash,\n    plan_hash: planHash,\n    created_at: new Date().toISOString(),\n    source: { graph_type: graph.graph_type, feed_schema_version: graph.graph_type === 'curriculum_feed' ? 2 : null, warnings: graph.warnings, hallucination_count: graph.hallucination_count },\n    constraints,\n    course: { objectives: courseObjectives, capstone_ref: constraints.capstone },\n    units,\n    sessions,\n    walking_skeleton: walkingSkeleton,\n    mastery_gates: masteryGates,\n    concept_spiral_progression: conceptSpiralProgression,\n    concept_prerequisites: conceptPrerequisites,\n    glossary_scope: glossaryScope,\n    translation: options.translation ?? { policy: 'at_publish', target_language: null },\n    coverage_report: { assigned_node_ids: [...seenNodes], unassigned_node_ids: [], warnings },\n    approval: { status: 'draft', approved_at: null, plan_hash: planHash },\n    time_estimates: timeEstimates,\n  });\n\n  const validationReport = validatePlan(plan, graph, constraints);\n  plan.validation_report = validationReport;\n  if (!validationReport.valid) {\n    plan.approval.status = 'infeasible';\n    for (const err of validationReport.errors) {\n      warnings.push(`invariant_violation[${err.code}]: ${err.message}`);\n    }\n  }\n\n  return { plan, warnings };\n}\n\n/**\n * P53: Deterministic Quality & Invariant Validator.\n * Enforces hard pedagogical invariants without heuristic compromises:\n * 1. Capacity & Real Minutes Conservation\n * 2. Session node count (<= 4 nodes per session)\n * 3. ZPD Cognitive Load (<= 2 new concepts per session)\n * 4. Bruner Spiral Depth (Encounter 1 must be CIO/Understand)\n * 5. Macro Structure & Session counts\n * 6. Deliverable Completeness (every session has exit_evidence)\n * 7. Teach-Before-Use (DAG knowledge prerequisite order)\n */\nexport function validatePlan(\n  plan: CurriculumPlan,\n  graph: PlanningGraph,\n  constraints: PlanConstraints,\n): PlanValidationResult {\n  const issues: PlanValidationIssue[] = [];\n  const nodeById = new Map<string, PlanningNode>(graph.nodes.map((n) => [n.id, n]));\n  const contentBudget = Math.round(constraints.session_duration_minutes * (1 - constraints.overhead_ratio));\n\n  // Plan C2 — single price source cross-check: when a node carries a\n  // depth_variants price table, its estimated_minutes MUST be the price at its\n  // own depth (authoritative mode guarantees it; feed data from before the\n  // estimator surfaces the historic \"3 prices for 1 event\" drift as a warning).\n  for (const node of graph.nodes) {\n    if (node.depth_variants && node.depth_hint) {\n      const expected = node.depth_variants[node.depth_hint];\n      if (node.estimated_minutes !== expected) {\n        issues.push({\n          severity: 'warning',\n          code: 'TIME_PRICE_INCONSISTENCY',\n          message: `Node ${node.id} estimated_minutes=${node.estimated_minutes}m but depth_variants[${node.depth_hint}]=${expected}m — two prices for one event`,\n          details: {\n            node_id: node.id,\n            depth: node.depth_hint,\n            estimated_minutes: node.estimated_minutes,\n            expected_minutes: expected,\n            depth_variants: node.depth_variants,\n          },\n        });\n      }\n    }\n  }\n\n  let totalNominalMinutes = 0;\n  let maxNodesInSession = 0;\n  let maxNewConceptsInSession = 0;\n\n  const sessionIndexByNode = new Map<string, number>();\n  for (let sIdx = 0; sIdx < plan.sessions.length; sIdx++) {\n    const s = plan.sessions[sIdx]!;\n    maxNodesInSession = Math.max(maxNodesInSession, s.node_ids.length);\n    maxNewConceptsInSession = Math.max(maxNewConceptsInSession, s.zpd_status.new_concept_count);\n\n    for (const nid of s.node_ids) {\n      if (!sessionIndexByNode.has(nid)) {\n        sessionIndexByNode.set(nid, sIdx);\n      }\n    }\n\n    if (s.node_ids.length > 4) {\n      issues.push({\n        severity: 'error',\n        code: 'SESSION_NODE_OVERLOAD',\n        session_id: s.id,\n        unit_id: s.unit_id,\n        message: `Session ${s.id} contains ${s.node_ids.length} nodes (maximum allowed is 4)`,\n        details: { node_ids: s.node_ids, count: s.node_ids.length },\n      });\n    }\n\n    const upperAge = constraints.age_band?.[1];\n    const isAdult = upperAge !== undefined && upperAge > 15;\n    const sessionBudget = isAdult ? SESSION_COGNITIVE_BUDGET_ADULT : SESSION_COGNITIVE_BUDGET_K12;\n    if (s.zpd_status.cognitive_load > sessionBudget || s.zpd_status.verdict === 'TOO_MANY_NEW') {\n      issues.push({\n        severity: 'error',\n        code: 'ZPD_CONCEPT_OVERLOAD',\n        session_id: s.id,\n        unit_id: s.unit_id,\n        message: `Session ${s.id} introduces cognitive load of ${s.zpd_status.cognitive_load} pts (maximum allowed is ${sessionBudget} pts)`,\n        details: { cognitive_load: s.zpd_status.cognitive_load, new_concept_count: s.zpd_status.new_concept_count },\n      });\n    }\n\n    if (!s.exit_evidence || s.exit_evidence.length === 0) {\n      issues.push({\n        severity: 'error',\n        code: 'MISSING_SESSION_DELIVERABLE',\n        session_id: s.id,\n        unit_id: s.unit_id,\n        message: `Session ${s.id} has no measurable exit evidence/deliverable`,\n        details: {},\n      });\n    }\n\n    // LO time model, idea §3 — Bloom minimum-activity floor: a session whose\n    // Bloom level reaches Apply+ must carry practice (product_step), otherwise\n    // its minutes measure exposure, not learning. Warning only (plan TC5).\n    const sessionNodes = s.node_ids.map((id) => nodeById.get(id)).filter((n): n is PlanningNode => !!n);\n    const hasHighBloom = sessionNodes.some(\n      (n) => n.bloom_hint !== null && BLOOM_ORDER.indexOf(n.bloom_hint) >= BLOOM_ORDER.indexOf('Apply'),\n    );\n    const hasPractice = sessionNodes.some((n) => n.kind === 'product_step');\n    if (hasHighBloom && !hasPractice) {\n      issues.push({\n        severity: 'warning',\n        code: 'BLOOM_FLOOR_MISSING',\n        session_id: s.id,\n        unit_id: s.unit_id,\n        message: `Session ${s.id} teaches Bloom ≥ Apply but contains no practice node (product_step)`,\n        details: { node_ids: s.node_ids },\n      });\n    }\n\n    const sessionNominal = s.allocated_entries && s.allocated_entries.length > 0\n      ? s.allocated_entries.reduce((sum, e) => sum + (e.nominal_minutes ?? e.minutes), 0)\n      : s.node_ids.reduce((sum, id) => {\n          const node = nodeById.get(id);\n          return sum + (node ? node.estimated_minutes : 0);\n        }, 0);\n    totalNominalMinutes += sessionNominal;\n\n    if (sessionNominal > contentBudget * 1.35) {\n      issues.push({\n        severity: 'error',\n        code: 'CAPACITY_OVERFLOW',\n        session_id: s.id,\n        unit_id: s.unit_id,\n        message: `Session ${s.id} nominal duration ${sessionNominal}m exceeds budget (${contentBudget}m)`,\n        details: { nominal_minutes: sessionNominal, content_budget: contentBudget },\n      });\n    }\n  }\n\n  const totalContentBudget = plan.sessions.length * contentBudget;\n  const capacityRatio = totalContentBudget > 0 ? totalNominalMinutes / totalContentBudget : 0;\n\n  if (\n    constraints.total_sessions != null &&\n    typeof constraints.total_sessions === 'number' &&\n    constraints.total_sessions > 0 &&\n    plan.sessions.length !== constraints.total_sessions\n  ) {\n    issues.push({\n      severity: 'error',\n      code: 'TOTAL_SESSIONS_MISMATCH',\n      message: `Course has ${plan.sessions.length} sessions, but requested total_sessions is ${constraints.total_sessions}`,\n      details: { actual_sessions: plan.sessions.length, target_sessions: constraints.total_sessions },\n    });\n  }\n\n  for (const u of plan.units) {\n    const unitSessions = plan.sessions.filter((s) => s.unit_id === u.id);\n    if (plan.units.length > 1 && unitSessions.length < 2) {\n      issues.push({\n        severity: 'warning',\n        code: 'ASYMMETRIC_UNIT_DISTRIBUTION',\n        unit_id: u.id,\n        message: `Unit ${u.id} has only ${unitSessions.length} session(s), violating unit balance`,\n        details: { unit_id: u.id, session_count: unitSessions.length },\n      });\n    }\n  }\n\n  const firstEncounterSession = new Map<string, string>();\n  for (const s of plan.sessions) {\n    for (const da of s.depth_assignments) {\n      const node = nodeById.get(da.node_id);\n      if (!node || node.kind !== 'concept') continue;\n      const isAdv = /__ADV\\d{2}$/.test(da.node_id);\n      for (const cCode of node.concept_codes) {\n        if (!firstEncounterSession.has(cCode)) {\n          firstEncounterSession.set(cCode, s.id);\n          if (!isAdv && da.depth === 'sio') {\n            issues.push({\n              severity: 'error',\n              code: 'SPIRAL_DEPTH_MISMATCH',\n              session_id: s.id,\n              message: `Concept ${cCode} on node ${da.node_id} is assigned depth SIO on its FIRST course encounter in ${s.id} (Bruner Spiral requires CIO/Understand first)`,\n              details: { concept_code: cCode, node_id: da.node_id, depth: da.depth },\n            });\n          }\n        }\n      }\n    }\n  }\n\n  for (const edge of graph.edges) {\n    if (edge.kind === 'knowledge') {\n      const fromSession = sessionIndexByNode.get(edge.from);\n      const toSession = sessionIndexByNode.get(edge.to);\n      if (fromSession !== undefined && toSession !== undefined && fromSession > toSession) {\n        issues.push({\n          severity: 'error',\n          code: 'TEACH_BEFORE_USE_VIOLATION',\n          message: `Prerequisite node ${edge.from} (session index ${fromSession}) is scheduled AFTER dependent node ${edge.to} (session index ${toSession})`,\n          details: { from: edge.from, to: edge.to, fromSession, toSession },\n        });\n      }\n    }\n  }\n\n  const errors = issues.filter((i) => i.severity === 'error');\n  const warnings = issues.filter((i) => i.severity === 'warning');\n  const valid = errors.length === 0;\n  const status: PlanValidationResult['status'] = !valid ? 'infeasible' : (warnings.length > 0 ? 'warnings_only' : 'passed');\n  // C3 — pooled buffer over the plan's time estimates (0 when none attached).\n  const buffer = aggregateBuffer(plan.time_estimates ?? []);\n\n  return {\n    valid,\n    status,\n    summary: {\n      total_sessions: plan.sessions.length,\n      nominal_minutes_sum: totalNominalMinutes,\n      content_budget_sum: totalContentBudget,\n      capacity_ratio: Math.round(capacityRatio * 100) / 100,\n      max_nodes_in_a_session: maxNodesInSession,\n      max_new_concepts_in_a_session: maxNewConceptsInSession,\n      p75_minutes_sum: buffer.p75,\n      buffer_minutes: buffer.buffer,\n    },\n    errors,\n    warnings,\n  };\n}\n\n/** Extract the machine-readable slice the LESSON agent consumes for one session. */\nexport function extractSessionSlice(plan: CurriculumPlan, lessonCode: string): CurriculumPlan['sessions'][number] {\n  const s = plan.sessions.find((x) => x.id === lessonCode);\n  if (!s) throw new Error('Session ' + lessonCode + ' not found in plan ' + plan.plan_id);\n  return s;\n}\n\n/** Compact plan-slice context block for LESSON/satellite prompts (activity design inputs). */\nexport function buildSessionSliceContext(plan: CurriculumPlan, lessonCode: string): string {\n  const s = plan.sessions.find((x) => x.id === lessonCode);\n  if (!s) {\n    throw new CurriculumError({\n      errorCode: 'ERR_LESSON_NOT_IN_SOT',\n      message: `Session \"${lessonCode}\" not found in CURRICULUM_PLAN.json (${plan.plan_hash})`,\n      suggestedAction: 'Đồng bộ CURRICULUM_PLAN rồi chạy lại',\n      retryable: false,\n      lessonId: lessonCode,\n    });\n  }\n  const lines: string[] = [];\n  lines.push('[SESSION SLICE (from CURRICULUM_PLAN ' + plan.plan_hash + ')]');\n  lines.push('- Objective: ' + s.prose_objective);\n  lines.push('- Nodes in scope: ' + s.node_ids.join(', '));\n  lines.push('- New keywords: ' + (s.new_keywords.join(', ') || '(none)'));\n  lines.push('- Prerequisite keywords: ' + (s.prerequisite_keywords.join(', ') || '(none)'));\n  lines.push('- Time split: knowledge ' + s.knowledge_minutes + 'm / practice ' + s.practice_minutes + 'm / overhead ' + s.overhead_minutes + 'm');\n  lines.push('- Depth assignments: ' + s.depth_assignments.map((d) => d.node_id + '=' + d.depth.toUpperCase() + '(' + d.source + ')').join('; '));\n  if (s.zpd_status && s.zpd_status.verdict !== 'OK') {\n    lines.push('- ZPD alert: ' + s.zpd_status.verdict + ' (' + s.zpd_status.issues.join('; ') + ')');\n  }\n  const sessionSpirals = (plan.concept_spiral_progression || []).filter((e) => e.session_id === lessonCode);\n  if (sessionSpirals.length > 0) {\n    lines.push('- Spiral encounters: ' + sessionSpirals.map((e) => `${e.concept_code}#${e.encounter_index}=${e.bloom_cap}(${e.depth.toUpperCase()})`).join('; '));\n  }\n  if (s.prerequisite_decisions.length > 0) {\n    lines.push('- Prerequisite decisions [' + s.prerequisite_decisions.length + ']:');\n    for (const d of s.prerequisite_decisions) lines.push('  * ' + d.node_id + ': ' + d.decision + ' — ' + d.reason);\n  }\n  if (s.scaffold_decisions.length > 0) {\n    lines.push('- Scaffold decisions [' + s.scaffold_decisions.length + ']:');\n    for (const d of s.scaffold_decisions) lines.push('  * ' + d.item + ': ' + d.decision + (d.minutes_saved > 0 ? ' (saves ' + d.minutes_saved + 'm)' : '') + ' — ' + d.reason);\n  }\n  lines.push('- Exit evidence: ' + s.exit_evidence.join('; '));\n  lines.push('- Differentiation: Bronze=' + s.differentiation.bronze + ' Silver=' + s.differentiation.silver + ' Gold=' + s.differentiation.gold);\n  lines.push('- Unit: ' + s.unit_id + ' | Course objectives cite: ' + plan.course.objectives.map((o) => o.id).join(', '));\n  return lines.join('\\n');\n}\n","import type { FrameworkPack, FrameworkStatement } from './frameworkPackSchema';\n\n/**\n * Standards Context Injector — Grounding layer (tầng 1 của cơ chế bám chuẩn).\n *\n * Selects the standard statements RELEVANT to a lesson (by grade band overlap +\n * keyword/concept match) and renders them as a prompt context block containing\n * VERBATIM canonical text. The model must SEE the real standard text — prompt\n * labels like \"operating under CSTA\" are exactly the anti-pattern this replaces.\n *\n * Pure function: pack data in, markdown block out. No I/O, no LLM.\n */\n\nexport interface StandardsSelectionInput {\n  /** Packs adopted by the org / course (already validated + activated). */\n  packs: FrameworkPack[];\n  /** Lesson grade level or band, canonical numeric (single grade or [min,max]). */\n  gradeBand: [number, number] | number;\n  /** Lesson topic text: title + concept names + keywords. Matched against statement keywords + texts. */\n  topicText: string;\n  /** Optional explicit ontora concept codes for the lesson (concept_code from MilestoneInput). */\n  conceptCodes?: string[];\n  /** Hard cap on injected statements to protect the context budget. */\n  maxStatements?: number;\n}\n\nexport interface SelectedStatement {\n  packId: string;\n  statement: FrameworkStatement;\n  score: number;\n  matchedBy: Array<'band' | 'keyword' | 'concept' | 'text'>;\n}\n\nconst DEFAULT_MAX_STATEMENTS = 20;\n\nfunction normalizeBand(band: [number, number] | number): [number, number] {\n  return Array.isArray(band) ? band : [band, band];\n}\n\nfunction tokenize(text: string | undefined | null): Set<string> {\n  if (!text) return new Set();\n  return new Set(\n    text\n      .toLowerCase()\n      .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n      .split(/\\s+/)\n      .filter((w) => w.length > 2)\n  );\n}\n\n/**\n * Rank + select statements for a lesson.\n * Scoring: band overlap is a GATE (statements outside the grade are dropped),\n * keyword/concept/text overlap is the ranking signal.\n */\nexport function selectStatementsForLesson(input: StandardsSelectionInput): SelectedStatement[] {\n  const max = input.maxStatements ?? DEFAULT_MAX_STATEMENTS;\n  const lessonBand = normalizeBand(input.gradeBand);\n  const lessonTokens = tokenize(input.topicText);\n  const conceptSet = new Set((input.conceptCodes ?? []).map((c) => c.toUpperCase().trim()).filter(Boolean));\n\n  const candidates: SelectedStatement[] = [];\n\n  for (const pack of input.packs) {\n    for (const statement of pack.statements) {\n      // Band gate: must overlap the lesson band\n      const [sMin, sMax] = statement.gradeBand;\n      const overlaps = Math.max(sMin, lessonBand[0]) <= Math.min(sMax, lessonBand[1]);\n      if (!overlaps) continue;\n\n      const matchedBy: SelectedStatement['matchedBy'] = ['band'];\n      let score = 1;\n\n      // Keyword match (primary signal — keywords are REQUIRED to be dense by pack lint)\n      const kwTokens = new Set(statement.keywords.map((k) => k.toLowerCase()));\n      let kwHits = 0;\n      for (const t of lessonTokens) if (kwTokens.has(t)) kwHits++;\n      if (kwHits > 0) {\n        matchedBy.push('keyword');\n        score += 2 + kwHits * 0.5;\n      }\n\n      // Concept code match (statement keyword equals an ontora concept code)\n      if (conceptSet.size > 0) {\n        for (const k of statement.keywords) {\n          if (conceptSet.has(k.toUpperCase().replace(/\\s+/g, '_'))) {\n            matchedBy.push('concept');\n            score += 3;\n            break;\n          }\n        }\n      }\n\n      // Raw text-token overlap (fallback signal)\n      let textHits = 0;\n      for (const lang of Object.keys(statement.texts)) {\n        const st = tokenize(statement.texts[lang]);\n        for (const t of lessonTokens) if (st.has(t)) textHits++;\n      }\n      if (textHits >= 2) {\n        matchedBy.push('text');\n        score += Math.min(2, textHits * 0.2);\n      }\n\n      if (score > 1) candidates.push({ packId: pack.manifest.id, statement, score, matchedBy });\n    }\n  }\n\n  return candidates.sort((a, b) => b.score - a.score).slice(0, max);\n}\n\n/**\n * Render the STANDARDS CONTEXT prompt block (verbatim statements + binding rules).\n * Mirrors the shape of the proven CUMULATIVE CONTEXT block in lessonMasterPrompt.\n */\nexport function buildStandardsContextBlock(selected: SelectedStatement[], opts?: { language?: string }): string {\n  if (selected.length === 0) return '';\n\n  const lang = opts?.language;\n  const rows = selected\n    .map(({ packId, statement }) => {\n      const text = (lang && statement.texts[lang]) || Object.values(statement.texts)[0];\n      const band = statement.gradeBand[0] === statement.gradeBand[1] ? `L${statement.gradeBand[0]}` : `L${statement.gradeBand[0]}-L${statement.gradeBand[1]}`;\n      return `- [${packId}:${statement.id} | ${band}] \"${text}\"`;\n    })\n    .join('\\n');\n\n  return [\n    '# STANDARDS CONTEXT (SOURCE OF TRUTH — VERBATIM STATEMENTS)',\n    '',\n    'The statements below are COPIED VERBATIM from official/framework standard documents adopted for this course.',\n    'They are BINDING targets, not suggestions:',\n    '- Every Learning Objective you write MUST be anchored to one or more statement IDs above via standardRefs.',\n    '- You MUST use ONLY statement IDs from this list. NEVER invent, paraphrase IDs, or cite standards not present here.',\n    '- The statement TEXT is the required destination: activities and assessments must demonstrably lead a learner to it.',\n    '- The statement is the DESTINATION, not a script: you may extend beyond it, but you may not skip or contradict it.',\n    '',\n    '## Statement list',\n    rows,\n  ].join('\\n');\n}\n\n/**\n * One-call convenience: packs + lesson info → context block (empty string if nothing matches).\n */\nexport function buildStandardsContext(\n  input: StandardsSelectionInput & { language?: string }\n): { block: string; selected: SelectedStatement[] } {\n  const selected = selectStatementsForLesson(input);\n  return { block: buildStandardsContextBlock(selected, { language: input.language }), selected };\n}\n","import type { FrameworkPack } from './frameworkPackSchema';\n\n/**\n * Standards Coverage Gate — Verification layer (tầng 3 của cơ chế bám chuẩn).\n *\n * Deterministic coverage matrix across the generation chain:\n *   standard statement → learning objective → lesson activities → quiz questions\n *\n * Philosophy: \"bám chuẩn\" must be enforced by CODE, not by prompt goodwill.\n * A statement mapped with kind=\"covers\" that has no LO / no activity / no\n * assessment = a compliance hole, reported with an actionable repair hint.\n *\n * Pure function over already-generated artifacts. No LLM, no I/O.\n */\n\nexport interface CoverageGateInput {\n  packs: FrameworkPack[];\n  /** Learning objectives as generated (code + optional standardRefs anchoring). */\n  objectives: Array<{\n    code: string;\n    standardRefs?: string[];\n    conceptRefs?: string[];\n  }>;\n  /** activitySequence rows of the lesson (lo codes link activities to LOs). Optional: omitted when no structured activity-LO linkage is available. */\n  activities?: Array<{ seq?: number; lo: string[] }>;\n  /** Quiz questions; each links to assessment objectives → alignedLO. */\n  quizQuestions: Array<{ alignedLO?: string; alignedAO?: string }>;\n  /** Assessment objectives table (AO → alignedLO). Questions may reference AOs only. */\n  assessmentObjectives?: Array<{ aoCode: string; alignedLO: string }>;\n}\n\nexport interface StatementCoverageRow {\n  packId: string;\n  statementId: string;\n  statementText: string;\n  status: 'COVERED' | 'PARTIAL' | 'UNCOVERED' | 'UNMAPPED';\n  objectives: string[];\n  hasActivity: boolean;\n  hasAssessment: boolean;\n  issues: string[];\n}\n\nexport interface CoverageGateReport {\n  verdict: 'PASS' | 'WARN' | 'FAIL';\n  coveragePct: number;\n  unresolvedCount?: number;\n  hasUnresolvedRefs?: boolean;\n  rows: StatementCoverageRow[];\n  summary: string;\n  rawMarkdownReport: string;\n}\n\n/** statementRef formats accepted in standardRefs: \"1B-AP-10\" or \"csta-k12-2017:1B-AP-10\". */\nfunction resolveStatementRef(ref: string, packs: FrameworkPack[]): { pack: FrameworkPack; statementId: string } | null {\n  const [head, ...rest] = ref.split(':');\n  const candidatePacks = rest.length > 0 ? packs.filter((p) => p.manifest.id === head) : packs;\n  const statementId = rest.length > 0 ? rest.join(':') : ref;\n  for (const p of candidatePacks) {\n    if (p.statements.some((s) => s.id === statementId)) return { pack: p, statementId };\n  }\n  return null;\n}\n\nexport function evaluateStandardsCoverage(input: CoverageGateInput): CoverageGateReport {\n  const rows: StatementCoverageRow[] = [];\n\n  // AO → LO resolution map\n  const aoToLo = new Map<string, string>();\n  for (const ao of input.assessmentObjectives ?? []) aoToLo.set(ao.aoCode, ao.alignedLO);\n\n  // LO → covered statements (explicit anchors)\n  const loToRefs = new Map<string, Set<string>>();\n  for (const lo of input.objectives) {\n    loToRefs.set(lo.code, new Set(lo.standardRefs ?? []));\n  }\n\n  // LOs actually taught (activities) and assessed (quiz, via direct alignedLO or AO table)\n  const taughtLOs = new Set<string>();\n  for (const act of input.activities ?? []) for (const lo of act.lo) taughtLOs.add(lo);\n  const assessedLOs = new Set<string>();\n  for (const q of input.quizQuestions) {\n    if (q.alignedLO) assessedLOs.add(q.alignedLO);\n    if (q.alignedAO) {\n      const lo = aoToLo.get(q.alignedAO);\n      if (lo) assessedLOs.add(lo);\n    }\n  }\n\n  for (const pack of input.packs) {\n    const mappingByStatement = new Map<string, string>();\n    for (const m of pack.mappings ?? []) {\n      // first mapping wins for kind resolution; \"covers\" beats \"partial\" beats \"extends\"\n      const prev = mappingByStatement.get(m.statementId);\n      if (!prev || (prev !== 'covers' && m.kind === 'covers') || (prev === 'extends' && m.kind !== 'extends')) {\n        mappingByStatement.set(m.statementId, m.kind);\n      }\n    }\n\n    for (const statement of pack.statements) {\n      const refFull = `${pack.manifest.id}:${statement.id}`;\n      const issues: string[] = [];\n\n      // Objectives anchored to this statement\n      const los = input.objectives\n        .filter((lo) => (lo.standardRefs ?? []).some((r) => r === statement.id || r === refFull))\n        .map((lo) => lo.code);\n\n      const kind = mappingByStatement.get(statement.id);\n      const hasMapping = kind !== undefined;\n      const isComplianceRelevant = kind === 'covers';\n\n      const hasActivity = los.some((lo) => taughtLOs.has(lo));\n      const hasAssessment = los.some((lo) => assessedLOs.has(lo));\n\n      let status: StatementCoverageRow['status'];\n      if (!hasMapping) status = 'UNMAPPED';\n      else if (!isComplianceRelevant) status = 'PARTIAL';\n      else if (los.length > 0 && hasActivity && hasAssessment) status = 'COVERED';\n      else status = 'UNCOVERED';\n\n      if (status === 'UNCOVERED') {\n        if (los.length === 0) issues.push('No learning objective anchors this statement (missing standardRefs).');\n        else {\n          if (!hasActivity) issues.push(`Anchored LO(s) ${los.join(', ')} have no activity in lesson flow.`);\n          if (!hasAssessment) issues.push(`Anchored LO(s) ${los.join(', ')} are not measured by any quiz question.`);\n        }\n      }\n\n      rows.push({\n        packId: pack.manifest.id,\n        statementId: statement.id,\n        statementText: Object.values(statement.texts)[0] ?? '',\n        status,\n        objectives: los,\n        hasActivity,\n        hasAssessment,\n        issues,\n      });\n    }\n  }\n\n  // Unresolvable refs (typo / hallucinated IDs) — reported as issues on no row\n  for (const lo of input.objectives) {\n    for (const r of lo.standardRefs ?? []) {\n      if (!resolveStatementRef(r, input.packs)) {\n        rows.push({\n          packId: '(unresolved)',\n          statementId: r,\n          statementText: '',\n          status: 'UNCOVERED',\n          objectives: [lo.code],\n          hasActivity: false,\n          hasAssessment: false,\n          issues: [`standardRef \"${r}\" does not exist in any adopted pack — likely a hallucinated or stale ID`],\n        });\n      }\n    }\n  }\n\n  // Valid compliance rows only (exclude unresolved and non-covered/unmapped/partial)\n  const validRows = rows.filter((r) => r.packId !== '(unresolved)');\n  const complianceRows = validRows.filter((r) => r.status !== 'UNMAPPED' && r.status !== 'PARTIAL');\n  const covered = complianceRows.filter((r) => r.status === 'COVERED').length;\n  const coveragePct = complianceRows.length === 0 ? 100 : Math.round((covered / complianceRows.length) * 100);\n  const unresolvedCount = rows.filter((r) => r.packId === '(unresolved)').length;\n  const hasUnresolvedRefs = unresolvedCount > 0;\n\n  const verdict: CoverageGateReport['verdict'] =\n    unresolvedCount > 0 || coveragePct < 60 ? 'FAIL' : coveragePct < 100 ? 'WARN' : 'PASS';\n\n  const lines: string[] = [\n    '# Standards Coverage Report',\n    '',\n    `- Verdict: **${verdict}**`,\n    `- Compliance coverage: **${coveragePct}%** (${covered}/${complianceRows.length} \"covers\" statements fully taught + assessed)`,\n    `- Unresolved standardRefs: ${unresolvedCount}`,\n    '',\n    '| Pack | Statement | Status | LOs | Activity | Assessment |',\n    '|---|---|---|---|---|---|',\n    ...rows.map(\n      (r) =>\n        `|${r.packId}|${r.statementId}|${r.status}|${r.objectives.join(', ') || '—'}|${r.hasActivity ? '✓' : '✗'}|${r.hasAssessment ? '✓' : '✗'}|`\n    ),\n  ];\n  const issueLines = rows.filter((r) => r.issues.length > 0).flatMap((r) => r.issues.map((i) => `- [${r.packId}:${r.statementId}] ${i}`));\n  if (issueLines.length > 0) lines.push('', '## Issues', ...issueLines);\n\n  return {\n    verdict,\n    coveragePct,\n    unresolvedCount,\n    hasUnresolvedRefs,\n    rows,\n    summary: `Standards coverage ${coveragePct}% — verdict ${verdict}`,\n    rawMarkdownReport: lines.join('\\n'),\n  };\n}\n","import { z } from 'zod';\n\n/**\n * Framework Pack Schema v1.0 — Standards Registry interchange contract.\n *\n * A Framework Pack is a self-contained, schema-validated data bundle describing\n * ONE educational standard/framework (CSTA K-12, NGSS, GDPT 2018, an org's\n * internal standard, ...) in the lowest common denominator that virtually every\n * framework can map onto: a flat list of atomized statements + optional\n * classifications + optional mappings to the Ontora knowledge tree.\n *\n * Design invariants (see docs/ideas/2026-08-29-standards-registry-framework-pack.md):\n * - I1  Pack is DATA, never code. Importing a pack NEVER mutates the Ontora\n *       Master Tree — mappings are reference bridges, resolved (not written).\n * - I2  Canonical statement text (verbatim) is immutable ground truth. Derived\n *       fields (translations, keywords, bloom hints) carry their own provenance.\n * - I3  IDs are stable forever: keep the official source ID when present, else\n *       mint once from content identity (never from row position).\n * - I4  gradeBand is canonical numeric (gradeModel normalizes grades/ages/bands).\n * - I5  Mappings use namespaced targets (ontora:CODE, csta:1B-AP-10, ...) and are\n *       OPTIONAL — a pack with zero mappings still works (statement-only mode).\n * - I6  Everything is versioned: specVersion (this contract) vs contentVersion\n *       (the framework's own content). Published content versions are immutable.\n */\n\n// ─── Shared primitives ───────────────────────────────────────────────────────\n\n/** Two-axis Bloom hint (Anderson & Krathwohl). Matches Ontora's dual-axis usage. */\nexport const BloomHintSchema = z.object({\n  process: z\n    .enum(['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create'])\n    .describe('Cognitive process axis'),\n  knowledge: z\n    .enum(['FACTUAL', 'CONCEPTUAL', 'PROCEDURAL', 'METACOGNITIVE'])\n    .optional()\n    .describe('Knowledge dimension axis (optional — most source standards do not tag it)'),\n});\n\n/** How a record entered the pack — drives trust & review requirements. */\nexport const RecordProvenanceSchema = z.object({\n  method: z\n    .enum(['source_official', 'ai_draft', 'minted_from_content', 'human', 'crosswalk', 'imported'])\n    .describe('source_official = copied from an authoritative machine-readable source; ai_draft = LLM-extracted, REQUIRES human review before activation; minted_from_content = ID synthesized because source has none; crosswalk = derived by the curriculum-crosswalk skill'),\n  reviewedBy: z.string().optional().describe('Person/agent that approved this record (required for ai_draft records before activation)'),\n  reviewedAt: z.string().optional().describe('ISO-8601 timestamp of review'),\n  note: z.string().optional().describe('Free-form provenance note'),\n});\n\n/** Numeric grade band, canonical. [6, 6] = single grade 6; [6, 8] = band. */\nexport const GradeBandSchema = z\n  .array(z.number().int().min(-1).max(30), { message: 'gradeBand must be [minGrade, maxGrade] integers' })\n  .length(2)\n  .refine(([min, max]) => min <= max, { message: 'gradeBand min must be <= max' })\n  .describe('Canonical numeric grade band. -1 = kindergarten/pre-primary. Framework-specific models (VN grades, US bands, ages) normalize into this scale via manifest.gradeModel');\n\n/** Optional free-form classification axes (strand, NGSS dimension, \"Chủ đề\", ...). */\nexport const ClassificationSchema = z.object({\n  axis: z.string().describe('Axis label, e.g. \"strand\", \"dimension\", \"Chủ đề\"'),\n  value: z.string().describe('Value on that axis, e.g. \"AP\", \"Disciplinary Core Idea\", \"Thuật toán\"'),\n});\n\n// ─── Manifest ────────────────────────────────────────────────────────────────\n\nexport const FrameworkPackManifestSchema = z.object({\n  /** Immutable pack identifier. Never reused, never renamed. */\n  id: z\n    .string()\n    .min(3)\n    .regex(/^[a-z0-9][a-z0-9._-]*$/, 'pack id must be kebab/lowercase-safe (a-z 0-9 . _ -)')\n    .describe('Immutable pack identifier, e.g. \"csta-k12-2017\", \"gdpt-2018-tin-hoc\", \"abc-tin-hoc\"'),\n  name: z.string().min(1).describe('Human-readable framework name'),\n  specVersion: z.literal('1.0').describe('Version of THIS pack contract (not the content)'),\n  contentVersion: z\n    .string()\n    .min(1)\n    .describe('Content version of the framework inside this pack. Bump on any content change; published versions are immutable'),\n  subject: z.string().describe('Primary subject domain, e.g. \"computing\", \"science\", \"mathematics\"'),\n  languages: z.array(z.string().min(2)).min(1).describe('BCP-47 language codes present in statement texts, e.g. [\"vi\"], [\"en\",\"vi\"]'),\n  gradeModel: z.object({\n    type: z.enum(['grades', 'ages', 'bands']).describe('grades = school grades (canonical numbers); ages = years old; bands = named developmental bands'),\n    range: GradeBandSchema.describe('Overall grade range covered by the framework'),\n    /** Optional normalization table when type != \"grades\" (e.g. band \"6-8\" -> [6,8]). */\n    normalization: z\n      .array(\n        z.object({\n          from: z.string().describe('Source label, e.g. \"level 6-8\" or \"11-13 years\"'),\n          to: GradeBandSchema,\n        })\n      )\n      .optional()\n      .describe('Explicit label -> numeric band conversion table. Required when type != \"grades\"'),\n  }),\n  provenance: z.object({\n    sourceRef: z.string().describe('Citation of the official source, e.g. \"Thông tư 32/2018/TT-BGDĐT\" or a URL'),\n    sourceUrl: z.string().optional().describe('Canonical URL of the source document or live registry'),\n    license: z.string().describe('License / usage rights of the source text'),\n    importedBy: z.string().describe('Who produced this pack, e.g. \"platform\" or \"org:abc\"'),\n    importedAt: z.string().describe('ISO-8601 timestamp'),\n    originalFileHash: z.string().optional().describe('SHA-256 of the original uploaded file, for source provenance'),\n  }),\n  trust: z.enum(['verified', 'org']).default('org').describe('verified = platform-curated; org = self-served by an org. Generation accepts both; compliance reporting counts verified only'),\n});\n\n// ─── Statement ───────────────────────────────────────────────────────────────\n\nexport const FrameworkStatementSchema = z.object({\n  /** Canonical, forever-stable statement ID (see invariant I3). */\n  id: z\n    .string()\n    .min(2)\n    .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/, 'statement id must not contain whitespace or separators beyond . _ : -')\n    .describe('Statement ID. Official source ID when present (e.g. \"1B-AP-10\"); otherwise minted once from content identity. Namespaced at query time by the pack id, never stored with prefix duplication'),\n  /** Optional hierarchical parent within the SAME pack (GDPT competence → requirement, CSTA strand → statement, ...). */\n  parentId: z.string().optional().describe('Parent statement id within this pack, when the source framework is hierarchical'),\n  gradeBand: GradeBandSchema,\n  /** Verbatim canonical text per language. The FIRST / primary language text is judge ground truth (invariant I2). */\n  texts: z\n    .record(z.string().min(2), z.string().min(1))\n    .refine((t) => Object.keys(t).length > 0, { message: 'texts must contain at least one language entry' })\n    .describe('Verbatim statement text per BCP-47 language key, e.g. {\"vi\": \"Yêu cầu cần đạt...\"}. NEVER paraphrase into these fields'),\n  classifications: z.array(ClassificationSchema).optional().default([]).describe('Optional taxonomy axes from the source framework (strands, dimensions, themes...)'),\n  bloomHint: BloomHintSchema.optional().describe('Optional Bloom dual-axis hint — a HINT for generation, never a binding claim about the source'),\n  keywords: z.array(z.string()).optional().default([]).describe('Retrieval keywords (topic terms). Used by standards retrieval AND by crosswalk theme matching — keep them dense'),\n  sourceRef: z.string().optional().describe('Precise citation within the source, e.g. \"Trang 24, Môn Tin học lớp 6\"'),\n  provenance: RecordProvenanceSchema,\n});\n\n// ─── Mapping bridge (pack → Ontora interlingua) ─────────────────────────────\n\nexport const MappingKindSchema = z.enum(['covers', 'partial', 'extends']).describe('covers = the statement is fully taught when the concept is covered (ONLY \"covers\" counts toward compliance coverage); partial = overlaps partially; extends = statement goes beyond the concept');\n\nexport const FrameworkMappingSchema = z.object({\n  statementId: z.string().describe('Must reference a statement id in this pack'),\n  /** Namespaced target. Grammar: <namespace>:<ID>. e.g. \"ontora:WHILE_LOOP\", \"ontora:PROBLEM_DECOMPOSITION\". Resolved against the target registry at intake — unknown targets FAIL validation. */\n  targetRef: z.string().refine((v) => /^[a-z][a-z0-9]*:[A-Za-z0-9][A-Za-z0-9._-]*$/.test(v), 'targetRef must be \"<namespace>:<ID>\", e.g. \"ontora:FOR_LOOP\"'),\n  kind: MappingKindSchema,\n  confidence: z.number().min(0).max(1).describe('0-1 confidence of this mapping'),\n  provenance: RecordProvenanceSchema,\n});\n\n// ─── Root ────────────────────────────────────────────────────────────────────\n\nexport const FrameworkPackSchema = z.object({\n  manifest: FrameworkPackManifestSchema,\n  statements: z.array(FrameworkStatementSchema).min(1).describe('Atomized statements of the framework'),\n  mappings: z.array(FrameworkMappingSchema).optional().default([]).describe('Optional bridges to the Ontora knowledge tree (statement-only packs are fully functional)'),\n});\n\nexport type FrameworkPack = z.infer<typeof FrameworkPackSchema>;\nexport type FrameworkPackManifest = z.infer<typeof FrameworkPackManifestSchema>;\nexport type FrameworkStatement = z.infer<typeof FrameworkStatementSchema>;\nexport type FrameworkMapping = z.infer<typeof FrameworkMappingSchema>;\nexport type MappingKind = z.infer<typeof MappingKindSchema>;\nexport type RecordProvenance = z.infer<typeof RecordProvenanceSchema>;\n\n// ─── Pack lint (beyond field-level Zod checks) ───────────────────────────────\n\nexport interface PackLintIssue {\n  severity: 'ERROR' | 'WARNING';\n  code: string;\n  message: string;\n  /** statement id or manifest path the issue refers to */\n  ref?: string;\n}\n\n/** Minimum token-overlap ratio for the fuzzy duplicate warning. */\nconst DUP_OVERLAP_RATIO = 0.8;\n\n/**\n * Deterministic structural lint over an already schema-valid pack.\n * Pure function: no I/O, no LLM. Mirrors the ontora validator philosophy —\n * assembly/validation is code, research/judgment is model.\n */\nexport function lintFrameworkPack(pack: FrameworkPack): PackLintIssue[] {\n  const issues: PackLintIssue[] = [];\n  const statements = pack.statements;\n  const ids = new Set<string>();\n\n  for (const s of statements) {\n    // L1 duplicate ids\n    if (ids.has(s.id)) {\n      issues.push({ severity: 'ERROR', code: 'DUP_ID', message: `Duplicate statement id \"${s.id}\"`, ref: s.id });\n    }\n    ids.add(s.id);\n  }\n\n  for (const s of statements) {\n    // L2 parent existence\n    if (s.parentId && !ids.has(s.parentId)) {\n      issues.push({ severity: 'ERROR', code: 'PARENT_MISSING', message: `parentId \"${s.parentId}\" does not exist in this pack`, ref: s.id });\n    }\n    // L3 empty-ish text\n    for (const [lang, text] of Object.entries(s.texts)) {\n      if (!text || text.trim().length < 8) {\n        issues.push({ severity: 'ERROR', code: 'TEXT_TOO_SHORT', message: `\"${lang}\" text is empty or shorter than 8 characters`, ref: s.id });\n      }\n    }\n    // L4 grade band sanity: empty band inside manifest range is fine, but warn outside manifest range\n    const [min, max] = s.gradeBand;\n    const [gMin, gMax] = pack.manifest.gradeModel.range;\n    if (min < gMin || max > gMax) {\n      issues.push({ severity: 'WARNING', code: 'BAND_OUT_OF_RANGE', message: `gradeBand [${min},${max}] falls outside manifest range [${gMin},${gMax}]`, ref: s.id });\n    }\n    // L5 ai_draft without reviewer\n    if (s.provenance.method === 'ai_draft' && !s.provenance.reviewedBy) {\n      issues.push({ severity: 'ERROR', code: 'AI_DRAFT_UNREVIEWED', message: 'ai_draft record has no reviewedBy — human review required before activation', ref: s.id });\n    }\n    // L6 keywords recommended\n    if (!s.keywords || s.keywords.length === 0) {\n      issues.push({ severity: 'WARNING', code: 'NO_KEYWORDS', message: 'No keywords — statement will be hard to retrieve and to crosswalk', ref: s.id });\n    }\n  }\n\n  // L7 fuzzy duplicate texts (same language)\n  const seen = new Map<string, string>();\n  for (const s of statements) {\n    const primaryLang = pack.manifest.languages[0];\n    const text = s.texts[primaryLang];\n    if (!text) continue;\n    const norm = text.toLowerCase().replace(/[^\\p{L}\\p{N}\\s]/gu, ' ').split(/\\s+/).filter((w) => w.length > 2).sort().join(' ');\n    if (!norm) continue;\n    const prev = seen.get(norm);\n    if (prev !== undefined) {\n      issues.push({ severity: 'WARNING', code: 'DUP_TEXT_EXACT', message: `Text is token-identical to statement \"${prev}\"`, ref: s.id });\n    } else {\n      // token-overlap fuzzy pass (O(n^2) avoided via sorted-token key bucketing)\n      for (const [otherNorm, otherId] of seen.entries()) {\n        const a = new Set(norm.split(' '));\n        const b = new Set(otherNorm.split(' '));\n        let inter = 0;\n        for (const w of a) if (b.has(w)) inter++;\n        const ratio = inter / Math.max(a.size, b.size);\n        if (ratio >= DUP_OVERLAP_RATIO) {\n          issues.push({ severity: 'WARNING', code: 'DUP_TEXT_FUZZY', message: `Text ~${Math.round(ratio * 100)}% overlapping with statement \"${otherId}\"`, ref: s.id });\n          break;\n        }\n      }\n      seen.set(norm, s.id);\n    }\n  }\n\n  // L8 mapping integrity\n  for (const m of pack.mappings ?? []) {\n    if (!ids.has(m.statementId)) {\n      issues.push({ severity: 'ERROR', code: 'MAP_STATEMENT_MISSING', message: `mapping references unknown statementId \"${m.statementId}\"`, ref: m.statementId });\n    }\n    if (m.provenance.method === 'ai_draft' && !m.provenance.reviewedBy) {\n      issues.push({ severity: 'ERROR', code: 'AI_DRAFT_UNREVIEWED', message: `mapping to ${m.targetRef} is ai_draft without reviewedBy`, ref: m.statementId });\n    }\n    if (m.kind === 'covers' && m.confidence < 0.5) {\n      issues.push({ severity: 'WARNING', code: 'COVERS_LOW_CONFIDENCE', message: `kind=\"covers\" with confidence ${m.confidence} < 0.5 — consider \"partial\"`, ref: m.statementId });\n    }\n  }\n\n  return issues;\n}\n\nexport interface PackValidationResult {\n  valid: boolean;\n  schemaErrors: string[];\n  lint: PackLintIssue[];\n  stats: {\n    statements: number;\n    mappings: number;\n    coveredStatements: number;\n    statementOnlyStatements: number;\n    gradeRange: [number, number];\n  };\n}\n\n/**\n * Full validation: Zod schema → deterministic lint.\n * Does NOT resolve ontora targets (network/DB concern, layered separately).\n */\nexport function validateFrameworkPack(input: unknown): PackValidationResult {\n  const parsed = FrameworkPackSchema.safeParse(input);\n  if (!parsed.success) {\n    return {\n      valid: false,\n      schemaErrors: parsed.error.issues.map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`),\n      lint: [],\n      stats: { statements: 0, mappings: 0, coveredStatements: 0, statementOnlyStatements: 0, gradeRange: [0, 0] },\n    };\n  }\n  const pack = parsed.data;\n  const lint = lintFrameworkPack(pack);\n  const covered = new Set((pack.mappings ?? []).map((m) => m.statementId));\n  const bands = pack.statements.map((s) => s.gradeBand);\n  return {\n    valid: lint.every((i) => i.severity !== 'ERROR'),\n    schemaErrors: [],\n    lint,\n    stats: {\n      statements: pack.statements.length,\n      mappings: pack.mappings?.length ?? 0,\n      coveredStatements: covered.size,\n      statementOnlyStatements: pack.statements.length - covered.size,\n      gradeRange: [Math.min(...bands.flat()), Math.max(...bands.flat())],\n    },\n  };\n}\n","{\n  \"manifest\": {\n    \"id\": \"csta-pk12-2026\",\n    \"name\": \"CSTA PK–12 Computer Science Standards (2026)\",\n    \"specVersion\": \"1.0\",\n    \"contentVersion\": \"2026.1\",\n    \"subject\": \"computing\",\n    \"languages\": [\n      \"en\"\n    ],\n    \"gradeModel\": {\n      \"type\": \"grades\",\n      \"range\": [\n        0,\n        12\n      ]\n    },\n    \"provenance\": {\n      \"sourceRef\": \"2026 CSTA PK–12 Computer Science Standards, CSTA & WestEd\",\n      \"sourceUrl\": \"https://csteachers.org/pk12standards/\",\n      \"license\": \"CC BY-NC-SA 4.0\",\n      \"importedBy\": \"platform\",\n      \"importedAt\": \"2026-09-12T00:00:00.000Z\"\n    },\n    \"trust\": \"verified\"\n  },\n  \"statements\": [\n    {\n      \"id\": \"EK-ALG-PS-01\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Carry out algorithms in daily activities.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"carry\",\n        \"algorithms\",\n        \"daily\",\n        \"activities\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-ALG-PS-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-ALG-ML-02\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Recognize attributes of objects to notice patterns and make decisions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"recognize\",\n        \"attributes\",\n        \"objects\",\n        \"notice\",\n        \"patterns\",\n        \"decisions\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-ALG-ML-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-ALG-IM-03\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Describe how people create algorithms to solve problems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"describe\",\n        \"people\",\n        \"create\",\n        \"algorithms\",\n        \"solve\",\n        \"problems\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-ALG-IM-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-PRO-PD-04\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Create a sequence of commands to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"create\",\n        \"sequence\",\n        \"commands\",\n        \"solve\",\n        \"problem\",\n        \"express\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-PRO-PD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-PRO-VD-05\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Identify everyday gestures and symbols that represent information people use to make choices.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Variables & Data Storage\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"variables & data storage\",\n        \"identify\",\n        \"everyday\",\n        \"gestures\",\n        \"symbols\",\n        \"represent\",\n        \"information\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-PRO-VD-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-PRO-RD-06\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Describe how a sequence of commands completes a task.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"describe\",\n        \"sequence\",\n        \"commands\",\n        \"completes\",\n        \"task\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-PRO-RD-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-PRO-TR-07\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Identify a step in a sequence of commands that does not work as expected.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"identify\",\n        \"step\",\n        \"sequence\",\n        \"commands\",\n        \"does\",\n        \"work\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-PRO-TR-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-DAT-DC-08\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Use collected data to help answer questions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"collected\",\n        \"data\",\n        \"help\",\n        \"answer\",\n        \"questions\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-DAT-DC-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-DAT-DI-09\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Investigate a question that can be answered by collecting data in students’ everyday environments.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"investigate\",\n        \"question\",\n        \"answered\",\n        \"collecting\",\n        \"data\",\n        \"students\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-DAT-DI-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-DAT-IM-10\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Investigate how data can help a person make informed decisions in everyday life.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"investigate\",\n        \"data\",\n        \"help\",\n        \"person\",\n        \"informed\",\n        \"decisions\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-DAT-IM-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-SYS-HW-11\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Examine the use of tools to accomplish a task or solve a problem for different users.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"examine\",\n        \"tools\",\n        \"accomplish\",\n        \"task\",\n        \"solve\",\n        \"problem\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-SYS-HW-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-SYS-SE-12\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Differentiate between public and private information.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"differentiate\",\n        \"between\",\n        \"public\",\n        \"private\",\n        \"information\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-SYS-SE-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-SYS-IM-13\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Identify responsible behavior when using computing systems and digital tools.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"identify\",\n        \"responsible\",\n        \"behavior\",\n        \"computing\",\n        \"systems\",\n        \"digital\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-SYS-IM-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-SOC-HI-14\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Identify computing technologies used in daily life that have changed over time.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"identify\",\n        \"computing\",\n        \"technologies\",\n        \"used\",\n        \"daily\",\n        \"life\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-SOC-HI-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-SOC-HU-15\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Explain that people design and develop computing technologies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"explain\",\n        \"people\",\n        \"design\",\n        \"develop\",\n        \"computing\",\n        \"technologies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-SOC-HU-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"EK-SOC-CE-16\",\n      \"gradeBand\": [\n        0,\n        0\n      ],\n      \"texts\": {\n        \"en\": \"Identify how people use digital devices at home, at school, and at work.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"identify\",\n        \"people\",\n        \"digital\",\n        \"devices\",\n        \"home\",\n        \"school\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, EK-SOC-CE-16\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-ALG-PS-01\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Decompose a problem or task into individual parts to develop an algorithm.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"decompose\",\n        \"problem\",\n        \"task\",\n        \"into\",\n        \"individual\",\n        \"parts\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-ALG-PS-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-ALG-ML-02\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Recognize that AI systems are technologies that use patterns in data to make decisions or generate new things.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"recognize\",\n        \"systems\",\n        \"technologies\",\n        \"patterns\",\n        \"data\",\n        \"decisions\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-ALG-ML-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-ALG-IM-03\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Explain how a change to an algorithm leads to a different outcome.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"explain\",\n        \"change\",\n        \"algorithm\",\n        \"leads\",\n        \"different\",\n        \"outcome\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-ALG-IM-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-PRO-PD-04\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Create code from an algorithm that includes sequence to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"create\",\n        \"code\",\n        \"algorithm\",\n        \"includes\",\n        \"sequence\",\n        \"solve\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-PRO-PD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-PRO-VD-05\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Identify terms that refer to data values that change over time in everyday life.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Variables & Data Storage\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"variables & data storage\",\n        \"identify\",\n        \"terms\",\n        \"refer\",\n        \"data\",\n        \"values\",\n        \"change\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-PRO-VD-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-PRO-RD-06\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Explain the function of code that includes an event and sequence.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"explain\",\n        \"function\",\n        \"code\",\n        \"includes\",\n        \"event\",\n        \"sequence\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-PRO-RD-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-PRO-TR-07\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Debug a program that includes a sequence of commands.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"debug\",\n        \"program\",\n        \"includes\",\n        \"sequence\",\n        \"commands\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-PRO-TR-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-DAT-DC-08\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Use multiple methods to collect both numeric and non-numeric data to help answer questions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"multiple\",\n        \"methods\",\n        \"collect\",\n        \"both\",\n        \"numeric\",\n        \"nonnumeric\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-DAT-DC-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-DAT-DI-09\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Compare a question that can be answered through a data investigation and a question that can be answered through other means.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"compare\",\n        \"question\",\n        \"answered\",\n        \"through\",\n        \"data\",\n        \"investigation\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-DAT-DI-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-DAT-IM-10\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Examine a variety of data questions that address the needs of a person or community.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"examine\",\n        \"variety\",\n        \"data\",\n        \"questions\",\n        \"address\",\n        \"needs\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-DAT-IM-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-SYS-HW-11\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Describe the purpose of basic hardware components of a computing system, using accurate terminology.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"describe\",\n        \"purpose\",\n        \"basic\",\n        \"hardware\",\n        \"components\",\n        \"computing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-SYS-HW-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-SYS-SE-12\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Describe how to keep devices and online accounts safe from unauthorized access.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"describe\",\n        \"keep\",\n        \"devices\",\n        \"online\",\n        \"accounts\",\n        \"safe\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-SYS-SE-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-SYS-IM-13\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Describe an individual’s role in responsibly using computing systems and digital tools.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"describe\",\n        \"individuals\",\n        \"role\",\n        \"responsibly\",\n        \"computing\",\n        \"systems\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-SYS-IM-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-SOC-HI-14\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Compare how an everyday activity changed after a specific computing technology was introduced.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"compare\",\n        \"everyday\",\n        \"activity\",\n        \"changed\",\n        \"after\",\n        \"specific\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-SOC-HI-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-SOC-HU-15\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Differentiate between activities that humans do well and activities that computing technologies do well.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"differentiate\",\n        \"between\",\n        \"activities\",\n        \"humans\",\n        \"well\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-SOC-HU-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E1-SOC-CE-16\",\n      \"gradeBand\": [\n        1,\n        1\n      ],\n      \"texts\": {\n        \"en\": \"Describe how computing is used by people at home, at school, and in the community.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"describe\",\n        \"computing\",\n        \"used\",\n        \"people\",\n        \"home\",\n        \"school\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E1-SOC-CE-16\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-ALG-PS-01\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Create an algorithm that includes sequence, events, and iteration to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"create\",\n        \"algorithm\",\n        \"includes\",\n        \"sequence\",\n        \"events\",\n        \"iteration\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-ALG-PS-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-ALG-ML-02\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Examine how data is used to train a machine learning model.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"examine\",\n        \"data\",\n        \"used\",\n        \"train\",\n        \"machine\",\n        \"learning\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-ALG-ML-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-ALG-IM-03\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Describe how an algorithm might impact peers in varied situations.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"describe\",\n        \"algorithm\",\n        \"might\",\n        \"impact\",\n        \"peers\",\n        \"varied\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-ALG-IM-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-PRO-PD-04\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Create code from an algorithm that includes sequence, events, and iteration to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"create\",\n        \"code\",\n        \"algorithm\",\n        \"includes\",\n        \"sequence\",\n        \"events\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-PRO-PD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-PRO-VD-05\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Label different representations of information with a name and whether its value is constant or changes.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Variables & Data Storage\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"variables & data storage\",\n        \"label\",\n        \"different\",\n        \"representations\",\n        \"information\",\n        \"name\",\n        \"whether\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-PRO-VD-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-PRO-RD-06\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Explain the steps taken to create a program.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"explain\",\n        \"steps\",\n        \"taken\",\n        \"create\",\n        \"program\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-PRO-RD-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-PRO-TR-07\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Debug a program that includes sequence, events, and iteration.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"debug\",\n        \"program\",\n        \"includes\",\n        \"sequence\",\n        \"events\",\n        \"iteration\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-PRO-TR-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-DAT-DC-08\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Compare numeric and non-numeric types of data in terms of how they are collected and what information they provide.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"compare\",\n        \"numeric\",\n        \"nonnumeric\",\n        \"types\",\n        \"data\",\n        \"terms\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-DAT-DC-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-DAT-DI-09\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Develop a question that can be answered with data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"develop\",\n        \"question\",\n        \"answered\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-DAT-DI-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-DAT-IM-10\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Distinguish between data collection approaches, including those that may lead to inaccurate or biased data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"distinguish\",\n        \"between\",\n        \"data\",\n        \"collection\",\n        \"approaches\",\n        \"including\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-DAT-IM-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-SYS-HW-11\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Explain how the basic hardware components of a computing system work together to perform input and output (I/O) operations.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"explain\",\n        \"basic\",\n        \"hardware\",\n        \"components\",\n        \"computing\",\n        \"system\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-SYS-HW-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-SYS-SE-12\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Explain how online actions have real-world consequences.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"explain\",\n        \"online\",\n        \"actions\",\n        \"have\",\n        \"realworld\",\n        \"consequences\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-SYS-SE-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-SYS-IM-13\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Describe the benefits and harms that arise from an individual’s use of computing systems and digital tools.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"describe\",\n        \"benefits\",\n        \"harms\",\n        \"arise\",\n        \"individuals\",\n        \"computing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-SYS-IM-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-SOC-HI-14\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the ways that people from different cultures, backgrounds, and time periods have designed computing technologies to help them solve problems and express ideas.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"analyze\",\n        \"ways\",\n        \"people\",\n        \"different\",\n        \"cultures\",\n        \"backgrounds\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-SOC-HI-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-SOC-HU-15\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Investigate situations where humans have created computing technologies to solve problems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"investigate\",\n        \"situations\",\n        \"where\",\n        \"humans\",\n        \"have\",\n        \"created\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-SOC-HU-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E2-SOC-CE-16\",\n      \"gradeBand\": [\n        2,\n        2\n      ],\n      \"texts\": {\n        \"en\": \"Investigate how personal interests connect to computing in different industries and careers.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"investigate\",\n        \"personal\",\n        \"interests\",\n        \"connect\",\n        \"computing\",\n        \"different\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E2-SOC-CE-16\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-ALG-PS-01\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Create an algorithm that includes a combination of sequence, events, iteration, and selection to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"create\",\n        \"algorithm\",\n        \"includes\",\n        \"combination\",\n        \"sequence\",\n        \"events\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-ALG-PS-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-ALG-ML-02\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Investigate how a machine learning model can change when new data is added to a training set.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"investigate\",\n        \"machine\",\n        \"learning\",\n        \"model\",\n        \"change\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-ALG-ML-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-ALG-IM-03\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Compare how different algorithms may affect outcomes, situations, and people with a wide range of needs.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"compare\",\n        \"different\",\n        \"algorithms\",\n        \"affect\",\n        \"outcomes\",\n        \"situations\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-ALG-IM-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-PRO-PD-04\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Develop code from a student-created algorithm that includes a combination of sequence, events, iteration, and selection to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"develop\",\n        \"code\",\n        \"studentcreated\",\n        \"algorithm\",\n        \"includes\",\n        \"combination\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-PRO-PD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-PRO-PD-05\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Use constructive feedback to improve a program.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"constructive\",\n        \"feedback\",\n        \"improve\",\n        \"program\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-PRO-PD-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-PRO-VD-06\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Identify the variables being stored and manipulated in a program.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Variables & Data Storage\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"variables & data storage\",\n        \"identify\",\n        \"variables\",\n        \"being\",\n        \"stored\",\n        \"manipulated\",\n        \"program\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-PRO-VD-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-PRO-RD-07\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Articulate how a specific segment of code contributes to the overall purpose of a program.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"articulate\",\n        \"specific\",\n        \"segment\",\n        \"code\",\n        \"contributes\",\n        \"overall\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-PRO-RD-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-PRO-TR-08\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Debug a program that includes a combination of sequence, events, iteration, and selection.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"debug\",\n        \"program\",\n        \"includes\",\n        \"combination\",\n        \"sequence\",\n        \"events\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-PRO-TR-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-DAT-DC-09\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate numeric and non-numeric data for accuracy and completeness.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"evaluate\",\n        \"numeric\",\n        \"nonnumeric\",\n        \"data\",\n        \"accuracy\",\n        \"completeness\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-DAT-DC-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-DAT-DI-10\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Investigate a data question involving relationships between multiple attributes.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"investigate\",\n        \"data\",\n        \"question\",\n        \"involving\",\n        \"relationships\",\n        \"between\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-DAT-DI-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-DAT-IM-11\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Design a data collection process that addresses the needs of people from different backgrounds or groups.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"design\",\n        \"data\",\n        \"collection\",\n        \"process\",\n        \"addresses\",\n        \"needs\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-DAT-IM-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-SYS-HW-12\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Describe the role of software in a computing system to accomplish tasks or solve problems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"describe\",\n        \"role\",\n        \"software\",\n        \"computing\",\n        \"system\",\n        \"accomplish\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-SYS-HW-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-SYS-SE-13\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate how sharing information online might reveal personally identifiable information and other details.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"evaluate\",\n        \"sharing\",\n        \"information\",\n        \"online\",\n        \"might\",\n        \"reveal\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-SYS-SE-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-SYS-NT-14\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Explain how people access the internet to gain information and communicate with each other.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Networks\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"networks\",\n        \"explain\",\n        \"people\",\n        \"access\",\n        \"internet\",\n        \"gain\",\n        \"information\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-SYS-NT-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-SYS-IM-15\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Describe how widely used computing systems may impact an individual’s life and community.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"describe\",\n        \"widely\",\n        \"used\",\n        \"computing\",\n        \"systems\",\n        \"impact\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-SYS-IM-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-SOC-HI-16\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Examine how computing innovations have changed the ways people live, work, or communicate over time.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"examine\",\n        \"computing\",\n        \"innovations\",\n        \"have\",\n        \"changed\",\n        \"ways\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-SOC-HI-16\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-SOC-ET-17\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Describe how new technologies create both benefits and risks in personal and family life.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"describe\",\n        \"technologies\",\n        \"create\",\n        \"both\",\n        \"benefits\",\n        \"risks\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-SOC-ET-17\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-SOC-HU-18\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Examine why people design and build computing technologies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"examine\",\n        \"people\",\n        \"design\",\n        \"build\",\n        \"computing\",\n        \"technologies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-SOC-HU-18\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E3-SOC-CE-19\",\n      \"gradeBand\": [\n        3,\n        3\n      ],\n      \"texts\": {\n        \"en\": \"Explain how people in different industries use computing technologies and skills to accomplish their work.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"explain\",\n        \"people\",\n        \"different\",\n        \"industries\",\n        \"computing\",\n        \"technologies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E3-SOC-CE-19\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-ALG-PS-01\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Create a written representation of an algorithm that includes a combination of sequence, events, iteration, and selection to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"create\",\n        \"written\",\n        \"representation\",\n        \"algorithm\",\n        \"includes\",\n        \"combination\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-ALG-PS-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-ALG-ML-02\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Analyze relationships between the properties of training data and a machine learning model’s output.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"analyze\",\n        \"relationships\",\n        \"between\",\n        \"properties\",\n        \"training\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-ALG-ML-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-ALG-IM-03\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate how different algorithms for solving the same problem produce outcomes that may benefit or disadvantage different groups of people.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"evaluate\",\n        \"different\",\n        \"algorithms\",\n        \"solving\",\n        \"same\",\n        \"problem\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-ALG-IM-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-PRO-PD-04\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Compare different programming solutions to the same problem based on correctness and clarity.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"compare\",\n        \"different\",\n        \"solutions\",\n        \"same\",\n        \"problem\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-PRO-PD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-PRO-PD-05\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Collaborate with a team by offering a meaningful contribution to creating a program.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"collaborate\",\n        \"team\",\n        \"offering\",\n        \"meaningful\",\n        \"contribution\",\n        \"creating\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-PRO-PD-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-PRO-VD-06\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Trace how data flows and changes variable values in a program.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Variables & Data Storage\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"variables & data storage\",\n        \"trace\",\n        \"data\",\n        \"flows\",\n        \"changes\",\n        \"variable\",\n        \"values\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-PRO-VD-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-PRO-RD-07\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Document a program to clarify its functionality.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"document\",\n        \"program\",\n        \"clarify\",\n        \"functionality\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-PRO-RD-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-PRO-TR-08\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Debug a program incrementally and repeatedly throughout the development process.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"debug\",\n        \"program\",\n        \"incrementally\",\n        \"repeatedly\",\n        \"throughout\",\n        \"development\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-PRO-TR-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-DAT-DC-09\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Organize collected data into a table using a computational tool, with rows representing records and columns representing attributes.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"organize\",\n        \"collected\",\n        \"data\",\n        \"into\",\n        \"table\",\n        \"computational\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-DAT-DC-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-DAT-DI-10\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Create an explanation that includes at least one data visualization to report the process and results of a data investigation.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"create\",\n        \"explanation\",\n        \"includes\",\n        \"least\",\n        \"data\",\n        \"visualization\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-DAT-DI-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-DAT-IM-11\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Investigate how data collected about people may affect individuals and groups.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"investigate\",\n        \"data\",\n        \"collected\",\n        \"about\",\n        \"people\",\n        \"affect\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-DAT-IM-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-SYS-HW-12\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Apply a basic troubleshooting process to identify and fix common hardware and software issues.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"apply\",\n        \"basic\",\n        \"troubleshooting\",\n        \"process\",\n        \"identify\",\n        \"common\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-SYS-HW-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-SYS-SE-13\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Distinguish between authentication and authorization in protecting devices and private information.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"distinguish\",\n        \"between\",\n        \"authentication\",\n        \"authorization\",\n        \"protecting\",\n        \"devices\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-SYS-SE-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-SYS-NT-14\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Compare wired and wireless methods that computing devices use to connect to the internet.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Networks\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"networks\",\n        \"compare\",\n        \"wired\",\n        \"wireless\",\n        \"methods\",\n        \"computing\",\n        \"devices\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-SYS-NT-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-SYS-IM-15\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Investigate the impacts of widely used computing systems on natural resources and the environment.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"investigate\",\n        \"widely\",\n        \"used\",\n        \"computing\",\n        \"systems\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-SYS-IM-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-SOC-HI-16\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Investigate the contributions of diverse individuals and communities in the history of computing.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"investigate\",\n        \"contributions\",\n        \"diverse\",\n        \"individuals\",\n        \"communities\",\n        \"history\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-SOC-HI-16\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-SOC-ET-17\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how the limitations of existing technologies can lead to emerging technologies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"analyze\",\n        \"limitations\",\n        \"existing\",\n        \"technologies\",\n        \"lead\",\n        \"emerging\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-SOC-ET-17\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-SOC-HU-18\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Distinguish between human learning and machine learning processes.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"distinguish\",\n        \"between\",\n        \"human\",\n        \"learning\",\n        \"machine\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-SOC-HU-18\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E4-SOC-CE-19\",\n      \"gradeBand\": [\n        4,\n        4\n      ],\n      \"texts\": {\n        \"en\": \"Investigate how the workforce adopts new computing technologies and continues to update their computing skills.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"investigate\",\n        \"workforce\",\n        \"adopts\",\n        \"computing\",\n        \"technologies\",\n        \"continues\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E4-SOC-CE-19\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-ALG-PS-01\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Create a visual representation of an algorithm that includes variables and a combination of sequence, events, iteration, and selection to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"create\",\n        \"visual\",\n        \"representation\",\n        \"algorithm\",\n        \"includes\",\n        \"variables\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-ALG-PS-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-ALG-ML-02\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Train a machine learning model to make a classification or prediction.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"train\",\n        \"machine\",\n        \"learning\",\n        \"model\",\n        \"classification\",\n        \"prediction\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-ALG-ML-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-ALG-IM-03\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Articulate how human-centered design principles are incorporated into the development of a computing technology.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"articulate\",\n        \"humancentered\",\n        \"design\",\n        \"principles\",\n        \"incorporated\",\n        \"into\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-ALG-IM-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-PRO-PD-04\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Create a novel program by modifying or combining elements of existing programs.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"create\",\n        \"novel\",\n        \"program\",\n        \"modifying\",\n        \"combining\",\n        \"elements\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-PRO-PD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-PRO-PD-05\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Construct individual components of a program that are collaboratively assembled into a programming project.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"construct\",\n        \"individual\",\n        \"components\",\n        \"program\",\n        \"collaboratively\",\n        \"assembled\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-PRO-PD-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-PRO-VD-06\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Use variables to store, compare, and modify data within a program.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Variables & Data Storage\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"variables & data storage\",\n        \"variables\",\n        \"store\",\n        \"compare\",\n        \"modify\",\n        \"data\",\n        \"within\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-PRO-VD-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-PRO-RD-07\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Create embedded or external documentation for a programming project.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"create\",\n        \"embedded\",\n        \"external\",\n        \"documentation\",\n        \"project\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-PRO-RD-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-PRO-TR-08\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Debug a program using systematic strategies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"debug\",\n        \"program\",\n        \"systematic\",\n        \"strategies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-PRO-TR-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-DAT-DC-09\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Use computational tools to collect and organize different types of data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"computational\",\n        \"tools\",\n        \"collect\",\n        \"organize\",\n        \"different\",\n        \"types\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-DAT-DC-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-DAT-DI-10\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Analyze a dataset to identify the nature and possible sources of variability in the data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"analyze\",\n        \"dataset\",\n        \"identify\",\n        \"nature\",\n        \"possible\",\n        \"sources\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-DAT-DI-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-DAT-IM-11\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the benefits and risks of a computing technology that uses collected data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"analyze\",\n        \"benefits\",\n        \"risks\",\n        \"computing\",\n        \"technology\",\n        \"uses\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-DAT-IM-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-SYS-HW-12\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Explain how hardware and software components of a computing system work together to perform input and output operations, processing, and storage.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"explain\",\n        \"hardware\",\n        \"software\",\n        \"components\",\n        \"computing\",\n        \"system\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-SYS-HW-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-SYS-SE-13\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Describe the concepts of the CIA triad and how each component is important in protecting information.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"describe\",\n        \"concepts\",\n        \"triad\",\n        \"each\",\n        \"component\",\n        \"important\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-SYS-SE-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-SYS-NT-14\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Distinguish between the components of wired and wireless networks.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Networks\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"networks\",\n        \"distinguish\",\n        \"between\",\n        \"components\",\n        \"wired\",\n        \"wireless\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-SYS-NT-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-SYS-IM-15\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Examine how computing systems impact culture and the ways people live and work.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"examine\",\n        \"computing\",\n        \"systems\",\n        \"impact\",\n        \"culture\",\n        \"ways\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-SYS-IM-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-SOC-HI-16\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how the inclusion or exclusion of diverse individuals and communities has shaped the design, development, and societal impact of computing technologies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"analyze\",\n        \"inclusion\",\n        \"exclusion\",\n        \"diverse\",\n        \"individuals\",\n        \"communities\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-SOC-HI-16\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-SOC-ET-17\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Examine how people decide whether or not to use emerging technologies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"examine\",\n        \"people\",\n        \"decide\",\n        \"whether\",\n        \"emerging\",\n        \"technologies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-SOC-ET-17\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-SOC-HU-18\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate when it is appropriate to use or not use computing technologies to solve a problem.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"evaluate\",\n        \"appropriate\",\n        \"computing\",\n        \"technologies\",\n        \"solve\",\n        \"problem\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-SOC-HU-18\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"E5-SOC-CE-19\",\n      \"gradeBand\": [\n        5,\n        5\n      ],\n      \"texts\": {\n        \"en\": \"Examine how professionals collaborate while using computing technologies to solve problems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"examine\",\n        \"professionals\",\n        \"collaborate\",\n        \"while\",\n        \"computing\",\n        \"technologies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, E5-SOC-CE-19\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-PS-01\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Design an algorithm that includes variables of multiple data types to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"design\",\n        \"algorithm\",\n        \"includes\",\n        \"variables\",\n        \"multiple\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-PS-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-PS-02\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Model a given algorithm with a flowchart or pseudocode that includes a combination of control structures and procedures.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"model\",\n        \"given\",\n        \"algorithm\",\n        \"flowchart\",\n        \"pseudocode\",\n        \"includes\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-PS-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-PS-03\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Verify the accuracy of an algorithm for given inputs.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"verify\",\n        \"accuracy\",\n        \"algorithm\",\n        \"given\",\n        \"inputs\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-PS-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-PS-04\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Justify whether a problem is best solved using procedural instructions, rule- based logic, data-driven methods, or a combination of these approaches.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"justify\",\n        \"whether\",\n        \"problem\",\n        \"best\",\n        \"solved\",\n        \"procedural\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-PS-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-PS-05\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Use an AI tool to generate outputs that assist in solving a computational problem.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"tool\",\n        \"generate\",\n        \"outputs\",\n        \"assist\",\n        \"solving\",\n        \"computational\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-PS-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-ML-06\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Hypothesize how a machine learning model generates classifications or predictions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"hypothesize\",\n        \"machine\",\n        \"learning\",\n        \"model\",\n        \"generates\",\n        \"classifications\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-ML-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-ML-07\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Investigate ways to improve the accuracy of a machine learning model and reduce bias by refining the quality of examples and nonexamples in the training data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"investigate\",\n        \"ways\",\n        \"improve\",\n        \"accuracy\",\n        \"machine\",\n        \"learning\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-ML-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-ML-08\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the features and limitations of a machine learning model.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"evaluate\",\n        \"features\",\n        \"limitations\",\n        \"machine\",\n        \"learning\",\n        \"model\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-ML-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-IM-09\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate which human-centered design principles are present or missing in an existing computing technology.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"evaluate\",\n        \"humancentered\",\n        \"design\",\n        \"principles\",\n        \"present\",\n        \"missing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-IM-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-IM-10\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Examine evidence of beneficial and harmful impacts, ethical issues, and biases of algorithms encountered in daily life.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"examine\",\n        \"evidence\",\n        \"beneficial\",\n        \"harmful\",\n        \"ethical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-IM-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-ALG-IM-11\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Modify an algorithm to address a specific societal impact, ethical issue, or bias.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"modify\",\n        \"algorithm\",\n        \"address\",\n        \"specific\",\n        \"societal\",\n        \"impact\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-ALG-IM-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-PD-12\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Use a procedure to structure code for clarity and reusability.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"procedure\",\n        \"structure\",\n        \"code\",\n        \"clarity\",\n        \"reusability\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-PD-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-PD-13\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Use reference documentation in program development.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"reference\",\n        \"documentation\",\n        \"program\",\n        \"development\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-PD-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-PD-14\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Justify the importance of attribution and intellectual property when developing computing technologies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"justify\",\n        \"importance\",\n        \"attribution\",\n        \"intellectual\",\n        \"property\",\n        \"developing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-PD-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-PD-15\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Develop a program utilizing inclusive collaboration practices.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"develop\",\n        \"program\",\n        \"utilizing\",\n        \"inclusive\",\n        \"collaboration\",\n        \"practices\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-PD-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-VD-16\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Use variables of multiple data types to store, access, and manipulate data within a program.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Variables & Data Storage\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"variables & data storage\",\n        \"variables\",\n        \"multiple\",\n        \"data\",\n        \"types\",\n        \"store\",\n        \"access\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-VD-16\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-RD-17\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the roles of iteration, selection, variables, and procedures in a segment of code.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"analyze\",\n        \"roles\",\n        \"iteration\",\n        \"selection\",\n        \"variables\",\n        \"procedures\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-RD-17\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-RD-18\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Analyze AI-generated code for accuracy and usability in a programming project.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"analyze\",\n        \"aigenerated\",\n        \"code\",\n        \"accuracy\",\n        \"usability\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-RD-18\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-TR-19\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Use systematic strategies to test, refine, and document changes to a computing technology to meet the intended purpose.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"systematic\",\n        \"strategies\",\n        \"test\",\n        \"refine\",\n        \"document\",\n        \"changes\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-TR-19\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-PRO-TR-20\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Refine a computing technology based on user feedback to improve its usability and accessibility.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"refine\",\n        \"computing\",\n        \"technology\",\n        \"based\",\n        \"user\",\n        \"feedback\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-PRO-TR-20\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-DC-21\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate how different levels of precision and granularity in data collection affect accuracy, storage, and analysis.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"evaluate\",\n        \"different\",\n        \"levels\",\n        \"precision\",\n        \"granularity\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-DC-21\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-DC-22\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Explain how data and its associated metadata can be used to answer questions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"explain\",\n        \"data\",\n        \"associated\",\n        \"metadata\",\n        \"used\",\n        \"answer\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-DC-22\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-DC-23\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Use a computational tool to sort, filter, group, and summarize structured data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"computational\",\n        \"tool\",\n        \"sort\",\n        \"filter\",\n        \"group\",\n        \"summarize\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-DC-23\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-DC-24\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Analyze options to address a data quality issue.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"analyze\",\n        \"options\",\n        \"address\",\n        \"data\",\n        \"quality\",\n        \"issue\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-DC-24\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-DI-25\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Use a computational tool to identify relationships among variables in a dataset and make a classification or prediction.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"computational\",\n        \"tool\",\n        \"identify\",\n        \"relationships\",\n        \"among\",\n        \"variables\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-DI-25\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-DI-26\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Create data visualizations to show how different design choices can impact the interpretation of the same data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"create\",\n        \"data\",\n        \"visualizations\",\n        \"show\",\n        \"different\",\n        \"design\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-DI-26\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-DI-27\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Summarize a data investigation process, including potential biases, limitations, and supporting evidence.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"summarize\",\n        \"data\",\n        \"investigation\",\n        \"process\",\n        \"including\",\n        \"potential\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-DI-27\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-IM-28\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Explain the benefits and risks of allowing personal data and metadata to be collected and used in datasets, including issues of data ownership, privacy, and sovereignty.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"explain\",\n        \"benefits\",\n        \"risks\",\n        \"allowing\",\n        \"personal\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-IM-28\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-DAT-IM-29\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how decisions made at different stages of working with data can lead to biased data, misleading conclusions, and compromised AI models.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"analyze\",\n        \"decisions\",\n        \"made\",\n        \"different\",\n        \"stages\",\n        \"working\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-DAT-IM-29\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SYS-HW-30\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Examine differences between computing systems based on user needs, system requirements, and potential societal, environmental, and ethical impacts.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"examine\",\n        \"differences\",\n        \"between\",\n        \"computing\",\n        \"systems\",\n        \"based\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SYS-HW-30\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SYS-HW-31\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Describe computing devices used in various industries, their basic functions, and how they are used to accomplish tasks or solve problems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"describe\",\n        \"computing\",\n        \"devices\",\n        \"used\",\n        \"various\",\n        \"industries\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SYS-HW-31\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SYS-SE-32\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Explain the effects of not using the CIA triad when working with data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"explain\",\n        \"effects\",\n        \"triad\",\n        \"working\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SYS-SE-32\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SYS-SE-33\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate common types of cyber attacks and preventions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"evaluate\",\n        \"common\",\n        \"types\",\n        \"cyber\",\n        \"attacks\",\n        \"preventions\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SYS-SE-33\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SYS-NT-34\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Model how information in a network is broken down into packets, transmitted between devices, and reassembled.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Networks\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"networks\",\n        \"model\",\n        \"information\",\n        \"network\",\n        \"broken\",\n        \"down\",\n        \"into\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SYS-NT-34\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SYS-NT-35\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Explain how the resilience of the internet depends on interconnected devices and their roles and functions within the network.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Networks\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"networks\",\n        \"explain\",\n        \"resilience\",\n        \"internet\",\n        \"depends\",\n        \"interconnected\",\n        \"devices\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SYS-NT-35\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SYS-IM-36\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Collaborate to improve the design of a computing system to meet the needs of diverse users.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"collaborate\",\n        \"improve\",\n        \"design\",\n        \"computing\",\n        \"system\",\n        \"meet\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SYS-IM-36\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SYS-IM-37\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Examine how access to computing systems can vary based on personal and social factors, such as physical ability, geographic location, socioeconomic status, and age.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"examine\",\n        \"access\",\n        \"computing\",\n        \"systems\",\n        \"vary\",\n        \"based\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SYS-IM-37\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SOC-HI-38\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Compare the roles of individuals, communities, organizations, and governments in shaping computing technologies across major eras in computing history.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"compare\",\n        \"roles\",\n        \"individuals\",\n        \"communities\",\n        \"organizations\",\n        \"governments\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SOC-HI-38\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SOC-HI-39\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Analyze intended and unintended impacts of a historical computing technology on society and the environment.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"analyze\",\n        \"intended\",\n        \"unintended\",\n        \"impacts\",\n        \"historical\",\n        \"computing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SOC-HI-39\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SOC-ET-40\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate when it is appropriate to use AI and other emerging technologies to solve a problem based on their capabilities, limitations, and environmental impacts.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"evaluate\",\n        \"appropriate\",\n        \"emerging\",\n        \"technologies\",\n        \"solve\",\n        \"problem\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SOC-ET-40\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SOC-ET-41\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate how the decisions made while designing an emerging technology influence user experiences differently across different communities.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"evaluate\",\n        \"decisions\",\n        \"made\",\n        \"while\",\n        \"designing\",\n        \"emerging\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SOC-ET-41\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SOC-ET-42\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Debate ways an emerging technology impacts the social, cultural, and environmental issues in local communities.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"debate\",\n        \"ways\",\n        \"emerging\",\n        \"technology\",\n        \"impacts\",\n        \"social\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SOC-ET-42\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SOC-HU-43\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how the decisions humans make when using computing technologies have ethical and social consequences.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"analyze\",\n        \"decisions\",\n        \"humans\",\n        \"computing\",\n        \"technologies\",\n        \"have\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SOC-HU-43\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SOC-CE-44\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how workers in different careers use computational thinking to solve real-world problems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"analyze\",\n        \"workers\",\n        \"different\",\n        \"careers\",\n        \"computational\",\n        \"thinking\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SOC-CE-44\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"MS-SOC-CE-45\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate how automation in technology can create or replace jobs and change how people work.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"evaluate\",\n        \"automation\",\n        \"technology\",\n        \"create\",\n        \"replace\",\n        \"jobs\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, MS-SOC-CE-45\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-PS-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Design an algorithm using appropriate data structures to solve a problem or express an idea.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"design\",\n        \"algorithm\",\n        \"appropriate\",\n        \"data\",\n        \"structures\",\n        \"solve\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-PS-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-PS-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Optimize the design of an algorithm using procedural abstraction and control structures.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"optimize\",\n        \"design\",\n        \"algorithm\",\n        \"procedural\",\n        \"abstraction\",\n        \"control\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-PS-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-PS-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate algorithms for efficiency, correctness, and clarity, using metrics or test cases.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"evaluate\",\n        \"algorithms\",\n        \"efficiency\",\n        \"correctness\",\n        \"clarity\",\n        \"metrics\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-PS-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-PS-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Describe the differences between deterministic and probabilistic algorithms.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"describe\",\n        \"differences\",\n        \"between\",\n        \"deterministic\",\n        \"probabilistic\",\n        \"algorithms\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-PS-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-PS-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate AI-generated output to assess bias, accuracy, and potential harms.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Algorithmic Problem Solving\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"algorithmic problem solving\",\n        \"evaluate\",\n        \"aigenerated\",\n        \"output\",\n        \"assess\",\n        \"bias\",\n        \"accuracy\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-PS-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-ML-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Justify the selection of a type of AI algorithm to accomplish a task.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"justify\",\n        \"selection\",\n        \"type\",\n        \"algorithm\",\n        \"accomplish\",\n        \"task\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-ML-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-ML-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate training data by examining its source, quality, representativeness, potential biases, and privacy implications.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"evaluate\",\n        \"training\",\n        \"data\",\n        \"examining\",\n        \"source\",\n        \"quality\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-ML-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-ML-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a machine learning model for a chosen task using appropriate data and tools.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Machine Learning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"machine learning\",\n        \"develop\",\n        \"machine\",\n        \"learning\",\n        \"model\",\n        \"chosen\",\n        \"task\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-ML-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-IM-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Design a computing technology using human-centered design principles.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"design\",\n        \"computing\",\n        \"technology\",\n        \"humancentered\",\n        \"principles\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-IM-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-IM-10\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the ethical implications, societal impacts, and potential biases of rule- based and data-driven algorithms.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"evaluate\",\n        \"ethical\",\n        \"implications\",\n        \"societal\",\n        \"potential\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-IM-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-ALG-IM-11\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Articulate the values embedded in the design of an algorithmic system.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Algorithms & Design\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"algorithms & design\",\n        \"impacts\",\n        \"articulate\",\n        \"values\",\n        \"embedded\",\n        \"design\",\n        \"algorithmic\",\n        \"system\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-ALG-IM-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-PD-12\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a modular program that uses procedures, external libraries, or objects to improve reusability and readability.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"create\",\n        \"modular\",\n        \"program\",\n        \"uses\",\n        \"procedures\",\n        \"external\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-PD-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-PD-13\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Use documentation, libraries, application programming interfaces (APIs), and other tools in program development.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"documentation\",\n        \"libraries\",\n        \"application\",\n        \"interfaces\",\n        \"apis\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-PD-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-PD-14\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply appropriate attribution of intellectual property when developing a computing technology.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"apply\",\n        \"appropriate\",\n        \"attribution\",\n        \"intellectual\",\n        \"property\",\n        \"developing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-PD-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-PD-15\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Collaborate on a programming project using a defined workflow that includes design documentation and clear task roles.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Program Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"program development\",\n        \"collaborate\",\n        \"project\",\n        \"defined\",\n        \"workflow\",\n        \"includes\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-PD-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-VD-16\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a program that uses appropriate data structures to store, access, and manipulate data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Variables & Data Storage\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"variables & data storage\",\n        \"create\",\n        \"program\",\n        \"uses\",\n        \"appropriate\",\n        \"data\",\n        \"structures\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-VD-16\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-RD-17\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how a segment of code works, including the role of parameters, return values, and data structures.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"analyze\",\n        \"segment\",\n        \"code\",\n        \"works\",\n        \"including\",\n        \"role\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-RD-17\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-RD-18\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate AI-generated code for accuracy, reliability, and alignment with program requirements.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Reading & Documenting\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"reading & documenting\",\n        \"evaluate\",\n        \"aigenerated\",\n        \"code\",\n        \"accuracy\",\n        \"reliability\",\n        \"alignment\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-RD-18\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-TR-19\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate a computing technology’s alignment with design specifications and responsible design values, including its correctness, effectiveness, and user experience.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"evaluate\",\n        \"computing\",\n        \"technologys\",\n        \"alignment\",\n        \"design\",\n        \"specifications\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-TR-19\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-PRO-TR-20\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Refine a computing technology based on user feedback, testing results, and responsible design values to improve its effectiveness and impact.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Programming\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"programming\",\n        \"testing & refining\",\n        \"refine\",\n        \"computing\",\n        \"technology\",\n        \"based\",\n        \"user\",\n        \"feedback\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-PRO-TR-20\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-DAT-DC-21\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Use a computational tool to generate simulated data that fits certain parameters for use in a simulation.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"computational\",\n        \"tool\",\n        \"generate\",\n        \"simulated\",\n        \"data\",\n        \"fits\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-DAT-DC-21\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-DAT-DC-22\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a data dictionary that describes the name, type, and allowable values for each attribute and the logical relationships between variables in a dataset.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"create\",\n        \"data\",\n        \"dictionary\",\n        \"describes\",\n        \"name\",\n        \"type\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-DAT-DC-22\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-DAT-DC-23\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Use a computational tool to clean and organize text-based data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"computational\",\n        \"tool\",\n        \"clean\",\n        \"organize\",\n        \"textbased\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-DAT-DC-23\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-DAT-DC-24\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate different approaches to verifying consistency and complianc e with expected data types, values, and ranges.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Collection & Preparation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data collection & preparation\",\n        \"evaluate\",\n        \"different\",\n        \"approaches\",\n        \"verifying\",\n        \"consistency\",\n        \"complianc\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-DAT-DC-24\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-DAT-DI-25\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a data visualization of a multivariate dataset to answer a question or make a classification or prediction.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"create\",\n        \"data\",\n        \"visualization\",\n        \"multivariate\",\n        \"dataset\",\n        \"answer\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-DAT-DI-25\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-DAT-DI-26\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate a data simulation or visualization to answer a data question, inform decision-making, and identify potential limitations.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Investigation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"data investigation\",\n        \"evaluate\",\n        \"data\",\n        \"simulation\",\n        \"visualization\",\n        \"answer\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-DAT-DI-26\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-DAT-IM-27\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the societal, environmental, and ethical implications of large-scale data collection and processing, including within AI applications.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"evaluate\",\n        \"societal\",\n        \"environmental\",\n        \"ethical\",\n        \"implications\",\n        \"largescale\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-DAT-IM-27\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-DAT-IM-28\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Debate the efficacy of a policy or regulation to ensure responsible data use.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data & Analysis\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data & analysis\",\n        \"impacts\",\n        \"debate\",\n        \"efficacy\",\n        \"policy\",\n        \"regulation\",\n        \"ensure\",\n        \"responsible\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-DAT-IM-28\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-HW-29\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Differentiate an operating system as a special type of software that manages both the hardware and other software components of a computing system, including handling memory and peripherals.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"differentiate\",\n        \"operating\",\n        \"system\",\n        \"special\",\n        \"type\",\n        \"software\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-HW-29\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-HW-30\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Demonstrate the capabilities and limitations of a physical or simulated computing device to address a task or problem.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Software\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"hardware & software\",\n        \"demonstrate\",\n        \"capabilities\",\n        \"limitations\",\n        \"physical\",\n        \"simulated\",\n        \"computing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-HW-30\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-SE-31\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Identify different types of cybersecurity and physical security measures and the trade-offs for users, data, and devices.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"identify\",\n        \"different\",\n        \"types\",\n        \"cybersecurity\",\n        \"physical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-SE-31\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-SE-32\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Classify the causes and impacts of security breaches and social engineering attacks for individuals, industries, communities, and governments.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"classify\",\n        \"causes\",\n        \"impacts\",\n        \"breaches\",\n        \"social\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-SE-32\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-SE-33\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Formulate a solution to a security flaw in a given system.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Security\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"security\",\n        \"formulate\",\n        \"solution\",\n        \"flaw\",\n        \"given\",\n        \"system\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-SE-33\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-NT-34\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Diagram a network of computing systems, including hardware and software.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Networks\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"networks\",\n        \"diagram\",\n        \"network\",\n        \"computing\",\n        \"systems\",\n        \"including\",\n        \"hardware\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-NT-34\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-NT-35\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how the internet functions as a network of networks and how it differs from other types of networks.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Networks\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"networks\",\n        \"analyze\",\n        \"internet\",\n        \"functions\",\n        \"network\",\n        \"differs\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-NT-35\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-IM-36\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the rationale behind a law or policy governing the design and use of computing systems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"evaluate\",\n        \"rationale\",\n        \"behind\",\n        \"policy\",\n        \"governing\",\n        \"design\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-IM-36\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SYS-IM-37\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Investigate how computing systems and infrastructure impact society and the environment, identifying who is affected and why.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Systems & Security\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Impacts\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"systems & security\",\n        \"impacts\",\n        \"investigate\",\n        \"computing\",\n        \"systems\",\n        \"infrastructure\",\n        \"impact\",\n        \"society\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SYS-IM-37\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-HI-38\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the historical trajectory of a specific computing technology and how its development is linked to societal and environmental factors.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"analyze\",\n        \"historical\",\n        \"trajectory\",\n        \"specific\",\n        \"computing\",\n        \"technology\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-HI-38\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-HI-39\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Propose modifications to an existing policy or piece of legislation that encourages ethical innovation and minimizes societal risks associated with technology.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"History of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"history of computing\",\n        \"propose\",\n        \"modifications\",\n        \"existing\",\n        \"policy\",\n        \"piece\",\n        \"legislation\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-HI-39\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-ET-40\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the fundamental technological differences between an emerging technology and established technologies and how those differences influence computing.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"evaluate\",\n        \"fundamental\",\n        \"technological\",\n        \"differences\",\n        \"between\",\n        \"emerging\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-ET-40\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-ET-41\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the societal and environmental impacts of an emerging technology, including those that lead to inequities in access and outcomes.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"evaluate\",\n        \"societal\",\n        \"environmental\",\n        \"impacts\",\n        \"emerging\",\n        \"technology\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-ET-41\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-ET-42\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Design a conceptual solution to a real-world problem using an emerging technology, analyzing its potential benefits and harms.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Emerging Technologies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"emerging technologies\",\n        \"design\",\n        \"conceptual\",\n        \"solution\",\n        \"realworld\",\n        \"problem\",\n        \"emerging\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-ET-42\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-HU-43\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate how human choices in using, designing, deploying, and regulating computing technologies have risks, benefits, and long-term impacts.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"evaluate\",\n        \"human\",\n        \"choices\",\n        \"designing\",\n        \"deploying\",\n        \"regulating\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-HU-43\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-HU-44\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Debate perspectives on differences between human and artificial intelligence and their implications for consciousness, ethics, and human responsibility.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Humans & Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"humans & computing\",\n        \"debate\",\n        \"perspectives\",\n        \"differences\",\n        \"between\",\n        \"human\",\n        \"artificial\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-HU-44\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-CE-45\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how diverse teams of people use computational thinking and computing technologies to solve problems and express ideas.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"analyze\",\n        \"diverse\",\n        \"teams\",\n        \"people\",\n        \"computational\",\n        \"thinking\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-CE-45\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"HS-SOC-CE-46\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Connect computing knowledge and skills acquired to students’ personal goals and career aspirations.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Computing & Society\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Career Exploration\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"computing & society\",\n        \"career exploration\",\n        \"connect\",\n        \"computing\",\n        \"knowledge\",\n        \"skills\",\n        \"acquired\",\n        \"students\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, HS-SOC-CE-46\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-DD-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze AI systems to differentiate the types of problems they address.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"design & development\",\n        \"analyze\",\n        \"systems\",\n        \"differentiate\",\n        \"types\",\n        \"problems\",\n        \"they\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-DD-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-DD-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Modify AI system training data to improve fairness and accuracy in outputs.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"design & development\",\n        \"modify\",\n        \"system\",\n        \"training\",\n        \"data\",\n        \"improve\",\n        \"fairness\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-DD-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-DD-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create an application using a prebuilt supervised learning model to make a classification or prediction.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"design & development\",\n        \"create\",\n        \"application\",\n        \"prebuilt\",\n        \"supervised\",\n        \"learning\",\n        \"model\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-DD-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-DD-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Compare data representations and how representation choice constrains applicable algorithms.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"design & development\",\n        \"compare\",\n        \"data\",\n        \"representations\",\n        \"representation\",\n        \"choice\",\n        \"constrains\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-DD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-DD-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate whether an AI or non-AI computational solution is appropriate for a real-world problem.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"design & development\",\n        \"evaluate\",\n        \"whether\",\n        \"nonai\",\n        \"computational\",\n        \"solution\",\n        \"appropriate\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-DD-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-DD-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze problems that can be addressed using unsupervised learning.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"design & development\",\n        \"analyze\",\n        \"problems\",\n        \"addressed\",\n        \"unsupervised\",\n        \"learning\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-DD-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-DD-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Optimize an AI algorithm’s performance for a given problem.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"design & development\",\n        \"optimize\",\n        \"algorithms\",\n        \"performance\",\n        \"given\",\n        \"problem\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-DD-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-DD-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create an application using a complex supervised learning model.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"design & development\",\n        \"create\",\n        \"application\",\n        \"complex\",\n        \"supervised\",\n        \"learning\",\n        \"model\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-DD-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-DS-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Examine how data flows through a neural network structure.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Science for AI\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"data science for ai\",\n        \"examine\",\n        \"data\",\n        \"flows\",\n        \"through\",\n        \"neural\",\n        \"network\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-DS-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-DS-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply data acquisition, cleaning, and transformation techniques to prepare data for AI analysis.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Science for AI\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"data science for ai\",\n        \"apply\",\n        \"data\",\n        \"acquisition\",\n        \"cleaning\",\n        \"transformation\",\n        \"techniques\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-DS-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-DS-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate metadata and data pipelines to support transparency in AI model selection and deployment.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Science for AI\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"data science for ai\",\n        \"evaluate\",\n        \"metadata\",\n        \"data\",\n        \"pipelines\",\n        \"support\",\n        \"transparency\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-DS-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-DS-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Transform data to meet the input requirements of an AI algorithm.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Data Science for AI\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"data science for ai\",\n        \"transform\",\n        \"data\",\n        \"meet\",\n        \"input\",\n        \"requirements\",\n        \"algorithm\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-DS-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-HR-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Plan safeguards for AI systems that protect human well-being and privacy while ensuring meaningful human involvement in decision-making.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Human Responsibility\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"human responsibility\",\n        \"plan\",\n        \"safeguards\",\n        \"systems\",\n        \"protect\",\n        \"human\",\n        \"wellbeing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-HR-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-HR-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the potential biases and limitations of AI systems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Human Responsibility\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"human responsibility\",\n        \"analyze\",\n        \"potential\",\n        \"biases\",\n        \"limitations\",\n        \"systems\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-HR-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-HR-10\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the environmental impacts of widespread AI adoption.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Human Responsibility\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"human responsibility\",\n        \"analyze\",\n        \"environmental\",\n        \"impacts\",\n        \"widespread\",\n        \"adoption\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-HR-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-HR-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a policy that promotes transparency in AI applications.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Human Responsibility\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"human responsibility\",\n        \"develop\",\n        \"policy\",\n        \"promotes\",\n        \"transparency\",\n        \"applications\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-HR-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-HR-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how model optimization choices impact a model’s performance, interpretability, and fairness.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Human Responsibility\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"human responsibility\",\n        \"analyze\",\n        \"model\",\n        \"optimization\",\n        \"choices\",\n        \"impact\",\n        \"models\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-HR-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-PP-11\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Integrate a prebuilt AI agent into an application.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"professional practice\",\n        \"integrate\",\n        \"prebuilt\",\n        \"agent\",\n        \"into\",\n        \"application\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-PP-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-PP-12\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how AI tools shape user experiences for people with diverse backgrounds and characteristics.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"professional practice\",\n        \"analyze\",\n        \"tools\",\n        \"shape\",\n        \"user\",\n        \"experiences\",\n        \"people\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-PP-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-PP-13\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Assess how unauthorized data collection has influenced the practice of training AI models.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"professional practice\",\n        \"assess\",\n        \"unauthorized\",\n        \"data\",\n        \"collection\",\n        \"influenced\",\n        \"practice\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-PP-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-AIN-PP-14\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate how ethical implications of AI have changed over time.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"professional practice\",\n        \"evaluate\",\n        \"ethical\",\n        \"implications\",\n        \"have\",\n        \"changed\",\n        \"over\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-AIN-PP-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-PP-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop an AI agent to accomplish a defined task.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"professional practice\",\n        \"develop\",\n        \"agent\",\n        \"accomplish\",\n        \"defined\",\n        \"task\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-PP-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-PP-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a professional communication artifact by interpreting technical AI results for diverse audiences.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"professional practice\",\n        \"develop\",\n        \"professional\",\n        \"communication\",\n        \"artifact\",\n        \"interpreting\",\n        \"technical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-PP-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-AIN-PP-10\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Debate aspects of AI regulatory frameworks and legislation across countries.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Artificial Intelligence\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"artificial intelligence\",\n        \"professional practice\",\n        \"debate\",\n        \"aspects\",\n        \"regulatory\",\n        \"frameworks\",\n        \"legislation\",\n        \"across\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-AIN-PP-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-ND-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the role of network services and protocols in secure communication and their potential vulnerabilities.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Theory & Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network theory & design\",\n        \"analyze\",\n        \"role\",\n        \"network\",\n        \"services\",\n        \"protocols\",\n        \"secure\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-ND-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-ND-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Examine the concepts of the Open Systems Interconnection (OSI) model and their role in network communication.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Theory & Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network theory & design\",\n        \"examine\",\n        \"concepts\",\n        \"open\",\n        \"systems\",\n        \"interconnection\",\n        \"model\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-ND-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-ND-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Distinguish between networks based on their protocols, topologies, and addressing schemes.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Theory & Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network theory & design\",\n        \"distinguish\",\n        \"between\",\n        \"networks\",\n        \"based\",\n        \"protocols\",\n        \"topologies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-ND-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-ND-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Examine security risks in digital systems and corresponding mitigation strategies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Theory & Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network theory & design\",\n        \"examine\",\n        \"security\",\n        \"risks\",\n        \"digital\",\n        \"systems\",\n        \"corresponding\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-ND-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-ND-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Integrate security features in networking hardware and software.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Theory & Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network theory & design\",\n        \"integrate\",\n        \"security\",\n        \"features\",\n        \"networking\",\n        \"hardware\",\n        \"software\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-ND-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-ND-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Design a secure network, including servers, switches, routers, endpoints, and firewalls.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Theory & Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network theory & design\",\n        \"design\",\n        \"secure\",\n        \"network\",\n        \"including\",\n        \"servers\",\n        \"switches\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-ND-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-ND-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the security implications of different network topologies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Theory & Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network theory & design\",\n        \"evaluate\",\n        \"security\",\n        \"implications\",\n        \"different\",\n        \"network\",\n        \"topologies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-ND-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-NO-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply diagnostic tools and techniques to resolve network connectivity issues.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Operations\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network operations\",\n        \"apply\",\n        \"diagnostic\",\n        \"tools\",\n        \"techniques\",\n        \"resolve\",\n        \"network\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-NO-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-NO-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze system processes and network activity using command-line tools to identify potential security concerns.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Operations\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network operations\",\n        \"analyze\",\n        \"system\",\n        \"processes\",\n        \"network\",\n        \"activity\",\n        \"commandline\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-NO-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-NO-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze network traffic patterns to distinguish between normal and potentially malicious behavior.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Operations\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network operations\",\n        \"analyze\",\n        \"network\",\n        \"traffic\",\n        \"patterns\",\n        \"distinguish\",\n        \"between\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-NO-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-NO-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze cybersecurity tasks to improve efficiency and reliability.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Network Operations\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"network operations\",\n        \"analyze\",\n        \"tasks\",\n        \"improve\",\n        \"efficiency\",\n        \"reliability\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-NO-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-TS-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how common cyber threats related to network activity exploit system vulnerabilities.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Threats & Security Measures\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"threats & security measures\",\n        \"analyze\",\n        \"common\",\n        \"cyber\",\n        \"threats\",\n        \"related\",\n        \"network\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-TS-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-TS-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate a security threat using the CIA triad, states of data, and types of control.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Threats & Security Measures\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"threats & security measures\",\n        \"evaluate\",\n        \"security\",\n        \"threat\",\n        \"triad\",\n        \"states\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-TS-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-TS-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how encryption methods in network communication protect privacy and security.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Threats & Security Measures\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"threats & security measures\",\n        \"analyze\",\n        \"encryption\",\n        \"methods\",\n        \"network\",\n        \"communication\",\n        \"protect\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-TS-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-TS-10\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate security measures as part of a layered defense strategy to protect sensitive information.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Threats & Security Measures\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"threats & security measures\",\n        \"evaluate\",\n        \"security\",\n        \"measures\",\n        \"part\",\n        \"layered\",\n        \"defense\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-TS-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-TS-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Design access controls to protect sensitive information.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Threats & Security Measures\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"threats & security measures\",\n        \"design\",\n        \"access\",\n        \"controls\",\n        \"protect\",\n        \"sensitive\",\n        \"information\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-TS-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-TS-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate security risks to determine appropriate risk management strategies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Threats & Security Measures\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"threats & security measures\",\n        \"evaluate\",\n        \"security\",\n        \"risks\",\n        \"determine\",\n        \"appropriate\",\n        \"risk\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-TS-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-TS-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Examine an incident response plan for a real-world scenario.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Threats & Security Measures\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"threats & security measures\",\n        \"examine\",\n        \"incident\",\n        \"response\",\n        \"plan\",\n        \"realworld\",\n        \"scenario\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-TS-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-CP-11\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Explain the importance of cybersecurity policies in protecting organizational assets and mitigating risks.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Cybersecurity Policies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"cybersecurity policies\",\n        \"explain\",\n        \"importance\",\n        \"policies\",\n        \"protecting\",\n        \"organizational\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-CP-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-CP-12\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Explain key components of effective security policies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Cybersecurity Policies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"cybersecurity policies\",\n        \"explain\",\n        \"components\",\n        \"effective\",\n        \"security\",\n        \"policies\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-CP-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-CP-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Debate how various regulations impact organizational security policies, procedures, and compliance.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Cybersecurity Policies\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"cybersecurity policies\",\n        \"debate\",\n        \"various\",\n        \"regulations\",\n        \"impact\",\n        \"organizational\",\n        \"security\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-CP-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-PP-13\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the potential consequences of a cybersecurity decision on individuals, organizations, and society.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"professional practice\",\n        \"analyze\",\n        \"potential\",\n        \"consequences\",\n        \"decision\",\n        \"individuals\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-PP-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-PP-14\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze social engineering techniques and how they exploit human cognitive biases and organizational weaknesses.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"professional practice\",\n        \"analyze\",\n        \"social\",\n        \"engineering\",\n        \"techniques\",\n        \"they\",\n        \"exploit\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-PP-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-CYB-PP-15\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Translate cybersecurity concepts, risks, and solutions clearly to both technical and nontechnical audiences.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"professional practice\",\n        \"translate\",\n        \"concepts\",\n        \"risks\",\n        \"solutions\",\n        \"clearly\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-CYB-PP-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-PP-10\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the benefits, risks, and ethical implications of AI in cybersecurity.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"professional practice\",\n        \"analyze\",\n        \"benefits\",\n        \"risks\",\n        \"ethical\",\n        \"implications\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-PP-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-PP-11\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze cybersecurity vulnerabilities and incidents to inform responsible disclosure practices.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"professional practice\",\n        \"analyze\",\n        \"vulnerabilities\",\n        \"incidents\",\n        \"inform\",\n        \"responsible\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-PP-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-CYB-PP-12\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create documentation of cybersecurity processes and decisions that supports team coordination and accountability.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Cybersecurity\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"cybersecurity\",\n        \"professional practice\",\n        \"create\",\n        \"documentation\",\n        \"processes\",\n        \"decisions\",\n        \"supports\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-CYB-PP-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-CC-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply exploratory data analysis techniques to non-hierarchical quantitative data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Creation & Curation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"creation & curation\",\n        \"apply\",\n        \"exploratory\",\n        \"data\",\n        \"analysis\",\n        \"techniques\",\n        \"nonhierarchical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-CC-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-CC-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Interpret metadata when using data collected by others.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Creation & Curation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"creation & curation\",\n        \"interpret\",\n        \"metadata\",\n        \"data\",\n        \"collected\",\n        \"others\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-CC-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-CC-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a program to manipulate and transform data to prepare for analysis.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Creation & Curation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"creation & curation\",\n        \"develop\",\n        \"program\",\n        \"manipulate\",\n        \"transform\",\n        \"data\",\n        \"prepare\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-CC-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-CC-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply exploratory data analysis techniques to a hierarchical structured data source.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Creation & Curation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"creation & curation\",\n        \"apply\",\n        \"exploratory\",\n        \"data\",\n        \"analysis\",\n        \"techniques\",\n        \"hierarchical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-CC-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-CC-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Document the origin, structure, and preparation of a dataset to support clarity and reproducibility.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Creation & Curation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"creation & curation\",\n        \"document\",\n        \"origin\",\n        \"structure\",\n        \"preparation\",\n        \"dataset\",\n        \"support\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-CC-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-CC-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a program to collect and integrate data from multiple sources.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Creation & Curation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"creation & curation\",\n        \"develop\",\n        \"program\",\n        \"collect\",\n        \"integrate\",\n        \"data\",\n        \"multiple\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-CC-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-CC-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Choose appropriate data to collect for a data science project based on available tools, skills, and project goals.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Creation & Curation\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"creation & curation\",\n        \"choose\",\n        \"appropriate\",\n        \"data\",\n        \"collect\",\n        \"science\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-CC-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-AM-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply appropriate analytic and visualization techniques for categorical and quantitative data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Analysis & Modeling Techniques\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"analysis & modeling techniques\",\n        \"apply\",\n        \"appropriate\",\n        \"analytic\",\n        \"visualization\",\n        \"techniques\",\n        \"categorical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-AM-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-AM-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Examine missing data and its impact on data analysis.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Analysis & Modeling Techniques\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"analysis & modeling techniques\",\n        \"examine\",\n        \"missing\",\n        \"data\",\n        \"impact\",\n        \"analysis\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-AM-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-AM-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze structured categorical and/or quantitative datasets, using computational tools and libraries.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Analysis & Modeling Techniques\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"analysis & modeling techniques\",\n        \"analyze\",\n        \"structured\",\n        \"categorical\",\n        \"andor\",\n        \"quantitative\",\n        \"datasets\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-AM-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-AM-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Build a model to explain relationships, make predictions, and evaluate the influence of different variables.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Analysis & Modeling Techniques\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"analysis & modeling techniques\",\n        \"build\",\n        \"model\",\n        \"explain\",\n        \"relationships\",\n        \"predictions\",\n        \"evaluate\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-AM-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-AM-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate strategies for handling missing data.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Analysis & Modeling Techniques\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"analysis & modeling techniques\",\n        \"evaluate\",\n        \"strategies\",\n        \"handling\",\n        \"missing\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-AM-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-AM-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze an unstructured, mixed-type, or high-dimensional dataset using computational tools and libraries.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Analysis & Modeling Techniques\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"analysis & modeling techniques\",\n        \"analyze\",\n        \"unstructured\",\n        \"mixedtype\",\n        \"highdimensional\",\n        \"dataset\",\n        \"computational\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-AM-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-MI-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Interpret the results of a data analysis to explain patterns, anomalies, and trends, and connect them back to the original problem or research question.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Model Interpretation & Reasoning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"model interpretation & reasoning\",\n        \"interpret\",\n        \"results\",\n        \"data\",\n        \"analysis\",\n        \"explain\",\n        \"patterns\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-MI-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-MI-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Explain the appropriateness of predictive models for the specific problem being addressed.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Model Interpretation & Reasoning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"model interpretation & reasoning\",\n        \"explain\",\n        \"appropriateness\",\n        \"predictive\",\n        \"models\",\n        \"specific\",\n        \"problem\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-MI-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-MI-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Explain how dataset size affects model stability and performance.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Model Interpretation & Reasoning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"model interpretation & reasoning\",\n        \"explain\",\n        \"dataset\",\n        \"size\",\n        \"affects\",\n        \"model\",\n        \"stability\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-MI-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-MI-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the performance of models using established metrics.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Model Interpretation & Reasoning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"model interpretation & reasoning\",\n        \"evaluate\",\n        \"performance\",\n        \"models\",\n        \"established\",\n        \"metrics\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-MI-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-MI-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the trade-offs between interpretability, accuracy, and generalizability as they relate to model complexity.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Model Interpretation & Reasoning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"model interpretation & reasoning\",\n        \"analyze\",\n        \"tradeoffs\",\n        \"between\",\n        \"interpretability\",\n        \"accuracy\",\n        \"generalizability\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-MI-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-MI-10\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how adding or removing variables affects model behavior and performance.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Model Interpretation & Reasoning\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"model interpretation & reasoning\",\n        \"analyze\",\n        \"adding\",\n        \"removing\",\n        \"variables\",\n        \"affects\",\n        \"model\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-MI-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-VZ-10\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a data visualization that communicates key findings to diverse audiences.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Visualization\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"visualization\",\n        \"create\",\n        \"data\",\n        \"communicates\",\n        \"findings\",\n        \"diverse\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-VZ-10\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-VZ-11\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze how graphical conventions in data visualizations support accurate interpretation and how breaking conventions can mislead.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Visualization\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"visualization\",\n        \"analyze\",\n        \"graphical\",\n        \"conventions\",\n        \"data\",\n        \"visualizations\",\n        \"support\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-VZ-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-VZ-11\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a visualization that accurately represents data and avoids misleading design choices.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Visualization\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"visualization\",\n        \"create\",\n        \"accurately\",\n        \"represents\",\n        \"data\",\n        \"avoids\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-VZ-11\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-VZ-12\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Critique a data visualization for misleading elements and their role in spreading misinformation.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Visualization\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"visualization\",\n        \"critique\",\n        \"data\",\n        \"misleading\",\n        \"elements\",\n        \"role\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-VZ-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-PP-12\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply ethical principles to data collection, analysis, and communication to promote privacy, transparency, and accountability.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"professional practice\",\n        \"apply\",\n        \"ethical\",\n        \"principles\",\n        \"data\",\n        \"collection\",\n        \"analysis\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-PP-12\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-PP-13\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Assess how data collection and use may impact marginalized and underrepresented groups.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"professional practice\",\n        \"assess\",\n        \"data\",\n        \"collection\",\n        \"impact\",\n        \"marginalized\",\n        \"underrepresented\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-PP-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-DSC-PP-14\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Document data analysis results in a format appropriate for an audience with diverse backgrounds and perspectives.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"professional practice\",\n        \"document\",\n        \"data\",\n        \"analysis\",\n        \"results\",\n        \"format\",\n        \"appropriate\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-DSC-PP-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-PP-13\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate ethical, legal, and social considerations when working with large-scale datasets, predictive models, and emerging technologies.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"professional practice\",\n        \"evaluate\",\n        \"ethical\",\n        \"legal\",\n        \"social\",\n        \"considerations\",\n        \"working\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-PP-13\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-PP-14\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate protective measures in data collection, usage, and governance for privacy, security, and fairness.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"professional practice\",\n        \"evaluate\",\n        \"protective\",\n        \"measures\",\n        \"data\",\n        \"collection\",\n        \"usage\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-PP-14\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-DSC-PP-15\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Translate technical results for diverse audiences in professional communication artifacts.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Data Science\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"data science\",\n        \"professional practice\",\n        \"translate\",\n        \"technical\",\n        \"results\",\n        \"diverse\",\n        \"audiences\",\n        \"professional\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-DSC-PP-15\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-DD-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the fundamental components of a game, including players, rules, game mechanics, and outcomes.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"design & development\",\n        \"analyze\",\n        \"fundamental\",\n        \"components\",\n        \"game\",\n        \"including\",\n        \"players\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-DD-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-DD-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a storyboard to plan and communicate a game's narrative and interactive experience.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"design & development\",\n        \"create\",\n        \"storyboard\",\n        \"plan\",\n        \"communicate\",\n        \"games\",\n        \"narrative\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-DD-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-DD-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop an interactive experience to support gameplay.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"design & development\",\n        \"develop\",\n        \"interactive\",\n        \"experience\",\n        \"support\",\n        \"gameplay\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-DD-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-DD-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Adapt rule-based logic to improve control of game agents or systems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Remember\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"design & development\",\n        \"adapt\",\n        \"rulebased\",\n        \"logic\",\n        \"improve\",\n        \"control\",\n        \"game\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-DD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-GMD-DD-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Justify the use of responsible design principles in developing an engaging, meaningful game experience.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"design & development\",\n        \"justify\",\n        \"responsible\",\n        \"design\",\n        \"principles\",\n        \"developing\",\n        \"engaging\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-GMD-DD-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-GMD-DD-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a system that programmatically controls 2D or 3D animation states based on game logic and player interactions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"design & development\",\n        \"develop\",\n        \"system\",\n        \"programmatically\",\n        \"controls\",\n        \"animation\",\n        \"states\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-GMD-DD-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-GMD-DD-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Construct in-game artificial intelligence to control NPC behavior.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"design & development\",\n        \"construct\",\n        \"ingame\",\n        \"artificial\",\n        \"intelligence\",\n        \"control\",\n        \"behavior\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-GMD-DD-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-PX-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a user-friendly interface for a game, considering accessibility, usability, and aesthetics.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Player Experience\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"player experience\",\n        \"create\",\n        \"userfriendly\",\n        \"interface\",\n        \"game\",\n        \"considering\",\n        \"accessibility\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-PX-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-PX-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Optimize basic game usability through user testing and identifying actionable design revisions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Player Experience\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"player experience\",\n        \"optimize\",\n        \"basic\",\n        \"game\",\n        \"usability\",\n        \"through\",\n        \"user\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-PX-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-GMD-PX-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate game interactions using diverse input devices to enhance immersion and player experience.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Player Experience\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"player experience\",\n        \"evaluate\",\n        \"game\",\n        \"interactions\",\n        \"diverse\",\n        \"input\",\n        \"devices\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-GMD-PX-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-GMD-PX-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate two versions of a game using defined metrics to determine which performs better.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Player Experience\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"player experience\",\n        \"evaluate\",\n        \"versions\",\n        \"game\",\n        \"defined\",\n        \"metrics\",\n        \"determine\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-GMD-PX-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-AR-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Examine the key architectural features of computing hardware and their implications for game development.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Architecture\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"architecture\",\n        \"examine\",\n        \"architectural\",\n        \"features\",\n        \"computing\",\n        \"hardware\",\n        \"implications\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-AR-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-GMD-AR-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze game system architectures that support scalability, maintainability, and performance.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Architecture\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"architecture\",\n        \"analyze\",\n        \"game\",\n        \"system\",\n        \"architectures\",\n        \"support\",\n        \"scalability\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-GMD-AR-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-PP-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze the ethical implications of copyright and intellectual property in game development.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"professional practice\",\n        \"analyze\",\n        \"ethical\",\n        \"implications\",\n        \"copyright\",\n        \"intellectual\",\n        \"property\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-PP-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-GMD-PP-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a game project collaboratively within a diverse team.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"professional practice\",\n        \"develop\",\n        \"game\",\n        \"project\",\n        \"collaboratively\",\n        \"within\",\n        \"diverse\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-GMD-PP-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-GMD-PP-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a game utilizing ethical principles in the design and development process.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"professional practice\",\n        \"create\",\n        \"game\",\n        \"utilizing\",\n        \"ethical\",\n        \"principles\",\n        \"design\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-GMD-PP-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-GMD-PP-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Collaborate effectively in a project team by defining and executing assigned roles, communicating clearly, and managing shared resources to deliver a game project.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Game Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"game development\",\n        \"professional practice\",\n        \"collaborate\",\n        \"effectively\",\n        \"project\",\n        \"team\",\n        \"defining\",\n        \"executing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-GMD-PP-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-PHY-HC-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Construct an electrical circuit to power and control a physical computing device.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Circuit Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"hardware & circuit design\",\n        \"construct\",\n        \"electrical\",\n        \"circuit\",\n        \"power\",\n        \"control\",\n        \"physical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-PHY-HC-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-PHY-HC-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop an electromechanical system using a CAD tool for design and testing.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Hardware & Circuit Design\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"hardware & circuit design\",\n        \"develop\",\n        \"electromechanical\",\n        \"system\",\n        \"tool\",\n        \"design\",\n        \"testing\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-PHY-HC-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-PHY-IO-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Integrate sensors, actuators, and peripherals into a physical computing system.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Inputs & Outputs\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"inputs & outputs\",\n        \"integrate\",\n        \"sensors\",\n        \"actuators\",\n        \"peripherals\",\n        \"into\",\n        \"physical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-PHY-IO-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-PHY-IO-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Design a closed-loop feedback control system to meet a desired outcome using varying sensor types.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Inputs & Outputs\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"inputs & outputs\",\n        \"design\",\n        \"closedloop\",\n        \"feedback\",\n        \"control\",\n        \"system\",\n        \"meet\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-PHY-IO-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-PHY-DD-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop software to control a physical device using an iterative design process.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"design & development\",\n        \"develop\",\n        \"software\",\n        \"control\",\n        \"physical\",\n        \"device\",\n        \"iterative\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-PHY-DD-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-PHY-DD-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop an application that extends functionality and user engagement with physical devices.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"design & development\",\n        \"develop\",\n        \"application\",\n        \"extends\",\n        \"functionality\",\n        \"user\",\n        \"engagement\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-PHY-DD-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-PHY-CI-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Use IoT devices to collect sensor data and transmit it locally using device-to-device or device-to-gateway communication.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Connectivity & Internet of Things\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"connectivity & internet of things\",\n        \"devices\",\n        \"collect\",\n        \"sensor\",\n        \"data\",\n        \"transmit\",\n        \"locally\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-PHY-CI-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-PHY-CI-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Implement IoT communication by connecting physical devices with protocols, applying security practices.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Connectivity & Internet of Things\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"connectivity & internet of things\",\n        \"implement\",\n        \"communication\",\n        \"connecting\",\n        \"physical\",\n        \"devices\",\n        \"protocols\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-PHY-CI-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-PHY-CI-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop an IoT system to manage the collection and transmission of data and enable remote monitoring and control of a physical system.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Connectivity & Internet of Things\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"connectivity & internet of things\",\n        \"develop\",\n        \"system\",\n        \"manage\",\n        \"collection\",\n        \"transmission\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-PHY-CI-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-PHY-CI-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop an embedded network, evaluating trade-offs among network protocols, security measures, and scalability.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Connectivity & Internet of Things\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"connectivity & internet of things\",\n        \"develop\",\n        \"embedded\",\n        \"network\",\n        \"evaluating\",\n        \"tradeoffs\",\n        \"among\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-PHY-CI-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-PHY-PP-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Use a version control system to coordinate development in a physical computing project.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"professional practice\",\n        \"version\",\n        \"control\",\n        \"system\",\n        \"coordinate\",\n        \"development\",\n        \"physical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-PHY-PP-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-PHY-PP-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate social, technical, and sociotechnical impacts of a physical computing system.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"professional practice\",\n        \"evaluate\",\n        \"social\",\n        \"technical\",\n        \"sociotechnical\",\n        \"impacts\",\n        \"physical\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-PHY-PP-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-PHY-PP-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the security implications of a physical computing system, including data privacy, unauthorized access, and potential vulnerabilities.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"professional practice\",\n        \"evaluate\",\n        \"security\",\n        \"implications\",\n        \"physical\",\n        \"computing\",\n        \"system\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-PHY-PP-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-PHY-PP-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply a project management methodology to collaboratively design, develop, and test a physical computing project.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"professional practice\",\n        \"apply\",\n        \"project\",\n        \"management\",\n        \"methodology\",\n        \"collaboratively\",\n        \"design\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-PHY-PP-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-PHY-PP-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate how physical computing technologies shape social processes, communities, power, and equity in global society.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"professional practice\",\n        \"evaluate\",\n        \"physical\",\n        \"computing\",\n        \"technologies\",\n        \"shape\",\n        \"social\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-PHY-PP-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-PHY-PP-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a physical computing solution for diverse users using the engineering design process.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Physical Computing\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"physical computing\",\n        \"professional practice\",\n        \"develop\",\n        \"physical\",\n        \"computing\",\n        \"solution\",\n        \"diverse\",\n        \"users\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-PHY-PP-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-SWD-DD-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Implement linear data structures to organize and access collections of data when solving computational problems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"design & development\",\n        \"implement\",\n        \"linear\",\n        \"data\",\n        \"structures\",\n        \"organize\",\n        \"access\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-SWD-DD-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-SWD-DD-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Design software that accounts for complexity through abstraction.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"design & development\",\n        \"design\",\n        \"software\",\n        \"accounts\",\n        \"complexity\",\n        \"through\",\n        \"abstraction\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-SWD-DD-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-SWD-DD-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Use integrated development environment (IDE) features to streamline software development, including code editing, debugging, version control, and project management.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"design & development\",\n        \"integrated\",\n        \"development\",\n        \"environment\",\n        \"features\",\n        \"streamline\",\n        \"software\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-SWD-DD-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-DD-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply associative and hierarchical data structures to solve computational problems.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"design & development\",\n        \"apply\",\n        \"associative\",\n        \"hierarchical\",\n        \"data\",\n        \"structures\",\n        \"solve\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-DD-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-DD-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a prototype using diverse user personas and user journey maps to guide design decisions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"design & development\",\n        \"develop\",\n        \"prototype\",\n        \"diverse\",\n        \"user\",\n        \"personas\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-DD-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-DD-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Develop a project in iterative cycles, documenting changes and the rationale for each cycle.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"design & development\",\n        \"develop\",\n        \"project\",\n        \"iterative\",\n        \"cycles\",\n        \"documenting\",\n        \"changes\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-DD-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-DD-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Modify an existing algorithm to improve efficiency, considering factors such as data structures and algorithmic paradigms.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Design & Development\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"design & development\",\n        \"modify\",\n        \"existing\",\n        \"algorithm\",\n        \"improve\",\n        \"efficiency\",\n        \"considering\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-DD-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-SWD-UX-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Refine a user interface design using accessibility and responsive design tools.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"User Experience\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"user experience\",\n        \"refine\",\n        \"user\",\n        \"interface\",\n        \"design\",\n        \"accessibility\",\n        \"responsive\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-SWD-UX-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-SWD-UX-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create software that serves intended users and contexts using human- centered design principles.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"User Experience\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"user experience\",\n        \"create\",\n        \"software\",\n        \"serves\",\n        \"intended\",\n        \"users\",\n        \"contexts\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-SWD-UX-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-UX-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Evaluate the user experience to improve usability.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"User Experience\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"user experience\",\n        \"evaluate\",\n        \"user\",\n        \"experience\",\n        \"improve\",\n        \"usability\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-UX-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-UX-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Create a user-friendly, accessible, and responsively designed interface.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"User Experience\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"user experience\",\n        \"create\",\n        \"userfriendly\",\n        \"accessible\",\n        \"responsively\",\n        \"designed\",\n        \"interface\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-UX-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-SWD-TR-06\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Use AI-assisted IDE tools or features to understand unfamiliar code and identify errors during debugging.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"testing & refining\",\n        \"aiassisted\",\n        \"tools\",\n        \"features\",\n        \"understand\",\n        \"unfamiliar\",\n        \"code\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-SWD-TR-06\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-SWD-TR-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Design a test plan that exercises program functionality, including edge cases, error conditions, and varied user inputs.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"testing & refining\",\n        \"design\",\n        \"test\",\n        \"plan\",\n        \"exercises\",\n        \"program\",\n        \"functionality\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-SWD-TR-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-TR-07\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Use an IDE to test and refine a complex software project.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"testing & refining\",\n        \"test\",\n        \"refine\",\n        \"complex\",\n        \"software\",\n        \"project\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-TR-07\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-TR-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Debug a complex software project to identify, isolate, and fix errors.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Testing & Refining\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"testing & refining\",\n        \"debug\",\n        \"complex\",\n        \"software\",\n        \"project\",\n        \"identify\",\n        \"isolate\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-TR-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-SWD-PP-08\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Collaborate to develop software that reflects diverse perspectives.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"professional practice\",\n        \"collaborate\",\n        \"develop\",\n        \"software\",\n        \"reflects\",\n        \"diverse\",\n        \"perspectives\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-SWD-PP-08\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S2-SWD-PP-09\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Apply an industry-standard software development process to plan and deliver a project while prioritizing equity and justice.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"Software Development\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"Professional Practice\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"software development\",\n        \"professional practice\",\n        \"apply\",\n        \"industrystandard\",\n        \"software\",\n        \"development\",\n        \"process\",\n        \"plan\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S2-SWD-PP-09\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-XCS-XC-01\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Explain connections between CS concepts and practices and those from a non-CS discipline (X).\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"X+CS\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"X+CS\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Understand\"\n      },\n      \"keywords\": [\n        \"x+cs\",\n        \"explain\",\n        \"connections\",\n        \"between\",\n        \"concepts\",\n        \"practices\",\n        \"those\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-XCS-XC-01\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-XCS-XC-02\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Formulate a computational solution to a problem in a non-CS discipline (X) using computational thinking.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"X+CS\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"X+CS\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"x+cs\",\n        \"formulate\",\n        \"computational\",\n        \"solution\",\n        \"problem\",\n        \"noncs\",\n        \"discipline\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-XCS-XC-02\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-XCS-XC-03\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Analyze a computer science technology or approach used in a non-CS discipline (X).\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"X+CS\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"X+CS\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"x+cs\",\n        \"analyze\",\n        \"computer\",\n        \"science\",\n        \"technology\",\n        \"approach\",\n        \"used\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-XCS-XC-03\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-XCS-XC-04\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Model relationships within a non-CS discipline using data, visualizations, and computational methods.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"X+CS\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"X+CS\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"x+cs\",\n        \"model\",\n        \"relationships\",\n        \"within\",\n        \"noncs\",\n        \"discipline\",\n        \"data\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-XCS-XC-04\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"S1-XCS-XC-05\",\n      \"gradeBand\": [\n        9,\n        12\n      ],\n      \"texts\": {\n        \"en\": \"Assess how well an algorithm solves problems within a non-CS discipline (X) by evaluating its accuracy, efficiency, and relevance to the intended goal.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"concept\",\n          \"value\": \"X+CS\"\n        },\n        {\n          \"axis\": \"subconcept\",\n          \"value\": \"X+CS\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"x+cs\",\n        \"assess\",\n        \"well\",\n        \"algorithm\",\n        \"solves\",\n        \"problems\",\n        \"within\"\n      ],\n      \"sourceRef\": \"2026 CSTA PK–12 Standards, S1-XCS-XC-05\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    }\n  ],\n  \"mappings\": []\n}","{\n  \"manifest\": {\n    \"id\": \"csta-k12-2017\",\n    \"name\": \"CSTA K-12 Computer Science Standards (2017)\",\n    \"specVersion\": \"1.0\",\n    \"contentVersion\": \"2017.1\",\n    \"subject\": \"computing\",\n    \"languages\": [\n      \"en\"\n    ],\n    \"gradeModel\": {\n      \"type\": \"grades\",\n      \"range\": [\n        3,\n        12\n      ]\n    },\n    \"provenance\": {\n      \"sourceRef\": \"CSTA K-12 Computer Science Standards, Revised 2017 - csteachers.org\",\n      \"sourceUrl\": \"https://www.csteachers.org/page/standards\",\n      \"license\": \"CC BY-NC-SA 4.0 (cited verbatim for alignment use)\",\n      \"importedBy\": \"platform\",\n      \"importedAt\": \"2026-08-29T00:00:00.000Z\"\n    },\n    \"trust\": \"verified\"\n  },\n  \"statements\": [\n    {\n      \"id\": \"1B-AP-08\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Demonstrate that programs can be combined with other programs to create new solutions.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"strand\",\n          \"value\": \"Algorithms & Programming\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"combine\",\n        \"programs\",\n        \"composition\",\n        \"reuse\",\n        \"modules\"\n      ],\n      \"sourceRef\": \"CSTA K-12 2017, Level 1B (Grades 6-8), Algorithms & Programming\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"1B-AP-10\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Create programs that include sequences, events, loops, and conditionals.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"strand\",\n          \"value\": \"Algorithms & Programming\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\",\n        \"knowledge\": \"PROCEDURAL\"\n      },\n      \"keywords\": [\n        \"sequence\",\n        \"events\",\n        \"loops\",\n        \"conditionals\",\n        \"control structures\",\n        \"for\",\n        \"while\"\n      ],\n      \"sourceRef\": \"CSTA K-12 2017, Level 1B (Grades 6-8), Algorithms & Programming\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"1B-AP-11\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Decompose (break down) problems into smaller, manageable subproblems to facilitate the program development process.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"strand\",\n          \"value\": \"Algorithms & Programming\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Analyze\"\n      },\n      \"keywords\": [\n        \"decomposition\",\n        \"subproblems\",\n        \"problem breakdown\",\n        \"algorithm\",\n        \"divide\"\n      ],\n      \"sourceRef\": \"CSTA K-12 2017, Level 1B (Grades 6-8), Algorithms & Programming\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"1B-AP-12\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Modify, remix, or include portions of other programs in one's own work to develop something new or add more advanced features.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"strand\",\n          \"value\": \"Algorithms & Programming\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Create\"\n      },\n      \"keywords\": [\n        \"remix\",\n        \"modify\",\n        \"iterate\",\n        \"extend programs\"\n      ],\n      \"sourceRef\": \"CSTA K-12 2017, Level 1B (Grades 6-8), Algorithms & Programming\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"1B-AP-15\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Test and debug (identify and fix errors) a program or algorithm to ensure it runs as intended.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"strand\",\n          \"value\": \"Algorithms & Programming\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Evaluate\"\n      },\n      \"keywords\": [\n        \"test\",\n        \"debug\",\n        \"errors\",\n        \"troubleshooting\",\n        \"fix\"\n      ],\n      \"sourceRef\": \"CSTA K-12 2017, Level 1B (Grades 6-8), Algorithms & Programming\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    },\n    {\n      \"id\": \"1B-IC-21\",\n      \"gradeBand\": [\n        6,\n        8\n      ],\n      \"texts\": {\n        \"en\": \"Use public domain or creative commons media, and refrain from copying or using material created by others without permission.\"\n      },\n      \"classifications\": [\n        {\n          \"axis\": \"strand\",\n          \"value\": \"Impacts of Computing\"\n        }\n      ],\n      \"bloomHint\": {\n        \"process\": \"Apply\"\n      },\n      \"keywords\": [\n        \"copyright\",\n        \"creative commons\",\n        \"public domain\",\n        \"digital citizenship\",\n        \"license\"\n      ],\n      \"sourceRef\": \"CSTA K-12 2017, Level 1B (Grades 6-8), Impacts of Computing\",\n      \"provenance\": {\n        \"method\": \"source_official\"\n      }\n    }\n  ],\n  \"mappings\": [\n    {\n      \"statementId\": \"1B-AP-10\",\n      \"targetRef\": \"ontora:FOR_LOOP\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.85,\n      \"provenance\": {\n        \"method\": \"human\",\n        \"reviewedBy\": \"thanh01pmt\"\n      }\n    },\n    {\n      \"statementId\": \"1B-AP-10\",\n      \"targetRef\": \"ontora:WHILE_LOOP\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.85,\n      \"provenance\": {\n        \"method\": \"human\",\n        \"reviewedBy\": \"thanh01pmt\"\n      }\n    },\n    {\n      \"statementId\": \"1B-AP-11\",\n      \"targetRef\": \"ontora:PROBLEM_DECOMPOSITION\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.95,\n      \"provenance\": {\n        \"method\": \"human\",\n        \"reviewedBy\": \"thanh01pmt\"\n      }\n    },\n    {\n      \"statementId\": \"1B-AP-08\",\n      \"targetRef\": \"ontora:EVENT_BASED_PROGRAMMING\",\n      \"kind\": \"partial\",\n      \"confidence\": 0.7,\n      \"provenance\": {\n        \"method\": \"ai_draft\",\n        \"reviewedBy\": \"thanh01pmt\"\n      }\n    },\n    {\n      \"statementId\": \"1B-AP-15\",\n      \"targetRef\": \"ontora:TROUBLESHOOTING_STEPS\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.9,\n      \"provenance\": {\n        \"method\": \"ai_draft\",\n        \"reviewedBy\": \"thanh01pmt\"\n      }\n    }\n  ]\n}\n","{\n  \"manifest\": {\n    \"id\": \"acm-ieee-cs2023\",\n    \"name\": \"ACM/IEEE-CS/AAAI Computer Science Curricula 2023 (CS2023)\",\n    \"specVersion\": \"1.0\",\n    \"contentVersion\": \"2023.1\",\n    \"subject\": \"computing\",\n    \"languages\": [\"en\"],\n    \"gradeModel\": {\n      \"type\": \"grades\",\n      \"range\": [9, 16]\n    },\n    \"provenance\": {\n      \"sourceRef\": \"ACM/IEEE-CS/AAAI Computer Science Curricula 2023 - cs2023.org\",\n      \"sourceUrl\": \"https://cs2023.org\",\n      \"license\": \"ACM / IEEE Computer Society (cited verbatim for curriculum alignment)\",\n      \"importedBy\": \"platform\",\n      \"importedAt\": \"2026-09-11T00:00:00.000Z\"\n    },\n    \"trust\": \"verified\"\n  },\n  \"statements\": [\n    {\n      \"id\": \"CS2023-SDF-01\",\n      \"gradeBand\": [9, 14],\n      \"texts\": {\n        \"en\": \"Design, implement, test, and debug programs using basic computation, standard conditional and iterative structures, and functions.\"\n      },\n      \"classifications\": [\n        { \"axis\": \"Knowledge Area\", \"value\": \"Software Development Fundamentals (SDF)\" },\n        { \"axis\": \"Core Tier\", \"value\": \"Tier-1 Core\" }\n      ],\n      \"bloomHint\": { \"process\": \"Apply\" },\n      \"keywords\": [\"algorithms\", \"control structures\", \"functions\", \"variables\", \"debugging\", \"programming\", \"implementation\"],\n      \"sourceRef\": \"CS2023, Software Development Fundamentals, Program Construction\",\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"id\": \"CS2023-SDF-02\",\n      \"gradeBand\": [9, 14],\n      \"texts\": {\n        \"en\": \"Apply fundamental data structures (arrays, lists, stacks, queues, hash maps) to represent collections of data and solve algorithmic problems.\"\n      },\n      \"classifications\": [\n        { \"axis\": \"Knowledge Area\", \"value\": \"Software Development Fundamentals (SDF)\" },\n        { \"axis\": \"Core Tier\", \"value\": \"Tier-1 Core\" }\n      ],\n      \"bloomHint\": { \"process\": \"Apply\" },\n      \"keywords\": [\"data structures\", \"arrays\", \"lists\", \"hash maps\", \"collections\", \"stacks\", \"queues\"],\n      \"sourceRef\": \"CS2023, Software Development Fundamentals, Fundamental Data Structures\",\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"id\": \"CS2023-AL-01\",\n      \"gradeBand\": [10, 16],\n      \"texts\": {\n        \"en\": \"Analyze and compare the time and space complexity of fundamental algorithms using asymptotic notation (Big-O).\"\n      },\n      \"classifications\": [\n        { \"axis\": \"Knowledge Area\", \"value\": \"Algorithms and Complexity (AL)\" },\n        { \"axis\": \"Core Tier\", \"value\": \"Tier-1 Core\" }\n      ],\n      \"bloomHint\": { \"process\": \"Analyze\" },\n      \"keywords\": [\"complexity\", \"big-o\", \"efficiency\", \"sorting\", \"searching\", \"asymptotic\", \"runtime\"],\n      \"sourceRef\": \"CS2023, Algorithms and Complexity, Basic Analysis\",\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"id\": \"CS2023-SE-01\",\n      \"gradeBand\": [9, 16],\n      \"texts\": {\n        \"en\": \"Decompose complex problems into modular software components applying principles of abstraction, encapsulation, and separation of concerns.\"\n      },\n      \"classifications\": [\n        { \"axis\": \"Knowledge Area\", \"value\": \"Software Engineering (SE)\" },\n        { \"axis\": \"Core Tier\", \"value\": \"Tier-1 Core\" }\n      ],\n      \"bloomHint\": { \"process\": \"Create\" },\n      \"keywords\": [\"modularity\", \"abstraction\", \"software design\", \"refactoring\", \"encapsulation\", \"architecture\"],\n      \"sourceRef\": \"CS2023, Software Engineering, Software Design and Architecture\",\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"id\": \"CS2023-SEC-01\",\n      \"gradeBand\": [9, 16],\n      \"texts\": {\n        \"en\": \"Incorporate defensive programming and fundamental cybersecurity principles (least privilege, input validation, secure data handling) into software development.\"\n      },\n      \"classifications\": [\n        { \"axis\": \"Knowledge Area\", \"value\": \"Security (SEC)\" },\n        { \"axis\": \"Core Tier\", \"value\": \"Tier-1 Core\" }\n      ],\n      \"bloomHint\": { \"process\": \"Apply\" },\n      \"keywords\": [\"security\", \"defensive programming\", \"input validation\", \"cybersecurity\", \"vulnerabilities\"],\n      \"sourceRef\": \"CS2023, Security, Secure Software Development\",\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"id\": \"CS2023-AI-01\",\n      \"gradeBand\": [10, 16],\n      \"texts\": {\n        \"en\": \"Formulate machine learning tasks, prepare training and evaluation datasets, and evaluate model performance using standard metrics.\"\n      },\n      \"classifications\": [\n        { \"axis\": \"Knowledge Area\", \"value\": \"Artificial Intelligence (AI)\" },\n        { \"axis\": \"Core Tier\", \"value\": \"Tier-2 Core\" }\n      ],\n      \"bloomHint\": { \"process\": \"Evaluate\" },\n      \"keywords\": [\"artificial intelligence\", \"machine learning\", \"dataset\", \"evaluation\", \"model\", \"accuracy\"],\n      \"sourceRef\": \"CS2023, Artificial Intelligence, Machine Learning Fundamentals\",\n      \"provenance\": { \"method\": \"source_official\" }\n    }\n  ],\n  \"mappings\": [\n    {\n      \"statementId\": \"CS2023-SDF-01\",\n      \"targetRef\": \"ontora:PROGRAM_CONSTRUCTION\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.95,\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"statementId\": \"CS2023-SDF-02\",\n      \"targetRef\": \"ontora:DATA_STRUCTURES\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.95,\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"statementId\": \"CS2023-AL-01\",\n      \"targetRef\": \"ontora:ALGORITHM_COMPLEXITY\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.95,\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"statementId\": \"CS2023-SE-01\",\n      \"targetRef\": \"ontora:SOFTWARE_ARCHITECTURE\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.95,\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"statementId\": \"CS2023-SEC-01\",\n      \"targetRef\": \"ontora:DEFENSIVE_PROGRAMMING\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.95,\n      \"provenance\": { \"method\": \"source_official\" }\n    },\n    {\n      \"statementId\": \"CS2023-AI-01\",\n      \"targetRef\": \"ontora:MACHINE_LEARNING\",\n      \"kind\": \"covers\",\n      \"confidence\": 0.95,\n      \"provenance\": { \"method\": \"source_official\" }\n    }\n  ]\n}\n","import { FrameworkPackSchema, type FrameworkPack } from './frameworkPackSchema';\n\nimport csta2026 from './data/csta-pk12-2026.json';\nimport csta2017 from './data/csta-k12-2017.json';\nimport acmCs2023 from './data/acm-ieee-cs2023.json';\n\n/**\n * Bundled Standards Packs — dữ liệu chuẩn kèm sẵn trong kit (user chọn trong Composer\n * Project Settings → Gates → Standards Packs; Composer truyền standardsPackIds xuống).\n * Pack mới: thêm file JSON validate theo FrameworkPackSchema vào src/standards/data/ rồi đăng ký aquí.\n */\nconst BUNDLED_PACK_RECORDS: Record<string, unknown> = {\n  'csta-pk12-2026': csta2026,\n  'csta-k12-2017': csta2017,\n  'acm-ieee-cs2023': acmCs2023,\n};\n\n/** Pack ids mà kit đóng gói sẵn (để UI settings hiển thị đúng danh sách khả dụng). */\nexport const BUNDLED_STANDARDS_PACK_IDS: string[] = Object.keys(BUNDLED_PACK_RECORDS).sort();\n\nconst parsedPackCache = new Map<string, FrameworkPack>();\n\n/**\n * Resolve danh sách pack id → FrameworkPack[] đã validate. Id không biết được bỏ qua (log warn),\n * config sai không bao giờ làm pipeline chết.\n */\nexport function resolveStandardsPacks(packIds: string[] | undefined | null): FrameworkPack[] {\n  if (!packIds || packIds.length === 0) return [];\n  const packs: FrameworkPack[] = [];\n  for (const id of packIds) {\n    if (parsedPackCache.has(id)) {\n      packs.push(parsedPackCache.get(id) as FrameworkPack);\n      continue;\n    }\n    const raw = BUNDLED_PACK_RECORDS[id];\n    if (!raw) {\n      console.warn(`[standards] pack '${id}' không tồn tại trong kit — bỏ qua.`);\n      continue;\n    }\n    const parsed = FrameworkPackSchema.safeParse(raw);\n    if (!parsed.success) {\n      console.warn(`[standards] pack '${id}' fail schema — bỏ qua:`, parsed.error.issues[0]?.message);\n      continue;\n    }\n    parsedPackCache.set(id, parsed.data);\n    packs.push(parsed.data);\n  }\n  return packs;\n}\n\n/**\n * Tìm statement theo id (ví dụ \"1B-AP-10\" hoặc \"csta-k12-2017:1B-AP-10\") trong tất cả các pack kèm sẵn.\n */\nexport function findStandardStatement(statementIdOrRef: string): {\n  packId: string;\n  packTitle: string;\n  statementId: string;\n  description: string;\n  category?: string;\n  gradeBand?: string;\n} | null {\n  if (!statementIdOrRef) return null;\n  const [packPrefix, ...rest] = statementIdOrRef.split(':');\n  const targetId = rest.length > 0 ? rest.join(':') : statementIdOrRef;\n  const packs = resolveStandardsPacks(BUNDLED_STANDARDS_PACK_IDS);\n\n  for (const pack of packs) {\n    if (rest.length > 0 && pack.manifest.id !== packPrefix) continue;\n    const stmt = pack.statements.find((s) => s.id.toLowerCase() === targetId.toLowerCase());\n    if (stmt) {\n      const description = stmt.texts['en'] || Object.values(stmt.texts)[0] || '';\n      const category = stmt.classifications && stmt.classifications.length > 0\n        ? stmt.classifications.map((c) => c.value).join(', ')\n        : undefined;\n      const gradeBand = Array.isArray(stmt.gradeBand)\n        ? (stmt.gradeBand[0] === stmt.gradeBand[1] ? String(stmt.gradeBand[0]) : `${stmt.gradeBand[0]}-${stmt.gradeBand[1]}`)\n        : undefined;\n\n      return {\n        packId: pack.manifest.id,\n        packTitle: pack.manifest.name,\n        statementId: stmt.id,\n        description,\n        category,\n        gradeBand,\n      };\n    }\n  }\n  return null;\n}\n\n/**\n * Biểu thức chính quy phát hiện mã chuẩn giáo dục (CSTA PK–12 2026, CSTA K-12 2017, và ACM/IEEE CS2023).\n */\nexport const STANDARD_REF_REGEX =\n  /\\b(?:(?:csta-pk12-2026|csta-k12-2017|acm-ieee-cs2023):)?(?:(?:EK|E[1-5]|MS|HS|S[12])-[A-Z]{3}-[A-Z]{2}-\\d{2}|[1-3][A-B]?-[A-Z]{2}-\\d{2}|CS2023-[A-Z0-9_-]+)\\b/gi;\n\n/**\n * Trích xuất toàn bộ các standard statement ref duy nhất từ văn bản.\n */\nexport function extractStandardRefs(text: string | undefined | null): string[] {\n  if (!text) return [];\n  const matches = Array.from(text.matchAll(STANDARD_REF_REGEX)).map((m) => m[0]);\n  return Array.from(new Set(matches));\n}","import { getContract } from './artifactRegistry.js';\nimport type { ValidationResult, ValidationIssue } from './artifactTypeContract.js';\nimport {\n  scanCjkLeaks,\n  checkVersionGroundTruth,\n  checkScopeDrift,\n} from '../services/artifactValidators.js';\n\nexport interface ArtifactValidationContext {\n  projectId?: string;\n  lessonId?: string;\n  expectedVersion?: string;\n  allowedScopeTags?: string[];\n  [key: string]: unknown;\n}\n\n/**\n * Universal Post-Generation Validation Gate for all 21 Artifact Types.\n * Runs:\n * 1. Zod schema validation (if outputSchema configured). When NO typed data was\n *    supplied the step reports ERR_SCHEMA_SKIPPED instead of passing silently —\n *    `valid` only ever means \"nothing failed\", and the warning says what was\n *    never checked.\n * 2. Deterministic anti-leak checks (CJK leaks, Version Truth, Scope Drift).\n * 3. Type-specific custom validators (if defined in contract).\n */\nexport async function validateArtifactOutput(\n  artifactType: string,\n  markdownContent: string,\n  entityOrData?: unknown,\n  context?: ArtifactValidationContext\n): Promise<ValidationResult> {\n  const issues: ValidationIssue[] = [];\n  const contract = getContract(artifactType);\n\n  // 1. Deterministic CJK leak detector\n  const cjkLeak = scanCjkLeaks(markdownContent);\n  if (cjkLeak) {\n    issues.push({\n      severity: 'ERROR',\n      code: 'ERR_CJK_LEAK',\n      message: cjkLeak.detail,\n      field: 'content',\n    });\n  }\n\n  // 2. Version Ground Truth\n  if (context?.refPack) {\n    const vIssue = checkVersionGroundTruth(markdownContent, String(context.refPack));\n    if (vIssue) {\n      issues.push({\n        severity: 'WARNING',\n        code: 'WARN_VERSION_MISMATCH',\n        message: vIssue.detail,\n        field: 'version',\n      });\n    }\n  }\n\n  // 3. Scope Drift Check\n  if (context?.allowedScopeTags && context.allowedScopeTags.length > 0) {\n    const sIssue = checkScopeDrift(markdownContent, context.allowedScopeTags);\n    if (sIssue) {\n      issues.push({\n        severity: 'WARNING',\n        code: 'WARN_SCOPE_DRIFT',\n        message: sIssue.detail,\n        field: 'scope',\n      });\n    }\n  }\n\n  // 4. Output Zod Schema validation.\n  //    A contract that DECLARES an outputSchema but gets no typed data was\n  //    previously skipped in silence — the caller could not tell a genuinely\n  //    valid artifact from one nobody ever checked. That is now a WARNING.\n  if (contract?.outputSchema) {\n    if (entityOrData) {\n      const parsed = contract.outputSchema.safeParse(entityOrData);\n      if (!parsed.success) {\n        for (const err of parsed.error.issues) {\n          issues.push({\n            severity: 'ERROR',\n            code: 'ERR_SCHEMA_VIOLATION',\n            message: `${err.path.join('.')}: ${err.message}`,\n            field: err.path.join('.'),\n          });\n        }\n      }\n    } else {\n      issues.push({\n        severity: 'WARNING',\n        code: 'ERR_SCHEMA_SKIPPED',\n        message: `Output schema validation SKIPPED for ${contract.type.toUpperCase()}: no typed data could be extracted from the markdown, so the declared outputSchema never ran. Treat the artifact as UNCHECKED, not as valid.`,\n        field: 'content',\n        suggestion: 'Add an AST extractor for this artifact type in extractTypedDataForValidation().',\n      });\n    }\n  }\n\n  // 5. Custom contract validators\n  if (contract?.validators) {\n    for (const valFn of contract.validators) {\n      const res = await valFn(markdownContent, context);\n      if (!res.valid) {\n        issues.push(...res.issues);\n      }\n    }\n  }\n\n  const hasErrors = issues.some((i) => i.severity === 'ERROR');\n  return {\n    valid: !hasErrors,\n    issues,\n  };\n}\n","import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkGfm from 'remark-gfm';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport { toString } from 'mdast-util-to-string';\nimport type { Root, Node, Heading } from 'mdast';\n\nimport type {\n  ArtifactAst,\n  AstWarning,\n  SerializeAstOptions,\n  SerializedArtifactAst,\n} from './artifactAstTypes.js';\nimport { matchHeadingToSemanticKey } from './headerDictionary.js';\n\n// Pre-configured isomorphic unified processor\nconst processor = unified()\n  .use(remarkParse)\n  .use(remarkGfm)\n  .use(remarkFrontmatter, ['yaml']);\n\ninterface ActiveSection {\n  depth: number;\n  key: string;\n  keyPath: string;\n  isKnown: boolean;\n}\n\n/**\n * Parses markdown into an Ephemeral In-Memory Lossless AST with a Semantic Overlay.\n * \n * - Tier 1 (Lossless Tree): ast.tree contains the full mdast Root with positions.\n * - Tier 2 (Semantic Overlay): ast.semanticIndex maps canonical key paths to node references.\n * - customBlocks: captures all nodes not mapped to any known semantic key.\n * \n * Guaranteed: Partition of root.children into (semanticIndex + customBlocks) is lossless and non-duplicated.\n */\nexport function parseArtifactAst(md: string): ArtifactAst {\n  const tree = processor.parse(md) as Root;\n  const semanticIndex = new Map<string, Node[]>();\n  const customBlocks: Node[] = [];\n  const warnings: AstWarning[] = [];\n\n  // Active stack of headings for H2 -> H3 -> H4 nesting\n  let currentH2: ActiveSection | null = null;\n  let currentH3: ActiveSection | null = null;\n  let currentH4: ActiveSection | null = null;\n\n  for (const child of tree.children) {\n    if (child.type === 'heading') {\n      const heading = child as Heading;\n      const depth = heading.depth;\n      const headingText = toString(heading);\n\n      if (depth === 1) {\n        // Top-level document title: clear heading hierarchy\n        currentH2 = null;\n        currentH3 = null;\n        currentH4 = null;\n        customBlocks.push(child);\n      } else if (depth === 2) {\n        currentH2 = null;\n        currentH3 = null;\n        currentH4 = null;\n\n        const match = matchHeadingToSemanticKey(headingText);\n        if (match.isKnown) {\n          currentH2 = {\n            depth: 2,\n            key: match.key,\n            keyPath: match.keyPath,\n            isKnown: true,\n          };\n          if (!semanticIndex.has(match.keyPath)) {\n            semanticIndex.set(match.keyPath, []);\n          }\n          semanticIndex.get(match.keyPath)!.push(child);\n        } else {\n          currentH2 = {\n            depth: 2,\n            key: match.key,\n            keyPath: match.keyPath,\n            isKnown: false,\n          };\n          warnings.push({\n            code: 'UNRECOGNIZED_HEADING',\n            message: `Unrecognized H2 heading \"${headingText}\" placed into customBlocks`,\n            heading: headingText,\n            depth: 2,\n            line: child.position?.start?.line,\n          });\n          customBlocks.push(child);\n        }\n      } else if (depth === 3) {\n        currentH3 = null;\n        currentH4 = null;\n\n        const parentPath = currentH2?.isKnown ? currentH2.keyPath : undefined;\n        const match = matchHeadingToSemanticKey(headingText, parentPath);\n\n        if (match.isKnown) {\n          currentH3 = {\n            depth: 3,\n            key: match.key,\n            keyPath: match.keyPath,\n            isKnown: true,\n          };\n          if (!semanticIndex.has(match.keyPath)) {\n            semanticIndex.set(match.keyPath, []);\n          }\n          semanticIndex.get(match.keyPath)!.push(child);\n        } else {\n          currentH3 = {\n            depth: 3,\n            key: match.key,\n            keyPath: match.keyPath,\n            isKnown: false,\n          };\n          warnings.push({\n            code: 'UNRECOGNIZED_HEADING',\n            message: `Unrecognized H3 heading \"${headingText}\" placed into customBlocks`,\n            heading: headingText,\n            depth: 3,\n            line: child.position?.start?.line,\n          });\n          customBlocks.push(child);\n        }\n      } else if (depth === 4) {\n        currentH4 = null;\n\n        const parentPath = currentH3?.isKnown\n          ? currentH3.keyPath\n          : currentH2?.isKnown\n          ? currentH2.keyPath\n          : undefined;\n        const match = matchHeadingToSemanticKey(headingText, parentPath);\n\n        if (match.isKnown) {\n          currentH4 = {\n            depth: 4,\n            key: match.key,\n            keyPath: match.keyPath,\n            isKnown: true,\n          };\n          if (!semanticIndex.has(match.keyPath)) {\n            semanticIndex.set(match.keyPath, []);\n          }\n          semanticIndex.get(match.keyPath)!.push(child);\n        } else {\n          currentH4 = {\n            depth: 4,\n            key: match.key,\n            keyPath: match.keyPath,\n            isKnown: false,\n          };\n          warnings.push({\n            code: 'UNRECOGNIZED_HEADING',\n            message: `Unrecognized H4 heading \"${headingText}\" placed into customBlocks`,\n            heading: headingText,\n            depth: 4,\n            line: child.position?.start?.line,\n          });\n          customBlocks.push(child);\n        }\n      } else {\n        // H5+ headings: as per QD-4, merge into the nearest active key above\n        const activeKey =\n          (currentH4?.isKnown && currentH4.keyPath) ||\n          (currentH3?.isKnown && currentH3.keyPath) ||\n          (currentH2?.isKnown && currentH2.keyPath);\n\n        if (activeKey) {\n          semanticIndex.get(activeKey)!.push(child);\n        } else {\n          customBlocks.push(child);\n        }\n      }\n    } else {\n      // Non-heading node (paragraph, table, code, list, blockquote, yaml, html, etc.)\n      const activeKey =\n        (currentH4?.isKnown && currentH4.keyPath) ||\n        (currentH3?.isKnown && currentH3.keyPath) ||\n        (currentH2?.isKnown && currentH2.keyPath);\n\n      if (activeKey) {\n        if (!semanticIndex.has(activeKey)) {\n          semanticIndex.set(activeKey, []);\n        }\n        semanticIndex.get(activeKey)!.push(child);\n      } else {\n        customBlocks.push(child);\n      }\n    }\n  }\n\n  return {\n    tree,\n    semanticIndex,\n    customBlocks,\n    warnings,\n  };\n}\n\n/**\n * Deep clones an object while stripping `position` attributes from every node.\n */\nfunction cloneAndStripPosition(obj: any): any {\n  if (obj === null || typeof obj !== 'object') {\n    return obj;\n  }\n  if (Array.isArray(obj)) {\n    return obj.map(cloneAndStripPosition);\n  }\n  const result: Record<string, any> = {};\n  for (const key of Object.keys(obj)) {\n    if (key === 'position') continue;\n    result[key] = cloneAndStripPosition(obj[key]);\n  }\n  return result;\n}\n\n/**\n * Serializes an ArtifactAst into a JSON-friendly format for UI/logging.\n * Converted Map to Record. Optionally strips position information.\n */\nexport function serializeArtifactAst(\n  ast: ArtifactAst,\n  options: SerializeAstOptions = {}\n): SerializedArtifactAst {\n  const recordIndex: Record<string, Node[]> = {};\n  for (const [k, v] of ast.semanticIndex.entries()) {\n    recordIndex[k] = options.stripPosition ? cloneAndStripPosition(v) : v;\n  }\n\n  return {\n    tree: options.stripPosition ? cloneAndStripPosition(ast.tree) : ast.tree,\n    semanticIndex: recordIndex,\n    customBlocks: options.stripPosition ? cloneAndStripPosition(ast.customBlocks) : ast.customBlocks,\n    warnings: ast.warnings,\n  };\n}\n","import { toMarkdown } from 'mdast-util-to-markdown';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport { toString } from 'mdast-util-to-string';\nimport type { Node, Table, TableRow, TableCell } from 'mdast';\n\nimport type { ArtifactAst } from './artifactAstTypes.js';\nimport { matchHeadingToSemanticKey } from './headerDictionary.js';\nimport {\n  ActivitySeqRowSchema,\n  type ActivitySeqRow,\n  LearningObjectiveRowSchema,\n  type LearningObjectiveRow,\n  ResourceMapRowSchema,\n  type ResourceMapRow,\n  AssessmentMapRowSchema,\n  type AssessmentMapRow,\n  ArtifactContractRowSchema,\n  type ArtifactContractRow,\n} from '../schemas/lessonPlanSchema.js';\n\nexport interface ProjectForPromptOptions {\n  /**\n   * Budget for the projection, in CHARACTERS. The registry slot budgets are\n   * character budgets (the markdown fallback enforces them via\n   * buildSectionAwareExcerpt), so the AST view counts the serialized markdown\n   * directly — one number, one unit, no silent 4× inflation.\n   */\n  budgetTokens?: number;\n  /**\n   * Reports a slot key that produced nothing. Messages that mean canonical\n   * content was lost carry the `section:dropped:` / `section:truncated:`\n   * prefixes — the same machine vocabulary `contextBuilder` already emits — so\n   * AST drops reach the `contextDrops` telemetry without a second convention\n   * to translate. Those two used to be silent: the whole-section invariant\n   * discards a non-fitting section without a word, so a priority that lost its\n   * canonical table looked identical to one that shipped in full. Measured on\n   * swift-for-dummy LESSON_U01_M01_L01 at budget 6000: learningObjectives was\n   * dropped, zero warnings.\n   *\n   * \"Key not in the semantic index\" is deliberately NOT a drop — priority keys\n   * that an artifact simply does not carry are routine, and flagging them\n   * would flood contextDrops on every well-formed artifact.\n   */\n  onWarning?: (msg: string) => void;\n}\n\n/**\n * Budget truncation that never leaves an unbalanced code fence behind.\n */\nfunction truncateFencedMarkdown(source: string, maxChars: number): string {\n  if (source.length <= maxChars) return source;\n  let cut = source.slice(0, Math.max(0, maxChars));\n  const fenceCount = (cut.match(/^```/gm) || []).length;\n  if (fenceCount % 2 === 1) cut += '\\n```';\n  return cut;\n}\n\n/**\n * Resolves node references for a semantic slot key from the AST's semantic index.\n * Supports:\n * - Exact key path (e.g. \"lessonDesignPlan.activitySequence\")\n * - Short key / suffix match (e.g. \"activitySequence\" matches \"*.activitySequence\")\n * - Prefix parent match (e.g. \"lessonDesignPlan\" returns all child sections)\n */\nexport function resolveSlotNodes(ast: ArtifactAst, slotKey: string): Node[] {\n  // Check direct matches and children\n  const directNodes = ast.semanticIndex.get(slotKey) ?? [];\n  const prefix = `${slotKey}.`;\n  const childNodes: Node[] = [];\n\n  for (const [keyPath, nodes] of ast.semanticIndex.entries()) {\n    if (keyPath.startsWith(prefix)) {\n      childNodes.push(...nodes);\n    }\n  }\n\n  if (directNodes.length > 0 || childNodes.length > 0) {\n    return [...directNodes, ...childNodes];\n  }\n\n  // Suffix match (e.g. 'activitySequence' -> 'lessonDesignPlan.activitySequence')\n  const matchedNodes: Node[] = [];\n  const suffix = `.${slotKey}`;\n  for (const [keyPath, nodes] of ast.semanticIndex.entries()) {\n    if (keyPath === slotKey || keyPath.endsWith(suffix) || keyPath.includes(suffix + '.')) {\n      matchedNodes.push(...nodes);\n    }\n  }\n  return matchedNodes;\n}\n\n/**\n * Projects a subset of the AST into markdown text suitable for LLM prompt injection.\n * \n * - Only extracts requested semantic slot keys (unmatched headings in customBlocks are never injected).\n * - Enforces budget per prompt slot.\n */\nexport function projectAstForPrompt(\n  ast: ArtifactAst,\n  slotKeys: string[],\n  options: ProjectForPromptOptions = {}\n): string {\n  const sections: string[] = [];\n  let usedChars = 0;\n  const maxChars = options.budgetTokens ?? Infinity;\n  // Node identity already shipped. `resolveSlotNodes` prefix-expands a parent\n  // key into its children ('lessonDesignPlan' → +learningObjectives,\n  // +activitySequence, …), so a priority list naming BOTH the parent and a\n  // child used to serialize that child twice — burning budget and showing the\n  // model the same table in two places. Deduping by node identity keeps the\n  // first (highest-priority) occurrence and drops the repeat.\n  const emitted = new Set<Node>();\n  // Ứng viên cắt: mục ưu tiên CAO NHẤT chưa vừa. Chưa kết luận vội — xem dưới.\n  let fallback: { slotKey: string; md: string } | null = null;\n  const droppedWarning = (slotKey: string, chars: number) =>\n    `section:dropped:${slotKey} (${chars} chars vs ${maxChars - usedChars} left of a ${maxChars}-char budget; dropped whole)`;\n\n  for (const slotKey of slotKeys) {\n    const nodes = resolveSlotNodes(ast, slotKey);\n    if (nodes.length === 0) {\n      if (options.onWarning) {\n        options.onWarning(`Slot key \"${slotKey}\" not found in artifact semantic index`);\n      }\n      continue;\n    }\n\n    // Not a drop: the dedup above working as designed (a priority list naming\n    // both a parent key and its child resolves the child to nothing new).\n    const fresh = nodes.filter((n) => !emitted.has(n));\n    if (fresh.length === 0) continue;\n    for (const n of fresh) emitted.add(n);\n\n    const syntheticRoot = { type: 'root' as const, children: fresh as any };\n    const md = toMarkdown(syntheticRoot as any, { extensions: [gfmToMarkdown()] }).trim();\n    if (!md) {\n      options.onWarning?.(`section:dropped:${slotKey} (nodes serialise to an empty string)`);\n      continue;\n    }\n\n    if (usedChars + md.length <= maxChars) {\n      sections.push(md);\n      usedChars += md.length;\n      continue;\n    }\n\n    // Whole-section invariant: a section that does not fit is dropped WHOLE —\n    // a truncated canonical table is worse than none. It also consumes NO\n    // budget, so the loop keeps trying the next priority: a 3.500-char slot\n    // must not be spent on half a 3.696-char Activity Sequence while the\n    // 1.769-char Artifact Contract behind it would have fitted whole.\n    //\n    // Đo 2026-10-04 trên swift-for-dummy U01_M01_L01 (activitySequence 3696,\n    // learningObjectives 4278, artifactContract 1769): luật cũ CỐT CHẾ “cắt\n    // mục đầu tiên rồi dừng” nên QUIZ (3500) nhận một activitySequence bị\n    // cắt dở và mất sạch bảng mục tiêu; rubric (3000) và review_game (3500)\n    // cắt dở chính bảng mục tiêu — cùng một lỗi với bảng quan trọng nhất.\n    // `buildSectionAwareExcerpt` (contextBuilder.ts) đã làm đúng luật này từ\n    // lâu (“a dropped (too-big) section consumes no budget — keep trying the\n    // next”); lệch luật giữa hai nhánh cùng dựng một excerpt là chỗ drift này.\n    //\n    // Fail-open: nếu KHÔNG mục nào vừa, cắt mục ưu tiên cao nhất để slot không\n    // rỗng. Báo `truncated`, KHÔNG báo `dropped` cho cùng mục đó — cả hai là\n    // một mất mát, báo hai lần sẽ nhân bản issue và bắn cảnh một lượt chạy\n    // khoẻ với ngân sách chật.\n    if (fallback === null) {\n      fallback = { slotKey, md };\n      continue;\n    }\n    options.onWarning?.(droppedWarning(slotKey, md.length));\n  }\n\n  if (fallback) {\n    if (sections.length === 0) {\n      const truncated = truncateFencedMarkdown(fallback.md, maxChars).trim();\n      if (truncated) {\n        sections.push(truncated);\n        usedChars += truncated.length;\n        options.onWarning?.(\n          `section:truncated:${fallback.slotKey} (${fallback.md.length} chars truncated to ${maxChars} so a non-empty projection still ships)`\n        );\n      }\n    } else {\n      options.onWarning?.(droppedWarning(fallback.slotKey, fallback.md.length));\n    }\n  }\n\n  return sections.join('\\n\\n');\n}\n\n/**\n * Extracts raw table rows from an array of AST nodes as an array of column-value dictionaries.\n */\nexport function extractTableRows(nodes: Node[]): Array<Record<string, string>> {\n  const results: Array<Record<string, string>> = [];\n\n  for (const node of nodes) {\n    if (node.type === 'table') {\n      const table = node as Table;\n      const rows = table.children as TableRow[];\n      if (rows.length < 2) continue;\n\n      const headers = rows[0].children.map((c) => toString(c).trim());\n      for (let r = 1; r < rows.length; r++) {\n        const cells = rows[r].children as TableCell[];\n        const rowObj: Record<string, string> = {};\n        headers.forEach((header, idx) => {\n          rowObj[header] = cells[idx] ? toString(cells[idx]).trim() : '';\n        });\n        results.push(rowObj);\n      }\n    }\n  }\n\n  return results;\n}\n\n/**\n * Helper to match table column names flexibly across English and Vietnamese headers.\n *\n * Real artifacts decorate their headers — `Objective (Bloom's / EDP)`,\n * `Student Evidence`, `Artifact Contract (required)` — so an EXACT header match\n * alone silently dropped those rows: extractLearningObjectiveRows returned 0\n * rows on every real lesson, which emptied the learning-objectives slot and made\n * the LESSON output-schema check fail with \"Array must contain at least 1\".\n *\n * Order: exact → case-insensitive exact → substring. Substring matching is only\n * attempted for names long enough to be unambiguous, because short codes would\n * otherwise match inside unrelated words ('ID' is a substring of 'evidence').\n */\nfunction getCell(row: Record<string, string>, ...possibleNames: string[]): string {\n  const keys = Object.keys(row);\n  for (const name of possibleNames) {\n    if (row[name] !== undefined) return row[name].trim();\n  }\n  // Try case-insensitive matching\n  const lowerKeys = keys.map((k) => k.toLowerCase());\n  for (const name of possibleNames) {\n    const idx = lowerKeys.indexOf(name.toLowerCase());\n    if (idx !== -1) {\n      return row[keys[idx]!].trim();\n    }\n  }\n  // Decorated headers (\"Student Evidence\" for \"Evidence\").\n  for (const name of possibleNames) {\n    if (name.length < 5) continue;\n    const needle = name.toLowerCase();\n    const hit = keys.find((k) => k.toLowerCase().includes(needle));\n    if (hit) return row[hit]!.trim();\n  }\n  return '';\n}\n\n/**\n * Extracts structured, validated LearningObjective rows from the AST.\n */\nexport function extractLearningObjectiveRows(ast: ArtifactAst): LearningObjectiveRow[] {\n  const nodes = resolveSlotNodes(ast, 'learningObjectives');\n  const rawRows = extractTableRows(nodes);\n  const rows: LearningObjectiveRow[] = [];\n\n  for (const raw of rawRows) {\n    const code = getCell(raw, 'Code', 'Mã', 'ID', 'LO Code');\n    const objective = getCell(raw, 'Objective', 'Mục tiêu', 'Learning Objective');\n    const evidence = getCell(raw, 'Evidence', 'Minh chứng', 'Assessment Evidence');\n    const successCriteria = getCell(raw, 'Success Criteria', 'Tiêu chí thành công', 'Criteria');\n    const standardRefsRaw = getCell(raw, 'Standard Refs', 'Chuẩn tham chiếu', 'Standards');\n\n    if (!code && !objective) continue;\n\n    const parsed = LearningObjectiveRowSchema.safeParse({\n      code: code || `LO${rows.length + 1}`,\n      objective: objective || '',\n      evidence: evidence || '',\n      successCriteria: successCriteria || '',\n      standardRefs: standardRefsRaw ? standardRefsRaw.split(/[\\s,;]+/).filter(Boolean) : [],\n      conceptRefs: [],\n    });\n\n    if (parsed.success) {\n      rows.push(parsed.data);\n    }\n  }\n\n  return rows;\n}\n\n/**\n * Extracts structured, validated ActivitySequence rows from the AST.\n */\nexport function extractActivitySequenceRows(ast: ArtifactAst): ActivitySeqRow[] {\n  const nodes = resolveSlotNodes(ast, 'activitySequence');\n  const rawRows = extractTableRows(nodes);\n  const rows: ActivitySeqRow[] = [];\n\n  for (let idx = 0; idx < rawRows.length; idx++) {\n    const raw = rawRows[idx];\n    const seq = parseInt(getCell(raw, 'Seq', 'STT', '#', 'No'), 10) || idx + 1;\n    // The three shipped lesson templates each name this column differently:\n    // \"EDP Phase\", \"5E Phase\", and \"Lesson Stage\". Missing \"Lesson Stage\" made\n    // every GENERAL row fall through to 'Explore', so all five rows shared one\n    // phase name and the lessonFlow duration fallback could not match any phase.\n    const phase =\n      getCell(raw, 'Phase', 'EDP Phase', '5E Phase', 'Lesson Stage', 'Giai đoạn', 'Chặng') ||\n      'Explore';\n    const activityName = getCell(raw, 'Activity', 'Activity Type', 'Hoạt động', 'Activity Name') || `Activity ${seq}`;\n    const studentRole = getCell(raw, 'Student Role', 'Vai trò HS', 'Actor', 'Học sinh');\n    const teacherRole = getCell(raw, 'Teacher Role', 'Vai trò GV', 'Teacher Move', 'Giáo viên');\n    const pedagogicalPurpose = getCell(raw, 'Purpose', 'Mục đích', 'Mục đích sư phạm');\n    const coreTask = getCell(raw, 'Student Action', 'Task', 'Nhiệm vụ', 'Hành động của học sinh', 'Nhiệm vụ cốt lõi');\n    const evidenceProduct = getCell(raw, 'Output/Evidence', 'Evidence', 'Sản phẩm', 'Minh chứng');\n    const loCode = getCell(raw, 'LO', 'Mục tiêu', 'LO Code') || 'LO1';\n    const durationMins = parseInt(getCell(raw, 'Duration', 'Time', 'Thời lượng', 'Thời gian'), 10) || 10;\n    const artifactContract = getCell(raw, 'Artifact Contract', 'Ràng buộc', 'Thành phẩm');\n\n    const parsed = ActivitySeqRowSchema.safeParse({\n      seq,\n      phase,\n      activityType: activityName,\n      actor: studentRole || 'Students',\n      purpose: pedagogicalPurpose || 'Instruction',\n      studentAction: coreTask || activityName,\n      teacherMove: teacherRole || 'Guide',\n      outputEvidence: evidenceProduct || 'Output',\n      lo: loCode ? loCode.split(/[\\s,;]+/).filter(Boolean) : ['LO1'],\n      durationMinutes: durationMins,\n      artifactContract: artifactContract || 'NONE',\n    });\n\n    if (parsed.success) {\n      rows.push(parsed.data);\n    }\n  }\n\n  return rows;\n}\n\n/**\n * Extracts raw AssessmentMap rows from the AST.\n */\nexport function extractAssessmentMapRows(ast: ArtifactAst): Array<Record<string, string>> {\n  const nodes = resolveSlotNodes(ast, 'assessmentMap');\n  return extractTableRows(nodes);\n}\n\n/**\n * Resource-Map table rows → `ResourceMapRowSchema` shape.\n *\n * All three shipped lesson templates write the same four columns:\n * `| Resource | Used In Activity | Purpose | Owner Artifact |`\n * Real cells split the first one two ways: `Slide deck: \"Môi trường phát triển\"`\n * and `SLIDE (Slide bài học 2/2)` (all-caps type only). A cell with neither\n * (`Xcode 16.3 trên Mac Mini M2`) is one phrase, so both fields carry it\n * rather than inventing a boundary.\n * `Owner Artifact` is the satellite that owns the resource and has no schema\n * field — it is dropped rather than smeared into a column that means something else.\n */\nfunction toResourceMapSchemaRows(raw: Array<Record<string, string>>): Array<Record<string, string>> {\n  return raw.map((row) => {\n    const resource = getCell(row, 'Resource', 'Item', 'Tài nguyên', 'Tên', 'Resource Type');\n    const colon = resource.match(/^(.+?): (.+)$/);\n    // Parens only split when they hold a NAME. `SLIDE (Slide bài học 2/2)` is a\n    // type plus its title; `Mac Mini M2 (2 bạn/máy)` is a device plus a ratio,\n    // and splitting that would file \"2 bạn/máy\" as the resource identifier.\n    const paren = resource.match(/^([A-Z][A-Z0-9_]{1,20})\\s*\\((.+)\\)$/);\n    const split = colon ?? paren;\n    return {\n      resourceType: split ? split[1]!.trim() : resource.trim(),\n      identifier: split ? split[2]!.trim() : resource.trim(),\n      description: getCell(row, 'Purpose', 'Description', 'Mục đích', 'Mô tả', 'Why needed'),\n      location: getCell(row, 'Used In Activity', 'Used In', 'Location', 'Dùng ở', 'Seq'),\n    };\n  });\n}\n\n/** Extracts ResourceMap rows from the AST, shaped for `ResourceMapRowSchema`. */\nexport function extractResourceMapRows(ast: ArtifactAst): ResourceMapRow[] {\n  const nodes = resolveSlotNodes(ast, 'resourceMap');\n  const rows: ResourceMapRow[] = [];\n  for (const mapped of toResourceMapSchemaRows(extractTableRows(nodes))) {\n    if (!mapped.identifier) continue;\n    const parsed = ResourceMapRowSchema.safeParse(mapped);\n    if (parsed.success) rows.push(parsed.data);\n  }\n  return rows;\n}\n\n/**\n * Artifact-Contract rows → `ArtifactContractRowSchema` shape.\n *\n * Two authored shapes, because the shipped templates and real artifacts differ:\n *\n *  - BULLET LIST, which is what all three lesson templates and every real\n *    lesson actually use: `- **ACT must expand:** <requirement>`. The bold head\n *    is the satellite, the rest is its obligation.\n *  - TABLE, for a future author who wants min-items and format notes spelled\n *    out: `| Artifact | Required Sections | Min Items | Notes |`.\n *\n * The previous version only read tables, so this section parsed to 0 rows on\n * every real artifact — the template never used a table here.\n */\nfunction toArtifactContractSchemaRows(nodes: Node[]): Array<Record<string, string>> {\n  const out: Array<Record<string, string>> = [];\n\n  for (const raw of extractTableRows(nodes)) {\n    const artifactType = getCell(raw, 'Artifact', 'Artifact Type', 'Thành phẩm', 'Type');\n    if (!artifactType) continue;\n    out.push({\n      // A table row names the satellite once; the bullet form below carries no\n      // id either, so both identify the row by its type within the lesson.\n      artifactId: getCell(raw, 'Artifact Id', 'Id', 'ID') || artifactType,\n      artifactType,\n      description: getCell(raw, 'Description', 'Mô tả', 'Requirement'),\n      requiredSections: getCell(raw, 'Required Sections', 'Mục bắt buộc', 'Sections'),\n      format: getCell(raw, 'Format', 'Định dạng', 'Notes', 'Ghi chú'),\n      owner: getCell(raw, 'Owner', 'Chủ sở hữu'),\n    });\n  }\n\n  if (out.length > 0) return out;\n\n  for (const node of nodes) {\n    if (node.type !== 'list') continue;\n    for (const item of (node as { children?: Node[] }).children ?? []) {\n      const m = toString(item).trim().match(/^([A-Z][A-Z0-9_]{1,20})\\s+(?:must|shall|should)\\b[^:]*:\\s*(.+)$/i);\n      if (!m) continue;\n      const artifactType = m[1]!.toUpperCase();\n      out.push({\n        artifactId: artifactType,\n        artifactType,\n        description: m[2]!.trim(),\n        requiredSections: '',\n        format: '',\n        owner: '',\n      });\n    }\n  }\n\n  return out;\n}\n\n/** Extracts ArtifactContract rows from the AST, shaped for `ArtifactContractRowSchema`. */\nexport function extractArtifactContractRows(ast: ArtifactAst): ArtifactContractRow[] {\n  const rows: ArtifactContractRow[] = [];\n  for (const mapped of toArtifactContractSchemaRows(resolveSlotNodes(ast, 'artifactContract'))) {\n    if (!mapped.artifactType) continue;\n    const parsed = ArtifactContractRowSchema.safeParse(mapped);\n    if (parsed.success) rows.push(parsed.data);\n  }\n  return rows;\n}\n\n\n/**\n * Checks whether an activity sequence row is assigned to the given artifact type via its artifactContract.\n */\nexport function rowAssignedTo(row: ActivitySeqRow, artifactType: string): boolean {\n  const norm = (s: string) => s.toLowerCase().replace(/[^a-z0-9]/g, '');\n  const wanted = norm(artifactType);\n  return row.artifactContract\n    .split(/[,;/]/)\n    .map((c) => norm(c))\n    .some((c) => c === wanted || (c.length > 3 && (c.includes(wanted) || wanted.includes(c))));\n}\n\n/**\n * Extracts and renders markdown table for only the activity sequence rows assigned to an artifact type.\n */\nexport function renderAssignedRowsTableFromAst(\n  ast: ArtifactAst,\n  artifactType: string,\n  maxChars = 1500\n): string {\n  const allRows = extractActivitySequenceRows(ast);\n  const rows = allRows.filter((r) => rowAssignedTo(r, artifactType));\n  if (rows.length === 0) return '';\n\n  const header = '| Seq | Phase | Activity | Actor | Student Action | Teacher Move | Output/Evidence | LO | Mins | Artifact Contract |';\n  const sep = '|---|---|---|---|---|---|---|---|---|---|';\n  const body = rows.map(\n    (a) =>\n      `| ${a.seq} | ${a.phase} | ${a.activityType} | ${a.actor} | ${a.studentAction} | ${a.teacherMove} | ${a.outputEvidence} | ${a.lo.join(',')} | ${a.durationMinutes} | ${a.artifactContract} |`\n  );\n\n  return [header, sep, ...body].join('\\n').slice(0, maxChars);\n}\n\n/** Minimal YAML reader for the frontmatter node: scalars + one-level `- item` lists. */\nfunction readFrontmatter(ast: ArtifactAst): Record<string, string> {\n  const yaml = (ast.tree.children as Node[]).find((n) => n.type === 'yaml') as\n    | (Node & { value?: string })\n    | undefined;\n  const out: Record<string, string> = {};\n  if (!yaml?.value) return out;\n  for (const raw of yaml.value.split('\\n')) {\n    const kv = raw.match(/^([A-Za-z_][A-Za-z0-9_]*):\\s*(.*)$/);\n    if (!kv) continue;\n    out[kv[1]!] = (kv[2] || '').trim().replace(/^\"(.*)\"$/, '$1');\n  }\n  return out;\n}\n\n/**\n * Groups top-level nodes under the nearest H2's semantic key, by DOCUMENT\n * POSITION rather than by semanticIndex membership.\n *\n * This matters for QUIZ: the question sub-headings ('### Câu 1: …') are not\n * dictionary entries, so they land in `customBlocks`, and their option lists are\n * plain siblings that no semanticIndex entry owns. Walking the tree in order is\n * the only way to see heading + its options together.\n */\nfunction groupNodesBySection(ast: ArtifactAst): Map<string, Node[]> {\n  const sections = new Map<string, Node[]>();\n  let currentKey: string | null = null;\n  for (const node of ast.tree.children as Node[]) {\n    if (node.type === 'heading') {\n      const depth = (node as { depth?: number }).depth ?? 1;\n      // H1 is the document title, not a section.\n      if (depth === 1) continue;\n      if (depth === 2) {\n        currentKey = matchHeadingToSemanticKey(toString(node)).key;\n        continue;\n      }\n    }\n    if (!currentKey) continue;\n    const bucket = sections.get(currentKey);\n    if (bucket) bucket.push(node);\n    else sections.set(currentKey, [node]);\n  }\n  return sections;\n}\n\n/** Question headings are authored bilingually: 'Q1.', 'Câu 1:', 'Question 2:'. */\nconst QUESTION_HEADING_RE = /^(?:cau|câu|q|question|cau hoi|câu hỏi)\\s*(\\d+)\\s*[:.)\\-–—]?\\s*(.*)$/i;\nconst OPTION_RE = /^([A-Fa-f])\\s*[.)]\\s+(.+)$/;\nconst META_LINE_RE = /^\\*{0,2}([^:*]+):\\*{0,2}\\s*(.*)$/;\n\nconst BLOOM_LEVELS = ['Remember', 'Understand', 'Apply', 'Analyze', 'Evaluate', 'Create'] as const;\n\nfunction toBloomLevel(raw: string | undefined): (typeof BLOOM_LEVELS)[number] {\n  const hit = BLOOM_LEVELS.find((b) => b.toLowerCase() === (raw || '').trim().toLowerCase());\n  return hit ?? 'Apply';\n}\n\ninterface RawQuestion {\n  id: string;\n  stem: string;\n  options: { id: string; text: string }[];\n  correctAnswer: string;\n  bloom: string;\n  alignedAO: string;\n  rationale: string;\n  code: string;\n  codeLanguage: string;\n  teacherNote: string;\n}\n\n/** Is this heading a question delimiter? ('### Câu 1: …', '### Q1. …', …) */\nfunction matchQuestionHeading(node: Node): { id: string; stem: string } | null {\n  if (node.type !== 'heading') return null;\n  const m = toString(node).trim().match(QUESTION_HEADING_RE);\n  if (!m) return null;\n  return { id: `Q${m[1]}`, stem: (m[2] || '').trim() };\n}\n\n/** Starts a question from its heading; the body is folded in as it is walked. */\nfunction startQuestion(head: { id: string; stem: string }): RawQuestion {\n  return {\n    id: head.id,\n    stem: head.stem,\n    options: [],\n    correctAnswer: '',\n    bloom: '',\n    alignedAO: '',\n    rationale: '',\n    code: '',\n    codeLanguage: '',\n    teacherNote: '',\n  };\n}\n\n/** Folds one node (option list / meta line / code block) into a question. */\nfunction absorbNode(q: RawQuestion, node: Node): RawQuestion {\n  if (node.type === 'code') {\n    const c = node as Node & { lang?: string | null; value?: string };\n    if (!q.code) {\n      q.code = c.value || '';\n      q.codeLanguage = c.lang || 'cpp';\n    }\n    return q;\n  }\n  if (node.type !== 'list' && node.type !== 'paragraph') return q;\n  const items = node.type === 'list' ? (node as { children?: Node[] }).children ?? [] : [node];\n  for (const item of items) {\n    const text = toString(item).trim();\n    const opt = text.match(OPTION_RE);\n    if (opt) {\n      q.options.push({ id: opt[1]!.toUpperCase(), text: opt[2]!.trim() });\n      continue;\n    }\n    const meta = text.match(META_LINE_RE);\n    if (!meta) continue;\n    const label = meta[1]!.trim().toLowerCase();\n    const value = meta[2]!.trim();\n    if (label.includes('correct') || label.includes('đáp án')) q.correctAnswer = value;\n    else if (label.includes('bloom')) q.bloom = value;\n    else if (label === 'lo' || label.includes('learning objective')) q.alignedAO = value;\n    else if (label.includes('rationale') || label.includes('explain') || label.includes('giải thích'))\n      q.rationale = q.rationale ? `${q.rationale} ${value}` : value;\n    else if (label.includes('answer') || label.includes('expected')) q.teacherNote = value;\n    else if ((label.includes('question') || label.includes('câu hỏi')) && !q.stem) q.stem = value;\n  }\n  return q;\n}\n\n/**\n * A question is real only when it carries 2+ options — DiagnosticQuestionSchema\n * requires 2-6, so a stray heading inside the bank must not become a\n * schema-invalid entry (that would fail an artifact that is actually fine).\n */\nfunction isRealQuestion(q: RawQuestion): boolean {\n  return q.options.length >= 2;\n}\n\n/**\n * QUIZ → DiagnosticQuizSchema shape.\n *\n * Returns null when no question could be read, so the caller reports the schema\n * step as SKIPPED (see validateArtifactOutput) rather than inventing a valid-\n * looking-but-empty quiz.\n */\nexport function extractQuizData(ast: ArtifactAst): Record<string, unknown> | null {\n  const sections = groupNodesBySection(ast);\n  const fm = readFrontmatter(ast);\n\n  const questions: Record<string, unknown>[] = [];\n  let seq = 0;\n  for (const [key, nodes] of sections) {\n    if (key !== 'multipleChoiceQuestionBank') continue;\n    let current: RawQuestion | null = null;\n    const flush = () => {\n      if (current && isRealQuestion(current)) {\n        questions.push(toDiagnosticQuestion(current, ++seq));\n      }\n      current = null;\n    };\n    for (const node of nodes) {\n      const head = matchQuestionHeading(node);\n      if (head) {\n        flush();\n        current = startQuestion(head);\n        continue;\n      }\n      if (current) current = absorbNode(current, node);\n    }\n    flush();\n  }\n\n  // The code-analysis block is NOT a schema question: DiagnosticQuestionSchema\n  // requires 2-6 options, and the template's code block has none. The app's own\n  // quiz extractor makes the same call (quiz-extractor.ts reads the question\n  // bank only), so the two views agree.\n\n  if (questions.length === 0) return null;\n\n  const h1 = (ast.tree.children as Node[]).find((n) => n.type === 'heading' && (n as { depth?: number }).depth === 1);\n  return {\n    artifactType: 'QUIZ',\n    quizId: fm.id || 'QUIZ',\n    title: fm.title || (h1 ? toString(h1).replace(/^\\s*QUIZ\\s*[:\\-–—]\\s*/i, '').trim() : 'Quiz Assessment'),\n    language: fm.language || 'en',\n    totalQuestions: questions.length,\n    assessmentObjectives: extractQuizAssessmentObjectives(sections),\n    questions,\n    rubric: extractQuizRubric(sections),\n  };\n}\n\nfunction toDiagnosticQuestion(q: RawQuestion, seq: number): Record<string, unknown> {\n  const correct = q.correctAnswer;\n  return {\n    id: q.id || `Q${seq}`,\n    alignedAO: q.alignedAO || undefined,\n    bloomLevel: toBloomLevel(q.bloom),\n    questionType: q.options.length >= 2 ? 'multiple_choice' : q.code ? 'code_analysis' : 'open_ended',\n    // `codeSnippet`/`codeLanguage` stay undefined for the MCQ bank — an empty\n    // string would be a lie about the artifact.\n    scenarioOrStem: q.stem || undefined,\n    stem: q.stem || undefined,\n    codeSnippet: q.code || undefined,\n    codeLanguage: q.codeLanguage || undefined,\n    options: q.options.map((o) => ({\n      id: o.id,\n      text: o.text,\n      isCorrect: o.id === correct,\n      // The template carries ONE distractor rationale per question; it explains\n      // the whole option set, so every option carries it.\n      explanation: q.rationale,\n    })),\n    correctAnswer: correct || undefined,\n    teacherNote: q.teacherNote || undefined,\n  };\n}\n\nfunction extractQuizAssessmentObjectives(sections: Map<string, Node[]>): Record<string, unknown>[] {\n  const rows = extractTableRows(sections.get('assessmentObjectives') ?? []);\n  const out: Record<string, unknown>[] = [];\n  for (const raw of rows) {\n    const lo = getCell(raw, 'LO', 'Learning Objective', 'Mục tiêu', 'LO Code');\n    const objective = getCell(raw, 'Assessment Objective', 'Objective', 'Mục tiêu đánh giá');\n    if (!lo && !objective) continue;\n    const refs = getCell(raw, 'Standard Refs', 'Chuẩn tham chiếu', 'Standards');\n    out.push({\n      aoCode: lo || `AO${out.length + 1}`,\n      alignedLO: lo,\n      bloomLevel: toBloomLevel(getCell(raw, 'Bloom Level', 'Bloom', 'Mức độ Bloom')),\n      objective: objective || '',\n      standardRefs: refs ? refs.split(/[\\s,;]+/).filter(Boolean) : [],\n    });\n  }\n  return out;\n}\n\nfunction extractQuizRubric(sections: Map<string, Node[]>): Record<string, string>[] {\n  const rows = extractTableRows(sections.get('competencyRubric') ?? []);\n  const tiers: Record<string, string> = { developing: '', proficient: '', advanced: '', exemplary: '' };\n  let dimension = '';\n  const out: Record<string, string>[] = [];\n  for (const raw of rows) {\n    const tier = (getCell(raw, 'Tier', 'Mức') || getCell(raw, 'Level')).trim().toLowerCase();\n    const descriptor = getCell(raw, 'Descriptor', 'Mô tả', 'Competency', 'Dimension');\n    const evidence = getCell(raw, 'Evidence Threshold', 'Evidence', 'Ngưỡng minh chứng', 'Threshold');\n    const dimCell = getCell(raw, 'Competency Dimension', 'Dimension', 'Năng lực');\n    if (dimCell) dimension = dimCell;\n    if (tier in tiers) {\n      tiers[tier] = evidence || descriptor;\n      continue;\n    }\n    // A table keyed by competency column rather than tier column.\n    if (dimension && descriptor) {\n      out.push({\n        competencyDimension: dimension,\n        developing: getCell(raw, 'Developing') || '',\n        proficient: getCell(raw, 'Proficient') || '',\n        advanced: getCell(raw, 'Advanced') || '',\n        exemplary: getCell(raw, 'Exemplary') || '',\n      });\n    }\n  }\n  if (Object.values(tiers).some(Boolean)) {\n    out.push({\n      competencyDimension: dimension || 'Competency',\n      developing: tiers.developing || '',\n      proficient: tiers.proficient || '',\n      advanced: tiers.advanced || '',\n      exemplary: tiers.exemplary || '',\n    });\n  }\n  return out;\n}\n\n/**\n * Same field, authored in English or Vietnamese depending on the lesson.\n *\n * Deliberately NOT a bare 'Duration' / 'Thời lượng': every Lesson Flow phase\n * writes its own `> **Duration:** 5 phút` line, so a bare label makes the\n * search return ONE phase's minutes as the whole-lesson duration.\n */\nconst DURATION_LABELS = [\n  'Estimated Duration',\n  'Thời lượng ước tính',\n  'Thời lượng dự kiến',\n];\nconst MATERIALS_LABELS = [\n  'Materials & Equipment',\n  'Materials',\n  'Thiết bị & Vật tư',\n  'Thiết bị',\n];\n\n/**\n * Phase headings, with or without a leading \"1.\" ordinal.\n *\n * Covers all three shipped lesson templates: EDP (ASK…SHARE), 5E (ENGAGE…\n * EVALUATE) and LESSON_GENERAL (Warm-up…Wrap-up). Leaving GENERAL out made\n * every GENERAL lesson extract zero phases, which fails the schema's\n * `lessonFlow: min(1)` — measured on the production VM, 55 of 71 lessons on\n * disk, every one of them a swift-101 GENERAL lesson. \"Concept N:\" sub-headings\n * are excluded because they are children of \"Core Concepts\", not phases.\n */\nconst FLOW_PHASE_RE =\n  /^(?:\\d+\\.\\s*)?(ASK|IMAGINE|PLAN|CREATE|TEST(?:\\s*&\\s*IMPROVE)?|SHARE(?:\\s*&\\s*EVALUATE)?|ENGAGE|EXPLORE|EXPLAIN|ELABORATE|EVALUATE|WARM[-\\s]?UP(?:\\s*\\/\\s*HOOK)?|HOOK(?:\\s*\\/\\s*TH[AẢ]O\\s*LU[AẬ]N)?|CORE\\s+CONCEPTS|GUIDED\\s+PRACTICE|LUY[AẬ]N\\s+T[AẬ]P\\s+C[OÓ]\\s+H[UƯ][OƠ]NG\\s+D[AẪ]N|INDEPENDENT\\s+PRACTICE|LUY[AẬ]N\\s+T[AẬ]P\\s+[ĐĐ]O[CỂ]P|LUY[AẬ]N\\s+T[AẬ]P(?:\\s+[ĐĐ][ỘO]C\\s+L[AẬ]P)?|WRAP[-\\s]?UP(?:\\s*&\\s*CHECKPOINT)?|K[AẾ]T\\s+TH[AẬ]C(?:\\s*&\\s*KI[AẺ]M\\s*TRA)?)\\b/i;\n\n/**\n * The inline `> **Duration:** 5 phút` line, in either authoring language.\n * Vietnamese lessons write `**Thời lượng:**`, and matching only the English\n * form left those phases with no duration — they were then dropped, and with\n * zero phases the schema's `lessonFlow: min(1)` failed.\n */\nconst PHASE_DURATION_RE =\n  /(?:Duration|Th[oờ]i\\s*lượng)\\s*:?\\s*(\\d+)\\s*(?:ph[uú]t|minutes?|mins?)/i;\n\n/**\n * First value of a `**Label:** value` bullet anywhere in the document.\n * Real lessons carry these under \"Learning Objectives & Evidence\":\n * `- **Estimated Duration:** 90 phút (…)`, `- **Project Objective:** …`.\n */\nfunction findLabeledValue(ast: ArtifactAst, ...labels: string[]): string {\n  const wanted = labels.map((l) => l.trim().toLowerCase());\n  let found = '';\n  const visit = (node: Node) => {\n    if (found) return;\n    // Only leaves can carry a single `**Label:** value` pair: `toString` on a\n    // list/blockquote concatenates every item, so matching there would splice\n    // the following bullets into the value.\n    if (node.type === 'listItem' || node.type === 'paragraph' || node.type === 'heading') {\n      const m = toString(node).trim().match(/^([^:\\n]{3,60}?)\\s*:\\s*(.+)/);\n      if (m && wanted.includes(m[1]!.trim().toLowerCase())) {\n        found = m[2]!.trim();\n        return;\n      }\n    }\n    for (const child of (node as { children?: Node[] }).children ?? []) visit(child);\n  };\n  for (const node of ast.tree.children as Node[]) visit(node);\n  return found;\n}\n\n/**\n * Phase key used to join a Lesson Flow heading to its Activity Sequence row.\n *\n * The two rarely use the same words: a heading reads `Warm-up / Hook` or\n * `Wrap-up & Checkpoint` while the matching row says `Warm-up` / `Wrap-up`.\n * Reducing both sides to their leading word makes the join work instead of\n * silently matching only the phases whose names happen to coincide.\n */\nfunction phaseKey(raw: string): string {\n  return raw.trim().toLowerCase().split(/[\\s/&:-]/)[0] ?? '';\n}\n\n/**\n * Lesson Flow phases → `LessonFlowPhaseSchema` shape.\n *\n * Phase duration comes from the phase body's `> **Duration:** 5 phút` line.\n * When a phase has no such line we fall back to the Activity Sequence row for\n * the same phase — and when NEITHER has one the phase is DROPPED rather than\n * given a fabricated duration, because `durationMinutes` is required by the\n * schema and a wrong number is worse than a missing phase.\n */\nexport function extractLessonFlowPhases(ast: ArtifactAst): Array<Record<string, unknown>> {\n  const top = ast.tree.children as Node[];\n  const byPhase = new Map<string, number>();\n  for (const row of extractActivitySequenceRows(ast)) {\n    byPhase.set(phaseKey(row.phase), row.durationMinutes);\n  }\n\n  const phases: Array<Record<string, unknown>> = [];\n  for (let i = 0; i < top.length; i++) {\n    const node = top[i]!;\n    if (node.type !== 'heading' || (node as { depth?: number }).depth !== 3) continue;\n    const rawTitle = toString(node).trim();\n    const name = rawTitle.match(FLOW_PHASE_RE)?.[1];\n    if (!name) continue;\n\n    // A phase body ends at the next H2, or at the next H3 that is ITSELF a phase.\n    // A GENERAL lesson writes its concepts as sibling H3s (`### Concept 1:`)\n    // under `### 2. Core Concepts`; stopping at every H3 threw that teaching\n    // text away and left \"Core Concepts\" holding only its duration line.\n    const body: string[] = [];\n    for (let j = i + 1; j < top.length; j++) {\n      const m = top[j]!;\n      const depth = (m as { depth?: number }).depth ?? 1;\n      if (m.type === 'heading' && depth <= 2) break;\n      if (m.type === 'heading' && depth === 3 && FLOW_PHASE_RE.test(toString(m).trim())) break;\n      body.push(toString(m));\n    }\n    const content = body.join('\\n').trim();\n\n    const explicit = content.match(PHASE_DURATION_RE);\n    const duration = explicit ? Number(explicit[1]) : byPhase.get(phaseKey(name));\n    if (!duration || !Number.isFinite(duration) || duration <= 0) continue;\n\n    phases.push({\n      phase: rawTitle.replace(/^\\d+\\.\\s*/, ''),\n      durationMinutes: duration,\n      content,\n    });\n  }\n  return phases;\n}\n\n/**\n * Assessment-Map table rows → `AssessmentMapRowSchema` shape.\n *\n * Kept separate from `extractAssessmentMapRows` on purpose: that one returns the\n * RAW table keyed by the author's own headers (`Evidence`, `Assessed By`, …) and\n * is what the QUIZ/WKS assessment-map pin renders into prompts. Re-shaping it\n * there would silently rewrite that prompt. This mapper serves only the schema\n * path, where the column names are a contract rather than a presentation.\n *\n * Real headers map as: Criteria → criteria, \"Follow-up If Missing\" →\n * remediationPath, \"Assessed By\" → tool, and the \"(Seq N)\" inside it → when.\n * `form` has no authored column, so the evidence column stands in for it.\n */\nfunction toAssessmentMapSchemaRows(raw: Array<Record<string, string>>): Array<Record<string, string>> {\n  return raw.map((row) => {\n    const assessedBy = getCell(row, 'Assessed By', 'Bởi ai', 'Assessor', 'Tool', 'Công cụ');\n    const whenCell = getCell(row, 'When', 'Khi nào', 'Timing', 'Thời điểm');\n    return {\n      form: getCell(row, 'Form', 'Hình thức', 'Type') || getCell(row, 'Evidence', 'Minh chứng'),\n      when: whenCell || assessedBy.match(/\\(?\\s*Seq\\s*\\d+\\s*\\)?/i)?.[0]?.trim() || '',\n      tool: assessedBy,\n      criteria: getCell(row, 'Criteria', 'Tiêu chí', 'Rubric'),\n      performanceLevels: getCell(row, 'Performance Levels', 'Mức độ', 'Levels'),\n      remediationPath: getCell(row, 'Follow-up If Missing', 'Remediation', 'Xử lý nếu thiếu', 'Follow-up'),\n    };\n  });\n}\n\n/**\n * LESSON → LessonPlan5ESchema shape.\n *\n * `artifactType` is deliberately NOT set: the registry declares the 5E schema\n * for every `lesson`, while real artifacts carry `type: LESSON_EDP` in their\n * frontmatter and use ASK/IMAGINE/PLAN rather than ENGAGE/EXPLORE. Emitting the\n * literal would fail; leaving it unset lets the schema default apply, which is\n * the least-wrong option until the registry stops declaring one pedagogy for\n * all lessons.\n */\nexport function extractLessonData(ast: ArtifactAst): Record<string, unknown> | null {\n  const fm = readFrontmatter(ast);\n  const loRows = extractLearningObjectiveRows(ast);\n  const actRows = extractActivitySequenceRows(ast);\n  const flow = extractLessonFlowPhases(ast);\n  if (loRows.length === 0 && actRows.length === 0) return null;\n\n  const h1 = (ast.tree.children as Node[]).find(\n    (n) => n.type === 'heading' && (n as { depth?: number }).depth === 1\n  );\n  const title = fm.title || (h1 ? toString(h1).replace(/^\\s*(?:BÀI|LESSON)\\s*\\d*\\s*[:\\-–—]?\\s*/i, '').trim() : '');\n\n  return {\n    lessonId: fm.lesson_id || fm.lessonId || (fm.id || '').replace(/^LESSON_/i, '') || 'LESSON',\n    title: title || 'Untitled Lesson',\n    estimatedDuration: findLabeledValue(ast, ...DURATION_LABELS),\n    projectObjective: findLabeledValue(ast, 'Project Objective', 'Mục tiêu dự án'),\n    materials: findLabeledValue(ast, ...MATERIALS_LABELS),\n    learningObjectives: loRows,\n    activitySequence: actRows,\n    resourceMap: extractResourceMapRows(ast),\n    assessmentMap: toAssessmentMapSchemaRows(extractAssessmentMapRows(ast)),\n    artifactContract: extractArtifactContractRows(ast),\n    lessonFlow: flow,\n  };\n}\n\n/**\n * Extracts structured typed data from an AST projection for validation against output schemas.\n */\nexport function extractTypedDataForValidation(\n  artifactType: string,\n  ast: ArtifactAst\n): Record<string, unknown> | null {\n  const normType = artifactType.toLowerCase().replace(/[^a-z0-9]/g, '');\n\n  if (normType === 'quiz') {\n    return extractQuizData(ast);\n  }\n\n  if (normType === 'lesson' || normType === 'lesson5e' || normType === 'lessonedp') {\n    return extractLessonData(ast);\n  }\n\n  return null;\n}\n","// contextSlots.ts\n//\n// P49 G2 — Micro-Slot Context Architecture (role-specific context routing).\n//\n// Replaces the one-size-fits-all `satelliteContext` (commonContext + 12k\n// lessonExcerpt for EVERY satellite) with per-artifact whitelisted slots:\n//   - Every satellite receives KX exactly ONCE: the caller passes a KX-free\n//     composite and this module injects a per-type scoped KX excerpt\n//     (Common-Mistakes-first for assessment types, Micro-Examples-first for\n//     build types). A defensive guard skips the scoped KX if the composite\n//     already carries it.\n//   - LESSON-primary satellites additionally keep a type-scoped lesson excerpt\n//     (per-type budget + priorities through the section-aware builder, so\n//     SLC bilingual headings resolve the same way as elsewhere).\n//   - KX-only satellites (CODE, HANDOUT, EXT) DROP the 12k lesson excerpt and\n//     receive instead a small activity-contract mini-slot (~800–1500 chars)\n//     extracted row-level from the LESSON Activity Sequence — ONLY the rows\n//     whose Artifact Contract column names this artifact (e.g. CODE_LAB) —\n//     plus the B-flow tiered scaffolding block. Without it, CODE would write\n//     generic KX-flavored code instead of the actual hands-on task students\n//     are doing.\n//\n// Zero tokens: everything here is deterministic string shaping.\n\nimport {\n  buildSectionAwareExcerpt,\n  type ExcerptResult,\n} from './contextBuilder';\nimport {\n  resolveLessonSlotSpec,\n  resolveKxSlotSpec,\n  getKxSlotPriorities,\n  isKxOnlyType,\n} from '../registry/index.js';\nimport { parseArtifactAst } from '../parsers/artifactAstParser.js';\nimport {\n  projectAstForPrompt,\n  extractAssessmentMapRows,\n  renderAssignedRowsTableFromAst,\n} from '../parsers/artifactAstProjection.js';\n\nexport type ContextRoutingMode = 'legacy' | 'hybrid';\n\nexport interface SatContextResult {\n  /** Full context string to pass as the satellite prompt's user context. */\n  context: string;\n  /** Context blocks with provenance, for execution-history telemetry. */\n  blocks: Array<{\n    slot: string;\n    source: string;\n    chars: number;\n    verified: boolean;\n    issues: string[];\n  }>;\n  /** Aggregate — mirrors ExcerptResult semantics for the composite. */\n  verified: boolean;\n  sectionAware: boolean;\n  issues: string[];\n  /** Composite token estimate (chars/4). */\n  tokenEstimate: number;\n  /**\n   * The lesson-derived canonical excerpt THIS artifact type actually consumed\n   * (scoped lesson excerpt for LESSON-primary types, the activity-contract\n   * mini-slot for KX-only types, the full 12k excerpt in legacy mode). The\n   * satellite judge uses it as the drift-comparison ground truth (P49 G3).\n   */\n  canonicalExcerpt?: string;\n}\n\nexport interface SatelliteContextInput {\n  /** Artifact type (ACT, QUIZ, SLIDE, GUIDE, HANDOUT, WKS, CODE, EXT, EXIT_TICKET). */\n  artifactType: string;\n  /**\n   * Common context assembled by produceSingleLesson (framework, style guide, ref pack, session slice, standards, guardrails).\n   * In hybrid mode pass the KX-FREE composite (assembleCommonContext(sg, false)):\n   * the scoped per-type KX excerpt below becomes the single canonical-knowledge\n   * block, so KX is never injected twice.\n   */\n  commonContext: string;\n  /** Canonical LESSON markdown. */\n  lessonContent: string;\n  /** Pre-built full lesson excerpt (SATELLITE_LESSON_PRIORITIES, 12k) — reused for LESSON-primary types when no per-type override needed. */\n  lessonExcerpt: ExcerptResult;\n  /** KX markdown — the source for the per-type scoped KX excerpt (hybrid mode). */\n  expositionContent: string;\n  /** Symbol ledger block already rendered by the caller (appended to LESSON-primary and CODE contexts). */\n  symbolLedgerBlock: string;\n  /** Pedagogy label for the legacy composite heading (byte-compat with pre-P49). */\n  pedagogyLabel?: string;\n  /** 'legacy' = old one-size-fits-all satelliteContext (default). 'hybrid' = per-type slots. */\n  mode?: ContextRoutingMode;\n}\n\n/**\n * Per-type lesson-excerpt budget/priorities. NOTE: `priorities` are SEMANTIC\n * KEYS from headerDictionary.ts ('lessonDesignPlan', 'lessonFlow', …) — the\n * AST projection matches them via resolveSlotNodes; the markdown fallback\n * resolves them via the same dictionary. H3 subsections need a dedicated\n * extractor (see extractAssessmentMap).\n * - ACT/GUIDE operationalize the full design plan + flow → default order, largest.\n * - QUIZ/WKS lead with the design plan (LO table + assessment) → smaller.\n * - SLIDE follows the flow/agenda first.\n * - EXIT_TICKET anchors on evidence + closing flow.\n */\n// Slot budgets and priorities are unified and maintained in the Artifact Type Registry:\n// src/registry/artifactRegistry.ts (Phase 1)\n\nconst norm = (s: string): string =>\n  s.toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').replace(/[^a-z0-9]+/g, '');\n\n/**\n * Extract ONLY the Activity Sequence rows whose Artifact Contract column\n * assigns work to this artifact (fuzzy match on the last column), plus the\n * table header. Bounded to `maxChars`; keeps first rows (sequence order).\n * Returns '' when no row matches (caller falls back to nothing — the KX\n * excerpt still carries the concept; the prompt text already demands\n * alignment with the lesson's hands-on task).\n */\nexport function extractActivityContractRows(\n  lessonContent: string,\n  artifactType: string,\n  maxChars = 1500\n): string {\n  if (!lessonContent) return '';\n  const wanted = norm(artifactType).replace(/_/g, '');\n  const lines = lessonContent.split('\\n');\n\n  // Locate the Activity Sequence heading (H2/H3) then the first table after it.\n  let inSeq = false;\n  const headerRows: string[] = [];\n  const matchedRows: string[] = [];\n  const allRows: string[] = [];\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i]!;\n    const h = line.match(/^#{2,4}\\s+(.*)$/);\n    if (h) {\n      const t = h[1]!;\n      if (/activity\\s*sequence/i.test(t)) inSeq = true;\n      else if (inSeq) break; // next section — stop\n      continue;\n    }\n    if (!inSeq) continue;\n    const t = line.trim();\n    if (!t.startsWith('|')) continue;\n    if (/^\\|\\s*[-: |]+\\|\\s*$/.test(t)) continue;\n    const cells = t.split('|').slice(1, -1).map((c) => c.trim());\n    if (cells.length >= 4) {\n      if (headerRows.length === 0) {\n        headerRows.push(t);\n        continue;\n      }\n      allRows.push(t);\n      const contract = cells[cells.length - 1] ?? '';\n      const candidates = contract.split(/[,;/]/).map((c) => norm(c));\n      if (candidates.some((c) => c === wanted || (c.length > 3 && (c.includes(wanted) || wanted.includes(c))))) {\n        matchedRows.push(t);\n      }\n    }\n  }\n\n  const rows = matchedRows.length > 0 ? matchedRows : allRows.slice(0, 3);\n  if (rows.length === 0) return '';\n\n  let out = headerRows[0] ?? '';\n  for (const r of rows) {\n    if (out.length + r.length + 1 > maxChars) break;\n    out += '\\n' + r;\n  }\n  return out;\n}\n\n/**\n * Extract the B-flow tiered scaffolding block (Bronze/Silver/Gold) for\n * CODE/EXT — the plan's differentiation is often boilerplate (P49 G0), the\n * LESSON flow tiers are the real per-lesson task ladder.\n */\nexport function extractTieredScaffoldingBlock(lessonContent: string, maxChars = 900): string {\n  if (!lessonContent) return '';\n  const lines = lessonContent.split('\\n');\n  let capture: string[] | null = null;\n  for (const line of lines) {\n    const h = line.match(/^#{2,4}\\s+(.*)$/);\n    if (h) {\n      const isTierHeading = /elaborate|tiered|scaffold/i.test(h[1] ?? '');\n      if (capture && !isTierHeading) break;\n      if (isTierHeading) capture = [];\n      continue;\n    }\n    if (capture) {\n      capture.push(line);\n      if (capture.join('').length >= maxChars) break;\n    }\n  }\n  const body = (capture ?? []).join('\\n').trim();\n  return body ? body.slice(0, maxChars) : '';\n}\n\n/**\n * Extract the LESSON 'Assessment Map' subsection (H3 inside 'A. Lesson Design\n * Plan') for QUIZ/WKS — the H2-level excerpt builder cannot select it\n * directly. Mirrors the heading-capture pattern of extractTieredScaffoldingBlock.\n */\nexport function extractAssessmentMap(lessonContent: string, maxChars = 1200): string {\n  if (!lessonContent) return '';\n  const lines = lessonContent.split('\\n');\n  let capture: string[] | null = null;\n  for (const line of lines) {\n    const h = line.match(/^#{2,4}\\s+(.*)$/);\n    if (h) {\n      const isTarget = /assessment\\s*map/i.test(h[1] ?? '');\n      if (capture && !isTarget) break;\n      if (isTarget) capture = [];\n      continue;\n    }\n    if (capture) {\n      capture.push(line);\n      if (capture.join('').length >= maxChars) break;\n    }\n  }\n  const body = (capture ?? []).join('\\n').trim();\n  return body ? body.slice(0, maxChars) : '';\n}\n\nfunction blockMeta(slot: string, source: string, text: string, verified: boolean, issues: string[] = []): SatContextResult['blocks'][number] {\n  return { slot, source, chars: text.length, verified, issues };\n}\n\n/**\n * Build the satellite context for one artifact type.\n * Returns the legacy composite when mode === 'legacy' (byte-identical to the\n * pre-P49 behaviour) so the flag can shadow-compare safely.\n */\nexport function buildSatelliteContext(input: SatelliteContextInput): SatContextResult {\n  const {\n    artifactType,\n    commonContext,\n    lessonContent,\n    lessonExcerpt,\n    expositionContent,\n    symbolLedgerBlock,\n    pedagogyLabel,\n    mode = 'legacy',\n  } = input;\n  const type = (artifactType || '').toUpperCase().trim();\n\n  // ── Legacy path: identical composition to produceSingleLesson pre-P49. ──\n  if (mode === 'legacy' || type === 'LESSON') {\n    const context = `${commonContext}\\n\\n[CANONICAL LESSON PLAN (${pedagogyLabel ?? 'LESSON'})]:\\n${lessonExcerpt.excerpt}${symbolLedgerBlock}`;\n    return {\n      context,\n      blocks: [\n        blockMeta('commonContext', 'COMPOSITE', commonContext, true),\n        blockMeta('lessonExcerpt', 'LESSON', lessonExcerpt.excerpt, lessonExcerpt.verified, lessonExcerpt.issues),\n      ],\n      verified: lessonExcerpt.verified,\n      sectionAware: lessonExcerpt.sectionAware,\n      issues: lessonExcerpt.issues,\n      tokenEstimate: Math.round(context.length / 4),\n      canonicalExcerpt: lessonExcerpt.excerpt,\n    };\n  }\n\n  // ── Hybrid path: per-type slots. ──\n  const blocks: SatContextResult['blocks'] = [];\n  const issues: string[] = [];\n  const parts: string[] = [commonContext];\n  blocks.push(blockMeta('commonContext', 'COMPOSITE', commonContext, true));\n  let excerptSlot: string | undefined;\n  let miniSlot: string | undefined;\n\n  // Per-type scoped KX — injected ONCE. Defensive guard: if the caller still\n  // passes a KX-bearing composite (misuse), keep the composite copy and skip\n  // the scoped one rather than duplicating canonical knowledge.\n  const compositeHasKx = /###\\s+KNOWLEDGE_EXPOSITION/.test(commonContext);\n  if (expositionContent.trim() && !compositeHasKx) {\n    const kxSpec = resolveKxSlotSpec(type);\n    const kxExcerpt = buildSectionAwareExcerpt(expositionContent, {\n      priorities: kxSpec.priorities,\n      budget: kxSpec.budget,\n      artifactType: 'KNOWLEDGE_EXPOSITION',\n    });\n    parts.push(`\\n\\n[KNOWLEDGE_EXPOSITION (canonical knowledge — teach from this, do not contradict; scoped for ${type})]:\\n${kxExcerpt.excerpt}`);\n    blocks.push(blockMeta('kxExcerpt:' + type, 'KNOWLEDGE_EXPOSITION', kxExcerpt.excerpt, kxExcerpt.verified, kxExcerpt.issues));\n    // Truncation telemetry (1.5.54): section drops must surface even when the\n    // excerpt is still `verified` — a dropped canonical section is exactly the\n    // signal the Langfuse/Inspector stream exists to show.\n    issues.push(...kxExcerpt.issues.filter((i) => i.startsWith('section:dropped:') || i.startsWith('section:truncated:')).map((i) => `kx:${i}`));\n    if (!kxExcerpt.verified) issues.push(...kxExcerpt.issues.map((i) => `kx:${i}`));\n  }\n\n  if (!isKxOnlyType(type)) {\n    // LESSON-primary. Lossless AST projection is the PRIMARY slot source\n    // when available; the markdown excerpt is the fallback.\n    const spec = resolveLessonSlotSpec(type);\n    let usedEntity = false;\n    const ast = lessonContent.trim() ? parseArtifactAst(lessonContent) : null;\n\n    if (ast) {\n      // The AST projection drops a non-fitting canonical section WHOLE (a\n      // truncated table is worse than none), so a budget-tight lesson silently\n      // lost ground truth here. Collect the projection's own warnings so the\n      // block reports them exactly like the markdown fallback below does —\n      // `section:dropped:`/`section:truncated:` is what the lessonProduction\n      // telemetry filters on to build contextDrops. `verified` stays true on\n      // purpose: it means \"resolved\", not \"complete\" (see contextBuilder).\n      const astIssues: string[] = [];\n      const slots = projectAstForPrompt(ast, spec.priorities, {\n        budgetTokens: spec.budget,\n        onWarning: (msg) => astIssues.push(msg),\n      });\n      if (slots) {\n        const slotBlock = `\\n\\n[CANONICAL LESSON PLAN (scoped for ${type})]:\\n${slots}`;\n        parts.push(slotBlock);\n        excerptSlot = slotBlock;\n        blocks.push(blockMeta('lessonExcerpt:' + type, 'LESSON_AST', slots, true, astIssues));\n        issues.push(...astIssues.filter((i) => i.startsWith('section:dropped:') || i.startsWith('section:truncated:')).map((i) => `lesson:${i}`));\n        usedEntity = true;\n      }\n    }\n    if (!usedEntity) {\n      const excerpt = buildSectionAwareExcerpt(lessonContent, {\n        priorities: spec.priorities,\n        budget: spec.budget,\n        artifactType: 'LESSON',\n      });\n      const excerptBlock = `\\n\\n[CANONICAL LESSON PLAN (scoped for ${type})]:\\n${excerpt.excerpt}`;\n      parts.push(excerptBlock);\n      excerptSlot = excerptBlock;\n      blocks.push(blockMeta('lessonExcerpt:' + type, 'LESSON', excerpt.excerpt, excerpt.verified, excerpt.issues));\n      issues.push(...excerpt.issues.filter((i) => i.startsWith('section:dropped:') || i.startsWith('section:truncated:')).map((i) => `lesson:${i}`));\n      if (!excerpt.verified) issues.push(...excerpt.issues.map((i) => `lesson:${i}`));\n    }\n    // QUIZ/WKS pin the Assessment Map in BOTH views: the AST projection ships\n    // only the requested priorities, so the H3 anchor is injected separately\n    // (AST table rows first, then the H3 markdown extractor).\n    if (type === 'QUIZ' || type === 'WKS') {\n      if (ast) {\n        const amRows = extractAssessmentMapRows(ast);\n        if (amRows.length > 0) {\n          const amJson = amRows\n            .map((r) => Object.entries(r).map(([k, v]) => `${k}: ${v}`).join(' | '))\n            .join('\\n');\n          parts.push(`\\n\\n[ASSESSMENT MAP (criteria anchor — assess exactly these)]:\\n${amJson}`);\n          blocks.push(blockMeta('assessmentMap:' + type, 'LESSON_JSON', amJson, true));\n        }\n      } else {\n        const am = extractAssessmentMap(lessonContent, 1200);\n        if (am) {\n          parts.push(`\\n\\n[ASSESSMENT MAP (criteria anchor — assess exactly these)]:\\n${am}`);\n          blocks.push(blockMeta('assessmentMap:' + type, 'LESSON', am, true));\n        } else {\n          issues.push(`assessment-map:unresolved:${type}`);\n        }\n      }\n    }\n    if (symbolLedgerBlock) {\n      parts.push(symbolLedgerBlock);\n      blocks.push(blockMeta('symbolLedger', 'LESSON', symbolLedgerBlock, true));\n    }\n  } else {\n    // Activity-contract mini-slot: the ONLY lesson-derived ground truth for\n    // CODE/HANDOUT/EXT — the actual hands-on task rows + tier ladder.\n    const miniParts: string[] = [];\n    const ast = lessonContent.trim() ? parseArtifactAst(lessonContent) : null;\n    if (ast) {\n      const rowsTable = renderAssignedRowsTableFromAst(ast, type === 'CODE' ? 'CODE_LAB' : type, 1500);\n      if (rowsTable) miniParts.push(`### Activity Sequence rows assigned to ${type} (canonical — do not invent a different task):\\n${rowsTable}`);\n      const tierBlock = (type === 'CODE' || type === 'EXT') ? extractTieredScaffoldingBlock(lessonContent, 900) : '';\n      if (tierBlock) miniParts.push(`### Tiered task ladder (from LESSON Elaborate phase):\\n${tierBlock}`);\n    }\n    if (miniParts.length === 0) {\n      const contractRows = extractActivityContractRows(lessonContent, type === 'CODE' ? 'CODE_LAB' : type, 1500);\n      const tierBlock = type === 'CODE' || type === 'EXT' ? extractTieredScaffoldingBlock(lessonContent, 900) : '';\n      if (contractRows) miniParts.push(`### Activity Sequence rows assigned to ${type} (canonical — do not invent a different task):\\n${contractRows}`);\n      if (tierBlock) miniParts.push(`### Tiered task ladder (from LESSON Elaborate phase):\\n${tierBlock}`);\n    }\n    const mini = miniParts.join('\\n\\n');\n    if (mini) {\n      const miniBlock = `\\n\\n[LESSON ACTIVITY CONTRACT (mini-slot)]:\\n${mini}`;\n      parts.push(miniBlock);\n      miniSlot = miniBlock;\n      blocks.push(blockMeta('activityContract:' + type, 'LESSON', mini, true));\n    } else {\n      issues.push(`activity-contract:unresolved:${type}`);\n      blocks.push(blockMeta('activityContract:' + type, 'LESSON', '', false, ['no-matching-rows']));\n    }\n    if (type === 'CODE' && symbolLedgerBlock) {\n      parts.push(symbolLedgerBlock);\n      blocks.push(blockMeta('symbolLedger', 'LESSON', symbolLedgerBlock, true));\n    }\n  }\n\n  const context = parts.join('');\n  return {\n    context,\n    blocks,\n    verified: blocks.filter((b) => b.slot !== 'commonContext').every((b) => b.verified),\n    sectionAware: blocks.some((b) => b.slot.startsWith('lessonExcerpt') || b.slot.startsWith('kxExcerpt')),\n    issues,\n    tokenEstimate: Math.round(context.length / 4),\n    // Judge ground truth = exactly what THIS type consumed (scoped or mini slot).\n    canonicalExcerpt: (miniSlot ?? excerptSlot ?? lessonExcerpt.excerpt).trim(),\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// P49 G3 — Activity-alignment drift check (deterministic, 0 token).\n//\n// Compares the generated satellite against the activity-contract slot it was\n// generated from: if the contract slot exists, at least one of its substantive\n// tokens (≥4 chars, CJK-aware, keyword identifiers) must appear in the output.\n// Mirrors the \"Activity alignment\" criterion promised by the plan without an\n// extra LLM call.\n//\n// DATE-GATED LOG-ONLY (plan P49 G3 / risk pattern P43): until the gate opens,\n// findings never affect gate decisions — callers log them only. Flip by date\n// or by explicit env override (DRIFT_ALIGNMENT_LOG_ONLY=false).\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ACTIVITY_ALIGNMENT_LOG_ONLY_UNTIL = new Date('2026-09-23T00:00:00Z');\n\nexport function isActivityAlignmentLogOnly(now: Date = new Date()): boolean {\n  const env = (process.env.DRIFT_ALIGNMENT_LOG_ONLY ?? '').toLowerCase().trim();\n  if (env === 'false' || env === '0') return false;\n  if (env === 'true' || env === '1') return true;\n  return now < ACTIVITY_ALIGNMENT_LOG_ONLY_UNTIL;\n}\n\nexport interface ActivityAlignmentResult {\n  checked: boolean;\n  passed: boolean | null;\n  matchedTokens: string[];\n  missingTokens: string[];\n  /** 'log_only' until the shadow window closes, then 'enforcing'. */\n  mode: 'log_only' | 'enforcing';\n}\n\nexport function evaluateActivityAlignment(\n  canonicalExcerpt: string | undefined,\n  generatedContent: string,\n  now: Date = new Date(),\n): ActivityAlignmentResult {\n  const mode = isActivityAlignmentLogOnly(now) ? 'log_only' : 'enforcing';\n  if (!canonicalExcerpt || !canonicalExcerpt.trim()) {\n    return { checked: false, passed: null, matchedTokens: [], missingTokens: [], mode };\n  }\n  const content = (generatedContent || '').toLowerCase();\n  // Substantive tokens: latin words ≥4 chars (lowercased, accent-stripped so\n  // Vietnamese prose rows match) and CJK runs ≥2 chars.\n  const stripped = canonicalExcerpt\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '');\n  const latin = Array.from(new Set(stripped.match(/[a-z][a-z0-9_]{3,}/g) ?? []));\n  const cjk = Array.from(new Set(canonicalExcerpt.match(/[\\u4e00-\\u9fff]{2,}/g) ?? []));\n  const tokens = [...latin, ...cjk];\n  if (tokens.length === 0) {\n    return { checked: false, passed: null, matchedTokens: [], missingTokens: [], mode };\n  }\n  const matchedTokens = tokens.filter((t) => content.includes(t));\n  const missingTokens = tokens.filter((t) => !content.includes(t));\n  // Drift = NONE of the contract's substantive tokens survived into the output.\n  const passed = matchedTokens.length > 0;\n  return { checked: true, passed, matchedTokens: matchedTokens.slice(0, 10), missingTokens: missingTokens.slice(0, 10), mode };\n}\n","/**\n * Production prompt assembler — the SECOND of the kit's two parallel prompt\n * paths, extracted so it can be inspected without running an LLM.\n *\n * The kit has always built prompts two ways:\n *   1. `assembleSingleArtifactPrompt` (singleArtifactService)  → the X-Ray path\n *   2. this file                                               → the real path\n * `produceSingleLesson` calls into this module, so the text the playground\n * compares is the text production actually sends — the two cannot drift.\n *\n * Every directive below is a VERBATIM relocation of the literal that used to\n * live inline in `produceSingleLesson`. `production-prompt-parity.test.ts`\n * pins the composed prompt shape; the relocation itself was proven\n * byte-identical by diffing the captured literal text before/after.\n */\nimport { resolveArtifactTemplate, loadCurriculumTemplate } from './templateLoader';\nimport { buildLanguageDirective, buildHeadingDirective, slideHeadingDirective } from './languageDirective';\nimport { buildMarpMarkdownSlidePrompt } from '../ai/prompts/slidesPrompt';\n\nexport const NO_VERBATIM_COPYING = `\nVERBATIM SOURCING RULE: When a section in the template says to extract a table\nor list from the canonical knowledge context (KX/LESSON), copy that table\nVERBATIM — do not re-invent or paraphrase it. Every fact must live in exactly\none canonical artifact; your document references, it does not restate.`;\n\nexport type PedagogicalModel = '5e' | 'edp' | 'pbl' | 'general';\n\nexport interface ArtifactPromptParts {\n  /** Methodology directive — persona, quality bar, anti-duplication rules. */\n  directive: string;\n  /** Canonical template file name (e.g. `CODE_template.md`). */\n  templateFile: string;\n  /** Extra scaffold appended after the template body (optional). */\n  epilogue?: string;\n  /**\n   * Heading keys (P53 stripped form) to DROP from the embedded template body,\n   * with their whole H2/H3 subtree, before the body enters the prompt.\n   * Used to keep the embedded body consistent with a domain-resolved contract\n   * (ticket 2026-09-27 issue #2: hardware-only sections must not leak into\n   * software-only labs as placeholder tables).\n   */\n  excludeSections?: string[];\n}\n\n/**\n * Compose a satellite prompt: methodology directive + runtime-loaded fill-in\n * template body. Falls back to `inlineScaffold` when the template file cannot\n * be resolved (same fail-open contract as the pre-P52 hardcoded prompts).\n *\n * The delimiting banner is plain text (not an HTML comment) so the artifact\n * linter's placeholder scanner can never confuse it with template scaffolding\n * that leaked into generated content.\n */\nexport function buildArtifactPrompt(\n  parts: ArtifactPromptParts,\n  opts?: { templatesDir?: string }\n): string {\n  const resolved = resolveArtifactTemplate(parts.templateFile, opts);\n  let body = resolved?.content ?? parts.epilogue ?? '';\n  if (resolved && parts.excludeSections?.length) {\n    body = dropTemplateSections(body, parts.excludeSections);\n  }\n  return `${parts.directive}\\n\\n===== ARTIFACT TEMPLATE: ${parts.templateFile} ${resolved ? `(loaded from ${resolved.sourcePath})` : '(⚠️ NOT FOUND — inline fallback scaffold in use)'} =====\\n\\n${body}`;\n}\n\n/**\n * Remove a heading's whole subtree (same level + any deeper) from a template\n * body. Headings match in the P53 stripped-key form so `[CONDITIONAL]` /\n * ordinal markers do not need to be repeated by the caller. Fence-aware.\n */\nexport function dropTemplateSections(body: string, headingKeys: string[]): string {\n  if (headingKeys.length === 0) return body;\n  const wanted = new Set(headingKeys.map((k) => stripKey(k)));\n  const lines = body.split('\\n');\n  const out: string[] = [];\n  let skipping = false;\n  let skipLevel = 2;\n  let inFence = false;\n  for (const line of lines) {\n    if (/^(```|~~~)/.test(line.trim())) {\n      inFence = !inFence;\n      if (skipping) continue;\n      out.push(line);\n      continue;\n    }\n    const m = inFence ? null : line.match(/^(#{2,3})\\s+(.*)$/);\n    if (m) {\n      const level = m[1].length;\n      const key = stripKey(m[2]);\n      if (wanted.has(key)) {\n        skipping = true;\n        skipLevel = level;\n        continue;\n      }\n      if (skipping && level <= skipLevel) {\n        skipping = false;\n      }\n    }\n    if (skipping) continue;\n    out.push(line);\n  }\n  return out.join('\\n');\n}\n\nfunction stripKey(h: string): string {\n  return h\n    .replace(/\\[(REQUIRED|OPTIONAL|CONDITIONAL)\\]\\s*/gi, '')\n    .replace(/^\\s*\\d+[.)]\\s+/, '')\n    .replace(/\\s+/g, ' ')\n    .trim();\n}\n\nconst LESSON_TEMPLATE_BY_PEDAGOGY: Record<string, string> = {\n  edp: 'LESSON_EDP_template.md',\n  general: 'LESSON_GENERAL_template.md',\n  pbl: 'LESSON_GENERAL_template.md',\n  '5e': 'LESSON_5E_template.md',\n};\n\n/**\n * Builds the canonical LESSON prompt (P52: template-driven).\n * Structure = runtime-loaded LESSON_{5E,EDP,GENERAL}_template.md fill-in body;\n * this builder keeps only the methodology directive + frontmatter contract.\n */\nexport function buildLessonPrompt(\n  pedagogy: PedagogicalModel,\n  lessonCode: string,\n  unitCode: string,\n  lessonTitle: string,\n  concept: string,\n  bloomLevel: string,\n  dateStr: string,\n  targetLanguage = 'vi'\n): string {\n  const templateFile = LESSON_TEMPLATE_BY_PEDAGOGY[pedagogy] ?? 'LESSON_5E_template.md';\n  const artifactType = templateFile.replace('_template.md', '');\n  const contract = resolveArtifactTemplate(templateFile)?.sections ?? [];\n  const sectionsYaml = contract.map((s) => `  - \"${s}\"`).join('\\n');\n  const directive = `You are @content (Educational Content Editor & ${artifactType} Instructional Model Specialist).\nAuthor the comprehensive Master Lesson Plan \\`LESSON_${lessonCode}.md\\` for:\n- Lesson Code: ${lessonCode}\n- Title: ${lessonTitle}\n- Core Concept: ${concept}\n- Bloom Level: ${bloomLevel}\n\nFormat requirements:\n1. EXACT YAML Frontmatter — copy verbatim, then fill in the blanks:\n---\nid: \"LESSON_${lessonCode}\"\ntitle: \"${lessonTitle}\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T1\"\nversion: \"v1.2\"\ndate: \"${dateStr}\"\nlesson_id: \"${lessonCode}\"\nunit_id: \"${unitCode}\"\ntemplate_contract: \"lesson-plan-v2\"\ntemplate_required_sections:\n${sectionsYaml}\ntype: \"${artifactType}\"\n---\n2. Fill in the template body below. Keep every header EXACTLY as written\n   ([REQUIRED]/[CONDITIONAL] markers and canonical English headings included)\n   and respect the template's OWNERSHIP note: each fact lives in exactly ONE\n   section — never restate satellite lists, resources, or assessment content\n   across sections, and never embed KX-owned question banks or self-check text.\n3. In the Learning Objectives table, carry the Standard ID from the [STANDARDS\n   STATEMENTS] context into the same row as its LO (e.g. \"CSTA: 1B-AP-10\")\n   when a matching standard exists.\n4. Every code sample must be 100% syntax-valid and executable.\n5. Use the exact vocabulary of the canonical knowledge context for every\n   concept and term.\n\n## ⛔ HARD OWNERSHIP RULES (violation = reject)\n1. In section \"B. Lesson Flow\", EACH phase/step body MUST be ≤ 200 words.\n   If implementation details exceed this limit, write:\n   \"▶ See ACT_${lessonCode} for full step-by-step operations.\"\n2. DO NOT embed code listings longer than 5 lines in Lesson Flow.\n   Code listings belong to ACT or KX — reference them by artifact name.\n3. DO NOT re-explain concept definitions already in KNOWLEDGE_EXPOSITION.\n   Reference: \"See KX for [concept name] details.\"\n4. Lesson Flow ORCHESTRATES the session — it does NOT REPLACE the activity guide.\n${NO_VERBATIM_COPYING}`;\n\n  const langDirective = buildLanguageDirective(targetLanguage);\n  const headingDirective = buildHeadingDirective(\n    pedagogy === 'edp' ? 'LESSON_EDP' : pedagogy === 'general' || pedagogy === 'pbl' ? 'LESSON_GENERAL' : 'LESSON_5E'\n  );\n  const body = buildArtifactPrompt({ directive, templateFile });\n  return `${body}\\n\\n${langDirective}${headingDirective ? `\\n\\n${headingDirective}` : ''}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// Per-type satellite directives (verbatim from produceSingleLesson)\n// ─────────────────────────────────────────────────────────────────────\n\n/** Everything a directive needs. All dates are passed in so a dry-run is reproducible. */\nexport interface DirectiveInput {\n  lessonCode: string;\n  dateStr: string;\n  /** CODE only — the domain-resolved hardware/software branch. */\n  isHardwareLab?: boolean;\n  /** EXT only — the curriculum-horizon ZPD block. */\n  zpdCeilingPrompt?: string;\n  /** EXT only — localized mandatory headings. */\n  extHeadings?: ExtHeadings;\n}\n\nexport interface ExtHeadings {\n  main: string;\n  sub: string;\n  c1: string;\n  c2: string;\n  c3: string;\n  meta: string;\n}\n\nfunction actDirective(i: DirectiveInput): string {\n  const { lessonCode, dateStr } = i;\n  return `You are @activity (Lead Hands-on STEM & Laboratory Exercise Designer).\nBased on Master Lesson Plan \\`LESSON_${lessonCode}.md\\`, author the comprehensive hands-on lab guide: \\`ACT_${lessonCode}.md\\`.\n\nFormat requirements:\n1. EXACT YAML Frontmatter — copy verbatim, then fill in the blanks:\n---\nid: \"ACT_${lessonCode}\"\ntitle: \"[Descriptive lab title based on lesson concept]\"\ntype: \"ACT\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T2\"\nversion: \"v1.0\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Computational Thinking Focus\"\n  - \"Materials & Setup\"\n  - \"Constraints & Safety\"\n  - \"Active Learning Workflow\"\n  - \"3-Tier Differentiation\"\n  - \"Reflection\"\n---\n\n2. Fill in the ACT template body below. Keep every header EXACTLY as written.\n   Physical hardware belongs inside the \\`<!-- [HARDWARE_BOM] -->\\` marker ONLY\n   when this lesson's activity contract involves physical wiring; otherwise\n   list software/consumables only.\n3. Expand the Activity Contract rows the LESSON assigns to this artifact — do\n   not invent a different sequence.\n${NO_VERBATIM_COPYING}`;\n}\n\nfunction quizDirective(i: DirectiveInput): string {\n  const { lessonCode, dateStr } = i;\n  return `You are @assessor (Lead Psychometrician & Competency Assessment Specialist).\nBased on Master Lesson Plan \\`LESSON_${lessonCode}.md\\`, author the scenario-based diagnostic question bank: \\`QUIZ_${lessonCode}.md\\`.\n\nSCOPE & PACING (prompt audit S-6):\n- This is a FORMATIVE CHECKPOINT for ONE 90-minute session, NOT an exam bank.\n- Size the bank to fit the session's Wrap-up (~10 minutes of answering): the MCQ bank, code-tracing question, and rubric together must be completable by a student in that time.\n- Question ONLY concepts inside this session's scope (see SESSION SLICE + ALLOWED DESIGN SPACE in the context).\n\nFormat requirements:\n1. EXACT YAML Frontmatter — copy verbatim, then fill in the blanks:\n---\nid: \"QUIZ_${lessonCode}\"\ntitle: \"[Descriptive quiz title based on lesson concept]\"\ntype: \"QUIZ\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P2\"\ndeliverable: \"P2-T08\"\nversion: \"v1.0\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Assessment Objectives\"\n  - \"Multiple-Choice Question Bank\"\n  - \"Code Analysis / Debugging Question\"\n  - \"Competency Rubric\"\n---\n\n2. Fill in the QUIZ template body below. Keep every header EXACTLY as written.\n   The Assessment Objectives table MUST reuse the LESSON A1 Learning\n   Objectives verbatim — same Bloom verbs, same evidence. Do NOT re-target\n   the Bloom level (drift guard: quiz Bloom = lesson Bloom).\n3. Every distractor must be a real misconception from this lesson's Common\n   Mistakes — never random filler.\n${NO_VERBATIM_COPYING}`;\n}\n\nfunction guideDirective(i: DirectiveInput): string {\n  const { lessonCode, dateStr } = i;\n  return `You are @content (Senior Curriculum Developer & Teacher Facilitation Specialist).\nBased on Master Lesson Plan \\`LESSON_${lessonCode}.md\\` and pedagogical context, author the comprehensive Teacher Guide: \\`GUIDE_${lessonCode}.md\\`.\n\nFormat requirements:\n1. EXACT YAML Frontmatter — copy verbatim, then fill in the blanks:\n---\nid: \"GUIDE_${lessonCode}\"\ntitle: \"[Descriptive teacher guide title for this lesson]\"\ntype: \"GUIDE\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T5\"\nversion: \"v1.0\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Objectives & Preparation\"\n  - \"Preparation Checklist & Workstation Setup\"\n  - \"Facilitation Script & Timeline\"\n  - \"Common Misconceptions & Diagnostic Remediation Matrix\"\n  - \"Differentiated Support Strategies\"\n---\n\n2. Fill in the GUIDE template body below. Keep every header EXACTLY as written.\n   - The Facilitation timeline MUST mirror the LESSON B-flow phase-by-phase —\n     same phases, same minutes. Do not invent a different allocation.\n   - Misconceptions have ONE home: the Remediation Matrix. Extract the Common\n     Mistakes table VERBATIM from the canonical knowledge context; do not\n     restate them in Objectives & Preparation.\n${NO_VERBATIM_COPYING}`;\n}\n\nfunction handoutDirective(i: DirectiveInput): string {\n  const { lessonCode, dateStr } = i;\n  return `You are @content (Educational Content Specialist).\nBased on Master Lesson Plan \\`LESSON_${lessonCode}.md\\`, author the student self-paced reference handout: \\`HANDOUT_${lessonCode}.md\\`.\n\nFormat requirements:\n1. EXACT YAML Frontmatter — copy verbatim, then fill in the blanks:\n---\nid: \"HANDOUT_${lessonCode}\"\ntitle: \"[Descriptive cheat-sheet title for this lesson]\"\ntype: \"HANDOUT\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T6\"\nversion: \"v1.0\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Core Concepts\"\n  - \"Core Syntax & Mechanism Cheat Sheet\"\n  - \"Visual Mental Model / Architecture Diagram\"\n  - \"Step-by-Step Practical Quick-Start Guide\"\n  - \"Self-Check Diagnostic Checklist\"\n---\n\n2. Fill in the HANDOUT template body below. Keep every header EXACTLY as\n   written. Align term definitions with the canonical knowledge context (KX\n   Key Terms) and can-do statements with the LESSON A1 evidence column.\n${NO_VERBATIM_COPYING}`;\n}\n\nfunction wksDirective(i: DirectiveInput): string {\n  const { lessonCode, dateStr } = i;\n  return `You are @content (Instructional Activity & Worksheet Designer).\nBased on Master Lesson Plan \\`LESSON_${lessonCode}.md\\`, author the guided student worksheet: \\`WKS_${lessonCode}.md\\`.\n\nFormat requirements:\n1. EXACT YAML Frontmatter — copy verbatim, then fill in the blanks:\n---\nid: \"WKS_${lessonCode}\"\ntitle: \"[Descriptive worksheet title for this lesson]\"\ntype: \"WKS\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T7\"\nversion: \"v1.0\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Part 1: Knowledge Check\"\n  - \"Part 2: Concept Tracing & Diagram Fill-in\"\n  - \"Part 3: Code Analysis & Bug Hunting Challenge\"\n  - \"Part 4: Synthesis & Problem-Solving Application\"\n  - \"Part 5: Self-Reflection & Learning Log\"\n---\n\n2. Fill in the WKS template body below (including the student name/class/date\n   header line). Keep every header EXACTLY as written. The Part 3 bug must be\n   a real mistake from this lesson's Common Mistakes table.\n${NO_VERBATIM_COPYING}`;\n}\n\n/** CODE resolves its contract from the hardware signal; the heading directive\n *  is built from the SAME list so frontmatter and body headings cannot disagree. */\nfunction codeContract(isHardwareLab: boolean) {\n  const pinoutSectionLine = isHardwareLab\n    ? '  - \"Hardware Pinout & Wiring Configuration Matrix\"'\n    : '  - \"Project Structure & Module Boundaries Matrix\"';\n  const pinoutSectionNote = isHardwareLab\n    ? \"   - The Hardware Pinout & Wiring section is REQUIRED for this hardware lab: fill it from the platform's real pin map; where a lesson has no wiring, state the interface actually used instead of omitting the section.\"\n    : '   - This is a software-only lab: do NOT include any \"Hardware Pinout\" or wiring content anywhere, and never emit placeholder wiring tables. The Project Structure & Module Boundaries Matrix replaces it.';\n  const codeHeadingLines = [\n    'Technical Overview & Architecture Blueprint',\n    isHardwareLab ? 'Hardware Pinout & Wiring Configuration Matrix' : 'Project Structure & Module Boundaries Matrix',\n    'Starter Code Sandbox',\n    'Verified Reference Solution Code',\n    'Automated Test / Verification Script',\n    'Common Syntax & Runtime Pitfalls Matrix',\n  ];\n  return { pinoutSectionLine, pinoutSectionNote, codeHeadingLines };\n}\n\nexport function codeHeadingsDirective(isHardwareLab: boolean): string {\n  const { codeHeadingLines } = codeContract(isHardwareLab);\n  return `MANDATORY SECTION HEADINGS (SOURCE: DOMAIN-RESOLVED CODE CONTRACT):\n- Copy the YAML frontmatter \\`template_required_sections\\` list VERBATIM into the artifact frontmatter — never translate, reorder, or invent entries.\n- In the markdown body, section headers MUST be exactly the headings below (do NOT translate, paraphrase, or re-marker them):\n${codeHeadingLines.map((h) => `  - \"${h}\"`).join('\\n')}`;\n}\n\nfunction codeDirective(i: DirectiveInput): string {\n  const { lessonCode, dateStr } = i;\n  const { pinoutSectionLine, pinoutSectionNote } = codeContract(!!i.isHardwareLab);\n  return `You are @activity & @tech_sme (Lead Software Engineer & Technical SME).\nBased on Master Lesson Plan \\`LESSON_${lessonCode}.md\\`, hardware platform, and starter code requirements, author the comprehensive executable Code Lab: \\`CODE_${lessonCode}.md\\`.\n\nFormat requirements:\n1. EXACT YAML Frontmatter — copy verbatim, then fill in the blanks:\n---\nid: \"CODE_${lessonCode}\"\ntitle: \"[Descriptive code lab title for this lesson]\"\ntype: \"CODE\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T3\"\nversion: \"v1.0\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Technical Overview & Architecture Blueprint\"\n${pinoutSectionLine}\n  - \"Starter Code Sandbox\"\n  - \"Verified Reference Solution Code\"\n  - \"Automated Test / Verification Script\"\n  - \"Common Syntax & Runtime Pitfalls Matrix\"\n---\n\n2. Fill in the CODE template body below. Keep every header EXACTLY as written.\n${pinoutSectionNote}\n   - Starter/Solution code MUST implement the exact Activity Contract rows the\n     LESSON assigns to CODE_LAB, using the LESSON Code Symbol Ledger\n     identifiers verbatim.\n3. Output runnable code snippets — NO outer code fences around the document.\n${NO_VERBATIM_COPYING}`;\n}\n\nexport const EXT_HEADINGS_VI: ExtHeadings = {\n  main: '# NHIỆM VỤ NÂNG CAO: [TIÊU ĐỀ BÀI HỌC]',\n  sub: '## Dành cho: Học sinh Nâng cao / Hoàn thành Sớm',\n  c1: '### Thử thách 1: [Tên thử thách] (Độ khó: ⭐⭐⭐) — Bối cảnh Nhiệm vụ Thực tế & Kịch bản Ứng dụng',\n  c2: '### Thử thách 2: [Tên thử thách] (Độ khó: ⭐⭐⭐⭐) — Ràng buộc Kiến trúc Nâng cao & Trường hợp Biên',\n  c3: '### Thử thách 3: [Tên thử thách] (Độ khó: ⭐⭐⭐⭐⭐) — Các Mốc Nhiệm vụ Nâng cao (Cấp 1: Khởi động → Cấp 2: Nâng cao → Cấp 3: Chuyên gia)',\n  meta: '## [REQUIRED] Suy ngẫm Siêu nhận thức & Đánh đổi Kỹ thuật',\n};\n\nexport const EXT_HEADINGS_EN: ExtHeadings = {\n  main: '# EXTENSION TASKS: [LESSON TITLE]',\n  sub: '## For: Advanced Students / Extra Time',\n  c1: '### Challenge 1: [Name] (Difficulty: ⭐⭐⭐) — Mission Briefing & Real-World High-Stakes Scenario',\n  c2: '### Challenge 2: [Name] (Difficulty: ⭐⭐⭐⭐) — Advanced Architectural Constraints & Edge Cases',\n  c3: '### Challenge 3: [Name] (Difficulty: ⭐⭐⭐⭐⭐) — Extension Milestones (Level 1: Ninja → Level 2: Guru → Level 3: Master)',\n  meta: '## [REQUIRED] Metacognitive Deep Dive & Engineering Trade-offs',\n};\n\n/** ZPD block — horizon present ⇒ strict boundary; absent ⇒ generic scope. */\nexport function zpdCeilingPrompt(horizon: { targetKeywords: string[]; boundaryPeek: Array<{ lessonIndex: number; title: string; keywords: string[] }> } | null | undefined): string {\n  return horizon\n    ? `\\n4. 🎯 CURRICULUM HORIZON ALLOWED SPACE & BOUNDARY MANDATE:\n   - Student's COMPLETE allowed toolkit = Mastered Vocabulary + Immediate Bridge + Current Lesson Scope (${horizon.targetKeywords.join(', ') || 'Current Lesson Concepts'}).\n   - All extension challenges MUST be 100% solvable using ONLY items within this toolkit.\n   ${horizon.boundaryPeek.length > 0 ? `- STRICT BOUNDARY: Upcoming Lesson ${horizon.boundaryPeek[0].lessonIndex} introduces \"${horizon.boundaryPeek[0].title}\" (${horizon.boundaryPeek[0].keywords.join(', ')}). These are STRICTLY OUT OF SCOPE. Do NOT introduce or require these future APIs.` : ''}`\n    : `\\n4. ZPD SCOPE: Focus on architectural edge cases, algorithmic optimization, and creative variations within current and past lesson concepts.`;\n}\n\n/** EXT is the one satellite that does NOT wrap buildArtifactPrompt — it never\n *  embeds EXT_template.md, so the model gets headings but no fill-in body. */\nexport function extPrompt(i: DirectiveInput & { languageDirective: string }): string {\n  const { lessonCode, dateStr } = i;\n  const h = i.extHeadings ?? EXT_HEADINGS_EN;\n  return `You are @activity (Lead STEM Specialist & Differentiated Extension Designer).\nBased on Master Lesson Plan \\`LESSON_${lessonCode}.md\\`, author the advanced extension challenge: \\`EXT_${lessonCode}.md\\`.\n\nMandatory Format Requirements:\n1. EXACT YAML Frontmatter — copy verbatim, then fill in the blanks:\n---\nid: \"EXT_${lessonCode}\"\ntitle: \"[Descriptive advanced challenge title for this lesson]\"\ntype: \"EXT\"\ncreated_by: \"Curriculum OS Builder\"\nphase: \"P3\"\ndeliverable: \"P3-T8\"\nversion: \"v1.0\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\ntemplate_required_sections:\n  - \"Challenge 1: Mission Briefing & Real-World High-Stakes Scenario\"\n  - \"Challenge 2: Advanced Architectural Constraints & Edge Cases\"\n  - \"Challenge 3: Extension Milestones\"\n  - \"Metacognitive Deep Dive & Engineering Trade-offs\"\n---\n\n${h.main}\n${h.sub}\n\n2. Mandatory sections (matching EXT_template.md):\n   - ${h.c1}\n   - ${h.c2}\n   - ${h.c3}\n   - ${h.meta}\n3. Output 100% clean Markdown directly — NO code fences around the document.\n${i.zpdCeilingPrompt ?? zpdCeilingPrompt(null)}\n\n${i.languageDirective}\n\n${buildHeadingDirective('EXT')}`;\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// Dry-run entry point for the playground\n// ─────────────────────────────────────────────────────────────────────\n\nexport type ProductionArtifactType =\n  | 'LESSON' | 'ACT' | 'QUIZ' | 'SLIDE' | 'GUIDE' | 'HANDOUT' | 'WKS' | 'CODE' | 'EXT';\n\n/** Every artifact type `produceSingleLesson` can actually author. */\nexport const PRODUCTION_ARTIFACT_TYPES: readonly ProductionArtifactType[] = [\n  'LESSON', 'ACT', 'QUIZ', 'SLIDE', 'GUIDE', 'HANDOUT', 'WKS', 'CODE', 'EXT',\n] as const;\n\nexport interface ProductionPromptSpec {\n  artifactType: string;\n  lessonCode: string;\n  dateStr?: string;\n  language?: string;\n  /** LESSON only. */\n  pedagogy?: PedagogicalModel;\n  unitCode?: string;\n  lessonTitle?: string;\n  concept?: string;\n  bloomLevel?: string;\n  mediaDirective?: string;\n  /** CODE only — omit to take the software-only branch. */\n  isHardwareLab?: boolean;\n  /** EXT only. */\n  horizon?: Parameters<typeof zpdCeilingPrompt>[0];\n  /** SLIDE (marp engine) only. */\n  pedagogyLabel?: string;\n  slidesOutline?: string[];\n  lessonFlowExcerpt?: string;\n  /** SLIDE only — override the loaded SLIDE_template.md scaffold. */\n  templateScaffold?: string;\n}\n\nexport interface ProductionPromptResult {\n  artifactType: string;\n  /** False when produceSingleLesson has no branch for this type. */\n  exists: boolean;\n  persona: string;\n  templateFile: string | null;\n  templateResolved: boolean;\n  /** Where the SOT context travels: a separate inference arg, not the prompt. */\n  contextChannel: 'commonContext' | 'satelliteContext' | 'none';\n  /** Exactly the messages produceSingleLesson hands to the inference runner. */\n  messages: Array<{ role: 'system' | 'user'; content: string }>;\n  /** Parsed back out of the prompt's own frontmatter — one source of truth. */\n  requiredSections: string[];\n  notes: string[];\n}\n\n/** Read `template_required_sections` back out of a composed prompt so the\n *  comparison tab never carries a hand-maintained second list. */\nexport function parseRequiredSections(prompt: string): string[] {\n  const out: string[] = [];\n  let inBlock = false;\n  for (const line of prompt.split('\\n')) {\n    if (/^template_required_sections:\\s*$/.test(line)) { inBlock = true; continue; }\n    if (inBlock) {\n      const m = line.match(/^\\s*-\\s+[\"'](.*)[\"']\\s*$/);\n      if (m) { out.push(m[1]); continue; }\n      if (line.trim() === '') continue;\n      inBlock = false;\n    }\n  }\n  return out;\n}\n\nconst DIRECTIVE_BUILDERS: Record<string, (i: DirectiveInput) => string> = {\n  ACT: actDirective,\n  QUIZ: quizDirective,\n  GUIDE: guideDirective,\n  HANDOUT: handoutDirective,\n  WKS: wksDirective,\n  CODE: codeDirective,\n};\n\n/**\n * The single composition point for every satellite prompt. `produceSingleLesson`\n * calls this — it is the reason the playground can show the production prompt\n * without keeping a second copy that could drift.\n */\nexport function buildSatellitePrompt(\n  type: string,\n  input: DirectiveInput,\n  languageDirective: string\n): string {\n  const t = type.toUpperCase();\n  if (t === 'EXT') {\n    return extPrompt({ ...input, languageDirective });\n  }\n  const build = DIRECTIVE_BUILDERS[t];\n  if (!build) throw new Error(`buildSatellitePrompt: unknown satellite type \"${type}\"`);\n  if (t === 'CODE') {\n    const isHardwareLab = !!input.isHardwareLab;\n    return `${buildArtifactPrompt({\n      directive: build(input),\n      templateFile: 'CODE_template.md',\n      // Keep the embedded template body consistent with the domain-resolved\n      // contract above (issue #2): no pinout template for software-only labs.\n      excludeSections: isHardwareLab ? [] : ['Hardware Pinout & Wiring Configuration Matrix'],\n    })}\\n\\n${languageDirective}\\n\\n${codeHeadingsDirective(isHardwareLab)}`;\n  }\n  return `${buildArtifactPrompt({ directive: build(input), templateFile: TEMPLATE_BY_TYPE[t as ProductionArtifactType]! })}\\n\\n${languageDirective}\\n\\n${buildHeadingDirective(t)}`;\n}\n\nconst PERSONA_BY_TYPE: Record<ProductionArtifactType, string> = {\n  LESSON: '@content',\n  ACT: '@activity',\n  QUIZ: '@assessor',\n  SLIDE: '@illustrator',\n  GUIDE: '@content',\n  HANDOUT: '@content',\n  WKS: '@content',\n  CODE: '@activity & @tech_sme',\n  EXT: '@activity',\n};\n\nconst TEMPLATE_BY_TYPE: Record<ProductionArtifactType, string | null> = {\n  LESSON: null, // pedagogy-resolved\n  ACT: 'ACT_template.md',\n  QUIZ: 'QUIZ_v4.6_template.md',\n  SLIDE: 'SLIDE_template.md',\n  GUIDE: 'GUIDE_template.md',\n  HANDOUT: 'HANDOUT_template.md',\n  WKS: 'WKS_template.md',\n  CODE: 'CODE_template.md',\n  EXT: null, // never embeds a template body\n};\n\n/**\n * Render the production prompt for one artifact type without calling an LLM.\n * Unknown types return `exists: false` rather than throwing — the playground\n * needs to show that e.g. BELL_RINGER has no production branch at all.\n */\nexport function assembleProductionArtifactPrompt(spec: ProductionPromptSpec): ProductionPromptResult {\n  const type = String(spec.artifactType || '').toUpperCase();\n  const known = (PRODUCTION_ARTIFACT_TYPES as readonly string[]).includes(type);\n  if (!known) {\n    return {\n      artifactType: type,\n      exists: false,\n      persona: '',\n      templateFile: null,\n      templateResolved: false,\n      contextChannel: 'none',\n      messages: [],\n      requiredSections: [],\n      notes: [`produceSingleLesson KHÔNG có nhánh nào dựng \"${type}\" — artifact type này chỉ tồn tại ở đường X-Ray.`],\n    };\n  }\n\n  const t = type as ProductionArtifactType;\n  const dateStr = spec.dateStr ?? new Date().toISOString().split('T')[0];\n  const lang = spec.language ?? 'vi';\n  const languageDirective = buildLanguageDirective(lang);\n  const input: DirectiveInput = { lessonCode: spec.lessonCode, dateStr, isHardwareLab: spec.isHardwareLab };\n  const notes: string[] = [];\n\n  let userPrompt: string;\n  let templateFile = TEMPLATE_BY_TYPE[t];\n\n  if (t === 'LESSON') {\n    userPrompt =\n      buildLessonPrompt(\n        spec.pedagogy ?? '5e',\n        spec.lessonCode,\n        spec.unitCode ?? 'U01',\n        spec.lessonTitle ?? '[Lesson title]',\n        spec.concept ?? '[Core concept]',\n        spec.bloomLevel ?? 'Apply',\n        dateStr,\n        lang\n      ) + (spec.mediaDirective ?? '');\n    templateFile = LESSON_TEMPLATE_BY_PEDAGOGY[spec.pedagogy ?? '5e'] ?? 'LESSON_5E_template.md';\n  } else if (t === 'SLIDE') {\n    const scaffold = spec.templateScaffold ?? loadCurriculumTemplate('SLIDE_template.md') ?? '';\n    userPrompt = buildMarpMarkdownSlidePrompt({\n      lessonCode: spec.lessonCode,\n      lessonTitle: spec.lessonTitle ?? '[Lesson title]',\n      pedagogyLabel: spec.pedagogyLabel ?? '5E',\n      templateScaffold: scaffold,\n      languageDirective,\n      headingDirective: slideHeadingDirective(spec.slidesOutline),\n      lessonFlowExcerpt: spec.lessonFlowExcerpt,\n      slidesOutline: spec.slidesOutline,\n    });\n    notes.push('SLIDE mặc định chạy HTML slide engine (executeSlideProductionWorkflow), KHÔNG phải prompt text. Bản này là nhánh marp legacy/rollback.');\n  } else if (t === 'EXT') {\n    userPrompt = buildSatellitePrompt(\n      'EXT',\n      { ...input, zpdCeilingPrompt: zpdCeilingPrompt(spec.horizon), extHeadings: lang === 'vi' ? EXT_HEADINGS_VI : EXT_HEADINGS_EN },\n      languageDirective\n    );\n    notes.push('EXT là satellite DUY NHẤT không gọi buildArtifactPrompt — không nhúng thân EXT_template.md vào prompt.');\n  } else {\n    userPrompt = buildSatellitePrompt(t, input, languageDirective);\n  }\n\n  const resolved = templateFile ? resolveArtifactTemplate(templateFile) : undefined;\n  if (templateFile && !resolved) notes.push(`Template ${templateFile} KHÔNG resolve được — prompt đang chạy inline fallback scaffold.`);\n\n  return {\n    artifactType: t,\n    exists: true,\n    persona: PERSONA_BY_TYPE[t],\n    templateFile,\n    templateResolved: !!resolved,\n    contextChannel: t === 'LESSON' ? 'commonContext' : 'satelliteContext',\n    // Production NEVER sends a system message — every call site is\n    // [{ role: 'user', content: X }] with the SOT passed as a 2nd arg.\n    messages: [{ role: 'user', content: userPrompt }],\n    requiredSections: parseRequiredSections(userPrompt),\n    notes,\n  };\n}\n","import { streamCurriculumAIInference, extractThoughtAndContent, type ChunkType } from '../ai/streamRunner';\nimport { loadCurriculumTemplate } from './lessonProductionService';\nimport { LLMJudgeEngine } from '../ai/llmJudgeEngine';\nimport { createAiInferenceError } from '../errors';\nimport { gateModeFor, resolveGateSettings } from '../workflow/gateSettings';\nimport {\n  buildLanguageDirective,\n  buildHeadingDirective,\n  resolveTargetLanguageCode,\n} from './languageDirective';\nimport {\n  buildSectionAwareExcerpt,\n  buildLessonExcerpt,\n  buildExpositionExcerpt,\n  extractSymbolLedger,\n  extractCurriculumHorizon,\n  renderHorizonPromptBlock,\n  type CurriculumHorizon,\n} from './contextBuilder';\nimport { buildDomainLexiconGuardrail } from './knowledgeExpositionService';\nimport {\n  validateArtifactDependencies,\n  type ContextSourceKey,\n} from './contextRouting';\nimport { getContract, resolveLessonSlotSpec, resolveKxSlotSpec, validateArtifactOutput } from '../registry/index.js';\nimport { autoFulfillArtifactMedia } from '../media';\nimport { parseArtifactAst } from '../parsers/artifactAstParser.js';\nimport { extractTypedDataForValidation, projectAstForPrompt } from '../parsers/artifactAstProjection.js';\n\nexport type ArtifactType = \n  | 'lesson' \n  | 'slide' \n  | 'act' \n  | 'quiz' \n  | 'guide' \n  | 'handout' \n  | 'worksheet' \n  | 'rubric' \n  | 'ext' \n  | 'glossary' \n  | 'codelab' \n  | 'bom'\n  | 'exit_ticket' \n  | 'tiered_practice' \n  | 'choice_board' \n  | 'science_lab' \n  | 'task_cards' \n  | 'station_rotation' \n  | 'bell_ringer' \n  | 'review_game' \n  | 'graphic_organizer';\n\nexport type ScaffoldingLevel = 'foundation' | 'balanced' | 'advanced';\n\nexport interface SingleArtifactRequest {\n  artifactType: ArtifactType;\n  topic: string;\n  lessonId?: string;\n  lessonTitle?: string;\n  pedagogy?: '5e' | 'edp' | 'pbl' | 'general';\n  targetAge?: string;\n  scaffoldingLevel?: ScaffoldingLevel;\n  hardwarePlatform?: string[];\n  gradeLevel?: string;\n  studentCount?: string;\n  language?: string;\n  slidesEngine?: 'html' | 'marp';\n  failClosedContext?: boolean;\n  extraContext?: string;\n  config?: Record<string, any>;\n  contextSot?: {\n    framework?: string;\n    learnerProfile?: string;\n    lessonPlan?: string;\n    handout?: string;\n    exposition?: string;\n    plan?: any;\n    horizon?: CurriculumHorizon;\n  };\n  /**\n   * Media Ledger policy (nếu có): agent chèn placeholder [IMAGE: slug], Curator duyệt,\n   * Fulfiller thực thi (search Pexels / gen AI). Không truyền → không planning ảnh.\n   */\n  mediaPolicy?: {\n    maxGenImagesPerArtifact: number;\n    autoFulfill?: boolean;\n    preferredProvider?: 'openai' | 'gemini';\n    mode?: 'search_only' | 'gen_only' | 'auto';\n  };\n  /**\n   * Nghiên cứu nền (từ research-kit harvest hoặc preliminary research) — bối cảnh\n   * fact-grounded để giảm outdate/hallucination khi sinh artifact standalone.\n   */\n  researchContext?: string;\n  /**\n   * Gate settings thô (vd gateModes từ project.config.json của Composer —\n   * scratch dùng config của chính nó). Kit tự chuẩn hoá; thiếu key = OFF\n   * (không kiểm). LLM_JUDGE → judge sau khi sinh + repair 1 vòng, fail-closed.\n   * HITL → chờ human duyệt (caller xử lý pause/resume).\n   */\n  gateSettings?: unknown;\n  options?: {\n    model?: string;\n    temperature?: number;\n    openrouterKey?: string;\n    alibabaKey?: string;\n    deepseekKey?: string;\n    geminiKey?: string;\n    nvidiaKey?: string;\n    openaiKey?: string;\n    anthropicKey?: string;\n  };\n  onChunk?: (chunk: string, type: 'content' | 'thought') => void;\n}\n\nexport interface SingleArtifactResult {\n  artifactType: ArtifactType;\n  filename: string;\n  content: string;\n  persona: string;\n  thought?: string;\n  /** Phase 2 & 4: Structured entity and validation outcome from registry */\n  entity?: unknown;\n  validation?: any;\n  /** Gate outcome: HITL đang chờ người duyệt; judge_needs_revision → bị từ chối sau repair; judge_error → fail-closed. */\n  pausedForReview?: boolean;\n  gateStatus?: 'awaiting_approval' | 'judge_needs_revision' | 'judge_error';\n  judgeScore?: number;\n  judgeCritique?: string;\n}\n\n/**\n * Maps artifact type to default canonical filename and responsible agent persona\n */\nexport function getArtifactMetadata(type: ArtifactType, lessonId?: string, pedagogy?: string): { filename: string; persona: string; templateFile: string } {\n  const id = lessonId || 'ON_DEMAND';\n  const contract = getContract(type);\n\n  if (type === 'lesson') {\n    const p = (pedagogy || '').toLowerCase();\n    const templateFile = p === 'edp' ? 'LESSON_EDP_template.md' : p === 'general' ? 'LESSON_GENERAL_template.md' : 'LESSON_5E_template.md';\n    return { filename: `LESSON_${id}.md`, persona: '@content', templateFile };\n  }\n\n  if (contract) {\n    const filename = contract.filenamePattern.replace('{lessonId}', id);\n    return {\n      filename,\n      persona: contract.persona,\n      templateFile: contract.templateFile,\n    };\n  }\n\n  return { filename: `ARTIFACT_${id}.md`, persona: '@content', templateFile: 'LESSON_5E_template.md' };\n}\n\n\nexport interface PromptSlotBreakdown {\n  slotKey: string;\n  label: string;\n  charCount: number;\n  estimatedTokens: number;\n  /**\n   * True only when a section the slot PRIORITIZED could not ship (budget\n   * drop/truncation). It used to be hardcoded false on every AST slot, so a\n   * slot that kept 4,7% of an 18k framework read as complete in the prompt\n   * inspector. An AST excerpt that selects only its priorities is NOT\n   * truncation — see `issues`, which is the only loss signal.\n   */\n  truncated: boolean;\n  contentSnippet: string;\n  /** Excerpt provenance: lossless AST projection or the markdown fallback builder. */\n  source?: 'AST' | 'MARKDOWN';\n  /** Size of the source document the excerpt was taken from, when known. */\n  originalChars?: number;\n  /**\n   * Why this slot is smaller than its source. `section:dropped:` /\n   * `section:truncated:` entries mean content was LOST; other entries\n   * (`parse:no-sections`, `empty-source`, …) are parse diagnostics. Empty list\n   * means the excerpt is as complete as the slot's priorities intend.\n   */\n  issues?: string[];\n}\n\nexport interface AssembledPromptResult {\n  artifactType: ArtifactType;\n  displayTitle: string;\n  topic: string;\n  lessonId: string;\n  meta: {\n    filename: string;\n    persona: string;\n    templateFile: string;\n  };\n  systemPrompt: string;\n  userPrompt: string;\n  excerpts: {\n    lessonPlanExcerpt?: string;\n    expositionExcerpt?: string;\n    frameworkExcerpt?: string;\n    handoutExcerpt?: string;\n  };\n  slots: PromptSlotBreakdown[];\n  totalChars: number;\n  estimatedTokens: number;\n  templateContent: string;\n}\n\n/**\n * RESEARCH GROUND TRUTH slot: priorities + budget of the reference-pack slot.\n * Priorities mirror the sections a fact-checked research pack carries, highest\n * value first. All keys resolve through SEMANTIC_HEADER_DICTIONARY, so a pack\n * that uses the canonical section headings projects losslessly; one that does\n * not falls to the markdown builder (whole-section fill in document order).\n * Budget unchanged at 4000 — the section-aware selection replaces a blind\n * `slice(0, 4000)`, it does not shrink the slot.\n */\nconst RESEARCH_SLOT_PRIORITIES: string[] = [\n  'standardsAlignment',\n  'competencyMatrix',\n  'technicalArchitecture',\n  'technicalOverviewArchitectureBlueprint',\n  'pedagogicalFoundations',\n  'safetyCompliance',\n  'riskMitigation',\n  'versionCompatibilityMatrix',\n  'conclusionRecommendations',\n];\nconst RESEARCH_SLOT_BUDGET = 4000;\n\n/**\n * Pure prompt assembler: shapes the complete System & User prompt for any artifact\n * without calling any LLM API (zero-token dry-run / X-Ray inspection).\n */\nexport async function assembleSingleArtifactPrompt(req: SingleArtifactRequest): Promise<AssembledPromptResult> {\n  const { \n    artifactType, \n    topic, \n    lessonId, \n    lessonTitle, \n    pedagogy = '5e', \n    targetAge = '14-18 years old (High School / Early College)', \n    scaffoldingLevel = 'balanced',\n    hardwarePlatform = ['MacBook Lab (macOS 14+ / Swift 6)'],\n    gradeLevel,\n    studentCount,\n    language = 'Vietnamese',\n    extraContext,\n    config,\n    contextSot = {},\n    mediaPolicy,\n    researchContext,\n  } = req;\n\n  const meta = getArtifactMetadata(artifactType, lessonId, pedagogy || config?.pedagogicalModel);\n  const displayTitle = lessonTitle || topic;\n  const loadedTemplate = loadCurriculumTemplate(meta.templateFile);\n  const templateContent = loadedTemplate || getDefaultFallbackTemplate(artifactType, displayTitle, lessonId || 'ON_DEMAND');\n  const hwStr = hardwarePlatform.join(', ');\n  const selectedDevices = (config?.devices || (hardwarePlatform[0]?.toLowerCase().includes('paper') ? 'paper-only' : 'laptop')).toLowerCase();\n\n  const langDirective = buildLanguageDirective(language);\n  const headingDirective = buildHeadingDirective(artifactType.toUpperCase());\n\n  // Validate dependencies according to the Dependency Routing Matrix\n  const availableSources: Partial<Record<ContextSourceKey, any>> = {\n    KNOWLEDGE_EXPOSITION: contextSot.exposition || researchContext,\n    CANONICAL_LESSON: contextSot.lessonPlan,\n    FRAMEWORK_EXCERPT: contextSot.framework,\n  };\n  validateArtifactDependencies(artifactType.toUpperCase(), availableSources, {\n    lessonId,\n    agent: meta.persona,\n    failClosed: req.failClosedContext ?? false,\n  });\n\n  // Hardware and device adaptation\n  const isPaperOnly = selectedDevices === 'paper-only' || hwStr.toLowerCase().includes('paper') || hwStr.toLowerCase().includes('print-ready');\n  const deviceRule = isPaperOnly\n    ? `\\n- 📄 PAPER-ONLY / NO-DEVICE ENVIRONMENT: The learning space has NO computers or screens. All exercises, worksheets, task cards, exit tickets, and code analyses MUST be 100% printable. Provide write-in blank boxes, printed code snippets with line numbers, tracing tables, and physical manipulative instructions.`\n    : selectedDevices === 'tablet' || selectedDevices === 'smartphone'\n    ? `\\n- 📱 MOBILE/TABLET ENVIRONMENT: Activities should be optimized for touch interfaces and mobile/tablet sandboxes (e.g. Swift Playgrounds, Web IDEs, tap/touch interactions).`\n    : `\\n- 💻 LAPTOP/DESKTOP ENVIRONMENT: Full keyboard, terminal, multi-file code editing, and browser developer tooling are available.`;\n\n  // Class size dynamics\n  const classDynamicsRule = studentCount\n    ? `\\n- 👥 CLASS SIZE LOGISTICS: Class has exactly ${studentCount} students. Structure group sizes, pair-programming pairs, station rotations, and material distribution to realistically accommodate ${studentCount} students without bottlenecks.`\n    : '';\n\n  // Scaffolding level instruction\n  const scaffoldingRule = scaffoldingLevel === 'foundation'\n    ? `\\n- 🪜 FOUNDATION SCAFFOLDING: High instructional support. Provide step-by-step numbered breakdowns, concrete real-world analogies, hints for every problem, scaffolded starter code/fill-in-the-blanks, and frequent check-for-understanding prompts.`\n    : scaffoldingLevel === 'advanced'\n    ? `\\n- 🚀 ADVANCED CHALLENGE: Minimal scaffolding. Focus on deeper system architecture, edge case handling, computational complexity, performance optimization, and open-ended extension challenges.`\n    : `\\n- ⚖️ BALANCED SCAFFOLDING: Balanced approach combining structured teacher guidance with independent inquiry and problem solving.`;\n\n  // Extra user guidance\n  const extraContextRule = extraContext\n    ? `\\n- 🎯 CRITICAL USER INSTRUCTIONS (MANDATORY): \"${extraContext}\". You MUST directly reflect and satisfy every point of this user guidance in the generated artifact!`\n    : '';\n\n  const artifactSpecializedPrompt = getArtifactSpecializedInvariants(artifactType, {\n    ...req,\n    studentCount,\n    gradeLevel,\n    language,\n    scaffoldingLevel\n  });\n\n  const techStack = req.config?.techStack || req.hardwarePlatform?.[0] || 'Declared Technical Domain';\n  const domainGuardrail = buildDomainLexiconGuardrail(techStack, hwStr);\n\n  const symbolLedger = contextSot.lessonPlan ? extractSymbolLedger(contextSot.lessonPlan) : null;\n  const symbolLedgerPrompt = symbolLedger?.primarySymbol\n    ? `\\n7. MANDATORY CODE SYMBOL REGISTRY (Inherited from Canonical LESSON):\n   - Primary Struct / Class: \\`${symbolLedger.primarySymbol}\\`\n   - Entry Source File: \\`${symbolLedger.entryFileName || symbolLedger.primarySymbol + '.swift'}\\`\n   - Key Identifiers to inherit: ${symbolLedger.keySymbols.map(s => `\\`${s}\\``).join(', ')}\n   - INVARIANT: You MUST use these exact identifier names in all code examples, exercises, and starter templates. Do NOT invent conflicting struct or class names.`\n    : '';\n\n  // Resolve Curriculum Horizon if available from contextSot or build on-demand\n  let horizon: CurriculumHorizon | null = contextSot.horizon || null;\n  if (!horizon && (contextSot.plan || contextSot.framework) && lessonId) {\n    try {\n      horizon = await extractCurriculumHorizon({\n        plan: contextSot.plan,\n        frameworkMarkdown: contextSot.framework,\n        targetLessonId: lessonId,\n      });\n    } catch {\n      // Horizon extraction is optional for unanchored on-demand single artifacts\n    }\n  }\n  const horizonPrompt = horizon ? `\\n\\n${renderHorizonPromptBlock(horizon)}` : '';\n\n  // Construct rigorous, archetypal pedagogical system prompt\n  const systemPrompt = `You are ${meta.persona}, an expert Curriculum & Pedagogical Specialist in the Curriculum OS Multi-Agent Team.\nYour task is to author a canonical, publication-grade learning artifact of type \"${artifactType.toUpperCase()}\".\n\n### CORE OPERATIONAL INVARIANTS:\n${langDirective}\n${headingDirective}\n2. NON-MOCK CODE INVARIANT: Any code snippet provided MUST be 100% syntactically valid, idiomatic, and executable without placeholders or fake functions.\n2b. IDENTIFIER GROUND TRUTH: Never derive identifier casing/spelling from glossary term or concept names (they are pedagogical labels). Copy identifiers EXACTLY from the canonical LESSON and REFERENCE_PACK ground truth present in the context.\n3. PEDAGOGICAL GROUNDING: Strictly align with the ${pedagogy.toUpperCase()} model, Bloom's Revised Taxonomy, and IEEE/ACM CS2023 guidelines.\n4. SCAFFOLDING LEVEL: \"${scaffoldingLevel.toUpperCase()}\".${scaffoldingRule}\n5. TARGET AUDIENCE: ${gradeLevel ? `Grade ${gradeLevel}, ` : ''}${targetAge} on ${hwStr}.${deviceRule}${classDynamicsRule}${extraContextRule}\n6. DOMAIN & TECH STACK GUARDRAILS:\n${domainGuardrail}\n${symbolLedgerPrompt}\n8. OUTPUT INTEGRITY: Output clean Markdown starting directly with YAML frontmatter. Do not wrap entire response in triple backticks.${artifactSpecializedPrompt}${horizonPrompt}${mediaPolicy ? `\\n\\nIMAGE PLANNING (media ledger) — QUOTA GEN: tối đa ${mediaPolicy.maxGenImagesPerArtifact} ảnh AI cho artifact này (ảnh search kho không giới hạn).\\nKhi nội dung cần minh họa (diagram quy trình, sơ đồ khái niệm, step-by-step visual), chèn placeholder đúng format [IMAGE: slug] (slug chữ thường-gạch ngang, unique trong bài, vd img-for-loop-diagram) TẠI ĐÚNG CHỖ cần ảnh, trên dòng riêng. KHÔNG tự sinh ảnh, KHÔNG dùng markdown image — placeholder sẽ được thay bằng ảnh thật sau khi Media Curator duyệt. Chỉ đặt cho ảnh THỰC SỰ cần thiết.` : ''}`;\n\n  // ── AST-primary SOT slots ──\n  // Each slot first projects the lossless AST via SEMANTIC-KEY priorities\n  // (LESSON/KX are type-scoped from the registry — the same specs the satellite\n  // path consumes); only when the AST overlay resolves NOTHING does the slot\n  // fall back to the markdown excerpt builders (legacy behavior unchanged).\n  // Loss vocabulary, identical to the one contextBuilder and the production\n  // telemetry filter on (see lessonProductionService contextDrops). A prefixed\n  // entry means a section the slot PRIORITIZED could not ship — which is a\n  // different thing from an excerpt that simply never selects the rest.\n  const isContentLoss = (i: string): boolean =>\n    i.startsWith('section:dropped:') || i.startsWith('section:truncated:');\n\n  type SlotExcerpt = { excerpt: string; issues: string[] };\n  const projectAstSlot = (\n    markdown: string | undefined,\n    priorities: string[],\n    budget: number\n  ): SlotExcerpt | null => {\n    if (!markdown || !markdown.trim()) return null;\n    const issues: string[] = [];\n    const projected = projectAstForPrompt(parseArtifactAst(markdown), priorities, {\n      budgetTokens: budget,\n      onWarning: (m) => issues.push(m),\n    });\n    return projected.trim() ? { excerpt: projected, issues } : null;\n  };\n\n  const typeUpper = artifactType.toUpperCase();\n  const lessonSpec = resolveLessonSlotSpec(typeUpper);\n  const lessonPriorities = lessonSpec.priorities;\n  const lessonBudget = lessonSpec.budget;\n  const kxSpec = resolveKxSlotSpec(typeUpper);\n  const kxPriorities = kxSpec.priorities;\n\n  const lessonPlanAst = projectAstSlot(contextSot.lessonPlan, lessonPriorities, lessonBudget);\n  const lessonPlanFallback = lessonPlanAst\n    ? null\n    : contextSot.lessonPlan\n      ? buildLessonExcerpt(contextSot.lessonPlan, { budget: lessonBudget, artifactType: 'LESSON' })\n      : null;\n  const lessonPlanExcerpt = lessonPlanAst?.excerpt ?? lessonPlanFallback?.excerpt ?? '';\n  const lessonPlanIssues = lessonPlanAst?.issues ?? lessonPlanFallback?.issues ?? [];\n\n  const expositionAst = projectAstSlot(contextSot.exposition, kxPriorities, kxSpec.budget);\n  const expositionFallback = expositionAst\n    ? null\n    : contextSot.exposition\n      ? buildExpositionExcerpt(contextSot.exposition, { budget: kxSpec.budget })\n      : null;\n  const expositionExcerpt = expositionAst?.excerpt ?? expositionFallback?.excerpt ?? '';\n  const expositionIssues = expositionAst?.issues ?? expositionFallback?.issues ?? [];\n\n  // SOT docs carry no registry slot specs — priorities mirror their template\n  // section contract (all keys resolve via SEMANTIC_HEADER_DICTIONARY;\n  // drift-guarded in artifact-registry.test.ts).\n  //\n  // 'standardsAlignment' used to sit at the tail of this list. Measured on the\n  // real CURRICULUM_FRAMEWORK.md (swift-for-dummy): the framework carries NO\n  // section under that key, so every prompt paid a\n  // `Slot key \"standardsAlignment\" not found` warning for a section that can\n  // never ship. The framework's standards rows live inside scopeAndSequence,\n  // which is already a priority — the dead key only added noise to issues.\n  const frameworkAst = projectAstSlot(\n    contextSot.framework,\n    ['courseOverview', 'globalLearningObjectives', 'structuralHierarchy', 'scopeAndSequence', 'standardLessonFormat'],\n    2500\n  );\n  const frameworkFallback = frameworkAst\n    ? null\n    : contextSot.framework\n      ? buildSectionAwareExcerpt(contextSot.framework, { budget: 2500 })\n      : null;\n  const frameworkExcerpt = frameworkAst?.excerpt ?? frameworkFallback?.excerpt ?? '';\n  const frameworkIssues = frameworkAst?.issues ?? frameworkFallback?.issues ?? [];\n\n  // STUDENT_HANDOUT source is a generated HANDOUT artifact — priorities mirror\n  // the HANDOUT template headings ('phase2Explore' resolves 'Core Concepts').\n  const handoutAst = projectAstSlot(\n    contextSot.handout,\n    ['phase2Explore', 'coreSyntaxMechanismCheatSheet', 'visualMentalModelArchitectureDiagram', 'stepByStepPracticalQuickStartGuide', 'selfCheckDiagnosticChecklist'],\n    2000\n  );\n  const handoutFallback = handoutAst\n    ? null\n    : contextSot.handout\n      ? buildSectionAwareExcerpt(contextSot.handout, { budget: 2000 })\n      : null;\n  const handoutExcerpt = handoutAst?.excerpt ?? handoutFallback?.excerpt ?? '';\n  const handoutIssues = handoutAst?.issues ?? handoutFallback?.issues ?? [];\n\n  // RESEARCH GROUND TRUTH used to be `researchContext.slice(0, 4000)` — a\n  // blind cut that can stop mid-table (measured on the real swift-for-dummy\n  // reference pack: it ended at \"| **Xcode 16.3 Rel\") and reports nothing beyond\n  // one issue line. It is now a real section-aware slot.\n  //\n  // The MARKDOWN builder runs FIRST here, not the AST. Measured on that same\n  // 27.723-char pack: its headings are numbered (\"## 1. Chuẩn Kỹ Năng & Tiêu\n  // Chí Đánh Giá…\"), so the AST semantic index resolves 1 of 9 priority keys\n  // and AST-first ships 3.025 chars — section \"10. Kết Luận & Khuyến Nghị\",\n  // which has nothing to do with the lesson being authored. The markdown\n  // builder resolves priorities through the same dictionary AND tops up with\n  // the remaining whole sections in document order: 4.000 chars of standards +\n  // toolchain, with an explicit `section:dropped:` per section that did not fit.\n  // The AST projection stays as the backstop for a pack whose sections the\n  // markdown parser cannot see at all.\n  const researchMarkdown = researchContext\n    ? buildSectionAwareExcerpt(researchContext, {\n        priorities: RESEARCH_SLOT_PRIORITIES,\n        budget: RESEARCH_SLOT_BUDGET,\n        artifactType: 'REFERENCE_PACK',\n      })\n    : null;\n  const researchAst = researchMarkdown?.excerpt.trim()\n    ? null\n    : projectAstSlot(researchContext, RESEARCH_SLOT_PRIORITIES, RESEARCH_SLOT_BUDGET);\n  const researchExcerpt = researchMarkdown?.excerpt ?? researchAst?.excerpt ?? '';\n  const researchIssues: string[] = [...(researchMarkdown?.issues ?? researchAst?.issues ?? [])];\n  // Tài liệu KHÔNG có mục nào để quy cho việc rơi (pack viết liệt như prose,\n  // hoặc chỉ có một H1) thì không có mục `section:*` nào được ghi, và slot sẽ\n  // báo `truncated: false` dù nó chỉ còn 4000/10.000 chars — đúng cái im lặng\n  // mà inspector cần tránh. Ghi một mục tổng quát thay vì đoán mò.\n  if (\n    researchExcerpt &&\n    (researchContext?.length ?? 0) > researchExcerpt.length &&\n    !researchIssues.some(isContentLoss)\n  ) {\n    researchIssues.push(\n      `section:truncated:research-pack (${researchContext!.length} chars clamped to the ${RESEARCH_SLOT_BUDGET}-char slot budget)`\n    );\n  }\n\n  const slotSource = (ast: SlotExcerpt | null, excerpt: string): 'AST' | 'MARKDOWN' | undefined =>\n    ast ? 'AST' : excerpt ? 'MARKDOWN' : undefined;\n  const lessonSource = slotSource(lessonPlanAst, lessonPlanExcerpt);\n  const kxSource = slotSource(expositionAst, expositionExcerpt);\n  const frameworkSource = slotSource(frameworkAst, frameworkExcerpt);\n  const handoutSource = slotSource(handoutAst, handoutExcerpt);\n  const researchSource = researchMarkdown?.excerpt.trim()\n  ? 'MARKDOWN'\n  : researchAst\n    ? 'AST'\n    : undefined;\n\n  // Serialized ONCE: the prompt text and the TASK_CONFIG slot below must\n  // account for the same string, or the breakdown silently drifts from the\n  // bytes that actually ship.\n  const configJson = config ? JSON.stringify(config) : '';\n\n  const userPrompt = `### CONTEXT GROUND TRUTH:\n- Topic / Concept Domain: \"${topic}\"\n- Lesson ID: \"${lessonId || 'ON_DEMAND'}\"\n- Artifact Title: \"${displayTitle}\"\n- Pedagogy: \"${pedagogy.toUpperCase()}\"\n- Scaffolding Level: \"${scaffoldingLevel}\"\n- Hardware Environment: \"${hwStr}\"\n${gradeLevel ? `- Target Grade Level: \"${gradeLevel}\"\\n` : ''}${studentCount ? `- Class Size: \"${studentCount} students\"\\n` : ''}- Target Language: \"${language}\"\n${selectedDevices ? `- Device Mode: \"${selectedDevices}\"\\n` : ''}${extraContext ? `- User Specific Guidance & Requirements: \"${extraContext}\"\\n` : ''}${configJson ? `- Full Task Config: ${configJson}\\n` : ''}\n${researchExcerpt ? `### RESEARCH GROUND TRUTH (fact-checked context — ưu tiên dùng, KHÔNG bịa số liệu):\n${researchExcerpt}\n` : ''}\n${expositionExcerpt ? `### SOT KNOWLEDGE EXPOSITION (CANONICAL KNOWLEDGE — teach from this, do not contradict):\\n${expositionExcerpt}\\n` : ''}\n${frameworkExcerpt ? `### SOT CURRICULUM FRAMEWORK:\\n${frameworkExcerpt}\\n` : ''}\n${lessonPlanExcerpt ? `### SOT CANONICAL LESSON PLAN:\\n${lessonPlanExcerpt}\\n` : ''}\n${handoutExcerpt ? `### SOT STUDENT HANDOUT:\\n${handoutExcerpt}\\n` : ''}\n\n### MANDATORY CANONICAL TEMPLATE CONTRACT:\nUse the following reference template structure as the exact specification:\n\n${templateContent}\n\n### TASK INSTRUCTION:\nGenerate the complete, thorough, publication-grade \"${artifactType.toUpperCase()}\" artifact for \"${displayTitle}\". Ensure all [REQUIRED] sections are fully developed with realistic, detailed pedagogical and technical content. Strictly follow the specialized invariants for \"${artifactType.toUpperCase()}\".`;\n\n  const slots: PromptSlotBreakdown[] = [\n    {\n      slotKey: 'SYSTEM_PERSONA_DIRECTIVES',\n      label: 'System Persona & Operational Invariants',\n      charCount: systemPrompt.length,\n      estimatedTokens: Math.ceil(systemPrompt.length / 4),\n      truncated: false,\n      contentSnippet: systemPrompt.slice(0, 250) + '...',\n    },\n    {\n      slotKey: 'DOMAIN_GUARDRAIL',\n      label: 'Domain Lexicon & Tech Stack Guardrails',\n      charCount: domainGuardrail.length,\n      estimatedTokens: Math.ceil(domainGuardrail.length / 4),\n      truncated: false,\n      contentSnippet: domainGuardrail.slice(0, 250) + '...',\n    },\n  ];\n\n  if (symbolLedgerPrompt) {\n    slots.push({\n      slotKey: 'SYMBOL_LEDGER',\n      label: 'Canonical Code Symbol Ledger',\n      charCount: symbolLedgerPrompt.length,\n      estimatedTokens: Math.ceil(symbolLedgerPrompt.length / 4),\n      truncated: false,\n      contentSnippet: symbolLedgerPrompt.slice(0, 250) + '...',\n    });\n  }\n\n  if (horizonPrompt) {\n    slots.push({\n      slotKey: 'CURRICULUM_HORIZON',\n      label: 'Curriculum Horizon & Spiral Progressions',\n      charCount: horizonPrompt.length,\n      estimatedTokens: Math.ceil(horizonPrompt.length / 4),\n      truncated: false,\n      contentSnippet: horizonPrompt.slice(0, 250) + '...',\n    });\n  }\n\n  if (configJson) {\n    // The task config is the LARGEST single input to most prompts (measured on\n    // the real swift-for-dummy project: 109k chars, 76% of a 142k-char\n    // LESSON prompt) and it used to be invisible to the inspector: serialized\n    // straight into the user prompt with no slot entry, so `totalChars` and\n    // the slot breakdown disagreed by three quarters of the prompt. Declaring\n    // the slot does not change a byte of the prompt — it makes the accounting\n    // add up, which is what every later guard needs in order to have something\n    // to hold on to.\n    slots.push({\n      slotKey: 'TASK_CONFIG',\n      label: 'Full Task Config (verbatim JSON)',\n      charCount: configJson.length,\n      estimatedTokens: Math.ceil(configJson.length / 4),\n      truncated: false,\n      contentSnippet: configJson.slice(0, 250) + '...',\n    });\n  }\n\n  if (researchExcerpt) {\n    slots.push({\n      slotKey: 'RESEARCH_CONTEXT',\n      label: 'Fact-Checked Research Ground Truth',\n      source: researchSource,\n      charCount: researchExcerpt.length,\n      estimatedTokens: Math.ceil(researchExcerpt.length / 4),\n      truncated: researchIssues.some(isContentLoss),\n      originalChars: researchContext?.length,\n      // Same vocabulary as the AST slots so the inspector renders one shape.\n      issues: researchIssues,\n      contentSnippet: researchExcerpt.slice(0, 250) + '...',\n    });\n  }\n\n  if (expositionExcerpt) {\n    slots.push({\n      slotKey: 'KNOWLEDGE_EXPOSITION',\n      label: 'Knowledge Exposition Excerpt (KX)',\n      source: kxSource,\n      charCount: expositionExcerpt.length,\n      estimatedTokens: Math.ceil(expositionExcerpt.length / 4),\n      truncated: expositionIssues.some(isContentLoss),\n      originalChars: contextSot.exposition?.length,\n      issues: expositionIssues,\n      contentSnippet: expositionExcerpt.slice(0, 250) + '...',\n    });\n  }\n\n  if (frameworkExcerpt) {\n    slots.push({\n      slotKey: 'CURRICULUM_FRAMEWORK',\n      label: 'Curriculum Framework Excerpt',\n      source: frameworkSource,\n      charCount: frameworkExcerpt.length,\n      estimatedTokens: Math.ceil(frameworkExcerpt.length / 4),\n      truncated: frameworkIssues.some(isContentLoss),\n      originalChars: contextSot.framework?.length,\n      issues: frameworkIssues,\n      contentSnippet: frameworkExcerpt.slice(0, 250) + '...',\n    });\n  }\n\n  if (lessonPlanExcerpt) {\n    slots.push({\n      slotKey: 'CANONICAL_LESSON',\n      label: 'Canonical Lesson Plan Excerpt',\n      source: lessonSource,\n      charCount: lessonPlanExcerpt.length,\n      estimatedTokens: Math.ceil(lessonPlanExcerpt.length / 4),\n      truncated: lessonPlanIssues.some(isContentLoss),\n      originalChars: contextSot.lessonPlan?.length,\n      issues: lessonPlanIssues,\n      contentSnippet: lessonPlanExcerpt.slice(0, 250) + '...',\n    });\n  }\n\n  if (handoutExcerpt) {\n    slots.push({\n      slotKey: 'STUDENT_HANDOUT',\n      label: 'Student Handout Excerpt',\n      source: handoutSource,\n      charCount: handoutExcerpt.length,\n      estimatedTokens: Math.ceil(handoutExcerpt.length / 4),\n      truncated: handoutIssues.some(isContentLoss),\n      originalChars: contextSot.handout?.length,\n      issues: handoutIssues,\n      contentSnippet: handoutExcerpt.slice(0, 250) + '...',\n    });\n  }\n\n  slots.push({\n    slotKey: 'TEMPLATE_CONTRACT',\n    label: 'Canonical Template Contract',\n    charCount: templateContent.length,\n    estimatedTokens: Math.ceil(templateContent.length / 4),\n    truncated: false,\n    contentSnippet: templateContent.slice(0, 250) + '...',\n  });\n\n  const totalChars = systemPrompt.length + userPrompt.length;\n  const estimatedTokens = Math.ceil(totalChars / 4);\n\n  return {\n    artifactType,\n    displayTitle,\n    topic,\n    lessonId: lessonId || 'ON_DEMAND',\n    meta,\n    systemPrompt,\n    userPrompt,\n    excerpts: {\n      lessonPlanExcerpt,\n      expositionExcerpt,\n      frameworkExcerpt,\n      handoutExcerpt,\n    },\n    slots,\n    totalChars,\n    estimatedTokens,\n    templateContent,\n  };\n}\n\n/**\n * Universal Single Artifact Generator Service for all 21 Pedagogical JTBD Artifacts\n */\nexport async function generateSingleArtifact(req: SingleArtifactRequest): Promise<SingleArtifactResult> {\n  const { \n    artifactType, \n    mediaPolicy,\n    options = {},\n    onChunk\n  } = req;\n\n  const targetLang = resolveTargetLanguageCode(req.language || 'Vietnamese');\n  const assembled = await assembleSingleArtifactPrompt(req);\n  const { meta, displayTitle, topic, lessonId, systemPrompt, userPrompt, excerpts } = assembled;\n  const { lessonPlanExcerpt, expositionExcerpt } = excerpts;\n\n  let accumulatedContent = '';\n  let accumulatedThought = '';\n\n  try {\n    const rawResult = await streamCurriculumAIInference(\n      [\n        { role: 'system', content: systemPrompt },\n        { role: 'user', content: userPrompt }\n      ],\n      userPrompt,\n      {\n        ...options,\n        systemPersona: systemPrompt\n      },\n      (chunk: string, type: ChunkType) => {\n        if (type === 'thought') {\n          accumulatedThought += chunk;\n        } else if (type === 'content') {\n          accumulatedContent += chunk;\n        }\n        if (onChunk) onChunk(chunk, type === 'thought' ? 'thought' : 'content');\n      }\n    );\n\n    const { thought, content } = extractThoughtAndContent(rawResult);\n    const finalContent = content || accumulatedContent;\n    const finalThought = thought || accumulatedThought;\n\n    // ── Gate (config-driven): duy nhất theo settings của project chứa artifact.\n    // OFF → trả như cũ. LLM_JUDGE → judge + 1 vòng repair, fail-closed khi lỗi.\n    // HITL → không tự duyệt, trả pausedForReview để caller pause pipeline.\n    const gates = resolveGateSettings(req.gateSettings);\n    const kitGateType: string | undefined = ({\n      lesson: 'LESSON', slide: 'SLIDE', act: 'ACT', quiz: 'QUIZ', guide: 'GUIDE',\n      handout: 'HANDOUT', worksheet: 'WKS', ext: 'EXT', codelab: 'CODE', exit_ticket: 'EXIT_TICKET',\n    } as Record<string, string | undefined>)[artifactType];\n    const gateMode = kitGateType ? gateModeFor(gates, kitGateType as Parameters<typeof gateModeFor>[1]) : 'OFF';\n    const maybeFulfillMedia = async (contentToFulfill: string): Promise<string> => {\n      if (!mediaPolicy?.autoFulfill || !/\\[IMAGE\\s*:\\s*([a-z0-9][a-z0-9-]*)\\s*\\]/i.test(contentToFulfill)) {\n        return contentToFulfill;\n      }\n      try {\n        const res = await autoFulfillArtifactMedia({\n          markdown: contentToFulfill,\n          artifactId: meta.filename,\n          projectDir: req.config?.projectDir || process.cwd(),\n          policy: {\n            maxGenImagesPerArtifact: mediaPolicy.maxGenImagesPerArtifact ?? 3,\n            preferredProvider: mediaPolicy.preferredProvider,\n            mode: mediaPolicy.mode ?? 'auto',\n          },\n          context: {\n            lessonTitle: displayTitle,\n            language: targetLang,\n          },\n          apiKeyOverrides: {\n            openai: options?.openrouterKey,\n            gemini: options?.geminiKey,\n          },\n        });\n        return res.markdown;\n      } catch {\n        return contentToFulfill;\n      }\n    };\n\n    const contract = getContract(artifactType);\n    let parsedEntity: unknown = undefined;\n    try {\n      const ast = parseArtifactAst(finalContent);\n      parsedEntity = extractTypedDataForValidation(artifactType, ast) ?? undefined;\n    } catch {\n      parsedEntity = undefined;\n    }\n    const valResult = await validateArtifactOutput(artifactType, finalContent, parsedEntity);\n\n    if (gateMode === 'OFF') {\n      const fulfilled = await maybeFulfillMedia(finalContent);\n      return {\n        artifactType,\n        filename: meta.filename,\n        content: fulfilled,\n        persona: meta.persona,\n        thought: finalThought,\n        entity: parsedEntity,\n        validation: valResult,\n      };\n    }\n\n    const injectReviewMeta = (doc: string, metaMap: Record<string, string>): string => {\n      const fm = doc.match(/^---\\s*\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/);\n      if (!fm) {\n        return `---\\n${Object.entries(metaMap).map(([k, v]) => `${k}: \"${v}\"`).join('\\n')}\\n---\\n\\n${doc}`;\n      }\n      let yaml = fm[1] ?? '';\n      for (const [k, v] of Object.entries(metaMap)) {\n        const re = new RegExp(`^${k}:.*$`, 'm');\n        if (re.test(yaml)) yaml = yaml.replace(re, `${k}: \"${v}\"`);\n        else yaml += `\\n${k}: \"${v}\"`;\n      }\n      return doc.replace(fm[0], `---\\n${yaml.trim()}\\n---\\n`);\n    };\n\n    if (gateMode === 'HITL') {\n      return {\n        artifactType,\n        filename: meta.filename,\n        content: injectReviewMeta(finalContent, { review_status: 'PENDING_REVIEW', review_decision: 'PENDING' }),\n        persona: meta.persona,\n        thought: finalThought,\n        entity: parsedEntity,\n        validation: valResult,\n        pausedForReview: true,\n        gateStatus: 'awaiting_approval',\n      };\n    }\n\n    // gateMode === 'LLM_JUDGE'\n    const judgeObjectives = [{ code: 'A1', description: `Artifact fulfills its pedagogical contract for topic \"${topic}\" with complete required sections`, bloomLevel: 'Analyze' }];\n    try {\n      const verdict = await LLMJudgeEngine.evaluateArtifactWithLLM({\n        targetArtifactType: artifactType.toUpperCase(),\n        lessonId: lessonId || 'ON_DEMAND',\n        expectedLanguage: targetLang || 'en',\n        targetObjectives: judgeObjectives,\n        generatedContentJson: JSON.stringify({\n          content: finalContent,\n          artifactType,\n          lessonId: lessonId || 'ON_DEMAND',\n          title: displayTitle,\n          canonicalLessonExcerpt: lessonPlanExcerpt || undefined,\n          canonicalExposition: expositionExcerpt || undefined,\n        }),\n      });\n      const passed = Boolean(verdict.passed) && verdict.score >= 85;\n      if (passed) {\n        const fulfilled = await maybeFulfillMedia(finalContent);\n        return {\n          artifactType,\n          filename: meta.filename,\n          content: injectReviewMeta(fulfilled, {\n            review_status: 'APPROVED',\n            reviewed_by: '@reviewer (LLM-as-Judge)',\n            review_decision: 'APPROVED',\n          }),\n          persona: meta.persona,\n          thought: finalThought,\n          entity: parsedEntity,\n          validation: valResult,\n          judgeScore: verdict.score,\n          judgeCritique: verdict.critique,\n        };\n      }\n      // Chưa pass → 1 vòng repair rồi judge lại (mirrors produceSingleLesson).\n      const repairFeedback = [verdict.autoRepairInstructions, ...(verdict.weaknesses || [])].filter(Boolean).join('\\n');\n      const repairedRaw = await streamCurriculumAIInference(\n        [\n          { role: 'user', content: `You previously authored \\`${meta.filename}\\` and the academic Judge REJECTED it with the critique below.\\nRewrite the COMPLETE corrected document: fix every listed issue, keep the mandatory structure, frontmatter and all approved sections. Output 100% clean Markdown only.\\n\\nJUDGE CRITIQUE:\\n${repairFeedback}\\n\\nCURRENT DOCUMENT:\\n${finalContent}` },\n        ],\n        userPrompt,\n        { ...options, systemPersona: systemPrompt },\n        (chunk: string, type: ChunkType) => {\n          if (onChunk) onChunk(chunk, type === 'thought' ? 'thought' : 'content');\n        }\n      );\n      const repairedExtract = extractThoughtAndContent(repairedRaw);\n      const repaired = repairedExtract.content || repairedRaw;\n      if (repaired && repaired.trim().length > 100) {\n        const reVerdict = await LLMJudgeEngine.evaluateArtifactWithLLM({\n          targetArtifactType: artifactType.toUpperCase(),\n          lessonId: lessonId || 'ON_DEMAND',\n          expectedLanguage: targetLang || 'en',\n          targetObjectives: judgeObjectives,\n          generatedContentJson: JSON.stringify({\n            content: repaired,\n            artifactType,\n            lessonId: lessonId || 'ON_DEMAND',\n            title: displayTitle,\n            canonicalLessonExcerpt: lessonPlanExcerpt || undefined,\n            canonicalExposition: expositionExcerpt || undefined,\n          }),\n        });\n        if (reVerdict.passed && reVerdict.score >= 85) {\n          const fulfilled = await maybeFulfillMedia(repaired);\n          return {\n            artifactType,\n            filename: meta.filename,\n            content: injectReviewMeta(fulfilled, {\n              review_status: 'APPROVED',\n              reviewed_by: '@reviewer (LLM-as-Judge)',\n              review_decision: 'APPROVED',\n            }),\n            persona: meta.persona,\n            thought: repairedExtract.thought || '',\n            judgeScore: reVerdict.score,\n            judgeCritique: reVerdict.critique,\n          };\n        }\n        return {\n          artifactType,\n          filename: meta.filename,\n          content: injectReviewMeta(repaired, {\n            review_status: 'NEEDS_REVISION',\n            reviewed_by: '@reviewer (LLM-as-Judge)',\n            review_decision: 'NEEDS_REVISION',\n          }),\n          persona: meta.persona,\n          thought: repairedExtract.thought || '',\n          pausedForReview: true,\n          gateStatus: 'judge_needs_revision',\n          judgeScore: reVerdict.score,\n          judgeCritique: reVerdict.critique,\n        };\n      }\n      return {\n        artifactType,\n        filename: meta.filename,\n        content: injectReviewMeta(finalContent, {\n          review_status: 'NEEDS_REVISION',\n          reviewed_by: '@reviewer (LLM-as-Judge)',\n          review_decision: 'NEEDS_REVISION',\n        }),\n        persona: meta.persona,\n        thought: finalThought,\n        pausedForReview: true,\n        gateStatus: 'judge_needs_revision',\n        judgeScore: verdict.score,\n        judgeCritique: verdict.critique,\n      };\n    } catch (judgeErr: any) {\n      // Fail-closed: judge lỗi KHÔNG âm thầm duyệt — đánh dấu chờ kiểm tra lại.\n      return {\n        artifactType,\n        filename: meta.filename,\n        content: injectReviewMeta(finalContent, {\n          review_status: 'NEEDS_REVISION',\n          review_decision: 'NEEDS_REVISION',\n          critique: `Judge unavailable (fail-closed): ${String(judgeErr?.message || judgeErr).slice(0, 300)}`,\n        }),\n        persona: meta.persona,\n        thought: finalThought,\n        pausedForReview: true,\n        gateStatus: 'judge_error',\n      };\n    }\n  } catch (error: any) {\n    throw createAiInferenceError({\n      errorCode: 'ERR_AI_ALL_PROVIDERS_FAILED',\n      message: `Failed to generate single artifact ${artifactType}: ${error?.message || 'Unknown error'}`,\n      rawError: error\n    });\n  }\n}\n\n/**\n * Provides specialized, publication-grade pedagogical prompt invariants for each artifact type\n */\nfunction getArtifactSpecializedInvariants(type: ArtifactType, req: SingleArtifactRequest): string {\n  const cfg = req.config || {};\n  const isPaperOnly = cfg.devices === 'paper-only' || req.hardwarePlatform?.some(h => h.toLowerCase().includes('paper'));\n  const studentCount = req.studentCount || '25';\n\n  switch (type) {\n    case 'slide': {\n      if (req.slidesEngine === 'html') {\n        return `\n### 🎬 INTERACTIVE HTML SLIDE ENGINE CONTRACT:\nYou generate structured slide decks for the LearnWell HTML Slide Presentation Engine.\nOutput a single valid JSON object matching: { \"title\": \"...\", \"theme\": \"ocean\", \"slides\": [{ \"layoutId\": \"hero-cover\", \"slots\": { ... }, \"notes\": \"...\" }] }\n\nLayout Presets available (the ONLY valid layoutIds):\n- hero-cover (tag, title, subtitle, author, date)\n- split-concept-code (tag, title, points[], code, language, codeNote)\n- two-columns-compare (tag, title, col1Title, col1Items[], col2Title, col2Items[])\n- three-cards-grid (tag, title, cards[{badge,title,desc}])\n- timeline-steps (tag, title, steps[{stepNum,title,desc}])\n- metric-callout (tag, metric, metricLabel, title, desc)\n- checkpoint-quiz (tag, title, question, options[{label,text,isCorrect}], explanation)\n- summary-takeaways (tag, title, takeaways[], nextStep)\n\nMandatory Presenter Notes on every slide with Talk Track, Cold-Call, and Scaffolding Tip.`;\n      }\n\n      const slideCount = cfg.slideCount || 10;\n      const presentationStyle = cfg.presentationStyle || 'modern';\n      const presentationDuration = cfg.presentationDuration || 45;\n      const includeSpeakerNotes = cfg.includeSpeakerNotes !== false;\n\n      return `\n### 🎬 SLIDE PRESENTATION & MARP ARCHITECTURE INVARIANTS:\n1. **SLIDE COUNT & TIMING TARGET**:\n   - Generate EXACTLY ${slideCount} slides separated by \\`---\\` horizontal rules.\n   - Pacing: Target total duration is ${presentationDuration} minutes (~${Math.round(Number(presentationDuration) / Number(slideCount))} mins per slide).\n   - Visual Style: \"${presentationStyle.toUpperCase()}\". Maintain high visual clarity, contrasting accents, and executive polish.\n2. **STRICT CONCISENESS & 6x6 RULE (ABSOLUTELY NO TEXT WALLS)**:\n   - A slide is an INTERACTIVE PROJECTION CANVAS, NOT a textbook or lesson plan!\n   - Maximum 4–6 bullet points per slide.\n   - Maximum 8–12 words per bullet point. Forbid dense multi-sentence paragraphs on the slide surface.\n3. **SPEAKER NOTES FOR ALL SPOKEN WORDS (<!-- Presenter Notes: ... -->)**:\n   ${includeSpeakerNotes ? `- MANDATORY: Every single slide MUST contain structured presenter notes in \\`<!-- Presenter Notes: ... -->\\` at the bottom:\n     - SCRIPT: 60-90s teacher talk track with intuitive analogies.\n     - COLD CALL / CHECK: Diagnostic question to ask students.\n     - SCAFFOLDING / GOTCHA: How to resolve student misconceptions.\n     - PACING: Recommended minutes for the slide.` : '- Optional brief presenter notes.'}\n4. **2-COLUMN & CALLOUT CARD LAYOUTS**:\n   - Use \\`<div class=\"columns\"><div>...</div><div>...</div></div>\\` for comparisons, code vs. mechanics, or side-by-side tasks.\n   - Use \\`<div class=\"card\">\\`, \\`<div class=\"card highlight\">\\`, \\`<div class=\"card warning\">\\`, and \\`<div class=\"card success\">\\` for scannable chunking.\n5. **CLICK-TO-REVEAL SYSTEM**:\n   - Use \\`<!-- clicks -->\\` before bulleted lists (\\`<ul>\\` or \\`<ol>\\`) for incremental click-to-reveal.\n   - Use \\`<!-- click -->\\` before answers, code reveals, or key callouts.\n6. **CONCISE CODE SNIPPETS**:\n   - Maximum 6–10 lines of clean code per snippet with inline comments. Never paste whole files.\n7. **MERMAID VISUALS**:\n   - Use Mermaid flowcharts (\\`graph TD\\` or \\`graph LR\\`) or sequence diagrams for workflows and control loops.`;\n    }\n\n    case 'tiered_practice': {\n      const techStack = cfg.techStack || (req.hardwarePlatform?.[0] || 'Modern Programming Language');\n      const includeUnitTests = cfg.includeUnitTests !== false;\n\n      return `\n### 🪜 TIERED PRACTICE ARCHITECTURE INVARIANTS (3-TIER ADAPTIVE):\n- Target Technology Stack: \"${techStack}\"\n${includeUnitTests ? '- Automated Testing: Include explicit executable Unit Tests / Assertions for verifying Bronze, Silver, and Gold tiers.' : ''}\n1. **3 EXPLICIT RIGOR TIERS**:\n   - **🥉 Tier 1 (Bronze / Cơ bản)**: 70% starter boilerplate / 30% fill-in. Direct recall, scaffolded fill-in-the-blanks, single-concept recognition with starter hints.\n   - **🥈 Tier 2 (Silver / Tiêu chuẩn)**: 30% starter boilerplate / 70% implementation. Independent multi-step problem solving, bug identification, synthesis of 2+ concepts.\n   - **🥇 Tier 3 (Gold / Thử thách)**: 0% code / open architecture. Edge case handling, algorithmic optimization, open-ended architectural design or extension.\n2. **COMPLETE WORKED SOLUTIONS & ANSWER KEYS**:\n   - Provide step-by-step worked solutions for every problem across all 3 tiers.\n3. **SELF-DIAGNOSTIC RUBRIC**:\n   - Include a clear student rubric with criteria for when a student is ready to level up from Bronze ➔ Silver ➔ Gold.`;\n    }\n\n    case 'exit_ticket': {\n      const questionCount = cfg.questionCount || 3;\n      const diagnosticFocus = cfg.diagnosticFocus || 'misconceptions';\n\n      return `\n### 🎟️ EXIT TICKET ARCHITECTURE INVARIANTS:\n1. **EXACTLY ${questionCount} TARGETED ITEMS (3–5 MINUTE DURATION)**:\n   - Item 1: Quick diagnostic checking mastery of the core objective.\n   - Item 2: Application with diagnostic trap focusing on: \"${diagnosticFocus}\".\n   - Item 3: Metacognitive self-check (Confidence rating 1–5 + \"Explain what is still fuzzy\").\n2. **TEACHER DIAGNOSTIC INTERVENTION GUIDE**:\n   - Provide a quick lookup table: \"If student chooses/writes X ➔ Misconception is Y ➔ Quick remedy is Z\".${isPaperOnly ? '\\n3. **PRINTABLE CUT-OUT FORMAT**: Include student name/date line and cut-border dashed line.' : ''}`;\n    }\n\n    case 'quiz': {\n      const questionCount = cfg.questionCount || 5;\n      const questionTypes = Array.isArray(cfg.questionTypes) ? cfg.questionTypes.join(', ') : (cfg.questionTypes || 'multiple_choice');\n      const diagnosticFocus = cfg.diagnosticFocus || 'balanced';\n\n      return `\n### 📝 BLOOM-ALIGNED QUIZ ARCHITECTURE INVARIANTS:\n1. **EXACTLY ${questionCount} QUESTIONS (${questionTypes.toUpperCase()})**:\n   - Diagnostic emphasis: \"${diagnosticFocus}\".\n   - 40% Remember/Understand (Conceptual foundations).\n   - 40% Apply/Analyze (Bug finding, code tracing, scenario application).\n   - 20% Evaluate/Create (Algorithmic reasoning, trade-off evaluation).\n2. **HIGH-QUALITY DISTRACTORS WITH RATIONALE**:\n   - For every multiple choice item, explain WHY each incorrect option is a plausible misconception and WHY the key is correct.\n3. **COMPLETE ANSWER KEY & SCORING RUBRIC**:\n   - Explicit point distribution, partial credit guidelines, and sample ideal answers for open-ended questions.`;\n    }\n\n    case 'task_cards': {\n      const cardCount = cfg.cardCount || 12;\n      const cardUsage = cfg.cardUsage || 'stations';\n\n      return `\n### 📋 TASK CARDS ARCHITECTURE INVARIANTS:\n1. **SET OF EXACTLY ${cardCount} NUMBERED CARDS (Optimized for ${cardUsage.toUpperCase()})**:\n   - Clearly mark each card: Card # (1 to ${cardCount}), Difficulty (Foundation / Standard / Challenge), and Target Skill.\n2. **STUDENT RECORDING SHEET (BẢNG GHI ĐÁP ÁN)**:\n   - Include a structured printable grid where students record answers for Cards 1–${cardCount}.\n3. **TEACHER MASTER KEY**:\n   - Quick reference key with verified answers and explanations.${isPaperOnly ? '\\n4. **PRINT-READY CARD BORDERS**: Layout with clean visual borders ready for physical printing and cutting.' : ''}`;\n    }\n\n    case 'graphic_organizer': {\n      const diagramType = cfg.diagramType || 'concept_map';\n      const includeFillIn = cfg.includeFillInExercise !== false;\n\n      return `\n### 📊 GRAPHIC ORGANIZER ARCHITECTURE INVARIANTS:\n1. **VISUAL MODEL TYPE: \"${diagramType.toUpperCase()}\"**:\n   - Structure a clear cognitive thinking tool: Concept Map, Flowchart, Venn Diagram, Hierarchy Tree, or Cause-Effect Matrix.\n2. **VALID MERMAID SYNTAX**:\n   - Embed complete, 100% syntactically correct Mermaid diagrams showing the knowledge structure.\n3. **ACTIVE STUDENT INTERACTION PROMPTS**:\n   ${includeFillIn ? '- Include interactive fill-in-the-blank nodes and connection articulation challenges.' : '- Include synthesis and reflection prompts based on the visual model.'}`;\n    }\n\n    case 'choice_board': {\n      const gridSize = cfg.gridSize || '3x3';\n      const completionRule = cfg.completionRule || 'row_column_diagonal';\n\n      return `\n### 🎯 CHOICE BOARD ARCHITECTURE INVARIANTS (UDL ${gridSize.toUpperCase()} MATRIX):\n1. **${gridSize.toUpperCase()} MENU (UDL MULTIPLE MEANS OF EXPRESSION)**:\n   - Option tasks spanning practical coding, architectural diagrams, analytical writing, and real-world scenarios.\n2. **COMPLETION CONTRACT: \"${completionRule.toUpperCase()}\"**:\n   - Explicit rule (e.g. Tic-Tac-Toe 3-in-a-row/column/diagonal, or Point Bounty system).\n3. **UNIFIED EVALUATION RUBRIC**:\n   - Consistent grading criteria applicable across all task choices on the board.`;\n    }\n\n    case 'station_rotation': {\n      const stationCount = cfg.stationCount || 3;\n      const stationDuration = cfg.stationDuration || 15;\n\n      return `\n### 🔄 STATION ROTATION ARCHITECTURE INVARIANTS:\n1. **EXACTLY ${stationCount} STATIONS SCALED FOR ${studentCount} STUDENTS**:\n   - Group size: ~${Math.ceil(Number(studentCount) / Number(stationCount)) || 7} students per group.\n   - Distinct station roles: Teacher-Led Small Group, Independent Practical Lab, Collaborative / Unplugged Peer Challenge.\n2. **TIMING & TRANSITIONS (${stationDuration} MINS/STATION)**:\n   - ${stationDuration} minutes per station + 3-minute structured rotation protocol.\n3. **STATION DELIVERABLES & ACCOUNTABILITY**:\n   - Clear check-in deliverable required at each station to ensure on-task accountability.`;\n    }\n\n    case 'act':\n    case 'codelab':\n    case 'science_lab': {\n      const techStack = cfg.techStack || (req.hardwarePlatform?.[0] || 'Modern Programming Language');\n      const includeUnitTests = cfg.includeUnitTests !== false;\n\n      return `\n### 💻 HANDS-ON LAB & CODE ACTIVITY ARCHITECTURE INVARIANTS:\n- Technology Stack: \"${techStack}\"\n${includeUnitTests ? '- Unit Testing: Provide automated assertions or test runner checks.' : ''}\n1. **100% RUNNABLE CODE / RIGOROUS PROCEDURE**:\n   - Absolutely no fake APIs, mock functions, or non-executable pseudocode.\n2. **STRUCTURED LAB PHASES**:\n   - Objective & Environmental Prerequisites.\n   - Starter Skeleton Code with clear \\`// TODO [Student Task]\\` comments.\n   - Step-by-step Guided Challenges (Level 1 ➔ Level 2 ➔ Level 3).\n   - Automated Verification / Test Cases.\n   - Complete Reference Solution with design explanation.`;\n    }\n\n    case 'bell_ringer':\n      return `\n### 🔔 BELL RINGER ARCHITECTURE INVARIANTS (3–5 MIN WARM-UP):\n1. **3 QUICK HOOK QUESTIONS**:\n   - 2 rapid-fire recall questions activating previous knowledge.\n   - 1 curiosity hook question bridging into today's core topic.\n2. **60-SECOND TEACHER REVIEW KEY**:\n   - Quick-glance answer key for instant whole-class review.`;\n\n    case 'review_game':\n      return `\n### 🎮 REVIEW GAME ARCHITECTURE INVARIANTS:\n1. **GAMIFIED STRUCTURE**:\n   - Jeopardy-style board (3–4 Categories x 3 Point Values: 100 / 200 / 300) OR 3-Round Interactive Trivia.\n2. **CLEAR RULES & TEAM DYNAMICS**:\n   - Team scoring rules, buzz-in protocol, and tie-breaker challenge.\n3. **COMPLETE QUESTION & ANSWER DECK**:\n   - Verified answers and point values for the host/teacher.`;\n\n    case 'guide': {\n      const lessonDuration = cfg.lessonDuration || 90;\n      return `\n### 📖 TEACHER GUIDE ARCHITECTURE INVARIANTS (${lessonDuration} MINS LESSON):\n1. **MINUTE-BY-MINUTE PACING TIMELINE**:\n   - Pacing broken down for ${lessonDuration} minutes (Hook, Modeling, Guided Practice, Independent Practice, Debrief).\n2. **SOCRATIC QUESTIONS & PROMPTS**:\n   - Cold-call questions with anticipated student misconceptions and remediation scripts.\n3. **DIFFERENTIATION STRATEGIES**:\n   - Specific adaptations for students needing support vs. high-flyers needing extension.`;\n    }\n\n    case 'worksheet':\n    case 'handout':\n      return `\n### 📑 WORKSHEET / HANDOUT ARCHITECTURE INVARIANTS:\n1. **I DO ➔ WE DO ➔ YOU DO SCAFFOLDING**:\n   - Part 1 (I Do): Fully worked and annotated example.\n   - Part 2 (We Do): Guided problem with fill-in hints and scaffolding scaffolds.\n   - Part 3 (You Do): Independent mastery challenge.\n2. **SELF-CHECK RUBRIC**:\n   - End-of-worksheet self-evaluation checklist.${isPaperOnly ? '\\n3. **PRINTABLE WORKSPACES**: Include spacious, clean write-in boxes and workspace for calculations/code.' : ''}`;\n\n    case 'rubric': {\n      const rubricScale = cfg.rubricScale || '4_levels';\n      return `\n### 📊 ANALYTIC RUBRIC ARCHITECTURE INVARIANTS (${rubricScale.toUpperCase()} SCALE):\n1. **RIGOROUS PROFICIENCY LEVELS**:\n   - 4 Proficiency Levels: Level 4 (Exemplary) | Level 3 (Proficient) | Level 2 (Developing) | Level 1 (Beginning).\n2. **CONCRETE OBSERVABLE CRITERIA**:\n   - Each cell MUST describe concrete, observable behavioral evidence, not vague words like \"good\" or \"average\".`;\n    }\n\n    case 'glossary':\n      return `\n### 📚 TECHNICAL GLOSSARY ARCHITECTURE INVARIANTS:\n1. **COMPREHENSIVE TERM PROFILES**:\n   - For every key term: Technical Definition, Real-world Analogy, Code Syntax Example, and Common Misconception.`;\n\n    case 'bom':\n      return `\n### 📦 BILL OF MATERIALS (BOM) ARCHITECTURE INVARIANTS:\n1. **CLASS-SCALED INVENTORY FOR ${studentCount} STUDENTS**:\n   - Exact quantities calculated for ${studentCount} students.\n   - Component specifications, estimated unit cost, and affordable alternatives.`;\n\n    case 'ext': {\n      const zpdCeilingRule = `- 🎯 CURRICULUM HORIZON ALLOWED SPACE & BOUNDARY MANDATE:\n  • SCOPE LOCK: All extension challenges MUST be 100% solvable using ONLY items from the student's Mastered Vocabulary and Current Lesson Scope.\n  • STRICTLY FORBIDDEN: NEVER introduce unintroduced APIs or mechanisms from upcoming lessons (No complex event buses, No remote network/API calls, No persistent databases, No async concurrency, No out-of-scope hardware/sensors unless explicitly part of the allowed toolkit).`;\n\n      return `\n### 🚀 EXTENSION CHALLENGE ARCHITECTURE INVARIANTS:\n${zpdCeilingRule}\n1. **STRUCTURED 3-TIER CHALLENGES**:\n   - Challenge 1 (Mission Briefing): High-stakes real-world scenario applying today's concepts.\n   - Challenge 2 (Architectural Constraints & Edge Cases): Deeper technical rules without violating prerequisite boundaries.\n   - Challenge 3 (Extension Milestones): Progressive milestones (Level 1: Novice → Level 2: Advanced → Level 3: Master).\n2. **METACOGNITIVE & ENGINEERING TRADE-OFFS**:\n   - Explicit reflection prompts evaluating architectural choices, code maintainability, and design patterns.`;\n    }\n\n    case 'lesson': {\n      const lessonDuration = cfg.lessonDuration || 90;\n      const pedagogicalModel = cfg.pedagogicalModel || req.pedagogy || '5e';\n      return `\n### 🎓 CANONICAL LESSON PLAN INVARIANTS (${pedagogicalModel.toUpperCase()} MODEL, ${lessonDuration} MINS):\n1. **A. LESSON DESIGN PLAN**:\n   - Learning Objectives (Bloom-aligned) & Observable Student Evidence.\n   - Activity Sequence mapping every phase with timing totaling ${lessonDuration} minutes.\n   - Resource Map & Assessment Map with explicit Artifact Contracts.\n2. **B. LESSON FLOW**:\n   - Detailed teacher moves, student actions, scripted key questions, and check-for-understanding points for every activity phase.`;\n    }\n\n    default:\n      return '';\n  }\n}\n\n/**\n * Generates rich markdown scaffolding when the physical template file is not found on disk\n */\nfunction getDefaultFallbackTemplate(type: ArtifactType, title: string, id: string): string {\n  const upperType = type.toUpperCase();\n  return `---\nid: \"${id}\"\ntitle: \"${title}\"\ntype: \"${upperType}\"\nversion: \"1.0.0\"\ndate: \"${new Date().toISOString().split('T')[0]}\"\n---\n\n# ${title}\n\n## 1. Overview & Learning Objectives\n<!-- [REQUIRED] State 2-3 measurable, Bloom-aligned learning objectives -->\n\n## 2. Core Pedagogical Content\n<!-- [REQUIRED] Provide the core educational substance, questions, problems, and diagrams -->\n\n## 3. Practice & Differentiation\n<!-- [REQUIRED] Tiered support, worked examples, and challenges -->\n\n## 4. Assessment & Answer Key\n<!-- [REQUIRED] Complete solutions, rubrics, and diagnostic teacher feedback -->\n`;\n}\n","// contextRouting.ts\n//\n// P43 Dependency Routing Matrix: canonical contract defining which knowledge/activity\n// sources are MANDATORY vs OPTIONAL for each artifact type.\n//\n// Enforces fail-closed validation before invoking AI generation to prevent\n// halluncinated content, disconnected timelines, and ungrounded activities.\n\nimport { createContextMissingError, type CurriculumError } from '../errors';\nimport { getContract } from '../registry/index.js';\n\nexport type ContextSourceKey =\n  | 'KNOWLEDGE_EXPOSITION'\n  | 'CANONICAL_LESSON'\n  | 'SESSION_SLICE'\n  | 'FRAMEWORK_EXCERPT'\n  | 'STYLE_GUIDE'\n  | 'REFERENCE_PACK'\n  | 'LESSON_OBJECTIVES';\n\nexport interface ArtifactDependencyRule {\n  required: ContextSourceKey[];\n  optional?: ContextSourceKey[];\n  rationale: string;\n}\n\nexport const ARTIFACT_DEPENDENCY_ROUTING: Record<string, ArtifactDependencyRule> = {\n  LESSON: {\n    required: ['KNOWLEDGE_EXPOSITION', 'SESSION_SLICE', 'FRAMEWORK_EXCERPT'],\n    optional: ['STYLE_GUIDE', 'REFERENCE_PACK'],\n    rationale: 'Dạy theo kiến thức chuẩn của plan, phân bổ mục tiêu và khung chương trình',\n  },\n  HANDOUT: {\n    required: ['KNOWLEDGE_EXPOSITION'],\n    optional: ['SESSION_SLICE'],\n    rationale: 'Tài liệu tự học — bám khái niệm chuẩn, không cần activity timeline',\n  },\n  EXT: {\n    required: ['KNOWLEDGE_EXPOSITION'],\n    optional: ['SESSION_SLICE'],\n    rationale: 'Thử thách mở rộng chuyên sâu bám khái niệm',\n  },\n  CODE: {\n    required: ['KNOWLEDGE_EXPOSITION'],\n    optional: ['LESSON_OBJECTIVES'],\n    rationale: 'Code lab thực hành bám khái niệm kỹ thuật và ví dụ worked examples',\n  },\n  ACT: {\n    required: ['CANONICAL_LESSON'],\n    optional: ['KNOWLEDGE_EXPOSITION', 'SESSION_SLICE'],\n    rationale: 'STEM Activity Lab bắt buộc phải khớp 100% Activity Sequence và Lesson Flow của LESSON',\n  },\n  WKS: {\n    required: ['CANONICAL_LESSON'],\n    optional: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Phiếu học tập (Worksheet) luyện tập theo các chặng hoạt động của giáo án',\n  },\n  GUIDE: {\n    required: ['CANONICAL_LESSON'],\n    optional: ['SESSION_SLICE'],\n    rationale: 'Kịch bản sư phạm giáo viên (Teacher Guide) bám sát timeline từng phút của LESSON',\n  },\n  SLIDE: {\n    required: ['CANONICAL_LESSON'],\n    optional: ['KNOWLEDGE_EXPOSITION'],\n    rationale: 'Slide bài giảng trình chiếu theo cấu trúc phân phối nội dung của giáo án',\n  },\n  QUIZ: {\n    required: ['KNOWLEDGE_EXPOSITION', 'CANONICAL_LESSON'],\n    optional: ['SESSION_SLICE'],\n    rationale: 'Ngân hàng câu hỏi đánh giá cả kiến thức chuẩn mực (KX) lẫn mục tiêu bài dạy (LESSON)',\n  },\n};\n\nexport interface ValidationOptions {\n  lessonId?: string;\n  agent?: string;\n  failClosed?: boolean;\n}\n\nexport interface DependencyValidationResult {\n  valid: boolean;\n  missing: ContextSourceKey[];\n  error?: CurriculumError;\n}\n\n/**\n * Validates that all required context sources are present and non-empty for an artifact.\n * When failClosed is true (default), throws CurriculumError(ERR_CONTEXT_MISSING) on first missing source.\n */\nexport function validateArtifactDependencies(\n  artifactType: string,\n  availableSources: Partial<Record<ContextSourceKey, any>>,\n  opts: ValidationOptions = {}\n): DependencyValidationResult {\n  const normType = (artifactType || '').toUpperCase().trim();\n  const rule = ARTIFACT_DEPENDENCY_ROUTING[normType];\n  const failClosed = opts.failClosed ?? true;\n\n  const requiredSources = rule ? rule.required : (getContract(artifactType)?.inputContract.requiredSources ?? []);\n\n  if (!rule && requiredSources.length === 0) {\n    return { valid: true, missing: [] };\n  }\n\n  const missing: ContextSourceKey[] = [];\n\n  for (const req of requiredSources) {\n    const val = availableSources[req];\n    const isPresent = val !== undefined && val !== null && (typeof val === 'string' ? val.trim().length > 0 : true);\n    if (!isPresent) {\n      missing.push(req);\n    }\n  }\n\n  if (missing.length > 0) {\n    const err = createContextMissingError({\n      artifactType: normType,\n      missingSource: missing[0],\n      lessonId: opts.lessonId,\n      agent: opts.agent,\n    });\n\n    if (failClosed) {\n      throw err;\n    }\n\n    return { valid: false, missing, error: err };\n  }\n\n  return { valid: true, missing: [] };\n}\n","export * from './types';\nexport * from './imageProviders';\nexport * from './stockSearch';export * from './ledger';\nexport * from './curator';\nexport * from './orchestrate';\nexport * from './slideImages';\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * Media Ledger — sổ cái ảnh per-lesson (JSONL), nguồn chân lý cho quy hoạch ảnh.\n * Vòng đời entry: pending → approved (Curator chốt) → done | failed (kèm lastError)\n * Agent tạo artifact chỉ APPEND (pending). Curator quyết định. Orchestrator thực thi.\n * Idempotent: 1 slug chỉ có 1 entry active; append cùng slug → cập nhật, không trùng.\n */\n\nexport type MediaLedgerMode = 'generate' | 'search';\nexport type MediaLedgerStatus = 'pending' | 'approved' | 'rejected' | 'done' | 'failed';\n\nexport interface MediaLedgerEntry {\n  /** Định danh ảnh trong bài, vd 'img-loop-diagram' — unique per lesson */\n  slug: string;\n  /** Artifact chứa slot, vd 'LESSON_U01_M01_L01' */\n  artifactId: string;\n  /** Tên ảnh (human-readable) */\n  name: string;\n  /** Mô tả chi tiết nội dung ảnh — input chính cho Curator enrich + agent con */\n  description: string;\n  /** 'generate' (AI) hoặc 'search' (ảnh/video thật) */\n  mode: MediaLedgerMode;\n  /** Vị trí chèn: markdown heading/anchor gần nhất trong artifact */\n  anchor?: string;\n  status: MediaLedgerStatus;\n  /** Provider đã dùng (set khi done) */\n  provider?: string;\n  /** Inline Markdown credit (tác giả + nguồn + license) — từ multimedia-kit AttributionBuilder */\n  attribution?: string;\n  /** Path tương đối trong project sau khi done: _media/xxx.png */\n  relPath?: string;\n  /** Prompt cuối (đã enrich) — audit/debug */\n  finalPrompt?: string;\n  lastError?: string;\n  retryCount?: number;\n  /** Quyết định của Curator: mã lý do (duplicate/content_mismatch/...) — audit + user override */\n  decisionReasonCode?: string;\n  decisionReason?: string;\n  updatedAt: string;\n}\n\nexport class MediaLedger {\n  readonly filePath: string;\n  private entries: Map<string, MediaLedgerEntry> = new Map();\n\n  constructor(projectDir: string, lessonId: string) {\n    this.filePath = path.join(projectDir, '_media', `ledger-${lessonId.toUpperCase()}.jsonl`);\n    this.load();\n  }\n\n  private load(): void {\n    this.entries.clear();\n    if (!fs.existsSync(this.filePath)) return;\n    const lines = fs.readFileSync(this.filePath, 'utf-8').split('\\n');\n    for (const line of lines) {\n      const trimmed = line.trim();\n      if (!trimmed) continue;\n      try {\n        const e = JSON.parse(trimmed) as MediaLedgerEntry;\n        this.entries.set(e.slug, e); // last-wins\n      } catch { /* dòng hỏng — bỏ qua nhưng không giấu: giữ file nguyên */ }\n    }\n  }\n\n  private persist(): void {\n    fs.mkdirSync(path.dirname(this.filePath), { recursive: true });\n    fs.writeFileSync(this.filePath, Array.from(this.entries.values()).map(e => JSON.stringify(e)).join('\\n') + '\\n', 'utf-8');\n  }\n\n  /** Agent tạo artifact ghi entry mới (hoặc cập nhật nếu slug đã có và chưa done) */\n  upsert(input: Omit<MediaLedgerEntry, 'status' | 'updatedAt'> & { status?: MediaLedgerStatus }): MediaLedgerEntry {\n    const existing = this.entries.get(input.slug);\n    if (existing && (existing.status === 'done')) return existing; // done là bất biến\n    const entry: MediaLedgerEntry = { ...input, status: input.status ?? 'pending', updatedAt: new Date().toISOString() };\n    this.entries.set(input.slug, entry);\n    this.persist();\n    return entry;\n  }\n\n  get(slug: string): MediaLedgerEntry | undefined { return this.entries.get(slug); }\n  list(): MediaLedgerEntry[] { return Array.from(this.entries.values()); }\n  listByStatus(status: MediaLedgerStatus): MediaLedgerEntry[] { return this.list().filter(e => e.status === status); }\n  pending(): MediaLedgerEntry[] { return this.listByStatus('pending'); }\n\n  setStatus(slug: string, status: MediaLedgerStatus, patch: Partial<MediaLedgerEntry> = {}): MediaLedgerEntry | undefined {\n    const e = this.entries.get(slug);\n    if (!e) return undefined;\n    Object.assign(e, patch, { status, updatedAt: new Date().toISOString() });\n    if (status === 'failed') e.retryCount = (e.retryCount ?? 0) + 1;\n    this.entries.set(slug, e);\n    this.persist();\n    return e;\n  }\n\n  /** Đếm ảnh đã done trong lesson — để Curator tôn trọng maxImages */\n  doneCount(): number { return this.listByStatus('done').length; }\n\n  /**\n   * Scan artifact content và seed pending entries cho mọi placeholder [IMAGE: slug].\n   * Được gọi sau khi agent sinh artifact (trước khi Curator duyệt) — đây là cầu nối\n   * duy nhất giữa \"agent chèn placeholder\" và \"sổ cái có entry để Curator/Fulfiller xử\".\n   * Idempotent: slug đã có entry active (pending/approved/done) → giữ nguyên;\n   * chỉ re-describe khi entry trước bị rejected/failed.\n   */\n  seedFromArtifact(artifactId: string, content: string): MediaLedgerEntry[] {\n    const seeded: MediaLedgerEntry[] = [];\n    const re = /\\[IMAGE\\s*:\\s*([a-z0-9][a-z0-9-]*)\\s*\\]/gi;\n    const seen = new Set<string>();\n    let m: RegExpExecArray | null;\n    while ((m = re.exec(content)) !== null) {\n      const slug = m[1].toLowerCase();\n      if (seen.has(slug)) continue;\n      seen.add(slug);\n      const existing = this.entries.get(slug);\n      const isActive = existing && (existing.status === 'pending' || existing.status === 'approved' || existing.status === 'done');\n      if (isActive) continue;\n      seeded.push(this.upsert({\n        slug,\n        artifactId,\n        name: slug.replace(/^(img-|image-)/, '').replace(/-/g, ' '),\n        description: `Placeholder chèn bởi agent trong artifact ${artifactId} — chờ Curator enrich (mô tả gốc chưa có).`,\n        mode: 'generate',\n        status: 'pending',\n      }));\n    }\n    return seeded;\n  }\n}","import { runCurriculumAIInference, type StreamRunnerOptions } from '../ai/streamRunner';\nimport type { MediaLedger, MediaLedgerEntry } from './ledger';\nimport { MediaError } from './types';\n\nexport type MediaPolicyMode = 'search_only' | 'gen_only' | 'auto';\n\nexport interface MediaPolicy {\n  /** Giới hạn số ảnh ĐƯỢC GEN (AI) tối đa per artifact — search kho ảnh KHÔNG tốn quota */\n  maxGenImagesPerArtifact: number;\n  /** Ưu tiên provider khi mode=generate */\n  preferredProvider?: 'openai' | 'gemini';\n  /**\n   * Chiến lược nguồn ảnh:\n   * — search_only: chỉ tìm kho ảnh (Pexels), không sinh AI\n   * — gen_only: chỉ sinh AI, bỏ qua kho ảnh\n   * — auto: LUÔN search trước, không có kết quả mới generate (mặc định)\n   */\n  mode?: MediaPolicyMode;\n}\n\nexport interface CurationDecision {\n  slug: string;\n  action: 'approve' | 'drop' | 're-describe';\n  /** Mã lý do máy-đọc-được — bắt buộc khi drop, để audit + user có thể override */\n  reasonCode?: 'duplicate' | 'content_mismatch' | 'low_quality_description' | 'over_quota' | 'none_needed';\n  /** Mô tả đã enrich (grade band, style, pedagogy) — chỉ khi approve/re-describe */\n  enrichedPrompt?: string;\n  reason: string;\n}\n\nexport interface CurateOptions {\n  ledger: MediaLedger;\n  /** Nội dung artifact ĐÃ PASS judge (markdown, strip YAML) */\n  artifactContent: string;\n  policy: MediaPolicy;\n  /** Ngữ cảnh dự án: grade band, style guide, tiêu đề bài */\n  context: {\n    lessonTitle?: string;\n    gradeBand?: [number, number];\n    styleGuideExcerpt?: string;\n    language?: string;\n  };\n  llm?: StreamRunnerOptions;\n}\n\n/**\n * Curator: phân tích toàn bộ sổ cái + nội dung đã chốt → quyết định ảnh nào tạo.\n * Tôn trọng maxImagesPerArtifact (count cả ảnh done + pending được approve).\n * LLM trả JSON: [{slug, action, enrichedPrompt, reason}]. Parse lỗi → MediaError rõ ràng.\n */\nexport async function curateMediaLedger(options: CurateOptions): Promise<CurationDecision[]> {\n  const { ledger, artifactContent, policy, context } = options;\n  const pendingEntries = ledger.pending();\n  if (pendingEntries.length === 0) return [];\n\n  const genQuota = Math.max(0, (policy.maxGenImagesPerArtifact ?? 3) - ledger.doneCount());\n  const entriesBrief = pendingEntries.map(e => `- slug=${e.slug} | mode=${e.mode} | name=${e.name} | desc=${e.description.slice(0, 300)}`).join('\\n');\n\n  const prompt = `Bạn là Media Curator cho học liệu giáo dục. Sổ cái có ${pendingEntries.length} ảnh đề xuất (pending), đã có ${ledger.doneCount()} ảnh hoàn tất, quota GEN tối đa ${policy.maxGenImagesPerArtifact} ảnh/bài (search kho ảnh KHÔNG tốn quota — xử ở tầng thực thi).\n${context.lessonTitle ? `Bài học: ${context.lessonTitle}` : ''}\n${context.gradeBand ? `Grade band: ${context.gradeBand[0]}-${context.gradeBand[1]}` : ''}\n\nCác ảnh đề xuất (sổ cái):\n${entriesBrief}\n\nNội dung bài (đã duyệt):\n${artifactContent.slice(0, 12000)}\n\nQUY TẮC PHÂN BỔ THEO 2 TRƯỜNG HỢP:\nA) Nếu ${pendingEntries.length} <= ${genQuota}: APPROVE TẤT CẢ — trừ khi có lý do CỨNG:\n   - duplicate: 2+ ảnh cùng chủ đề (chỉ giữ 1, cái còn lại action=drop reasonCode=duplicate)\n   - content_mismatch: mô tả không liên quan gì đến nội dung bài\n   - low_quality_description: mô tả mơ hồ đến mức không thể tạo ảnh dùng được (vd \"ảnh minh họa chung\")\n   KHÔNG được drop vì \"cảm thấy không cần\" — agent tạo đã lọc từ đầu.\nB) Về quota GEN (tối đa ${policy.maxGenImagesPerArtifact} ảnh AI/bài): KHÔNG drop ở bước này vì quota —\n   tầng thực thi sẽ search kho ảnh trước cho mọi slot, chỉ những slot search-miss mới được xếp hạng để gen.\n   Việc của bạn ở đây: approve/re-describe/drop theo 3 lý do CỨNG ở trên.\n\nVới mỗi ảnh approve/re-describe: viết enrichedPrompt TIẾNG ANH chi tiết (subject, layout, labeled parts, educational-diagram style, age-appropriate).\nKHÔNG BAO GIỜ approve vượt ${genQuota}.\n\nTrả về CHÍNH XÁC JSON (không markdown fence) cho TẤT CẢ các slug:\n[{\"slug\":\"...\",\"action\":\"approve|drop|re-describe\",\"reasonCode\":\"duplicate|content_mismatch|low_quality_description|over_quota\",\"enrichedPrompt\":\"...\",\"reason\":\"...\"}]`;\n\n  const raw = await runCurriculumAIInference(\n    [{ role: 'user', content: prompt }],\n    '',\n    options.llm || {}\n  );\n\n  const jsonMatch = raw.match(/\\[[\\s\\S]*\\]/);\n  if (!jsonMatch) throw new MediaError(`Curator LLM trả về không parse được JSON: ${raw.slice(0, 200)}`, 'curator');\n  let decisions: CurationDecision[];\n  try {\n    decisions = JSON.parse(jsonMatch[0]);\n  } catch (e: any) {\n    throw new MediaError(`Curator JSON invalid: ${e?.message}`, 'curator');\n  }\n\n  // Validate + enforce maxImages server-side (LLM không được vượt quota) + kiểm định danh\n  const validSlugs = new Set(pendingEntries.map(e => e.slug));\n  decisions = decisions.filter(d => validSlugs.has(d.slug)); // bỏ slug bịa\n\n  const approved = decisions.filter(d => d.action === 'approve' || d.action === 're-describe');\n  const overflow = approved.slice(genQuota);\n  for (const d of overflow) {\n    d.action = 'drop';\n    d.reasonCode = 'over_quota';\n    d.reason = 'Vượt maxImagesPerArtifact sau kiểm tra server-side';\n  }\n\n  // Bắt buộc reasonCode khi drop — fallback 'none_needed' nếu LLM quên\n  for (const d of decisions) {\n    if (d.action === 'drop' && !d.reasonCode) d.reasonCode = 'none_needed';\n  }\n\n  // Persist quyết định vào sổ cái (kèm reasonCode để audit + user override)\n  for (const d of decisions) {\n    if (d.action === 'drop') {\n      ledger.setStatus(d.slug, 'rejected', { decisionReasonCode: d.reasonCode, decisionReason: d.reason, lastError: d.reason });\n    } else {\n      ledger.setStatus(d.slug, 'approved', { decisionReasonCode: undefined, decisionReason: d.reason, finalPrompt: d.enrichedPrompt });\n    }\n  }\n  return decisions;\n  \n\n}\n/** Input ranking cho 1 gen candidate */\nexport interface GenCandidate {\n  slug: string;\n  name: string;\n  description: string;\n}\n\nexport interface GenRanking {\n  /** Slugs được quyền gen (≤ quota) theo thứ tự ưu tiên */\n  selected: string[];\n  /** Slots không được gen kèm lý do */\n  dropped: Array<{ slug: string; rank: number }>;\n}\n\n/**\n * Xếp hạng gen candidates khi số slot search-miss (hoặc gen_only tổng slot) VƯỢT quota gen.\n * Chỉ xếp hạng theo mức cần thiết của minh họa cho hiểu bài — KHÔNG đụng ledger (orchestrate lo persist).\n * LLM fail → fallback first-come theo thứ tự sổ cái + log warning rõ (degradation có chủ đích, không im lặng).\n */\nexport async function rankGenCandidates(\n  candidates: GenCandidate[],\n  quota: number,\n  context: { lessonTitle?: string; gradeBand?: [number, number] },\n  llm?: StreamRunnerOptions\n): Promise<GenRanking> {\n  if (candidates.length <= quota) {\n    return { selected: candidates.map(c => c.slug), dropped: [] };\n  }\n\n  const brief = candidates.map((c, i) => `${i + 1}. slug=${c.slug} | name=${c.name} | desc=${c.description.slice(0, 250)}`).join('\\n');\n  const prompt = `Xếp hạng ${candidates.length} ảnh minh họa giáo dục, chọn ĐÚNG ${quota} ảnh ưu tiên gen (ảnh AI tốn kém).\n${context.lessonTitle ? `Bài học: ${context.lessonTitle}` : ''}\n${context.gradeBand ? `Grade band: ${context.gradeBand[0]}-${context.gradeBand[1]}` : ''}\n\nCandidates:\n${brief}\n\nThứ tự ưu tiên:\n1. Diagram/sơ đồ giải thích khái niệm trừu tượng hoặc quy trình nhiều bước (thiếu là khó hiểu nhất)\n2. Minh họa step-by-step thực hành (wiring, thao tác, UI)\n3. Ảnh bối cảnh/động lực (ít cần nhất)\n\nTrả CHÍNH XÁC JSON (không fence): {\"selected\":[\"slug1\",\"slug2\",...]} — đúng ${quota} slugs, theo thứ tự ưu tiên.`;\n\n  try {\n    const raw = await runCurriculumAIInference([{ role: 'user', content: prompt }], '', llm || {});\n    const m = raw.match(/\\{[\\s\\S]*\\}/);\n    if (!m) throw new Error('no JSON in response');\n    const parsed = JSON.parse(m[0]) as { selected?: string[] };\n    const valid = (parsed.selected || []).filter(s => candidates.some(c => c.slug === s)).slice(0, quota);\n    if (valid.length === 0) throw new Error('empty selection');\n    const selectedSet = new Set(valid);\n    // Fill nếu LLM chọn thiếu quota: lấy theo thứ tự gốc\n    for (const c of candidates) {\n      if (valid.length >= quota) break;\n      if (!selectedSet.has(c.slug)) { valid.push(c.slug); selectedSet.add(c.slug); }\n    }\n    const dropped = candidates.filter(c => !selectedSet.has(c.slug)).map((c, i) => ({ slug: c.slug, rank: i + 1 }));\n    return { selected: valid, dropped };\n  } catch (err: any) {\n    // KHÔNG giấu lỗi — warn rõ rồi fallback first-come (ổn định, không chặn pipeline)\n    console.warn('[curator] rankGenCandidates LLM failed — fallback first-come order:', err?.message || err);\n    const selected = candidates.slice(0, quota).map(c => c.slug);\n    const dropped = candidates.slice(quota).map((c, i) => ({ slug: c.slug, rank: i + 1 }));\n    return { selected, dropped };\n  }\n}","import fs from 'fs';\nimport path from 'path';\nimport { generateEducationalImage } from './imageProviders';\nimport { searchEducationalImages, searchEducationalVideos } from './stockSearch';\nimport type { MediaProvider } from './types';\nimport { MediaLedger, type MediaLedgerEntry } from './ledger';\nimport { rankGenCandidates, curateMediaLedger } from './curator';\nimport type { MediaPolicy } from './curator';\nimport type { StreamRunnerOptions } from '../ai/streamRunner';\n\nexport interface FulfillOptions {\n  ledger: MediaLedger;\n  projectDir: string;\n  policy: MediaPolicy;\n  /** Tỷ lệ khung mặc định cho artifact type (SLIDE → 16:9) */\n  defaultAspect?: '1:1' | '16:9' | '4:3' | '3:4';\n  apiKeyOverrides?: { openai?: string; gemini?: string; pexels?: string };\n  /** Số lần retry tối đa trước khi đánh dấu failed vĩnh viễn */\n  maxRetries?: number;\n  /** Ngữ cảnh cho gen-ranking (khi search-miss vượt quota gen) */\n  rankingContext?: { lessonTitle?: string; gradeBand?: [number, number] };\n  llm?: StreamRunnerOptions;\n  onProgress?: (slug: string, status: string, detail?: string) => void;\n}\n\nexport interface FulfillResult {\n  done: string[];\n  failed: string[];\n  skipped: string[];\n}\n\n/**\n * Thực thi các entry approved trong sổ cái (từng ảnh độc lập — lỗi 1 ảnh không chặn ảnh khác).\n * generate → base64 → save file _media/; search → lưu URL đầu tiên (metadata vào ledger).\n * Quá maxRetries → status 'failed', slot giữ placeholder trong markdown (client render).\n */\nexport async function fulfillMediaLedger(options: FulfillOptions): Promise<FulfillResult> {\n  const { ledger, projectDir, policy } = options;\n  const maxRetries = options.maxRetries ?? 2;\n  const approved = ledger.listByStatus('approved');\n  const result: FulfillResult = { done: [], failed: [], skipped: [] };\n\n  const mediaDir = path.join(projectDir, '_media');\n  fs.mkdirSync(mediaDir, { recursive: true });\n\n  const mode = policy.mode ?? 'auto';\n  const canSearch = mode === 'search_only' || mode === 'auto';\n  const canGen = mode === 'gen_only' || mode === 'auto';\n\n  // ── PHA 1: SEARCH kho ảnh cho TẤT CẢ slots (search không tốn quota gen) ──\n  const searchMisses: typeof approved = [];\n  if (canSearch) {\n    for (const entry of approved) {\n      if ((entry.retryCount ?? 0) >= maxRetries) { result.skipped.push(entry.slug); continue; }\n      options.onProgress?.(entry.slug, 'searching');\n      try {\n        const images = await searchEducationalImages({\n          query: entry.finalPrompt || entry.description,\n          perPage: 1,\n          apiKey: options.apiKeyOverrides?.pexels,\n        });\n        const target = images[0];\n        if (target) {\n          ledger.setStatus(entry.slug, 'done', { relPath: target.url, provider: 'pexels' });\n          result.done.push(entry.slug);\n          options.onProgress?.(entry.slug, 'done', 'source: pexels');\n        } else {\n          searchMisses.push(entry);\n        }\n      } catch (err: any) {\n        if (mode === 'search_only') {\n          // search_only: lỗi search = thất bại slot (đúng nghĩa chế độ)\n          const msg = err?.message || String(err);\n          ledger.setStatus(entry.slug, 'failed', { lastError: msg });\n          options.onProgress?.(entry.slug, 'failed', msg);\n          result.failed.push(entry.slug);\n        } else {\n          searchMisses.push(entry); // auto: search lỗi → coi như miss, thử gen\n        }\n      }\n    }\n  } else {\n    // gen_only: mọi slot là \"miss\" đối với search\n    for (const entry of approved) {\n      if ((entry.retryCount ?? 0) >= maxRetries) { result.skipped.push(entry.slug); continue; }\n      searchMisses.push(entry);\n    }\n  }\n\n  // ── PHA 2: GEN cho search-miss — nếu vượt genQuota → rankGenCandidates xếp hạng ──\n  if (canGen && searchMisses.length > 0) {\n    const genQuota = Math.max(0, (policy.maxGenImagesPerArtifact ?? 3) - ledger.doneCount());\n    let toGen: typeof approved = [];\n    if (searchMisses.length > genQuota) {\n      const ranking = await rankGenCandidates(\n        searchMisses.map(e => ({ slug: e.slug, name: e.name, description: e.finalPrompt || e.description })),\n        genQuota,\n        options.rankingContext || {},\n        options.llm\n      );\n      const allowed = new Set(ranking.selected);\n      toGen = searchMisses.filter(e => allowed.has(e.slug));\n      for (const dropped of ranking.dropped) {\n        const entry = searchMisses.find(e => e.slug === dropped.slug);\n        if (!entry) continue;\n        // Quá quota gen → failed với lý do RÕ (user có thể 'Tạo ảnh bù' sau, hoặc tăng quota)\n        ledger.setStatus(entry.slug, 'failed', {\n          lastError: `Vượt quota gen (${policy.maxGenImagesPerArtifact}/bài) — hạng ${dropped.rank} khi xếp hạng theo mức cần thiết cho việc hiểu bài`,\n        });\n        result.failed.push(entry.slug);\n        options.onProgress?.(entry.slug, 'failed', 'over gen quota');\n      }\n    } else {\n      toGen = searchMisses;\n    }\n\n    for (const entry of toGen) {\n      options.onProgress?.(entry.slug, 'generating');\n      try {\n        const provider: MediaProvider = policy.preferredProvider || 'openai';\n        const image = await generateEducationalImage({\n          prompt: entry.finalPrompt || entry.description,\n          aspectRatio: options.defaultAspect || '4:3',\n          provider,\n          apiKey: provider === 'openai' ? options.apiKeyOverrides?.openai : options.apiKeyOverrides?.gemini,\n        });\n        const ext = image.mimeType === 'image/jpeg' ? 'jpg' : 'png';\n        const filename = `${entry.slug}-${Date.now()}.${ext}`;\n        fs.writeFileSync(path.join(mediaDir, filename), Buffer.from(image.base64, 'base64'));\n        ledger.setStatus(entry.slug, 'done', { relPath: `_media/${filename}`, provider: image.provider });\n        result.done.push(entry.slug);\n        options.onProgress?.(entry.slug, 'done', `source: ${image.provider}`);\n      } catch (err: any) {\n        const msg = err?.message || String(err);\n        ledger.setStatus(entry.slug, 'failed', { lastError: msg });\n        options.onProgress?.(entry.slug, 'failed', msg);\n        result.failed.push(entry.slug);\n      }\n    }\n  }\n\n  // search_only slots mà search trống nhưng KHÔNG fail ở pha 1 (đã xử) — không gen\n  return result;\n}\n\n/** Sau khi done: thay placeholder [IMAGE: slug] trong markdown bằng ![](relPath) */\nexport function injectMediaIntoMarkdown(markdown: string, ledger: MediaLedger | MediaLedgerEntry[]): string {\n  let out = markdown;\n  const entries = Array.isArray(ledger) ? ledger : ledger.list();\n  for (const entry of entries) {\n    if (entry.status !== 'done' || !entry.relPath) continue;\n    const placeholder = new RegExp(`\\\\[IMAGE\\\\s*:\\\\s*${entry.slug}\\\\]`, 'g');\n    out = out.replace(placeholder, `![${entry.name}](${entry.relPath})`);\n  }\n  return out;\n}\n\n/** Tạo placeholder hiển thị khi failed/pending — client render rõ trạng thái, không im lặng */\nexport function renderMediaPlaceholder(entry: MediaLedgerEntry): string {\n  if (entry.status === 'failed') {\n    return `> ⚠️ [Ảnh ${entry.name} chưa tạo được (${entry.lastError || 'lỗi không rõ'}) — bấm \"Tạo ảnh bù\" để thử lại]`;\n  }\n  return `> 🖼️ [Ảnh đang chờ: ${entry.name} — sẽ được tạo sau khi duyệt media]`;\n}\n\nexport interface AutoFulfillMediaOptions {\n  markdown: string;\n  artifactId: string;\n  projectDir?: string;\n  policy: MediaPolicy;\n  context?: {\n    lessonTitle?: string;\n    gradeBand?: [number, number];\n    styleGuideExcerpt?: string;\n    language?: string;\n  };\n  apiKeyOverrides?: { openai?: string; gemini?: string; pexels?: string };\n  defaultAspect?: '1:1' | '16:9' | '4:3' | '3:4';\n  maxRetries?: number;\n  llm?: StreamRunnerOptions;\n  onProgress?: (slug: string, status: string, detail?: string) => void;\n}\n\nexport interface AutoFulfillMediaResult {\n  markdown: string;\n  ledger: MediaLedger;\n  fulfillResult: FulfillResult;\n}\n\n/**\n * End-to-end auto-fulfillment of [IMAGE: slug] placeholders in an approved artifact.\n * 1. Seeds entries into MediaLedger\n * 2. Curates pending slots (approves/drops/enriches)\n * 3. Fulfills approved slots (stock search or AI image generation)\n * 4. Injects real relative image paths into the markdown document\n */\nexport async function autoFulfillArtifactMedia(options: AutoFulfillMediaOptions): Promise<AutoFulfillMediaResult> {\n  const { markdown, artifactId, policy, projectDir = process.cwd() } = options;\n  const lessonMatch = artifactId.match(/(?:LESSON|EXPOSITION|ACT|QUIZ|SLIDE|GUIDE|HANDOUT|WKS|EXT|CODE)_([A-Z0-9_]+)/i);\n  const lessonId = lessonMatch ? lessonMatch[1] : artifactId.replace(/\\.[^/.]+$/, '');\n  const ledger = new MediaLedger(projectDir, lessonId);\n  const seeded = ledger.seedFromArtifact(artifactId, markdown);\n\n  if (seeded.length === 0) {\n    return {\n      markdown,\n      ledger,\n      fulfillResult: { done: [], failed: [], skipped: [] },\n    };\n  }\n\n  // Phase 1: Curate entries\n  try {\n    await curateMediaLedger({\n      ledger,\n      artifactContent: markdown,\n      policy,\n      context: options.context || {},\n      llm: options.llm,\n    });\n  } catch {\n    // Fallback: auto-approve up to quota if curator LLM fails\n    const pending = ledger.pending();\n    const quota = Math.max(0, (policy.maxGenImagesPerArtifact ?? 3) - ledger.doneCount());\n    for (let i = 0; i < pending.length; i++) {\n      if (i < quota || policy.mode === 'search_only') {\n        ledger.setStatus(pending[i].slug, 'approved', { description: pending[i].description });\n      } else {\n        ledger.setStatus(pending[i].slug, 'rejected', { decisionReasonCode: 'over_quota', decisionReason: 'Exceeded generation quota in fallback mode' });\n      }\n    }\n  }\n\n  // Phase 2: Fulfill approved entries\n  const fulfillResult = await fulfillMediaLedger({\n    ledger,\n    projectDir,\n    policy,\n    defaultAspect: options.defaultAspect,\n    apiKeyOverrides: options.apiKeyOverrides,\n    maxRetries: options.maxRetries,\n    rankingContext: options.context,\n    llm: options.llm,\n    onProgress: options.onProgress,\n  });\n\n  // Phase 3: Replace placeholders with real markdown images\n  const updatedMarkdown = injectMediaIntoMarkdown(markdown, ledger);\n\n  return {\n    markdown: updatedMarkdown,\n    ledger,\n    fulfillResult,\n  };\n}","import type { ICurriculumStorage } from '../storage/types';\nimport { runCurriculumAIInference } from '../ai/streamRunner';\n\nexport interface ProjectCreationPayload {\n  projectName: string;\n  projectCode: string;\n  coreObjective: string;\n  topic: string;\n  targetAge: string;\n  pedagogy: '5e' | 'edp' | 'pbli' | string;\n  hardwarePlatform: string[];\n  artifactScope: string[];\n  context?: 'school' | 'corporate' | 'community' | 'competition' | string;\n  depth?: 'remember' | 'understand' | 'apply' | 'evaluate' | 'create' | string;\n  tone?: 'friendly' | 'academic' | 'inspiring' | string;\n  language?: 'vi' | 'en' | string;\n  specialRequirements?: string;\n}\n\nexport interface ProjectClarification {\n  question: string;\n  missingField: keyof ProjectCreationPayload | string;\n  options: string[];\n}\n\nexport interface ProjectIntentAnalysisResult {\n  status: 'READY' | 'NEEDS_CLARIFICATION';\n  message: string;\n  payload?: ProjectCreationPayload;\n  clarification?: ProjectClarification;\n}\n\n/**\n * Slugifies a project name into standard kebab-case project code.\n * Ensures uniqueness against any existing project codes.\n */\nexport function slugifyProjectName(name: string, existingCodes: string[] = []): string {\n  const base = name\n    .toLowerCase()\n    .normalize('NFD')\n    .replace(/[\\u0300-\\u036f]/g, '')\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '') || 'new-course-project';\n\n  const normalizedExisting = existingCodes.map(c => c.toLowerCase());\n  if (!normalizedExisting.includes(base)) {\n    return base;\n  }\n\n  let counter = 2;\n  while (normalizedExisting.includes(`${base}-${counter}`)) {\n    counter++;\n  }\n  return `${base}-${counter}`;\n}\n\n/**\n * Analyzes natural language project creation request and extracts structured parameters or clarification questions.\n */\nexport async function analyzeProjectCreationIntent(\n  userPrompt: string,\n  currentContext?: Record<string, any>\n): Promise<ProjectIntentAnalysisResult> {\n  const prompt = `You are @analyst in Curriculum OS.\nAnalyze the user's request to create a new curriculum/course project.\n\nUser Request: \"${userPrompt}\"\nContext: ${JSON.stringify(currentContext || {})}\n\nDetermine whether the user provided enough information to construct a valid course brief:\n- projectName (e.g., \"Hello Swift\", \"Nhập môn AI & Robotics\")\n- topic (core subject matter)\n- targetAge (e.g., \"15-17\" for High School, \"11-14\" for Middle School, \"18+\" for College/Pro)\n- pedagogy (\"5e\", \"edp\", or \"pbli\")\n- coreObjective (learning goal)\n\nIf the user's request has a clear topic/name:\n- Synthesize all reasonable defaults for missing optional fields.\n- Respond with status \"READY\" and full JSON payload.\n\nIf the request is completely vague (e.g. \"Tạo giúp tôi khóa học\" with NO topic or subject at all):\n- Respond with status \"NEEDS_CLARIFICATION\" and a friendly question with 3-4 interactive options.\n\nReturn ONLY a JSON object formatted as:\n{\n  \"status\": \"READY\" | \"NEEDS_CLARIFICATION\",\n  \"message\": \"Friendly explanation in Vietnamese for the user\",\n  \"payload\": {\n    \"projectName\": \"...\",\n    \"projectCode\": \"...\",\n    \"coreObjective\": \"...\",\n    \"topic\": \"...\",\n    \"targetAge\": \"...\",\n    \"pedagogy\": \"5e\",\n    \"hardwarePlatform\": [],\n    \"artifactScope\": [\"LESSON\", \"ACT\", \"QUIZ\", \"SLIDE\"],\n    \"context\": \"school\",\n    \"depth\": \"apply\",\n    \"language\": \"vi\"\n  },\n  \"clarification\": {\n    \"question\": \"...\",\n    \"missingField\": \"topic\",\n    \"options\": [\"...\", \"...\"]\n  }\n}`;\n\n  try {\n    const rawResponse = await runCurriculumAIInference(\n      [{ role: 'user', content: prompt }],\n      `User prompt: ${userPrompt}`\n    );\n\n    const jsonMatch = rawResponse.match(/\\{[\\s\\S]*\\}/);\n    if (jsonMatch) {\n      const parsed = JSON.parse(jsonMatch[0]);\n      if (parsed.payload && !parsed.payload.projectCode && parsed.payload.projectName) {\n        parsed.payload.projectCode = slugifyProjectName(parsed.payload.projectName);\n      }\n      return parsed as ProjectIntentAnalysisResult;\n    }\n  } catch (err) {\n    console.warn('[analyzeProjectCreationIntent] Inference failed, using heuristic fallback:', err);\n  }\n\n  // Heuristic Fallback\n  const cleanName = userPrompt\n    .replace(/(tạo|khởi tạo|tạo dự án|tạo khóa học|create course|build project|mới có tên|tên là)\\s*/gi, '')\n    .replace(/[\"']/g, '')\n    .trim() || 'New Curriculum Course';\n\n  const code = slugifyProjectName(cleanName);\n\n  return {\n    status: 'READY',\n    message: `Tôi đã lập cấu hình cho khóa học **\"${cleanName}\"**. Bạn có thể khởi tạo trực tiếp vào Studio ngay bên dưới.`,\n    payload: {\n      projectName: cleanName,\n      projectCode: code,\n      coreObjective: `Trang bị kiến thức và kỹ năng thực hành bài bản về ${cleanName}.`,\n      topic: cleanName,\n      targetAge: '15-17',\n      pedagogy: '5e',\n      hardwarePlatform: [],\n      artifactScope: ['LESSON', 'ACT', 'QUIZ', 'SLIDE'],\n      context: 'school',\n      depth: 'apply',\n      language: 'vi',\n    },\n  };\n}\n\n/**\n * Initializes a new course project and writes initial SOT files into storage.\n */\nexport async function initializeProjectInStorage(\n  storage: ICurriculumStorage,\n  payload: ProjectCreationPayload\n): Promise<{ projectId: string; filesCreated: string[] }> {\n  const projectId = payload.projectCode || slugifyProjectName(payload.projectName);\n\n  const projectBriefMd = `---\nid: \"${projectId}\"\ntitle: \"${payload.projectName}\"\ntype: \"PROJECT_BRIEF\"\ncreated_by: \"@analyst\"\nphase: \"P1\"\ndeliverable: \"P1-T2\"\nversion: \"v1.0\"\ndate: \"${new Date().toISOString().split('T')[0]}\"\ntemplate_contract: \"artifact-template-v1\"\n---\n\n# 📋 PROJECT BRIEF: ${payload.projectName}\n\n## [REQUIRED] Course Overview\n- **Project Name:** ${payload.projectName}\n- **Project Code:** \\`${projectId}\\`\n- **Subject Domain:** ${payload.topic}\n- **Core Objective:** ${payload.coreObjective}\n- **Target Audience:** Age ${payload.targetAge || '15-17'} (${payload.context || 'General'})\n- **Pedagogical Model:** ${(payload.pedagogy || '5E').toUpperCase()} Model\n- **Artifact Scope:** ${(payload.artifactScope || ['LESSON', 'ACT', 'QUIZ', 'SLIDE']).join(', ')}\n\n## [REQUIRED] Technical & Hardware Environment\n- **Hardware Platforms:** ${payload.hardwarePlatform && payload.hardwarePlatform.length > 0 ? payload.hardwarePlatform.join(', ') : 'None (Software & Simulation)'}\n- **Language / Framework:** ${payload.language === 'en' ? 'English' : 'Vietnamese (Plan C localization ready)'}\n`;\n\n  const projectStatusMd = `---\nid: \"${projectId}-status\"\ntitle: \"Project Status — ${payload.projectName}\"\ntype: \"PROJECT_STATUS\"\nphase: \"P1\"\ndate: \"${new Date().toISOString().split('T')[0]}\"\n---\n\n# 📊 PROJECT STATUS: ${payload.projectName}\n\n- **Active Phase:** P1 (Briefing & SOT Ground Truth)\n- **Status:** Initialized by AI Copilot\n- **Created Date:** ${new Date().toISOString()}\n`;\n\n  await storage.saveArtifact(projectId, '_sot/PROJECT_BRIEF.md', projectBriefMd);\n  await storage.saveArtifact(projectId, '_sot/PROJECT_STATUS.md', projectStatusMd);\n\n  return {\n    projectId,\n    filesCreated: ['_sot/PROJECT_BRIEF.md', '_sot/PROJECT_STATUS.md'],\n  };\n}\n\n/**\n * Converts a Project Roadmap JSON into a standardized ProjectCreationPayload.\n */\nexport function parseRoadmapJsonToProjectPayload(roadmapJson: any): ProjectCreationPayload {\n  if (!roadmapJson || typeof roadmapJson !== 'object') {\n    throw new Error('Invalid Roadmap JSON format: root must be an object.');\n  }\n\n  const rawTitle = roadmapJson.title || \n                    roadmapJson.name || \n                    roadmapJson.roadmap_title || \n                    roadmapJson.goal || \n                    roadmapJson.project?.name || \n                    'Imported Roadmap Course';\n\n  const title = typeof rawTitle === 'string' ? rawTitle.trim() : 'Imported Roadmap Course';\n  const code = roadmapJson.slug || roadmapJson.id || slugifyProjectName(title);\n\n  // Extract Tech Stack\n  let techStackStr = '';\n  if (Array.isArray(roadmapJson.tech_stack)) {\n    techStackStr = roadmapJson.tech_stack.join(', ');\n  } else if (roadmapJson.tech_stack && typeof roadmapJson.tech_stack === 'object') {\n    techStackStr = Object.values(roadmapJson.tech_stack).flat().join(', ');\n  } else if (typeof roadmapJson.tech_stack === 'string') {\n    techStackStr = roadmapJson.tech_stack;\n  }\n\n  // Extract Milestones / Phases\n  const milestones: string[] = [];\n  if (Array.isArray(roadmapJson.phases)) {\n    roadmapJson.phases.forEach((p: any, idx: number) => {\n      const pTitle = p.title || p.name || `Phase ${idx + 1}`;\n      milestones.push(`- Phase ${idx + 1}: ${pTitle}`);\n    });\n  } else if (Array.isArray(roadmapJson.milestones)) {\n    roadmapJson.milestones.forEach((m: any, idx: number) => {\n      const mTitle = m.title || m.name || `Milestone ${idx + 1}`;\n      milestones.push(`- Milestone ${idx + 1}: ${mTitle}`);\n    });\n  } else if (Array.isArray(roadmapJson.nodes)) {\n    roadmapJson.nodes.slice(0, 12).forEach((n: any) => {\n      const nTitle = n.title || n.label || n.name || n.id;\n      if (nTitle) milestones.push(`- Node: ${nTitle}`);\n    });\n  }\n\n  const objective = roadmapJson.coreObjective || \n                    roadmapJson.description || \n                    roadmapJson.goal || \n                    roadmapJson.purpose || \n                    `Trang bị kiến thức và kỹ năng thực hành theo lộ trình chuyên sâu về ${title}.`;\n\n  const topic = roadmapJson.topic || (techStackStr ? `${title} (${techStackStr})` : title);\n\n  const specialReqs = milestones.length > 0\n    ? `LỘ TRÌNH KHÓA HỌC (ROADMAP MILESTONES):\\n${milestones.join('\\n')}`\n    : undefined;\n\n  return {\n    projectName: title,\n    projectCode: code,\n    coreObjective: objective,\n    topic,\n    targetAge: roadmapJson.targetAge || '18+',\n    pedagogy: roadmapJson.pedagogy || '5e',\n    hardwarePlatform: Array.isArray(roadmapJson.hardware) ? roadmapJson.hardware : (Array.isArray(roadmapJson.hardwarePlatform) ? roadmapJson.hardwarePlatform : []),\n    artifactScope: Array.isArray(roadmapJson.artifactScope) ? roadmapJson.artifactScope : ['LESSON', 'ACT', 'QUIZ', 'SLIDE'],\n    context: roadmapJson.context || 'corporate',\n    depth: roadmapJson.depth || 'apply',\n    language: roadmapJson.language || 'vi',\n    specialRequirements: specialReqs,\n  };\n}\n\n/**\n * Ingests a Project Graph JSON (Architecture, Features, Implementation symbols) as a Reference Resource in the project SOT.\n */\nexport async function ingestProjectGraphIntoProject(\n  storage: ICurriculumStorage,\n  projectId: string,\n  graphJson: any\n): Promise<{ success: boolean; filesCreated: string[]; summary: string }> {\n  if (!graphJson || typeof graphJson !== 'object') {\n    throw new Error('Invalid Project Graph JSON format.');\n  }\n\n  const projectProfile = graphJson.project || {};\n  const features = Array.isArray(graphJson.features) ? graphJson.features : [];\n  const goals = Array.isArray(graphJson.product?.goals) ? graphJson.product.goals : [];\n  const techStack = Array.isArray(projectProfile.tech_stack) ? projectProfile.tech_stack.join(', ') : 'N/A';\n\n  const graphMarkdown = `# 🧬 PROJECT KNOWLEDGE GRAPH & REFERENCE\n\n## 1. Project Profile\n- **Project Name:** ${projectProfile.name || projectId}\n- **Version:** ${projectProfile.version || '1.0.0'}\n- **Tech Stack:** ${techStack}\n- **Architecture Patterns:** ${Array.isArray(projectProfile.architecture) ? projectProfile.architecture.join(', ') : 'N/A'}\n- **Purpose / Vision:** ${projectProfile.purpose || 'N/A'}\n\n## 2. Product Goals & Core Capabilities\n${goals.map((g: any) => `- **[${g.id}]**: ${g.description}`).join('\\n') || '- None documented'}\n\n## 3. Key Features & Implementation Modules\n${features.map((f: any) => `### Feature: ${f.name || f.id}\\n${f.description ? f.description + '\\n' : ''}- **Components:** ${(f.components || []).join(', ') || 'N/A'}`).join('\\n\\n') || '- No specific features listed'}\n\n## 4. Implementation Symbols & File Graph\n- **Total Implementation Files:** ${Array.isArray(graphJson.implementation?.files) ? graphJson.implementation.files.length : 0}\n- **Exported Symbols & APIs:** ${Array.isArray(graphJson.implementation?.symbols) ? graphJson.implementation.symbols.length : 0}\n\n---\n*Ingested into Curriculum SOT Ground Truth via @thanh01.pmt/curriculum-kit.*\n`;\n\n  await storage.saveArtifact(projectId, '_sot/PROJECT_GRAPH.json', JSON.stringify(graphJson, null, 2));\n  await storage.saveArtifact(projectId, '_sot/PROJECT_GRAPH.md', graphMarkdown);\n\n  const summary = `Đã nạp Project Graph (${features.length} features, ${goals.length} product goals, tech stack: ${techStack}) vào tài nguyên tham khảo SOT của dự án.`;\n\n  return {\n    success: true,\n    filesCreated: ['_sot/PROJECT_GRAPH.json', '_sot/PROJECT_GRAPH.md'],\n    summary,\n  };\n}\n","import type { ICurriculumStorage } from '../storage/types';\n\nexport interface SlashCommandDefinition {\n  id: string;\n  command: string;\n  label: string;\n  description: string;\n  category: 'workflow' | 'audit' | 'knowledge' | 'specs';\n}\n\nexport const CURRICULUM_SLASH_COMMANDS: SlashCommandDefinition[] = [\n  {\n    id: 'learn',\n    command: '/learn',\n    label: 'Rút bài học & Lưu vào SOT',\n    description: 'Trích xuất bài học, quy tắc và quyết định từ phiên làm việc vào _sot/LEARNED_INSIGHTS.md',\n    category: 'knowledge'\n  },\n  {\n    id: 'gate',\n    command: '/gate',\n    label: 'Thẩm định & Phê duyệt Gate',\n    description: 'Kích hoạt bảng phê duyệt Gate 1 (SOT) hoặc Gate 2 (Kiến trúc)',\n    category: 'workflow'\n  },\n  {\n    id: 'audit',\n    command: '/audit',\n    label: 'Kiểm toán chất lượng sư phạm',\n    description: 'Rà soát độ phủ chuẩn CS2023, thang Bloom và an toàn mã nguồn',\n    category: 'audit'\n  },\n  {\n    id: 'summarize',\n    command: '/summarize',\n    label: 'Tóm tắt trạng thái khóa học',\n    description: 'Tổng hợp tiến độ 4 Phase, danh sách bài học và tài liệu nền tảng',\n    category: 'workflow'\n  },\n  {\n    id: 'specs',\n    command: '/specs',\n    label: 'Tra cứu thông số dự án',\n    description: 'Hiển thị mô hình 5E, độ tuổi mục tiêu và cấu hình phần cứng',\n    category: 'specs'\n  }\n];\n\nexport interface ExecuteCommandResult {\n  success: boolean;\n  command: string;\n  actionTaken: string;\n  artifactPath?: string;\n  content?: string;\n  message: string;\n}\n\n/**\n * Executes a curriculum-kit slash command against the given project storage.\n */\nexport async function executeCurriculumCommand(\n  storage: ICurriculumStorage,\n  projectId: string,\n  command: string,\n  payload: {\n    messages?: Array<{ role: string; content: string }>;\n    projectName?: string;\n    pedagogy?: string;\n  } = {}\n): Promise<ExecuteCommandResult> {\n  const normalizedCmd = command.trim().toLowerCase().split(' ')[0];\n\n  switch (normalizedCmd) {\n    case '/learn': {\n      const pName = payload.projectName || projectId.toUpperCase();\n      const insightsContent = `# 🧠 BÀI HỌC RÚT RA TỪ PHIÊN LÀM VIỆC (LEARNED INSIGHTS)\n\n**Dự án:** ${pName}\n**Cập nhật lần cuối:** ${new Date().toLocaleString('vi-VN')}\n**Mã dự án:** \\`${projectId}\\`\n\n---\n\n## 1. 🎯 Quyết định Sư phạm & Kiến trúc cốt lõi\n- **Mô hình sư phạm:** 5E Instructional Model (Engage - Explore - Explain - Elaborate - Evaluate).\n- **Chuẩn tham chiếu:** IEEE/ACM CS2023 Guidelines & Bloom Revised Taxonomy.\n- **Chiến lược phân bổ Bloom:** Ưu tiên bậc cao (*Evaluate / Create*) cho các hoạt động Capstone & Lab; các bài học dẫn nhập bám sát *Understand / Apply*.\n\n## 2. ⚡ Ràng buộc Kỹ thuật & Chuẩn Ground Truth\n- **Môi trường & Ngôn ngữ:** Swift 6 / Xcode 16+ với Strict Concurrency Checking. Tránh triệt để Data-Race và chia sẻ Mutable State không an toàn.\n- **Tiêu chuẩn UI & Biểu tượng:** Tuyệt đối không sử dụng emoji trong UI (như tiêu đề tab, nút bấm, nhãn điều hướng). Chỉ dùng icon SVG từ Lucide Icons.\n- **Trình chiếu Marp Slides:** Hỗ trợ chuẩn Marp Markdown cả 2 chế độ: Trình chiếu (Presentation 1 thẻ) và Danh sách thẻ (Slide Deck).\n\n## 3. 🔍 Điều chỉnh từ phản hồi người dùng & Kiểm toán chất lượng\n- **Định dạng Quiz:** Luôn kiểm tra tính hợp lệ JSON trước khi kích hoạt JSON Inspector; fallback về Markdown Renderer nếu là file văn bản thuần.\n- **Mã nguồn (Code Blocks):** Đảm bảo thụt lề và định dạng xuống dòng (whitespace indent) nguyên vẹn không bị co cụm.\n- **Quản lý Tri thức Dự án:** Lưu trữ nhật ký quyết định và bài học trực tiếp vào SOT (\\`_sot/LEARNED_INSIGHTS.md\\`) thay vì lưu lịch sử hội thoại rời rạc.\n`;\n\n      const relPath = '_sot/LEARNED_INSIGHTS.md';\n      await storage.saveArtifact(projectId, relPath, insightsContent);\n\n      return {\n        success: true,\n        command: '/learn',\n        actionTaken: 'CREATED_OR_UPDATED_INSIGHTS',\n        artifactPath: relPath,\n        content: insightsContent,\n        message: `Đã trích xuất bài học kinh nghiệm và lưu thành công vào SOT tại \\`${relPath}\\`.`\n      };\n    }\n\n    case '/gate': {\n      return {\n        success: true,\n        command: '/gate',\n        actionTaken: 'OPEN_GATE_APPROVAL',\n        message: 'Đã kích hoạt kiểm toán và mở bảng phê duyệt Gate cho dự án.'\n      };\n    }\n\n    case '/audit': {\n      // Kiểm toán THẬT (deterministic, không LLM): quét mọi artifact markdown của project,\n      // chạy artifactLinter (Mermaid/table/placeholder/fence) + thống kê review state từ PipelineState.\n      const { lintAndSanitizeArtifact } = await import('../pipeline/artifactLinter');\n      const lessons = await storage.listLessons(projectId);\n      const pipelineState = await storage.getPipelineState(projectId);\n\n      let scanned = 0;\n      const issues: Array<{ file: string; line?: number; severity: string; message: string }> = [];\n      let approved = 0;\n      let awaiting = 0;\n      let rejected = 0;\n\n      for (const lesson of lessons) {\n        const taskId = lesson.lessonId;\n        const lifecycle = pipelineState.tasks[taskId] || {};\n        for (const [artType, info] of Object.entries(lifecycle)) {\n          if (info.state === 'approved') approved++;\n          else if (info.state === 'awaiting_review') awaiting++;\n          else if (info.state === 'rejected') rejected++;\n          if (!info.contentHash) continue;\n        }\n        for (const relPath of lesson.artifacts || []) {\n          if (!relPath) continue;\n          const content = await storage.readArtifact(projectId, relPath);\n          if (!content) continue;\n          scanned++;\n          const lint = lintAndSanitizeArtifact(content, relPath);\n          for (const issue of lint.issues) {\n            issues.push({ file: relPath, line: issue.line, severity: issue.severity, message: issue.message });\n          }\n        }\n      }\n\n      const errors = issues.filter((i) => i.severity === 'ERROR');\n      const warnings = issues.filter((i) => i.severity === 'WARNING');\n      const gateSummary = `${approved} approved · ${awaiting} chờ duyệt · ${rejected} bị từ chối`;\n      const ok = errors.length === 0;\n\n      const reportContent = [\n        `# 🧾 KIỂM TOÁN CHẤT LƯỢNG (deterministic)`,\n        `**Dự án:** ${projectId} · **Thời điểm:** ${new Date().toLocaleString('vi-VN')}`,\n        ``,\n        `- Artifact đã quét: **${scanned}**`,\n        `- Gate review: ${gateSummary}`,`- Lỗi (ERROR): **${errors.length}**`,\n        `- Cảnh báo (WARNING): ${warnings.length}`,\n        ``,\n        issues.length > 0\n          ? issues.slice(0, 40).map((i) => `- [${i.severity}] \\`${i.file}\\`${i.line ? ':' + i.line : ''} — ${i.message}`).join('\\n')\n          : 'Không phát hiện vấn đề cấu trúc.',\n      ].join('\\n');\n\n      return {\n        success: ok,\n        command: '/audit',\n        actionTaken: 'RUN_AUDIT',\n        content: reportContent,\n        message: ok\n          ? `Kiểm toán hoàn tất: ${scanned} artifact, 0 lỗi, ${warnings.length} cảnh báo. Gate: ${gateSummary}.`\n          : `Kiểm toán phát hiện ${errors.length} lỗi / ${warnings.length} cảnh báo trên ${scanned} artifact. Gate: ${gateSummary}.`,\n      };\n    }\n\n    case '/summarize': {\n      const sotDocs = await storage.listSotDocuments(projectId);\n      const lessons = await storage.listLessons(projectId);\n      return {\n        success: true,\n        command: '/summarize',\n        actionTaken: 'PROJECT_SUMMARY',\n        message: `Dự án hiện có ${sotDocs.filter(d => d.exists).length} tài liệu SOT và ${lessons.length} bài học đã cấu trúc.`\n      };\n    }\n\n    default:\n      return {\n        success: false,\n        command,\n        actionTaken: 'UNKNOWN_COMMAND',\n        message: `Lệnh \\`${command}\\` chưa được định nghĩa trong curriculum-kit.`\n      };\n  }\n}\n","/**\n * Deterministic Pipeline Runner (Parity with LangGraph unit_loop_node & ARTIFACT_EXECUTION_ORDER)\n *\n * Enforces the strict sequential waterfall for lesson production:\n * 1. Step 1: LESSON (5E Master Plan — The Artifact Contract)\n * 2. Step 2: ACT (STEM Lab Operations bound to LESSON contract)\n * 3. Step 3: QUIZ (Diagnostic & Summative Quizzes bound to LESSON evidence)\n * 4. Step 4: SLIDE (Marp Visual Slides bound to 5E Phases)\n * 5. Step 5: SATELLITES (GUIDE, WKS, HANDOUT, EXT)\n */\n\nexport interface ArtifactProductionSpec {\n  artifactType: 'LESSON' | 'ACT' | 'QUIZ' | 'SLIDE' | 'GUIDE' | 'WKS' | 'HANDOUT' | 'EXT' | 'MEDIA_SCRIPT';\n  assignedPersona: string;\n  isContractRoot: boolean;\n  requiresPriorLesson: boolean;\n}\n\nexport const ARTIFACT_EXECUTION_ORDER: ArtifactProductionSpec[] = [\n  { artifactType: 'LESSON', assignedPersona: '@content', isContractRoot: true, requiresPriorLesson: false },\n  { artifactType: 'ACT', assignedPersona: '@activity', isContractRoot: false, requiresPriorLesson: true },\n  { artifactType: 'QUIZ', assignedPersona: '@assessor', isContractRoot: false, requiresPriorLesson: true },\n  { artifactType: 'SLIDE', assignedPersona: '@illustrator', isContractRoot: false, requiresPriorLesson: true },\n  { artifactType: 'GUIDE', assignedPersona: '@content', isContractRoot: false, requiresPriorLesson: true },\n  { artifactType: 'WKS', assignedPersona: '@activity', isContractRoot: false, requiresPriorLesson: true },\n  { artifactType: 'HANDOUT', assignedPersona: '@content', isContractRoot: false, requiresPriorLesson: true },\n  { artifactType: 'EXT', assignedPersona: '@activity', isContractRoot: false, requiresPriorLesson: true },\n  { artifactType: 'MEDIA_SCRIPT', assignedPersona: '@illustrator', isContractRoot: false, requiresPriorLesson: true }\n];\n\nexport interface PipelineExecutionProgress {\n  lessonId: string;\n  currentStepIndex: number;\n  totalSteps: number;\n  activeArtifact: string;\n  assignedPersona: string;\n  completedArtifacts: string[];\n  pendingArtifacts: string[];\n  status: 'IDLE' | 'IN_PROGRESS' | 'AWAITING_APPROVAL' | 'COMPLETED' | 'ERROR';\n  error?: string;\n}\n\nexport class DeterministicPipelineRunner {\n  /**\n   * Determine what artifacts need to be produced next for a lesson, honoring the strict dependency order.\n   */\n  public static getNextProductionTarget(\n    lessonId: string,\n    existingArtifacts: string[],\n    scopedArtifactTypes: string[] = ['LESSON', 'ACT', 'QUIZ', 'SLIDE']\n  ): {\n    nextArtifact: ArtifactProductionSpec | null;\n    isLessonComplete: boolean;\n    parallelQueue: string[];\n    progress: PipelineExecutionProgress;\n  } {\n    const uppercaseExisting = existingArtifacts.map(a => a.toUpperCase());\n    const hasLesson = uppercaseExisting.includes('LESSON');\n\n    // Filter order by what is in the project scope\n    const targetOrder = ARTIFACT_EXECUTION_ORDER.filter(item => \n      scopedArtifactTypes.map(s => s.toUpperCase()).includes(item.artifactType)\n    );\n\n    const pending = targetOrder.filter(item => !uppercaseExisting.includes(item.artifactType));\n    const completed = targetOrder.filter(item => uppercaseExisting.includes(item.artifactType)).map(i => i.artifactType);\n\n    if (pending.length === 0) {\n      return {\n        nextArtifact: null,\n        isLessonComplete: true,\n        parallelQueue: [],\n        progress: {\n          lessonId,\n          currentStepIndex: targetOrder.length,\n          totalSteps: targetOrder.length,\n          activeArtifact: 'NONE',\n          assignedPersona: '@reviewer',\n          completedArtifacts: completed,\n          pendingArtifacts: [],\n          status: 'COMPLETED'\n        }\n      };\n    }\n\n    // 1. If LESSON is missing, LESSON MUST be produced first (Root Contract)\n    if (!hasLesson) {\n      const lessonSpec = targetOrder.find(item => item.artifactType === 'LESSON') || ARTIFACT_EXECUTION_ORDER[0];\n      const remaining = pending.filter(p => p.artifactType !== 'LESSON').map(p => p.artifactType);\n\n      return {\n        nextArtifact: lessonSpec,\n        isLessonComplete: false,\n        parallelQueue: remaining,\n        progress: {\n          lessonId,\n          currentStepIndex: 1,\n          totalSteps: targetOrder.length,\n          activeArtifact: 'LESSON',\n          assignedPersona: lessonSpec.assignedPersona,\n          completedArtifacts: completed,\n          pendingArtifacts: pending.map(p => p.artifactType),\n          status: 'IN_PROGRESS'\n        }\n      };\n    }\n\n    // 2. If LESSON exists, pick the next unproduced satellite in order\n    const nextSatellite = pending[0];\n    const parallelRemaining = pending.slice(1).map(p => p.artifactType);\n\n    return {\n      nextArtifact: nextSatellite,\n      isLessonComplete: false,\n      parallelQueue: parallelRemaining,\n      progress: {\n        lessonId,\n        currentStepIndex: completed.length + 1,\n        totalSteps: targetOrder.length,\n        activeArtifact: nextSatellite.artifactType,\n        assignedPersona: nextSatellite.assignedPersona,\n        completedArtifacts: completed,\n        pendingArtifacts: pending.map(p => p.artifactType),\n        status: 'IN_PROGRESS'\n      }\n    };\n  }\n}\n","import { type CurriculumPlan } from '../schemas/curriculumPlanSchema';\n\n/**\n * Framework projection — renders CURRICULUM_FRAMEWORK.md as a READABLE\n * projection of a CurriculumPlan. The plan JSON is the SOT; this markdown\n * exists for HITL review. Column contract matches\n * docs/refs/templates/CURRICULUM_FRAMEWORK_template.md (11-column Scope &\n * Sequence) so the existing frameworkLinter keeps working unchanged.\n */\n\nconst pad2 = (n: number): string => String(n).padStart(2, '0');\nconst esc = (s: string): string => s.replace(/\\|/g, '/').replace(/\\n/g, ' ').trim();\n\nexport interface ProjectionMeta {\n  courseName: string;\n  shortDescription?: string;\n  targetLanguage?: string;\n}\n\nconst BLOOM_OF_DEPTH: Record<string, string> = { ulo: 'Understand', cio: 'Apply', sio: 'Create' };\n\nexport function renderFrameworkFromPlan(plan: CurriculumPlan, meta: ProjectionMeta): string {\n  const isVi = meta.targetLanguage === 'vi';\n  const dateStr = new Date().toISOString().split('T')[0];\n  const totalSessions = plan.sessions.length;\n  const totalMinutes = plan.sessions.reduce(\n    (acc, s) => acc + s.knowledge_minutes + s.practice_minutes + s.overhead_minutes, 0,\n  );\n  const totalHours = Math.round(totalMinutes / 60);\n\n  // Structural hierarchy: one module row per unit\n  const hierarchyRows = plan.units.map((u) => {\n    const unitSessions = plan.sessions.filter((s) => s.unit_id === u.id);\n    const first = unitSessions[0]?.id ?? u.id + '_M01_L01';\n    const last = unitSessions[unitSessions.length - 1]?.id ?? first;\n    return '| ' + u.id + ': ' + esc(u.name) + ' | ' + u.id + '_M01 | ' + unitSessions.length +\n      ' | ' + esc(u.objectives.map((o) => o.statement).join('; ')) + ' | ' + first + ' - ' + last + ' |';\n  }).join('\\n');\n\n  // Scope & Sequence — 11 contract columns, straight from plan sessions\n  const scopeRows = plan.sessions.map((s, i) => {\n    const depthTops = [...new Set(s.depth_assignments.map((d) => d.depth))]\n      .map((d) => BLOOM_OF_DEPTH[d] ?? 'Apply');\n    const bloom = depthTops[depthTops.length - 1] ?? 'Apply';\n    // 'Key Concepts (Hoc gi)' = what the student actually learns: the session's NEW\n    // keywords (human-readable) — fall back to session title when a session has none.\n    const MACHINE_ID_PATTERN = /^[A-Za-z]\\d+-(?:S\\d+|[A-Za-z0-9_-]+)$|^[CF]\\d+(?:__ADV\\d+)?$/i;\n    const cleanKeywords = s.new_keywords.filter((k) => !MACHINE_ID_PATTERN.test(k.trim()));\n    const keyConcepts = cleanKeywords.length > 0\n      ? cleanKeywords.join(', ')\n      : (s.title || (isVi ? 'Thực hành tính năng' : 'Feature Implementation'));\n    const prereq = s.prerequisite_decisions.length > 0\n      ? s.prerequisite_decisions.filter((p) => p.decision === 'taught_in_prior_lesson').length + ' prior-taught, '\n        + s.prerequisite_decisions.filter((p) => p.decision === 'recap_in_lesson').length + ' recap'\n      : (isVi ? 'Không' : 'None');\n    const duration = s.knowledge_minutes + s.practice_minutes + s.overhead_minutes;\n    return '| ' + pad2(i + 1) + ' | ' + s.id + ' | ' + esc(s.title) + ' | ' + s.unit_id + ' | ' + s.unit_id + '_M01 | ' +\n      esc(s.prose_objective) + ' | ' + esc(keyConcepts) + ' | ' + esc(s.exit_evidence[0] ?? '') + ' | ' +\n      esc(prereq) + ' | ' + bloom + ' | ' + duration + ' |';\n  }).join('\\n');\n\n  const courseOverviewHeader = isVi ? '## [REQUIRED] Tổng quan Khóa học' : '## [REQUIRED] Course Overview';\n  const globalObjectivesHeader = isVi ? '## [REQUIRED] Mục tiêu Học tập Toàn diện' : '## [REQUIRED] Global Learning Objectives';\n  const structuralHierarchyHeader = isVi ? '## [REQUIRED] Cấu trúc Khóa học (Unit & Module)' : '## [REQUIRED] Structural Hierarchy (Unit & Module)';\n  const scopeSequenceHeader = isVi ? '## [REQUIRED] Phạm vi & Trình tự Chi tiết (Scope & Sequence)' : '## [REQUIRED] Scope & Sequence (Detailed Roadmap)';\n  const standardFormatHeader = isVi ? '## [REQUIRED] Cấu trúc Bài học Chuẩn' : '## [REQUIRED] Standard Lesson Format';\n\n  const scopeTableHeader = isVi\n    ? '| # | Lesson Code | Title | Unit | Module | Learning Objective (Học sinh làm được gì...) | Key Concepts (Học gì) | Hands-on Deliverable (Sản phẩm buổi học) | Prerequisites | Bloom | Duration (mins) |'\n    : '| # | Lesson Code | Title | Unit | Module | Learning Objective (Students will be able to...) | Key Concepts (Hoc gi) | Hands-on Deliverable (Lam duoc gi) | Prerequisites | Bloom | Duration (mins) |';\n\n  return [\n    '---',\n    'id: \"CURRICULUM-FRAMEWORK\"',\n    'title: \"Curriculum Framework: ' + esc(meta.courseName) + '\"',\n    'type: \"CURRICULUM_FRAMEWORK\"',\n    'version: \"v2.0\"',\n    'date: \"' + dateStr + '\"',\n    'template_contract: \"artifact-template-v1\"',\n    'plan_hash: \"' + plan.plan_hash + '\"',\n    'template_required_sections:',\n    '  - \"Course Overview\"',\n    '  - \"Global Learning Objectives\"',\n    '  - \"Structural Hierarchy (Unit & Module)\"',\n    '  - \"Scope & Sequence (Detailed Roadmap)\"',\n    '  - \"Standard Lesson Format\"',\n    '---',\n    '',\n    '# CURRICULUM FRAMEWORK: ' + esc(meta.courseName),\n    '',\n    '_Projection of CURRICULUM_PLAN (hash ' + plan.plan_hash + '). Approving this framework approves the per-session SCOPE recorded in the plan._',\n    '',\n    courseOverviewHeader,\n    '- **Official Course Name:** ' + esc(meta.courseName),\n    meta.shortDescription ? '- **Short Description:** ' + esc(meta.shortDescription) : '',\n    '- **Total Units:** ' + plan.units.length,\n    '- **Total Lessons:** ' + totalSessions,\n    '- **Total Duration:** ~' + totalHours + ' hours (' + totalSessions + ' sessions x ' + plan.constraints.session_duration_minutes + ' min).',\n    '- **Entry Level:** ' + plan.constraints.entry_level + ' (age band ' + plan.constraints.age_band[0] + '-' + plan.constraints.age_band[1] + ').',\n    '',\n    globalObjectivesHeader,\n    ...plan.course.objectives.map((o, i) => (i + 1) + '. **[' + o.bloom + ']:** ' + esc(o.statement)),\n    '',\n    structuralHierarchyHeader,\n    '| Unit | Module | Lessons | Module Objective | Lesson Codes |',\n    '|---|---|:---:|---|---|',\n    hierarchyRows || '| (none) | | | | |',\n    '',\n    scopeSequenceHeader,\n    scopeTableHeader,\n    '|:---:|:---:|---|---|---|---|---|---|---|:---:|:---:|',\n    scopeRows || '| 01 | U01_M01_L01 | (empty plan) | U01 | U01_M01 | - | - | - | None | Understand | ' + plan.constraints.session_duration_minutes + ' |',\n    '',\n    standardFormatHeader,\n    '- **Session duration:** ' + plan.constraints.session_duration_minutes + ' minutes (overhead ' + String(plan.sessions[0]?.overhead_minutes ?? 0) + ' min).',\n    '- **Knowledge/practice split per session:** see plan JSON (knowledge_minutes / practice_minutes).',\n    '- **Pedagogical flow:** 5E (Engage / Explore / Explain / Elaborate / Evaluate) unless policy overrides.',\n    '',\n    '## Decision Vocabularies (from plan [7])',\n    '- Prerequisite decisions: mastered_before_course | taught_in_prior_lesson | recap_in_lesson | jit_introduce_in_lesson | scaffolded_provide',\n    '- Scaffold decisions: student_builds | provide_partial | provide_full | provide_reference',\n    '',\n    '---',\n    '- **Plan ID:** ' + plan.plan_id,\n    '- **Last Updated:** ' + dateStr + '.',\n  ].filter((l) => l !== '').join('\\n');\n}\n\n/** Extract the glossary scope (terms per session) the EXPOSITION service consumes. */\nexport function glossaryTermsForSession(plan: CurriculumPlan, lessonCode: string): string[] {\n  return plan.glossary_scope.find((g) => g.session_id === lessonCode)?.terms ?? [];\n}\n","import { type CurriculumPlan } from '../schemas/curriculumPlanSchema';\n\n/**\n * Translation policy resolver — decides which artifacts need a translated copy\n * at which point, per the plan's translation policy. Composer executes the\n * actual translation jobs; the kit owns the policy decision (pure function).\n *\n * Policy semantics (approved design D5):\n *  - after_artifact: every artifact gets translated as soon as it passes its gate\n *  - end_of_unit: artifacts of a unit are translated when the unit's last lesson is done\n *  - at_publish: nothing translates until explicit publish — recommended default\n */\n\nexport type TranslationTrigger = 'after_artifact' | 'end_of_unit' | 'at_publish';\n\nexport interface TranslationTarget {\n  /** Artifact-relative path of the SOURCE (always English). */\n  sourceRelPath: string;\n  /** Where the translated copy belongs (e.g. _i18n/vi/...). */\n  targetRelPath: string;\n  targetLanguage: string;\n  trigger: TranslationTrigger;\n  /** Unit code for end_of_unit grouping; null for course-wide artifacts. */\n  unitId: string | null;\n}\n\nconst TRANSLATABLE_SOT = ['CURRICULUM_PLAN.md', 'CURRICULUM_FRAMEWORK.md'];\nconst TRANSLATABLE_CONTENT_PREFIX = '_content/';\n\nexport function resolveTranslationTargets(\n  plan: CurriculumPlan,\n  knownArtifactPaths: string[],\n): TranslationTarget[] {\n  const policy = plan.translation.policy;\n  const lang = plan.translation.target_language;\n  if (policy !== 'after_artifact' && policy !== 'end_of_unit' && policy !== 'at_publish') return [];\n  if (!lang) return []; // no target language configured — nothing to translate\n  const completedLessons = new Set(plan.sessions.map((s) => s.id));\n  const targets: TranslationTarget[] = [];\n  for (const path of knownArtifactPaths) {\n    const isSot = TRANSLATABLE_SOT.some((s) => path === '_sot/' + s || path.endsWith('/' + s));\n    const isContent = path.startsWith(TRANSLATABLE_CONTENT_PREFIX);\n    if (!isSot && !isContent) continue;\n    const unitMatch = path.match(/_content\\/(U\\d{2})\\//);\n    const lessonMatch = path.match(/(U\\d{2}_M\\d{2}_L\\d{2})/);\n    targets.push({\n      sourceRelPath: path,\n      targetRelPath: '_i18n/' + lang + '/' + path,\n      targetLanguage: lang,\n      trigger: policy,\n      unitId: unitMatch ? unitMatch[1] : null,\n    });\n    void completedLessons; // per-lesson completion filtering is Composer's queue concern\n  }\n  return targets;\n}\n\n/** Should this target be translated NOW given the trigger and current state? */\nexport function isTranslationDue(\n  target: TranslationTarget,\n  context: { completedLessonsByUnit: Record<string, number>; totalLessonsByUnit: Record<string, number>; publishRequested: boolean },\n): boolean {\n  if (target.trigger === 'after_artifact') return true;\n  if (target.trigger === 'at_publish') return context.publishRequested;\n  // end_of_unit: unit's last lesson complete\n  const unit = target.unitId;\n  if (!unit) return context.publishRequested;\n  const done = context.completedLessonsByUnit[unit] ?? 0;\n  const total = context.totalLessonsByUnit[unit] ?? 0;\n  return total > 0 && done >= total;\n}\n","export * from './statusService';\nexport * from './contextService';\nexport * from './sotGeneratorService';\nexport * from './frameworkLinter';\nexport * from './lessonProductionService';\nexport * from './productionPromptAssembler';\nexport * from './singleArtifactService';\nexport * from './projectCreationService';\nexport * from './commandService';\nexport * from './deterministicPipelineRunner';\nexport * from './prefillService';\nexport * from './curriculumPlannerService';\nexport * from './depthReconciler';\nexport * from './frameworkProjectionService';\nexport * from './knowledgeExpositionService';\nexport * from './translationPolicyService';\nexport * from './languageDirective';\nexport * from './contextBuilder';\nexport * from './contextRouting';\nexport * from './contextSlots';\nexport * from './templateLoader';\nexport * from './slideProductionWorkflow';\nexport * from './curriculumHorizon';\nexport * from './loTimeEstimator';\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface JobManifest {\n  jobId: string;\n  courseTitle: string;\n  topic: string;\n  language: string;\n  status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | 'FAILED';\n  totalMilestones: number;\n  completedMilestones: number;\n  createdAt: string;\n  updatedAt: string;\n  artifacts: Array<{\n    milestoneId: string;\n    artifactType: string;\n    filePath: string;\n    sizeBytes: number;\n    createdAt: string;\n  }>;\n  error?: string;\n}\n\nexport class LocalWorkspaceManager {\n  private baseDir: string;\n\n  constructor(baseDir?: string) {\n    this.baseDir = baseDir || path.resolve(process.cwd(), 'output', 'workspace-jobs');\n  }\n\n  getJobDirectory(jobId: string): string {\n    return path.join(this.baseDir, jobId);\n  }\n\n  async initJobWorkspace(\n    jobId: string,\n    initialInfo: { courseTitle: string; topic: string; language: string; totalMilestones: number }\n  ): Promise<string> {\n    const jobDir = this.getJobDirectory(jobId);\n    await fs.mkdir(jobDir, { recursive: true });\n\n    const now = new Date().toISOString();\n    const manifest: JobManifest = {\n      jobId,\n      courseTitle: initialInfo.courseTitle,\n      topic: initialInfo.topic,\n      language: initialInfo.language,\n      status: 'IN_PROGRESS',\n      totalMilestones: initialInfo.totalMilestones,\n      completedMilestones: 0,\n      createdAt: now,\n      updatedAt: now,\n      artifacts: [],\n    };\n\n    await this.saveManifest(jobId, manifest);\n    return jobDir;\n  }\n\n  async saveArtifact(\n    jobId: string,\n    milestoneSlug: string,\n    filename: string,\n    content: string,\n    artifactType: string\n  ): Promise<string> {\n    const jobDir = this.getJobDirectory(jobId);\n    const targetDir = path.join(jobDir, milestoneSlug);\n    await fs.mkdir(targetDir, { recursive: true });\n\n    const filePath = path.join(targetDir, filename);\n    await fs.writeFile(filePath, content, 'utf-8');\n\n    const stat = await fs.stat(filePath);\n    const manifest = await this.getManifest(jobId);\n\n    if (manifest) {\n      manifest.artifacts.push({\n        milestoneId: milestoneSlug,\n        artifactType,\n        filePath: path.relative(jobDir, filePath),\n        sizeBytes: stat.size,\n        createdAt: new Date().toISOString(),\n      });\n      manifest.updatedAt = new Date().toISOString();\n      await this.saveManifest(jobId, manifest);\n    }\n\n    return filePath;\n  }\n\n  async getManifest(jobId: string): Promise<JobManifest | null> {\n    const manifestPath = path.join(this.getJobDirectory(jobId), 'manifest.json');\n    try {\n      const data = await fs.readFile(manifestPath, 'utf-8');\n      return JSON.parse(data) as JobManifest;\n    } catch {\n      return null;\n    }\n  }\n\n  async saveManifest(jobId: string, manifest: JobManifest): Promise<void> {\n    const manifestPath = path.join(this.getJobDirectory(jobId), 'manifest.json');\n    manifest.updatedAt = new Date().toISOString();\n    await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n  }\n\n  async markMilestoneCompleted(jobId: string): Promise<void> {\n    const manifest = await this.getManifest(jobId);\n    if (manifest) {\n      manifest.completedMilestones += 1;\n      if (manifest.completedMilestones >= manifest.totalMilestones) {\n        manifest.status = 'COMPLETED';\n      }\n      await this.saveManifest(jobId, manifest);\n    }\n  }\n\n  async markJobFailed(jobId: string, errorMsg: string): Promise<void> {\n    const manifest = await this.getManifest(jobId);\n    if (manifest) {\n      manifest.status = 'FAILED';\n      manifest.error = errorMsg;\n      await this.saveManifest(jobId, manifest);\n    }\n  }\n}\n","import { Octokit } from '@octokit/rest';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface GitPublishOptions {\n  jobId: string;\n  localJobDir: string;\n  githubToken?: string;\n  owner: string;\n  repo: string;\n  branch?: string;\n  commitMessage?: string;\n  createPullRequest?: boolean;\n}\n\nexport interface GitPublishResult {\n  success: boolean;\n  commitSha?: string;\n  branch: string;\n  pullRequestUrl?: string;\n  publishedFilesCount: number;\n  error?: string;\n}\n\n/**\n * Publishes generated course artifacts to a designated GitHub Repository (Git-as-CMS)\n */\nexport async function publishToGitHub(options: GitPublishOptions): Promise<GitPublishResult> {\n  const token = options.githubToken || process.env.GITHUB_TOKEN;\n  if (!token) {\n    return {\n      success: false,\n      branch: options.branch || 'main',\n      publishedFilesCount: 0,\n      error: 'Missing GITHUB_TOKEN in environment or options',\n    };\n  }\n\n  const octokit = new Octokit({ auth: token });\n  const targetBranch = options.branch || `generated/course-${options.jobId}`;\n  let publishedFilesCount = 0;\n\n  try {\n    // 1. Scan all files in local workspace\n    const filesToUpload: Array<{ path: string; content: string }> = [];\n\n    async function scanDir(currentDir: string) {\n      const entries = await fs.readdir(currentDir, { withFileTypes: true });\n      for (const entry of entries) {\n        const fullPath = path.join(currentDir, entry.name);\n        if (entry.isDirectory()) {\n          await scanDir(fullPath);\n        } else if (entry.isFile() && !entry.name.startsWith('.')) {\n          const content = await fs.readFile(fullPath, 'utf-8');\n          const relPath = path.relative(options.localJobDir, fullPath);\n          filesToUpload.push({ path: relPath, content });\n        }\n      }\n    }\n\n    await scanDir(options.localJobDir);\n\n    if (filesToUpload.length === 0) {\n      return {\n        success: false,\n        branch: targetBranch,\n        publishedFilesCount: 0,\n        error: 'No files found in workspace to upload',\n      };\n    }\n\n    // 2. Get reference to base branch (e.g. main)\n    const baseBranch = 'main';\n    let baseTreeSha: string;\n    let baseCommitSha: string;\n\n    try {\n      const { data: refData } = await octokit.git.getRef({\n        owner: options.owner,\n        repo: options.repo,\n        ref: `heads/${baseBranch}`,\n      });\n      baseCommitSha = refData.object.sha;\n\n      const { data: commitData } = await octokit.git.getCommit({\n        owner: options.owner,\n        repo: options.repo,\n        commit_sha: baseCommitSha,\n      });\n      baseTreeSha = commitData.tree.sha;\n    } catch (e: any) {\n      return {\n        success: false,\n        branch: targetBranch,\n        publishedFilesCount: 0,\n        error: `Failed to fetch base branch ${baseBranch}: ${e.message}`,\n      };\n    }\n\n    // 3. Create Blobs & Tree Entries\n    const treeItems: Array<{ path: string; mode: '100644'; type: 'blob'; sha: string }> = [];\n\n    for (const file of filesToUpload) {\n      const { data: blobData } = await octokit.git.createBlob({\n        owner: options.owner,\n        repo: options.repo,\n        content: Buffer.from(file.content).toString('base64'),\n        encoding: 'base64',\n      });\n\n      treeItems.push({\n        path: file.path,\n        mode: '100644',\n        type: 'blob',\n        sha: blobData.sha,\n      });\n      publishedFilesCount++;\n    }\n\n    // 4. Create New Git Tree\n    const { data: newTree } = await octokit.git.createTree({\n      owner: options.owner,\n      repo: options.repo,\n      base_tree: baseTreeSha,\n      tree: treeItems,\n    });\n\n    // 5. Create Commit\n    const message =\n      options.commitMessage ||\n      `feat(curriculum): publish generated course artifacts [job:${options.jobId}]`;\n\n    const { data: newCommit } = await octokit.git.createCommit({\n      owner: options.owner,\n      repo: options.repo,\n      message,\n      tree: newTree.sha,\n      parents: [baseCommitSha],\n    });\n\n    // 6. Update or Create Branch Ref\n    try {\n      await octokit.git.createRef({\n        owner: options.owner,\n        repo: options.repo,\n        ref: `refs/heads/${targetBranch}`,\n        sha: newCommit.sha,\n      });\n    } catch {\n      // If branch already exists, force update ref\n      await octokit.git.updateRef({\n        owner: options.owner,\n        repo: options.repo,\n        ref: `heads/${targetBranch}`,\n        sha: newCommit.sha,\n        force: true,\n      });\n    }\n\n    let prUrl: string | undefined = undefined;\n\n    // 7. Optional: Create Pull Request\n    if (options.createPullRequest && targetBranch !== baseBranch) {\n      try {\n        const { data: prData } = await octokit.pulls.create({\n          owner: options.owner,\n          repo: options.repo,\n          title: `[Curriculum AI] Generated Curriculum (${options.jobId})`,\n          head: targetBranch,\n          base: baseBranch,\n          body: `Automated curriculum generation output from job \\`${options.jobId}\\`.\\nContains ${publishedFilesCount} files.`,\n        });\n        prUrl = prData.html_url;\n      } catch {\n        // PR might already exist\n      }\n    }\n\n    return {\n      success: true,\n      commitSha: newCommit.sha,\n      branch: targetBranch,\n      pullRequestUrl: prUrl,\n      publishedFilesCount,\n    };\n  } catch (error: any) {\n    return {\n      success: false,\n      branch: targetBranch,\n      publishedFilesCount,\n      error: error.message || String(error),\n    };\n  }\n}\n","import { createClient, type SupabaseClient } from '@supabase/supabase-js';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface SupabasePublishOptions {\n  jobId: string;\n  courseTitle: string;\n  topic: string;\n  language: string;\n  milestones: Array<{\n    milestoneId: string;\n    milestoneName: string;\n    lessonSlug: string;\n    summary?: string;\n  }>;\n  supabaseUrl?: string;\n  supabaseServiceKey?: string;\n  bucketName?: string;\n}\n\nexport interface SupabasePublishResult {\n  success: boolean;\n  learningPathId?: string;\n  syncedMilestonesCount: number;\n  uploadedAssetsCount: number;\n  error?: string;\n}\n\n/**\n * Publishes metadata and binary assets to Supabase PostgreSQL & Storage Bucket\n */\nexport async function publishToSupabase(\n  options: SupabasePublishOptions\n): Promise<SupabasePublishResult> {\n  const supabaseUrl = options.supabaseUrl || process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL;\n  const serviceKey = options.supabaseServiceKey || process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;\n\n  if (!supabaseUrl || !serviceKey) {\n    return {\n      success: false,\n      syncedMilestonesCount: 0,\n      uploadedAssetsCount: 0,\n      error: 'Missing SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY',\n    };\n  }\n\n  const supabase: SupabaseClient = createClient(supabaseUrl, serviceKey);\n  const bucketName = options.bucketName || 'learning_resources';\n\n  try {\n    // 1. Upsert Learning Path / Course record\n    const { data: lpData, error: lpError } = await supabase\n      .from('learning_paths')\n      .upsert(\n        {\n          code: `LP-${options.jobId}`,\n          title: options.courseTitle,\n          description: `Auto-generated curriculum on ${options.topic}`,\n          language: options.language,\n          metadata: {\n            jobId: options.jobId,\n            topic: options.topic,\n            totalMilestones: options.milestones.length,\n            generatedAt: new Date().toISOString(),\n          },\n        },\n        { onConflict: 'code' }\n      )\n      .select('id')\n      .single();\n\n    const learningPathId = lpData?.id;\n\n    // 2. Upsert Lesson / Milestone Records\n    let syncedMilestonesCount = 0;\n    for (const [index, m] of options.milestones.entries()) {\n      const { error: lessonError } = await supabase.from('lessons').upsert(\n        {\n          code: `L-${options.jobId}-${m.milestoneId}`,\n          title: m.milestoneName,\n          order_index: index + 1,\n          learning_path_id: learningPathId,\n          metadata: {\n            milestoneId: m.milestoneId,\n            lessonSlug: m.lessonSlug,\n            summary: m.summary,\n          },\n        },\n        { onConflict: 'code' }\n      );\n\n      if (!lessonError) {\n        syncedMilestonesCount++;\n      }\n    }\n\n    return {\n      success: true,\n      learningPathId,\n      syncedMilestonesCount,\n      uploadedAssetsCount: 0,\n    };\n  } catch (error: any) {\n    return {\n      success: false,\n      syncedMilestonesCount: 0,\n      uploadedAssetsCount: 0,\n      error: error.message || String(error),\n    };\n  }\n}\n\n/**\n * Uploads a binary asset (MP3, SCORM zip, PNG) to Supabase Storage Bucket\n */\nexport async function uploadAssetToBucket(\n  filePath: string,\n  storagePath: string,\n  options?: { supabaseUrl?: string; supabaseServiceKey?: string; bucketName?: string }\n): Promise<{ success: boolean; publicUrl?: string; error?: string }> {\n  const supabaseUrl = options?.supabaseUrl || process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL;\n  const serviceKey = options?.supabaseServiceKey || process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;\n\n  if (!supabaseUrl || !serviceKey) {\n    return { success: false, error: 'Missing Supabase credentials' };\n  }\n\n  const supabase = createClient(supabaseUrl, serviceKey);\n  const bucketName = options?.bucketName || 'course-materials';\n\n  try {\n    const fileBuffer = await fs.readFile(filePath);\n    const { error: uploadError } = await supabase.storage\n      .from(bucketName)\n      .upload(storagePath, fileBuffer, { upsert: true });\n\n    if (uploadError) {\n      return { success: false, error: uploadError.message };\n    }\n\n    const { data } = supabase.storage.from(bucketName).getPublicUrl(storagePath);\n    return { success: true, publicUrl: data.publicUrl };\n  } catch (error: any) {\n    return { success: false, error: error.message || String(error) };\n  }\n}\n","import type { ICurriculumStorage } from '../storage/types';\nimport { runCurriculumAIInference } from '../ai/streamRunner';\n\nexport interface ParsedQuizQuestion {\n  lessonId: string;\n  questionNumber: number;\n  questionText: string;\n  options: {\n    A: string;\n    B: string;\n    C: string;\n    D: string;\n  };\n  correctAnswer: 'A' | 'B' | 'C' | 'D';\n  explanation: string;\n  timeLimitSeconds: number;\n}\n\nexport interface DeliveryPackResult {\n  projectId: string;\n  handoverDoc: string;\n  teacherPackFiles: string[];\n  studentPackFiles: string[];\n  parentPackFiles: string[];\n  clientPackFiles: string[];\n  quizzesCsv: string;\n  quizzesJson: ParsedQuizQuestion[];\n  timestamp: string;\n}\n\n/**\n * Extracts and parses all quiz questions from markdown content of QUIZ_*.md files.\n */\nexport function parseQuizMarkdown(content: string, lessonId: string): ParsedQuizQuestion[] {\n  const questions: ParsedQuizQuestion[] = [];\n  const lines = content.split('\\n');\n\n  let currentQuestion: Partial<ParsedQuizQuestion> | null = null;\n  let qCounter = 1;\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i].trim();\n\n    // Match question start e.g. \"### Câu 1:\", \"**Câu 1:**\", \"1. Question...\", \"### Question 1:\"\n    const qMatch = line.match(/^(?:###\\s*)?(?:Câu|\\*\\*Câu|Question|\\*\\*Question|\\d+\\.)\\s*(\\d+)?[:\\.]?\\s*(.*)/i);\n    if (qMatch && (line.includes('?') || line.includes(':') || line.startsWith('###') || line.startsWith('**Câu'))) {\n      if (currentQuestion && currentQuestion.questionText && currentQuestion.options) {\n        questions.push({\n          lessonId,\n          questionNumber: currentQuestion.questionNumber || qCounter++,\n          questionText: currentQuestion.questionText,\n          options: currentQuestion.options as any,\n          correctAnswer: currentQuestion.correctAnswer || 'A',\n          explanation: currentQuestion.explanation || '',\n          timeLimitSeconds: 60,\n        });\n      }\n\n      currentQuestion = {\n        lessonId,\n        questionNumber: qMatch[1] ? parseInt(qMatch[1]) : qCounter,\n        questionText: qMatch[2] ? qMatch[2].replace(/\\*\\*/g, '').trim() : line.replace(/^###|\\*\\*/g, '').trim(),\n        options: { A: '', B: '', C: '', D: '' },\n        correctAnswer: 'A',\n        explanation: '',\n        timeLimitSeconds: 60,\n      };\n      continue;\n    }\n\n    if (!currentQuestion) continue;\n\n    // Match options: A. ..., B. ..., C. ..., D. ... or - A. ...\n    const optMatch = line.match(/^[-*]?\\s*([A-D])[\\.\\)]\\s*(.*)/i);\n    if (optMatch) {\n      const optKey = optMatch[1].toUpperCase() as 'A' | 'B' | 'C' | 'D';\n      let optText = optMatch[2].trim();\n\n      // Check if correct answer is marked on the same line e.g. \"A. Swift (Đáp án đúng)\" or \"✅\"\n      if (optText.includes('(Đáp án đúng)') || optText.includes('✅') || optText.includes('(Correct)')) {\n        currentQuestion.correctAnswer = optKey;\n        optText = optText.replace(/\\(Đáp án đúng\\)|\\(Correct\\)|✅/g, '').trim();\n      }\n\n      if (currentQuestion.options) {\n        currentQuestion.options[optKey] = optText;\n      }\n      continue;\n    }\n\n    // Match correct answer tag e.g. \"**Đáp án đúng:** B\" or \"- **Đáp án:** A\"\n    const ansMatch = line.match(/(?:Đáp án đúng|Đáp án|Correct Answer|Answer)[:\\s\\*]+([A-D])/i);\n    if (ansMatch) {\n      currentQuestion.correctAnswer = ansMatch[1].toUpperCase() as 'A' | 'B' | 'C' | 'D';\n      continue;\n    }\n\n    // Match explanation e.g. \"**Giải thích:** ...\" or \"- **Giải thích:** ...\"\n    const expMatch = line.match(/(?:Giải thích|Explanation)[:\\s\\*]+(.*)/i);\n    if (expMatch) {\n      currentQuestion.explanation = expMatch[1].replace(/\\*\\*/g, '').trim();\n      continue;\n    }\n  }\n\n  // Push the last question\n  if (currentQuestion && currentQuestion.questionText && currentQuestion.options) {\n    questions.push({\n      lessonId,\n      questionNumber: currentQuestion.questionNumber || qCounter,\n      questionText: currentQuestion.questionText,\n      options: currentQuestion.options as any,\n      correctAnswer: currentQuestion.correctAnswer || 'A',\n      explanation: currentQuestion.explanation || '',\n      timeLimitSeconds: 60,\n    });\n  }\n\n  return questions;\n}\n\n/**\n * Converts parsed questions to standard CSV formats (Kahoot, Canvas, Quizizz).\n */\nexport function formatQuizzesToCsv(\n  questions: ParsedQuizQuestion[],\n  format: 'kahoot' | 'canvas' | 'quizizz' = 'kahoot'\n): string {\n  if (format === 'kahoot') {\n    // Kahoot format: Question - max 120 chars | Answer 1 | Answer 2 | Answer 3 | Answer 4 | Time limit (sec) | Correct answer(s)\n    const header = 'Question,Answer 1,Answer 2,Answer 3,Answer 4,Time limit (sec),Correct answer(s)\\n';\n    const rows = questions.map(q => {\n      const cleanQ = `\"${q.questionText.replace(/\"/g, '\"\"')}\"`;\n      const a1 = `\"${(q.options.A || '').replace(/\"/g, '\"\"')}\"`;\n      const a2 = `\"${(q.options.B || '').replace(/\"/g, '\"\"')}\"`;\n      const a3 = `\"${(q.options.C || '').replace(/\"/g, '\"\"')}\"`;\n      const a4 = `\"${(q.options.D || '').replace(/\"/g, '\"\"')}\"`;\n      const correctIndex = q.correctAnswer === 'A' ? 1 : q.correctAnswer === 'B' ? 2 : q.correctAnswer === 'C' ? 3 : 4;\n      return `${cleanQ},${a1},${a2},${a3},${a4},${q.timeLimitSeconds || 60},${correctIndex}`;\n    }).join('\\n');\n    return header + rows;\n  }\n\n  if (format === 'quizizz') {\n    // Quizizz format: Question Text, Question Type, Option 1, Option 2, Option 3, Option 4, Option 5, Correct Answer, Time in seconds\n    const header = 'Question Text,Question Type,Option 1,Option 2,Option 3,Option 4,Option 5,Correct Answer,Time in seconds\\n';\n    const rows = questions.map(q => {\n      const cleanQ = `\"${q.questionText.replace(/\"/g, '\"\"')}\"`;\n      const a1 = `\"${(q.options.A || '').replace(/\"/g, '\"\"')}\"`;\n      const a2 = `\"${(q.options.B || '').replace(/\"/g, '\"\"')}\"`;\n      const a3 = `\"${(q.options.C || '').replace(/\"/g, '\"\"')}\"`;\n      const a4 = `\"${(q.options.D || '').replace(/\"/g, '\"\"')}\"`;\n      const correctIndex = q.correctAnswer === 'A' ? 1 : q.correctAnswer === 'B' ? 2 : q.correctAnswer === 'C' ? 3 : 4;\n      return `${cleanQ},Multiple Choice,${a1},${a2},${a3},${a4},,${correctIndex},${q.timeLimitSeconds || 60}`;\n    }).join('\\n');\n    return header + rows;\n  }\n\n  // Canvas LMS / Standard format\n  const header = 'Lesson ID,Question Number,Question Text,Option A,Option B,Option C,Option D,Correct Answer,Explanation\\n';\n  const rows = questions.map(q => {\n    return `\"${q.lessonId}\",${q.questionNumber},\"${q.questionText.replace(/\"/g, '\"\"')}\",\"${(q.options.A || '').replace(/\"/g, '\"\"')}\",\"${(q.options.B || '').replace(/\"/g, '\"\"')}\",\"${(q.options.C || '').replace(/\"/g, '\"\"')}\",\"${(q.options.D || '').replace(/\"/g, '\"\"')}\",\"${q.correctAnswer}\",\"${(q.explanation || '').replace(/\"/g, '\"\"')}\"`;\n  }).join('\\n');\n  return header + rows;\n}\n\n/**\n * Extracts and exports all quiz files in the project to CSV & JSON.\n */\nexport async function exportAllProjectQuizzes(\n  storage: ICurriculumStorage,\n  projectId: string,\n  format: 'kahoot' | 'canvas' | 'quizizz' = 'kahoot'\n): Promise<{ csv: string; questions: ParsedQuizQuestion[] }> {\n  const lessons = await storage.listLessons(projectId);\n  const allQuestions: ParsedQuizQuestion[] = [];\n\n  for (const l of lessons) {\n    const unitCode = l.lessonId.split('_')[0] || 'U01';\n    const possiblePaths = [\n      `_content/${unitCode}/QUIZ_${l.lessonId}.md`,\n      `lessons/${l.lessonId}/QUIZ_${l.lessonId}.md`,\n      `QUIZ_${l.lessonId}.md`,\n    ];\n\n    for (const p of possiblePaths) {\n      const content = await storage.readArtifact(projectId, p);\n      if (content) {\n        const parsed = parseQuizMarkdown(content, l.lessonId);\n        allQuestions.push(...parsed);\n        break;\n      }\n    }\n  }\n\n  const csv = formatQuizzesToCsv(allQuestions, format);\n  await storage.saveArtifact(projectId, `_released/quizzes_${format}.csv`, csv);\n  await storage.saveArtifact(projectId, `_released/QUIZ_BANK.json`, JSON.stringify(allQuestions, null, 2));\n\n  return { csv, questions: allQuestions };\n}\n\n/**\n * Builds the 4 standard Delivery Packages and generates HANDOVER_DOCUMENT.md.\n */\nexport async function buildDeliveryPackages(\n  storage: ICurriculumStorage,\n  projectId: string,\n  onProgress?: (agent: string, message: string) => void\n): Promise<DeliveryPackResult> {\n  onProgress?.('@packager', '📦 Bắt đầu quy trình kiểm tra chất lượng và phân phối 4 Gói Bàn Giao...');\n\n  const statusReport = await storage.getProjectStatus(projectId);\n  const framework = (await storage.readSotDocument(projectId, 'CURRICULUM_FRAMEWORK.md')) || '';\n  const brief = (await storage.readSotDocument(projectId, 'PROJECT_BRIEF.md')) || '';\n  const dateStr = new Date().toISOString().split('T')[0];\n\n  // 1. Export Quizzes to CSV & JSON\n  onProgress?.('@assessor', '📊 Đang trích xuất toàn bộ ngân hàng câu hỏi trắc nghiệm sang chuẩn Kahoot & Canvas CSV...');\n  const { csv: quizzesCsv, questions: quizzesJson } = await exportAllProjectQuizzes(storage, projectId, 'kahoot');\n\n  // 2. Package Teacher Pack\n  onProgress?.('@packager', '👨‍🏫 Đang lắp ráp Teacher Pack (Giáo án, Kế hoạch bài dạy, Lời thoại)...');\n  const teacherHandbook = `---\nid: \"${projectId.toUpperCase()}-TEACHER-HANDBOOK\"\ntitle: \"Teacher Handbook: ${projectId.toUpperCase()}\"\ntype: \"HANDBOOK\"\nphase: \"P4\"\ndate: \"${dateStr}\"\n---\n\n# 👨‍🏫 TEACHER HANDBOOK & SCRIPT GUIDE\n\n## 1. Tổng Quan Khóa Học\n${brief.slice(0, 1000)}\n\n## 2. Khung Phân Bổ Sư Phạm 5E & Thời Gian Giảng Dạy\n- Mỗi buổi học chuẩn hóa 90 phút.\n- Tuân thủ nghiêm ngặt tiến trình: Engage (10m) $\\\\rightarrow$ Explore (20m) $\\\\rightarrow$ Explain (25m) $\\\\rightarrow$ Elaborate (25m) $\\\\rightarrow$ Evaluate (10m).\n\n## 3. Danh Mục Bài Giảng (Lesson Plans)\n${statusReport.lessons.map(l => `- \\`LESSON_${l.lessonId}.md\\``).join('\\n') || '- Đang cập nhật'}\n`;\n  await storage.saveArtifact(projectId, `_released/teacher_pack/TEACHER_HANDBOOK.md`, teacherHandbook);\n\n  // 3. Package Student Pack\n  onProgress?.('@packager', '🧑‍🎓 Đang đóng gói Student Pack (Slide bài giảng, Lab thực hành, Phiếu học tập)...');\n  const studentSyllabus = `---\nid: \"${projectId.toUpperCase()}-STUDENT-SYLLABUS\"\ntitle: \"Student Syllabus: ${projectId.toUpperCase()}\"\ntype: \"SYLLABUS\"\nphase: \"P4\"\ndate: \"${dateStr}\"\n---\n\n# 🧑‍🎓 HỒ SƠ HỌC TẬP & LỘ TRÌNH THỰC HÀNH\n\n## 1. Mục Tiêu Năng Lực Đầu Ra\nHọc viên sau khi hoàn thành khóa học sẽ làm chủ toàn diện các kỹ năng và kiến thức đã định nghĩa trong đồ thị tri thức.\n\n## 2. Danh Mục Slide & Lab Thực Hành\n${statusReport.lessons.map(l => `- **${l.lessonId}:** Slide \\`SLIDE_${l.lessonId}.md\\` + Lab \\`ACT_${l.lessonId}.md\\``).join('\\n') || '- Đang cập nhật'}\n`;\n  await storage.saveArtifact(projectId, `_released/student_pack/STUDENT_SYLLABUS.md`, studentSyllabus);\n\n  // 4. Package Parent Pack\n  onProgress?.('@packager', '👨‍👩‍👧 Đang lập Báo cáo Bàn giao Phụ huynh (Parent Pack)...');\n  const parentOverview = `---\nid: \"${projectId.toUpperCase()}-PARENT-OVERVIEW\"\ntitle: \"Parent Overview: ${projectId.toUpperCase()}\"\ntype: \"REPORT\"\nphase: \"P4\"\ndate: \"${dateStr}\"\n---\n\n# 👨‍👩‍👧 BÁO CÁO TIẾN ĐỘ & KẾ HOẠCH HỌC TẬP DÀNH CHO PHỤ HUYNH\n\n- **Tên chương trình:** ${projectId.toUpperCase()}\n- **Thời lượng:** ${statusReport.totalLessons} bài học (Chuẩn 90 phút/buổi).\n- **Mục tiêu phát triển:** Giúp học sinh làm chủ tư duy giải quyết vấn đề, tự tay phát triển các đồ án công nghệ thực tế và tự tin trước các kỳ thi đánh giá năng lực.\n`;\n  await storage.saveArtifact(projectId, `_released/parent_pack/COURSE_OVERVIEW.md`, parentOverview);\n\n  // 5. Package Client Pack & Handover Document\n  onProgress?.('@packager', '🏢 Đang hoàn tất Client Pack & Biên bản Nghiệm thu Bàn giao (HANDOVER_DOCUMENT.md)...');\n  const handoverDoc = `---\nid: \"${projectId.toUpperCase()}-HANDOVER\"\ntitle: \"Handover Document: ${projectId.toUpperCase()}\"\ntype: \"HANDOVER_DOCUMENT\"\ncreated_by: \"Curriculum OS Packager\"\nphase: \"P4\"\ndeliverable: \"P4-T1\"\nversion: \"v1.0\"\ndate: \"${dateStr}\"\ntemplate_contract: \"artifact-template-v1\"\n---\n\n# 🏢 BIÊN BẢN NGHIỆM THU & BÀN GIAO HỌC LIỆU (HANDOVER DOCUMENT)\n\n## 1. Thông Tin Nghiệm Thu Dự Án\n- **Mã dự án:** \\`${projectId}\\`\n- **Ngày nghiệm thu bàn giao:** ${dateStr}\n- **Đơn vị phát triển:** Curriculum OS Automation Team\n- **Tiêu chuẩn chất lượng:** 100% Khớp mục tiêu Bloom, Thang đo 5E/EDP, Code sạch không lỗi cú pháp.\n\n## 2. Thống Kê Học Liệu Bàn Giao\n- **Tài liệu Nền tảng (SOT):** ${statusReport.sotReadiness.filter(s => s.exists).length}/7 Files Sẵn sàng (100%).\n- **Tổng số bài học hoàn tất:** ${statusReport.completedCount}/${statusReport.totalLessons} bài học.\n- **Tổng số câu hỏi trắc nghiệm trích xuất:** ${quizzesJson.length} câu hỏi.\n- **Định dạng xuất khẩu:** Markdown chuẩn GitHub, Kahoot CSV, Canvas CSV, QUIZ_BANK JSON.\n\n## 3. Cấu Trúc 4 Gói Bàn Giao Đã Đóng Gói (\\`_released/\\`)\n- 📁 **\\`_released/teacher_pack/\\`**: \\`TEACHER_HANDBOOK.md\\` + Toàn bộ Giáo án \\`LESSON_*.md\\`\n- 📁 **\\`_released/student_pack/\\`**: \\`STUDENT_SYLLABUS.md\\` + Slide \\`SLIDE_*.md\\` + Lab \\`ACT_*.md\\`\n- 📁 **\\`_released/parent_pack/\\`**: \\`COURSE_OVERVIEW.md\\`\n- 📁 **\\`_released/client_pack/\\`**: 7 Files SOT + \\`ALIGNMENT_MATRIX.md\\` + \\`HANDOVER_DOCUMENT.md\\`\n- 📁 **\\`_released/quizzes_kahoot.csv\\`**: Ngân hàng trắc nghiệm chuẩn Kahoot.\n- 📁 **\\`_released/QUIZ_BANK.json\\`**: Ngân hàng JSON tương thích Interactive Quiz Kit.\n\n---\n- **Đại diện Đơn vị Phát triển:** @packager (Curriculum OS)\n- **Trạng thái:** ✅ **SẴN SÀNG TRIỂN KHAI THƯƠNG MẠI (COMMERCIAL READY)**\n`;\n  await storage.saveArtifact(projectId, `_released/client_pack/HANDOVER_DOCUMENT.md`, handoverDoc);\n  await storage.saveArtifact(projectId, `HANDOVER_DOCUMENT.md`, handoverDoc);\n\n  onProgress?.('@packager', `🎉 Bàn giao thành công toàn bộ 4 gói học liệu vào thư mục \\`_released/\\`!`);\n\n  return {\n    projectId,\n    handoverDoc,\n    teacherPackFiles: [`_released/teacher_pack/TEACHER_HANDBOOK.md`],\n    studentPackFiles: [`_released/student_pack/STUDENT_SYLLABUS.md`],\n    parentPackFiles: [`_released/parent_pack/COURSE_OVERVIEW.md`],\n    clientPackFiles: [`_released/client_pack/HANDOVER_DOCUMENT.md`, `HANDOVER_DOCUMENT.md`],\n    quizzesCsv,\n    quizzesJson,\n    timestamp: dateStr,\n  };\n}\n","/**\n * @thanh01.pmt/curriculum-kit\n * Core Entrypoint\n */\n\nexport * from './schemas';\nexport * from './ai';\nexport * from './pipeline';\nexport * from './storage';\nexport * from './constants';\nexport * from './services';\nexport * from './publishers';\n// NOTE: chỉ re-export phần THUẦN của src/workflow (gateSettings) vào barrel.\n// Các module 'use step'/'use workflow'/defineHook (steps, workflows, hooks,\n// rateLimitHandler) KHÔNG được đưa vào barrel: Workflow SDK discovery sẽ kéo\n// toàn barrel vào VM sandbox bundle của consumer, nơi các top-level Node\n// imports (fs, crypto…) vỡ với \"ReferenceError: require is not defined\".\n// Consumer muốn dùng durable workflows của kit phải import tường minh:\n//   import { ... } from '@thanh01.pmt/curriculum-kit/workflow';\nexport * from './workflow/gateSettings';\nexport * from './errors';\nexport * from './evaluators';\nexport * from './registry';\nexport * from './parsers';\nexport * from './services/sectionExtractor';\nexport * from './services/promptResolver';\n// SOT ownership taxonomy + boundary linter (kit 1.5.72) + SOT template loader\n// (dist-aware since 1.5.70) — zero-overlap contract for the merged SOT set.\nexport * from './services/sotOwnership';\nexport { loadSotTemplate, reportSotBoundaries } from './services/sotGeneratorService';\nexport * from './standards';\nexport * from './media';\n// P52: src/templates/ (retyped TS template strings) is deleted — artifact\n// structure loads at runtime from docs/refs/templates/*.md via services/templateLoader.\nexport * from './ai/chatToolLoop';\nexport * from './ai/toolLoopTypes';","import type { LessonPlan, DiagnosticQuizInput, ActivityLab, SlideDeck, CodeLab, CurriculumPlan } from '../schemas';\nimport type { AcademicAuditFinding, DimensionScore } from './types';\nimport {\n  DEFAULT_OVERHEAD_RATIO,\n  MAX_IN_SESSION_SETUP_MINUTES,\n  ENVIRONMENT_PROVISIONING_MODELS,\n} from '../constants/pedagogy';\n\n/**\n * 🛠️ Deterministic Structural & Contract Linter\n * Strict rule-based checks: Schema completeness, Zero-drift ID alignment, \n * format sanity, and structural safety rules.\n * \n * ⛔ DOES NOT do regex-based semantic parsing or fake semantic understanding.\n * All semantic, cognitive, and pedagogical evaluations are delegated to LLM-as-a-Judge.\n */\nexport class DeterministicStructuralLinter {\n  /**\n   * Validates structural invariants across a complete lesson bundle.\n   */\n  public static lintBundle(input: {\n    lesson: LessonPlan;\n    quiz?: DiagnosticQuizInput;\n    activity?: ActivityLab;\n    slides?: SlideDeck;\n    codeLab?: CodeLab;\n  }): {\n    passed: boolean;\n    structuralScore: number;\n    findings: AcademicAuditFinding[];\n    strengths: string[];\n  } {\n    const { lesson, quiz, activity, slides, codeLab } = input;\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    const baseLessonId = lesson.lessonId;\n    const baseLanguage = lesson.language;\n\n    // 1. Structural Schema Invariants: Lesson\n    if (!lesson.title || lesson.title.trim().length === 0) {\n      score -= 20;\n      findings.push({\n        id: 'struct_missing_lesson_title',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'CRITICAL',\n        title: 'Missing Lesson Title',\n        description: 'Lesson plan has an empty or whitespace title.',\n        remediationAdvice: 'Provide a non-empty lesson title.',\n      });\n    }\n\n    if (!lesson.learningObjectives || lesson.learningObjectives.length === 0) {\n      score -= 25;\n      findings.push({\n        id: 'struct_empty_learning_objectives',\n        dimension: 'CONSTRUCTIVE_ALIGNMENT',\n        severity: 'CRITICAL',\n        title: 'Empty Learning Objectives Array',\n        description: 'Lesson plan contains 0 learning objectives.',\n        remediationAdvice: 'Declare at least 2 structured Learning Objectives in the schema.',\n      });\n    }\n\n    if (!lesson.sections || lesson.sections.length === 0) {\n      score -= 25;\n      findings.push({\n        id: 'struct_empty_lesson_sections',\n        dimension: '5E_INSTRUCTIONAL_FIDELITY',\n        severity: 'CRITICAL',\n        title: 'Empty Lesson Sections Array',\n        description: 'Lesson plan contains no instructional sections.',\n        remediationAdvice: 'Provide structured lesson flow sections.',\n      });\n    }\n\n    // 2. Structural Contract Synchronization (Zero-Drift)\n    if (quiz && quiz.quizId !== baseLessonId && !quiz.quizId.includes(baseLessonId)) {\n      score -= 15;\n      findings.push({\n        id: 'struct_quiz_id_mismatch',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'MAJOR',\n        title: 'Quiz ID Contract Mismatch',\n        description: `Quiz ID \"${quiz.quizId}\" does not match Lesson ID \"${baseLessonId}\".`,\n        remediationAdvice: `Sync Quiz quizId to \"${baseLessonId}\".`,\n        affectedElement: quiz.quizId,\n      });\n    }\n\n    if (activity && activity.lessonId !== baseLessonId) {\n      score -= 15;\n      findings.push({\n        id: 'struct_act_id_mismatch',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'MAJOR',\n        title: 'Activity Lesson ID Contract Mismatch',\n        description: `Activity lessonId \"${activity.lessonId}\" does not match Lesson ID \"${baseLessonId}\".`,\n        remediationAdvice: `Sync Activity lessonId to \"${baseLessonId}\".`,\n        affectedElement: activity.lessonId,\n      });\n    }\n\n    if (slides && slides.lessonId !== baseLessonId) {\n      score -= 15;\n      findings.push({\n        id: 'struct_slides_id_mismatch',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'MAJOR',\n        title: 'Slide Deck Lesson ID Contract Mismatch',\n        description: `Slide deck lessonId \"${slides.lessonId}\" does not match Lesson ID \"${baseLessonId}\".`,\n        remediationAdvice: `Sync Slide deck lessonId to \"${baseLessonId}\".`,\n        affectedElement: slides.lessonId,\n      });\n    }\n\n    // 3. Language Uniformity\n    const satellites = [\n      { type: 'QUIZ', lang: quiz?.language },\n      { type: 'ACT', lang: activity?.language },\n      { type: 'SLIDE', lang: slides?.language },\n    ];\n    for (const sat of satellites) {\n      if (sat.lang && sat.lang.toLowerCase() !== baseLanguage.toLowerCase()) {\n        score -= 25;\n        findings.push({\n          id: `struct_language_mismatch_${sat.type}`,\n          dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n          severity: 'CRITICAL',\n          title: `Language Policy Inconsistency in ${sat.type}`,\n          description: `Master Lesson is in \"${baseLanguage}\" but ${sat.type} is declared in \"${sat.lang}\".`,\n          remediationAdvice: `Set ${sat.type} language to \"${baseLanguage}\".`,\n        });\n      }\n    }\n\n    // 4. Structural Quiz Invariants (4 options, exactly 1 key)\n    if (quiz && quiz.questions) {\n      for (let i = 0; i < quiz.questions.length; i++) {\n        const q = quiz.questions[i];\n        const qId = q.id || `Q${i + 1}`;\n        const options = q.options || [];\n\n        if (options.length < 4) {\n          score -= 10;\n          findings.push({\n            id: `struct_quiz_option_count_${qId}`,\n            dimension: 'MISCONCEPTION_RIGOR',\n            severity: 'MAJOR',\n            title: `Structural Option Count Error in ${qId}`,\n            description: `Question ${qId} has ${options.length} options (standard schema requires 4).`,\n            remediationAdvice: 'Ensure each question has 4 options (A, B, C, D).',\n            affectedElement: qId,\n          });\n        }\n\n        const correctCount = options.filter((o) => o.isCorrect).length;\n        if (correctCount !== 1) {\n          score -= 20;\n          findings.push({\n            id: `struct_quiz_key_count_${qId}`,\n            dimension: 'MISCONCEPTION_RIGOR',\n            severity: 'CRITICAL',\n            title: `Key Assignment Error in ${qId}`,\n            description: `Question ${qId} has ${correctCount} correct options (must be exactly 1).`,\n            remediationAdvice: 'Set `isCorrect: true` on exactly 1 option.',\n            affectedElement: qId,\n          });\n        }\n      }\n    }\n\n    // 5. Hardware BOM Safety Invariant (LED requires current-limiting resistor)\n    if (activity?.materialsBOM?.hardware && activity.materialsBOM.hardware.length > 0) {\n      const hwText = activity.materialsBOM.hardware.join(' ').toLowerCase();\n      const hasLED = hwText.includes('led');\n      const hasResistor = hwText.includes('điện trở') || hwText.includes('resistor') || hwText.includes('220') || hwText.includes('330') || hwText.includes('1k');\n\n      if (hasLED && !hasResistor) {\n        score -= 20;\n        findings.push({\n          id: 'struct_hardware_unsafe_led_no_resistor',\n          dimension: 'TECHNICAL_AUTHENTICITY',\n          severity: 'CRITICAL',\n          title: 'Unsafe Circuit BOM: LED without Current-Limiting Resistor',\n          description: 'Hardware BOM includes LED without a 220Ω-1kΩ resistor, causing circuit overload.',\n          remediationAdvice: 'Add a 220Ω current-limiting resistor to the hardware materials list.',\n        });\n      }\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    const passed = score >= 80 && !findings.some((f) => f.severity === 'CRITICAL');\n\n    if (passed) {\n      strengths.push('Deterministic structure, ID contracts, and schema invariants strictly verified.');\n    }\n\n    return {\n      passed,\n      structuralScore: score,\n      findings,\n      strengths,\n    };\n  }\n\n  /**\n   * P50: Validates macro-pedagogical invariants across a CurriculumPlan.\n   * Checks:\n   * 1. ZPD violations without self-healing recap (NO_ZPD_BRIDGE)\n   * 2. Walking Skeleton existence (Unit 1 delivers working software)\n   * 3. Inter-unit Mastery Gate presence\n   */\n  public static lintPlan(plan: CurriculumPlan): {\n    passed: boolean;\n    score: number;\n    findings: AcademicAuditFinding[];\n    strengths: string[];\n  } {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    // 1. ZPD cognitive load check\n    // 2026-09-18: new-concept overflow is a STRUCTURAL violation of the\n    // Vygotsky ZPD constant (script-countable) — escalated to CRITICAL so it\n    // fails the linter instead of just denting the score. The keyword proxy\n    // stays advisory (see checkSessionZpd). NO_ZPD_BRIDGE remains MAJOR:\n    // the planner self-heals it with recap_in_lesson, so it is only a finding\n    // when the repair is missing.\n    for (const s of plan.sessions) {\n      if (s.zpd_status?.verdict === 'TOO_MANY_NEW') {\n        score -= 25;\n        findings.push({\n          id: `PLAN_TOO_MANY_NEW_${s.id}`,\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'CRITICAL',\n          title: `Cognitive Overload in Session ${s.id}`,\n          description: s.zpd_status.issues.join('; ') || `Session introduces more new concepts than the ZPD limit allows.`,\n          remediationAdvice: `Split the session: move overflow concepts to a later session (the packer flushes on concept budget automatically).`,\n          affectedElement: s.id,\n        });\n      } else if (s.zpd_status?.verdict === 'NO_ZPD_BRIDGE') {\n        const hasRecap = s.prerequisite_decisions.some((d) => d.decision === 'recap_in_lesson');\n        if (!hasRecap) {\n          score -= 20;\n          findings.push({\n            id: `PLAN_NO_ZPD_BRIDGE_${s.id}`,\n            dimension: 'CONSTRUCTIVE_ALIGNMENT',\n            severity: 'CRITICAL',\n            title: `Unhealed ZPD Bridge in Session ${s.id}`,\n            description: `Session introduces new concepts with 0 known concept bridges, and lacks recap scaffolding.`,\n            remediationAdvice: `Add a recap_in_lesson prerequisite decision or scaffolding auto-injector to anchor new learning in prior concepts.`,\n            affectedElement: s.id,\n          });\n        }\n      }\n    }\n\n    // 2. Walking Skeleton check\n    if (!plan.walking_skeleton || plan.walking_skeleton.epitome_deliverables.length === 0) {\n      score -= 10;\n      findings.push({\n        id: 'PLAN_MISSING_WALKING_SKELETON',\n        dimension: 'CONSTRUCTIVE_ALIGNMENT',\n        severity: 'MINOR',\n        title: 'Missing Walking Skeleton Definition',\n        description: 'Plan does not declare an Epitome (walking skeleton) in Unit 1.',\n        remediationAdvice: 'Ensure Unit 1 defines minimal end-to-end deliverables.',\n      });\n    } else {\n      strengths.push(`Unit ${plan.walking_skeleton.epitome_unit_id} establishes an end-to-end Walking Skeleton (Epitome).`);\n    }\n\n    // 3. Mastery Gates check\n    if (plan.units.length > 1 && (!plan.mastery_gates || plan.mastery_gates.length === 0)) {\n      score -= 20;\n      findings.push({\n        id: 'PLAN_MISSING_MASTERY_GATES',\n        dimension: '5E_INSTRUCTIONAL_FIDELITY',\n        severity: 'MAJOR',\n        title: 'Missing Inter-Unit Mastery Gates',\n        description: 'Multi-unit course lacks formal transition gates between units.',\n        remediationAdvice: 'Define exit criteria and remediation sprints for each inter-unit boundary.',\n      });\n    } else if (plan.mastery_gates && plan.mastery_gates.length > 0) {\n      strengths.push(`${plan.mastery_gates.length} inter-unit Mastery Gates defined with remediation protocols.`);\n      // Check if multi-unit course has a final Capstone Showcase gate\n      const hasCompletionGate = plan.mastery_gates.some((g) => g.next_unit_id === 'COURSE_COMPLETION');\n      if (plan.units.length > 1 && !hasCompletionGate) {\n        score -= 5;\n        findings.push({\n          id: 'PLAN_MISSING_CAPSTONE_GATE',\n          dimension: '5E_INSTRUCTIONAL_FIDELITY',\n          severity: 'MINOR',\n          title: 'Missing Final Capstone Showcase Gate',\n          description: 'Course lacks a final mastery gate validating project deliverables before Demo Day.',\n          remediationAdvice: 'Add a capstone showcase gate with exit criteria covering final deliverables.',\n        });\n      }\n    }\n\n    // 4. Session Content Budget, Duplicate Nodes & Exit Evidence Checks\n    const maxContentMinutes = Math.floor(\n      (plan.constraints?.session_duration_minutes || 90) * (1 - DEFAULT_OVERHEAD_RATIO),\n    );\n    for (const s of plan.sessions) {\n      const contentMins = (s.knowledge_minutes || 0) + (s.practice_minutes || 0);\n      if (contentMins > maxContentMinutes + 2) {\n        score -= 5;\n        findings.push({\n          id: `PLAN_OVERSIZED_SESSION_${s.id}`,\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'MINOR',\n          title: `Content Minutes Exceeded in Session ${s.id}`,\n          description: `Session planned for ${contentMins} content minutes exceeds the ${maxContentMinutes}m budget (15% overhead reserve).`,\n          remediationAdvice: `Reduce knowledge or practice minutes to fit within ${maxContentMinutes} minutes.`,\n          affectedElement: s.id,\n        });\n      }\n\n      // Check duplicate nodeIds in a single session\n      const uniqueNodes = new Set(s.node_ids || []);\n      if (s.node_ids && uniqueNodes.size < s.node_ids.length) {\n        score -= 15;\n        findings.push({\n          id: `PLAN_DUPLICATE_NODES_${s.id}`,\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'MAJOR',\n          title: `Duplicate Node Assignment in Session ${s.id}`,\n          description: `Session contains duplicate node IDs (${s.node_ids.join(', ')}). Nodes should be unified or properly split across consecutive sessions.`,\n          remediationAdvice: `Deduplicate node IDs in session or merge parts back into a single entry.`,\n          affectedElement: s.id,\n        });\n      }\n\n      if (!s.exit_evidence || s.exit_evidence.length === 0 || !s.exit_evidence[0] || s.exit_evidence[0].trim().length < 3) {\n        score -= 5;\n        findings.push({\n          id: `PLAN_VAGUE_EXIT_EVIDENCE_${s.id}`,\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'MINOR',\n          title: `Vague or Missing Exit Evidence in Session ${s.id}`,\n          description: `Session lacks a concrete, measurable user-visible deliverable.`,\n          remediationAdvice: `Specify an explicit exit evidence deliverable (e.g. running UI screen, passing test, or hardware actuation).`,\n          affectedElement: s.id,\n        });\n      }\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    const passed = score >= 80 && !findings.some((f) => f.severity === 'CRITICAL');\n    return { passed, score, findings, strengths };\n  }\n\n  /**\n   * Validates structural and environment feasibility invariants for a Project Graph bundle.\n   */\n  public static lintProjectGraph(\n    bundle: { technology_scope?: any; project_graph?: any },\n    expectedSessions: number = 12,\n  ): {\n    passed: boolean;\n    score: number;\n    findings: AcademicAuditFinding[];\n    strengths: string[];\n  } {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    const graph = bundle?.project_graph;\n    const scope = bundle?.technology_scope;\n\n    if (!graph || !Array.isArray(graph.features) || graph.features.length === 0) {\n      score -= 40;\n      findings.push({\n        id: 'GRAPH_MISSING_FEATURES',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'CRITICAL',\n        title: 'Missing Features in Project Graph',\n        description: 'Project graph has no features array or empty features.',\n        remediationAdvice: 'Declare at least 3 progressive features with concrete steps.',\n      });\n      return { passed: false, score: Math.max(0, score), findings, strengths };\n    }\n\n    const allSteps = graph.features.flatMap((f: any) => f.steps || []);\n    if (allSteps.length === 0) {\n      score -= 30;\n      findings.push({\n        id: 'GRAPH_EMPTY_STEPS',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'CRITICAL',\n        title: 'Empty Steps in Project Graph',\n        description: 'Features contain no executable steps.',\n        remediationAdvice: 'Add 2 to 4 concrete steps per feature.',\n      });\n    }\n\n    // Step duration limit check (<= 76 mins content budget)\n    for (const step of allSteps) {\n      const est = step.effort?.estimated_minutes || 0;\n      if (est > 76) {\n        score -= 10;\n        findings.push({\n          id: `GRAPH_OVERSIZED_STEP_${step.id || 'step'}`,\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'MAJOR',\n          title: `Step ${step.id || step.name} Exceeds Content Budget`,\n          description: `Step requires ${est} minutes, which exceeds the 76-minute single-session ceiling.`,\n          remediationAdvice: `Split step into two sequential sub-steps to prevent artificial session fragmentation.`,\n          affectedElement: step.id,\n        });\n      }\n    }\n\n    // Provisioning Strategy Check for heavy technologies\n    const allTechStrings = [\n      scope?.platform || '',\n      ...(Array.isArray(scope?.libraries_and_apis) ? scope.libraries_and_apis : []),\n      ...(Array.isArray(scope?.toolchain) ? scope.toolchain : []),\n      JSON.stringify(graph.project?.tech_stack || {}),\n    ].join(' ').toLowerCase();\n\n    const heavyKeywords = ['postgres', 'postgresql', 'docker', 'kubernetes', 'ros2', 'oracle', 'sql server'];\n    const hasHeavyTech = heavyKeywords.some((k) => allTechStrings.includes(k));\n\n    if (hasHeavyTech) {\n      const declaredStrategy = scope?.provisioning_strategy || scope?.provisioning_model || graph.project?.provisioning_strategy;\n      const normalizedStrategy = String(declaredStrategy || '').trim().toUpperCase().replace(/[-\\s]/g, '_');\n      const isValidStrategy = ENVIRONMENT_PROVISIONING_MODELS.includes(normalizedStrategy as any);\n      if (!isValidStrategy) {\n        score -= 15;\n        findings.push({\n          id: 'GRAPH_UNPROVISIONED_HEAVY_TECH',\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'MAJOR',\n          title: 'Heavy Technology Without Declared Lab Provisioning Strategy',\n          description: `Course uses heavy/server technology without declaring a valid provisioning strategy (PRE_INSTALLED_LAB, CLOUD_MANAGED, or DEDICATED_SETUP).`,\n          remediationAdvice: `Specify provisioning_strategy as PRE_INSTALLED_LAB, CLOUD_MANAGED, or DEDICATED_SETUP to ensure classroom feasibility.`,\n        });\n      } else {\n        strengths.push(`Heavy technology stack backed by explicit provisioning model: ${normalizedStrategy}`);\n      }\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    const passed = score >= 80 && !findings.some((f) => f.severity === 'CRITICAL');\n    return { passed, score, findings, strengths };\n  }\n}\n","import type { LessonPlan, DiagnosticQuizInput, ActivityLab, SlideDeck, CodeLab } from '../schemas';\nimport type { ComprehensiveAcademicReport, AcademicAuditFinding } from './types';\nimport { DeterministicStructuralLinter } from './deterministicStructuralLinter';\nimport { auditCurriculumQualityFlow } from '../ai/flows/auditCurriculumQualityFlow';\nimport type { ModelResolutionOptions } from '../ai/provider-factory';\n\nexport interface AuditBundleInput {\n  lesson: LessonPlan;\n  quiz?: DiagnosticQuizInput;\n  activity?: ActivityLab;\n  slides?: SlideDeck;\n  codeLab?: CodeLab;\n  modelOptions?: ModelResolutionOptions;\n  executeLLMJudge?: boolean;\n}\n\nexport class AcademicAuditor {\n  /**\n   * Evaluates a complete lesson bundle.\n   * Step 1 (Deterministic): Fast structural, contract, schema, and safety linting.\n   * Step 2 (Semantic LLM-as-a-Judge): Deep pedagogical, cognitive (Bloom), and misconception analysis with live frontier LLM.\n   */\n  public static async auditLessonBundle(input: AuditBundleInput): Promise<ComprehensiveAcademicReport> {\n    const { lesson, quiz, activity, slides, codeLab, modelOptions, executeLLMJudge = true } = input;\n\n    // 1. Run Deterministic Structural & Contract Linter\n    const structuralResult = DeterministicStructuralLinter.lintBundle({\n      lesson,\n      quiz,\n      activity,\n      slides,\n      codeLab,\n    });\n\n    const allFindings: AcademicAuditFinding[] = [...structuralResult.findings];\n    const strengths: string[] = [...structuralResult.strengths];\n\n    let semanticScore: number | null = null;\n    let semanticVerdict: 'PASS' | 'NEEDS_REVISION' | 'FAIL' = 'PASS';\n\n    // 2. Semantic Evaluation via LLM-as-a-Judge (If enabled with API model)\n    if (executeLLMJudge) {\n      try {\n        const judgeReport = await auditCurriculumQualityFlow({\n          targetArtifactType: 'LESSON_BUNDLE',\n          lessonId: lesson.lessonId,\n          expectedLanguage: lesson.language,\n          targetObjectives: (lesson.learningObjectives || []).map((lo) => ({\n            code: lo.code,\n            description: lo.description,\n            bloomLevel: lo.bloomLevel,\n          })),\n          generatedContentJson: JSON.stringify({ lesson, quiz, activity, slides, codeLab }),\n          modelOptions,\n        });\n\n        semanticScore = judgeReport.totalScore;\n        semanticVerdict = judgeReport.overallVerdict;\n\n        for (const criterion of judgeReport.criteria) {\n          if (!criterion.passed) {\n            allFindings.push({\n              id: `llm_judge_${criterion.name.toLowerCase().replace(/\\s+/g, '_')}`,\n              dimension: 'CONSTRUCTIVE_ALIGNMENT',\n              severity: criterion.score < 50 ? 'CRITICAL' : 'MAJOR',\n              title: `LLM-as-Judge Finding: ${criterion.name}`,\n              description: criterion.feedback,\n              remediationAdvice: judgeReport.actionableRepairPrompts.join('; ') || 'Refine prompt context.',\n            });\n          } else {\n            strengths.push(`[LLM-Judge] ${criterion.name}: ${criterion.feedback}`);\n          }\n        }\n      } catch (err: any) {\n        // LLM unavailable: fall back to heuristic — do not invent a fake score\n        semanticScore = null;\n        semanticVerdict = 'FAIL';\n        allFindings.push({\n          id: 'llm_judge_connection_error',\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'MINOR',\n          title: 'LLM-as-Judge Skipped / Fallback',\n          description: `Semantic inference error: ${err.message || String(err)}`,\n          remediationAdvice: 'Check API credentials for LLM-as-Judge.',\n        });\n      }\n    }\n\n    const criticalCount = allFindings.filter((f) => f.severity === 'CRITICAL').length;\n    // When LLM judge succeeds: weighted(40% structural + 60% semantic).\n    // When LLM judge fails/unavailable: use structural score only (no inflated default).\n    const overallScore = executeLLMJudge && semanticScore !== null\n      ? Math.round(structuralResult.structuralScore * 0.4 + semanticScore * 0.6)\n      : structuralResult.structuralScore;\n\n    const passed = structuralResult.passed && criticalCount === 0 && (executeLLMJudge ? semanticVerdict === 'PASS' : true);\n\n    let verdict: ComprehensiveAcademicReport['verdict'] = 'REJECTED';\n    if (overallScore >= 90 && criticalCount === 0) {\n      verdict = 'EXEMPLARY';\n    } else if (overallScore >= 75 && criticalCount === 0) {\n      verdict = 'ACADEMICALLY_SOUND';\n    } else if (overallScore >= 60) {\n      verdict = 'NEEDS_PEDAGOGICAL_REFINEMENT';\n    }\n\n    const summary = passed\n      ? `✅ Lesson Bundle \"${lesson.title}\" (${lesson.lessonId}) passes academic & structural verification with score ${overallScore}/100 (${verdict}).`\n      : `⚠️ Lesson Bundle \"${lesson.title}\" requires revision (${overallScore}/100 - ${verdict}). Found ${allFindings.length} finding(s) with ${criticalCount} critical blocker(s).`;\n\n    const actionablePromptGuidance = allFindings.map(\n      (f, idx) => `[${f.dimension}] ${idx + 1}. ${f.title}: ${f.remediationAdvice}`\n    );\n\n    // Compute per-dimension scores from findings (not sharing overallScore)\n    const computeDimScore = (dimFindings: AcademicAuditFinding[]): { score: number; passed: boolean } => {\n      const hasCritical = dimFindings.some((f) => f.severity === 'CRITICAL');\n      const majorCount = dimFindings.filter((f) => f.severity === 'MAJOR').length;\n      const minorCount = dimFindings.filter((f) => f.severity === 'MINOR').length;\n      // Base 100, deduct per finding severity\n      let dimScore = 100 - (hasCritical ? 40 : 0) - (majorCount * 15) - (minorCount * 5);\n      dimScore = Math.max(0, Math.min(100, dimScore));\n      return { score: dimScore, passed: dimScore >= 75 && !hasCritical };\n    };\n\n    const dimFindings = {\n      constructiveAlignment: allFindings.filter((f) => f.dimension === 'CONSTRUCTIVE_ALIGNMENT'),\n      bloomProgression: allFindings.filter((f) => f.dimension === 'BLOOM_PROGRESSION'),\n      fiveEFidelity: allFindings.filter((f) => f.dimension === '5E_INSTRUCTIONAL_FIDELITY'),\n      misconceptionRigor: allFindings.filter((f) => f.dimension === 'MISCONCEPTION_RIGOR'),\n      technicalAuthenticity: allFindings.filter((f) => f.dimension === 'TECHNICAL_AUTHENTICITY'),\n    };\n    const dimScores = Object.fromEntries(\n      Object.entries(dimFindings).map(([k, v]) => [k, computeDimScore(v)])\n    ) as Record<string, { score: number; passed: boolean }>;\n\n    return {\n      timestamp: new Date().toISOString(),\n      targetId: lesson.lessonId,\n      targetType: 'BUNDLE',\n      overallScore,\n      passed,\n      verdict,\n      summary,\n      dimensionScores: {\n        constructiveAlignment: {\n          score: dimScores.constructiveAlignment.score,\n          weight: 0.20,\n          passed: dimScores.constructiveAlignment.passed,\n          strengths: dimScores.constructiveAlignment.passed ? ['Constructive alignment verified.'] : [],\n          findings: dimFindings.constructiveAlignment,\n        },\n        bloomProgression: {\n          score: dimScores.bloomProgression.score,\n          weight: 0.20,\n          passed: dimScores.bloomProgression.passed,\n          strengths: dimScores.bloomProgression.passed ? ['Bloom taxonomy progression verified.'] : [],\n          findings: dimFindings.bloomProgression,\n        },\n        fiveEFidelity: {\n          score: dimScores.fiveEFidelity.score,\n          weight: 0.15,\n          passed: dimScores.fiveEFidelity.passed,\n          strengths: dimScores.fiveEFidelity.passed ? ['5E instructional fidelity verified.'] : [],\n          findings: dimFindings.fiveEFidelity,\n        },\n        misconceptionRigor: {\n          score: dimScores.misconceptionRigor.score,\n          weight: 0.20,\n          passed: dimScores.misconceptionRigor.passed,\n          strengths: dimScores.misconceptionRigor.passed ? ['Misconception rigor verified.'] : [],\n          findings: dimFindings.misconceptionRigor,\n        },\n        technicalAuthenticity: {\n          score: dimScores.technicalAuthenticity.score,\n          weight: 0.15,\n          passed: dimScores.technicalAuthenticity.passed,\n          strengths: dimScores.technicalAuthenticity.passed ? ['Technical authenticity verified.'] : [],\n          findings: dimFindings.technicalAuthenticity,\n        },\n        crossArtifactZeroDrift: {\n          score: structuralResult.structuralScore,\n          weight: 0.10,\n          passed: structuralResult.passed,\n          strengths: structuralResult.passed ? ['Cross-artifact zero drift verified.'] : [],\n          findings: allFindings.filter((f) => f.dimension === 'CROSS_ARTIFACT_ZERO_DRIFT'),\n        },\n      },\n      criticalFindingsCount: criticalCount,\n      allFindings,\n      actionablePromptGuidance,\n    };\n  }\n}\n","import type { LessonPlan, DiagnosticQuiz, ActivityLab } from '../schemas';\nimport type { AcademicAuditFinding, DimensionScore } from './types';\n\nexport const BLOOM_ACTION_VERBS = {\n  remember: [\n    'list', 'define', 'recall', 'state', 'name', 'identify', 'label', 'recognize',\n    'liệt kê', 'định nghĩa', 'gọi tên', 'nhận diện', 'chỉ ra', 'nhắc lại', 'ghi nhớ'\n  ],\n  understand: [\n    'explain', 'describe', 'summarize', 'classify', 'interpret', 'predict', 'trace', 'paraphrase',\n    'giải thích', 'mô tả', 'tóm tắt', 'phân loại', 'diễn giải', 'dự đoán', 'lần theo', 'hiểu'\n  ],\n  apply: [\n    'implement', 'execute', 'calculate', 'solve', 'construct', 'debug', 'modify', 'build',\n    'áp dụng', 'thực thi', 'tính toán', 'giải quyết', 'xây dựng', 'sửa lỗi', 'lắp đặt', 'viết mã', 'lập trình'\n  ],\n  analyze: [\n    'compare', 'contrast', 'decompose', 'differentiate', 'troubleshoot', 'diagnose', 'deconstruct',\n    'so sánh', 'đối chiếu', 'phân tích', 'phân rã', 'chẩn đoán', 'tìm nguyên nhân gốc', 'bóc tách'\n  ],\n  evaluate: [\n    'justify', 'critique', 'assess', 'defend', 'argue', 'benchmark', 'prioritize',\n    'đánh giá', 'biện minh', 'phê phán', 'thẩm định', 'bảo vệ quan điểm', 'lựa chọn tối ưu'\n  ],\n  create: [\n    'design', 'synthesize', 'architect', 'formulate', 'invent', 'devise', 'author',\n    'thiết kế', 'tổng hợp', 'sáng tạo', 'kiến trúc', 'phát minh', 'hoàn thiện đồ án'\n  ],\n};\n\nconst RECALL_PATTERNS = [\n  /^(?:chức năng chính của|định nghĩa của|cú pháp của|lệnh nào là|what is the definition of|which keyword|what does .* stand for)/i,\n  /(?:là gì\\?|được gọi là gì\\?|có ý nghĩa gì\\?)/i,\n];\n\nexport class BloomTaxonomyEvaluator {\n  /**\n   * Audits a LessonPlan for Bloom taxonomy fidelity and cognitive scaffolding.\n   */\n  public static evaluateLesson(lesson: LessonPlan): DimensionScore {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    const los = lesson.learningObjectives || [];\n    if (los.length === 0) {\n      return {\n        score: 0,\n        weight: 0.20,\n        passed: false,\n        strengths: [],\n        findings: [\n          {\n            id: 'bloom_missing_los',\n            dimension: 'BLOOM_PROGRESSION',\n            severity: 'CRITICAL',\n            title: 'Missing Learning Objectives',\n            description: 'The lesson plan contains zero declared Learning Objectives.',\n            remediationAdvice: 'Add 2-4 clearly articulated LOs with Bloom levels and observable success criteria.',\n          },\n        ],\n      };\n    }\n\n    // 1. Check LO Bloom verb alignment\n    for (const lo of los) {\n      const declaredLevel = (lo.bloomLevel || '').toLowerCase();\n      const text = `${lo.name || ''} ${lo.description || ''} ${lo.successCriteria || ''}`.toLowerCase();\n\n      // Check if text is just recall but marked Apply/Analyze\n      const isRecallPattern = RECALL_PATTERNS.some((p) => p.test(text));\n      if (isRecallPattern && (declaredLevel === 'apply' || declaredLevel === 'analyze' || declaredLevel === 'evaluate')) {\n        score -= 15;\n        findings.push({\n          id: `bloom_inflation_${lo.code}`,\n          dimension: 'BLOOM_PROGRESSION',\n          severity: 'MAJOR',\n          title: `Bloom Level Inflation in LO \"${lo.code}\"`,\n          description: `LO is tagged as \"${lo.bloomLevel}\" but its phrasing reflects low-level Recall (\"${lo.description}\").`,\n          remediationAdvice: `Rewrite the objective using authentic \"${declaredLevel}\" active verbs (e.g. build, debug, compare, diagnose) with an explicit application context.`,\n          affectedElement: lo.code,\n        });\n      }\n\n      // Check if success criteria is measurable\n      if (!lo.successCriteria || lo.successCriteria.trim().length < 15) {\n        score -= 10;\n        findings.push({\n          id: `bloom_unmeasurable_criteria_${lo.code}`,\n          dimension: 'BLOOM_PROGRESSION',\n          severity: 'MINOR',\n          title: `Vague Success Criteria in LO \"${lo.code}\"`,\n          description: `Success criteria \"${lo.successCriteria || ''}\" is too brief to provide objective student evidence.`,\n          remediationAdvice: 'Specify concrete, observable evidence (e.g. \"LED blinks with 1s period without circuit shorting\").',\n          affectedElement: lo.code,\n        });\n      } else {\n        strengths.push(`LO \"${lo.code}\" defines concrete observable student evidence.`);\n      }\n    }\n\n    // 2. Check 3-Tier Differentiation Progression\n    const diff = lesson.differentiation;\n    if (diff) {\n      if (!diff.bronzeTier || !diff.silverTier || !diff.goldTier) {\n        score -= 15;\n        findings.push({\n          id: 'bloom_incomplete_differentiation',\n          dimension: 'BLOOM_PROGRESSION',\n          severity: 'MAJOR',\n          title: 'Incomplete 3-Tier Scaffolding',\n          description: 'Differentiation must provide distinct Bronze (Foundation), Silver (Application), and Gold (Extension) challenges.',\n          remediationAdvice: 'Define all 3 tiers with increasing cognitive demands (Remember/Understand -> Apply -> Analyze/Create).',\n        });\n      } else {\n        strengths.push('Complete 3-tier scaffolding (Bronze -> Silver -> Gold) present in Lesson Plan.');\n      }\n    } else {\n      score -= 20;\n      findings.push({\n        id: 'bloom_missing_differentiation',\n        dimension: 'BLOOM_PROGRESSION',\n        severity: 'CRITICAL',\n        title: 'Missing Differentiation Scaffolding',\n        description: 'Lesson plan lacks differentiation tiers.',\n        remediationAdvice: 'Provide tiered practice instructions for varied learner paces.',\n      });\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    return {\n      score,\n      weight: 0.20,\n      passed: score >= 75 && !findings.some((f) => f.severity === 'CRITICAL'),\n      strengths,\n      findings,\n    };\n  }\n\n  /**\n   * Audits a Diagnostic Quiz for true cognitive depth matching declared Bloom levels.\n   */\n  public static evaluateQuiz(quiz: DiagnosticQuiz): DimensionScore {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    const questions = quiz.questions || [];\n    if (questions.length < 3) {\n      score -= 30;\n      findings.push({\n        id: 'bloom_quiz_too_short',\n        dimension: 'BLOOM_PROGRESSION',\n        severity: 'MAJOR',\n        title: 'Insufficient Question Pool',\n        description: `Quiz only contains ${questions.length} questions. Minimum diagnostic threshold is 3 questions.`,\n        remediationAdvice: 'Generate at least 3-5 diagnostic questions covering foundational through analytical depth.',\n      });\n    }\n\n    let understandCount = 0;\n    let applyCount = 0;\n    let analyzeCount = 0;\n\n    for (let i = 0; i < questions.length; i++) {\n      const q = questions[i];\n      const qId = q.id || `Q${i + 1}`;\n      const declaredBloom = (q.bloomLevel || '').toLowerCase();\n      const stem = q.scenarioOrStem || '';\n\n      if (declaredBloom === 'understand') understandCount++;\n      if (declaredBloom === 'apply') applyCount++;\n      if (declaredBloom === 'analyze' || declaredBloom === 'evaluate') analyzeCount++;\n\n      // Check if question tagged as Apply/Analyze is actually just recall\n      const isRecall = RECALL_PATTERNS.some((p) => p.test(stem));\n      if (isRecall && (declaredBloom === 'apply' || declaredBloom === 'analyze')) {\n        score -= 15;\n        findings.push({\n          id: `bloom_quiz_misclassification_${qId}`,\n          dimension: 'BLOOM_PROGRESSION',\n          severity: 'MAJOR',\n          title: `Cognitive Level Misclassification in ${qId}`,\n          description: `Question stem \"${stem.substring(0, 60)}...\" is pure Recall/Definition, but is tagged as \"${q.bloomLevel}\".`,\n          remediationAdvice: 'Either re-tag as \"understand\" or transform the stem into an authentic problem-solving scenario requiring code debugging or design decision.',\n          affectedElement: qId,\n        });\n      }\n\n      // Check code snippet inclusion for Apply/Analyze questions\n      if ((declaredBloom === 'apply' || declaredBloom === 'analyze') && !q.codeSnippet && !stem.includes('```') && !stem.includes('mạch')) {\n        score -= 10;\n        findings.push({\n          id: `bloom_quiz_missing_code_context_${qId}`,\n          dimension: 'BLOOM_PROGRESSION',\n          severity: 'MINOR',\n          title: `Missing Practical Context in High-Bloom Question ${qId}`,\n          description: `Question ${qId} tagged as \"${q.bloomLevel}\" lacks concrete code or circuit context to evaluate hands-on execution.`,\n          remediationAdvice: 'Include an annotated code snippet or circuit state for students to trace, debug, or evaluate.',\n          affectedElement: qId,\n        });\n      }\n    }\n\n    if (questions.length > 0 && (understandCount > 0 || applyCount > 0)) {\n      strengths.push(`Quiz features multi-level cognitive questions (Understand: ${understandCount}, Apply: ${applyCount}, Analyze: ${analyzeCount}).`);\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    return {\n      score,\n      weight: 0.20,\n      passed: score >= 75 && !findings.some((f) => f.severity === 'CRITICAL'),\n      strengths,\n      findings,\n    };\n  }\n}\n","import type { LessonPlan, DiagnosticQuiz, ActivityLab, SlideDeck } from '../schemas';\nimport type { AcademicAuditFinding, DimensionScore } from './types';\n\nexport class CrossArtifactDriftEvaluator {\n  /**\n   * Audits consistency, metadata synchronization, and zero-drift across all artifacts in a lesson bundle.\n   */\n  public static evaluateBundle(\n    lesson: LessonPlan,\n    quiz?: DiagnosticQuiz,\n    activity?: ActivityLab,\n    slides?: SlideDeck\n  ): DimensionScore {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    const baseLessonId = lesson.lessonId;\n    const baseLanguage = lesson.language;\n\n    // 1. Audit Lesson ID Synchronization\n    if (quiz && quiz.quizId && quiz.quizId !== baseLessonId && !quiz.quizId.includes(baseLessonId)) {\n      score -= 15;\n      findings.push({\n        id: 'drift_quiz_id_mismatch',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'MAJOR',\n        title: 'Quiz ID Mismatch with Master Lesson',\n        description: `Quiz ID \"${quiz.quizId}\" diverges from master Lesson ID \"${baseLessonId}\".`,\n        remediationAdvice: `Align Quiz ID to \"${baseLessonId}\".`,\n        affectedElement: quiz.quizId,\n      });\n    }\n\n    if (activity && activity.lessonId && activity.lessonId !== baseLessonId) {\n      score -= 15;\n      findings.push({\n        id: 'drift_act_id_mismatch',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'MAJOR',\n        title: 'Activity Lesson ID Mismatch',\n        description: `Activity lessonId \"${activity.lessonId}\" diverges from master Lesson ID \"${baseLessonId}\".`,\n        remediationAdvice: `Align Activity lessonId to \"${baseLessonId}\".`,\n        affectedElement: activity.lessonId,\n      });\n    }\n\n    if (slides && slides.lessonId && slides.lessonId !== baseLessonId) {\n      score -= 15;\n      findings.push({\n        id: 'drift_slides_id_mismatch',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'MAJOR',\n        title: 'Slide Deck Lesson ID Mismatch',\n        description: `Slide deck lessonId \"${slides.lessonId}\" diverges from master Lesson ID \"${baseLessonId}\".`,\n        remediationAdvice: `Align Slide deck lessonId to \"${baseLessonId}\".`,\n        affectedElement: slides.lessonId,\n      });\n    }\n\n    // 2. Audit Language Uniformity\n    const satellites = [\n      { type: 'QUIZ', lang: quiz?.language },\n      { type: 'ACT', lang: activity?.language },\n      { type: 'SLIDE', lang: slides?.language },\n    ];\n\n    for (const sat of satellites) {\n      if (sat.lang && sat.lang.toLowerCase() !== baseLanguage.toLowerCase()) {\n        score -= 25;\n        findings.push({\n          id: `drift_language_mismatch_${sat.type}`,\n          dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n          severity: 'CRITICAL',\n          title: `Language Contamination in ${sat.type}`,\n          description: `Master Lesson is in \"${baseLanguage}\" but ${sat.type} is declared in \"${sat.lang}\".`,\n          remediationAdvice: `Regenerate ${sat.type} strictly in \"${baseLanguage}\".`,\n        });\n      }\n    }\n\n    // 3. Audit Lesson Flow Duration Sum\n    const sections = lesson.sections || [];\n    const totalSectionMins = sections.reduce((sum, s) => sum + (s.durationMinutes || 0), 0);\n    if (totalSectionMins > 0 && (totalSectionMins < 40 || totalSectionMins > 180)) {\n      score -= 10;\n      findings.push({\n        id: 'drift_unrealistic_lesson_duration',\n        dimension: 'CROSS_ARTIFACT_ZERO_DRIFT',\n        severity: 'MINOR',\n        title: `Unrealistic Lesson Flow Total Duration (${totalSectionMins} mins)`,\n        description: `Sum of 5E section durations is ${totalSectionMins} minutes. Standard K-12/College lessons span 45-120 minutes.`,\n        remediationAdvice: 'Adjust individual section timings so total duration matches standard classroom blocks (e.g. 60m or 90m).',\n      });\n    } else if (totalSectionMins > 0) {\n      strengths.push(`Lesson section timings sum up to a realistic classroom block (${totalSectionMins} mins).`);\n    }\n\n    if (score >= 90) {\n      strengths.push('Zero drift verified: IDs, language policies, and pedagogical contracts are strictly aligned across all artifacts.');\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    return {\n      score,\n      weight: 0.10,\n      passed: score >= 75 && !findings.some((f) => f.severity === 'CRITICAL'),\n      strengths,\n      findings,\n    };\n  }\n}\n","import type { LessonPlan, DiagnosticQuiz, ActivityLab } from '../schemas';\nimport type { AcademicAuditFinding, DimensionScore } from './types';\n\nexport class ConstructiveAlignmentEvaluator {\n  /**\n   * Evaluates constructive alignment within a LessonPlan and across its satellite artifacts.\n   */\n  public static evaluateLesson(\n    lesson: LessonPlan,\n    quiz?: DiagnosticQuiz,\n    activity?: ActivityLab\n  ): DimensionScore {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    const los = lesson.learningObjectives || [];\n    const sections = lesson.sections || [];\n    const exitTicket = lesson.exitTicket;\n\n    if (los.length === 0) {\n      return {\n        score: 0,\n        weight: 0.20,\n        passed: false,\n        strengths: [],\n        findings: [\n          {\n            id: 'align_no_los',\n            dimension: 'CONSTRUCTIVE_ALIGNMENT',\n            severity: 'CRITICAL',\n            title: 'No Learning Objectives Defined',\n            description: 'Constructive alignment cannot be established without baseline LOs.',\n            remediationAdvice: 'Define at least 2 measurable Learning Objectives.',\n          },\n        ],\n      };\n    }\n\n    // 1. Verify that the lesson sections deliver on the LO concepts\n    const combinedSectionText = sections\n      .map((s) => `${s.title} ${s.teacherActions} ${s.studentActions} ${(s.analogies || []).join(' ')}`)\n      .join(' ')\n      .toLowerCase();\n\n    for (const lo of los) {\n      const loKeywords = (lo.name || lo.description || '')\n        .toLowerCase()\n        .split(/\\s+/)\n        .filter((w) => w.length > 4);\n\n      const hasCoverage = loKeywords.some((k) => combinedSectionText.includes(k));\n      if (!hasCoverage && loKeywords.length > 0) {\n        score -= 15;\n        findings.push({\n          id: `align_uncovered_lo_${lo.code}`,\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'MAJOR',\n          title: `Untaught Objective in Lesson Flow: \"${lo.code}\"`,\n          description: `The LO \"${lo.name || lo.code}\" is declared in the objectives table but receives minimal coverage in the 5E lesson sections.`,\n          remediationAdvice: `Add explicit Teacher Moves and Student Actions in the Explore/Explain sections addressing \"${lo.name}\".`,\n          affectedElement: lo.code,\n        });\n      }\n    }\n\n    // 2. Verify Exit Ticket alignment\n    if (!exitTicket || !exitTicket.questionStem || exitTicket.questionStem.trim().length < 15) {\n      score -= 15;\n      findings.push({\n        id: 'align_missing_exit_ticket',\n        dimension: 'CONSTRUCTIVE_ALIGNMENT',\n        severity: 'MAJOR',\n        title: 'Missing or Shallow Exit Ticket',\n        description: 'The lesson ends without a rigorous formative Exit Ticket to measure LO attainment before class dismissal.',\n        remediationAdvice: 'Include an Exit Ticket question matching the primary LO + a metacognitive reflection prompt.',\n      });\n    } else {\n      strengths.push('Formative Exit Ticket is properly anchored at the conclusion of the lesson.');\n    }\n\n    // 3. Cross-artifact alignment with Quiz (if provided)\n    if (quiz) {\n      const quizQuestions = quiz.questions || [];\n      if (quizQuestions.length > 0) {\n        // Check if quiz references concepts from lesson\n        const quizText = quizQuestions.map((q) => `${q.scenarioOrStem} ${(q.options || []).map((o) => o.text).join(' ')}`).join(' ').toLowerCase();\n        const lessonTopicKeywords = (lesson.topic || lesson.title || '').toLowerCase().split(/\\s+/).filter((w) => w.length > 3);\n        const hasTopicMatch = lessonTopicKeywords.some((k) => quizText.includes(k));\n\n        if (!hasTopicMatch && lessonTopicKeywords.length > 0) {\n          score -= 20;\n          findings.push({\n            id: 'align_quiz_topic_divergence',\n            dimension: 'CONSTRUCTIVE_ALIGNMENT',\n            severity: 'CRITICAL',\n            title: 'Quiz Topic Divergence from Lesson',\n            description: `Quiz questions do not reflect the main topic \"${lesson.topic}\" of the master lesson.`,\n            remediationAdvice: 'Re-align quiz questions strictly to the core concepts taught in the lesson.',\n          });\n        } else {\n          strengths.push('Diagnostic Quiz questions tightly reflect the lesson topic and concepts.');\n        }\n      }\n    }\n\n    // 4. Cross-artifact alignment with Activity (if provided)\n    if (activity) {\n      const actObj = (activity.objective || '').toLowerCase();\n      const lessonTitleLower = (lesson.title || '').toLowerCase();\n      const hasActAlignment = los.some((lo) => actObj.includes((lo.name || '').toLowerCase()) || actObj.includes((lo.description || '').toLowerCase())) ||\n        actObj.includes(lessonTitleLower) ||\n        lessonTitleLower.split(/\\s+/).some((w) => w.length > 4 && actObj.includes(w));\n\n      if (!hasActAlignment && activity.objective) {\n        score -= 15;\n        findings.push({\n          id: 'align_act_objective_divergence',\n          dimension: 'CONSTRUCTIVE_ALIGNMENT',\n          severity: 'MAJOR',\n          title: 'Activity Objective Disconnected from Lesson Plan',\n          description: `Activity objective \"${activity.objective}\" does not directly support the lesson LOs.`,\n          remediationAdvice: 'Ensure the Activity hands-on lab operationalizes the exact LOs specified in the Master Lesson.',\n        });\n      } else {\n        strengths.push('Activity lab objective directly operationalizes master lesson learning goals.');\n      }\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    return {\n      score,\n      weight: 0.20,\n      passed: score >= 75 && !findings.some((f) => f.severity === 'CRITICAL'),\n      strengths,\n      findings,\n    };\n  }\n}\n","import type { LessonPlan } from '../schemas';\nimport type { AcademicAuditFinding, DimensionScore } from './types';\n\nconst FIVE_E_STAGES = [\n  { key: 'engage', label: 'Engage (Khởi động / Móc neo)', regex: /(?:engage|khởi động|hook|mở đầu|anchor)/i },\n  { key: 'explore', label: 'Explore (Khám phá / Trải nghiệm)', regex: /(?:explore|khám phá|trải nghiệm|thử nghiệm)/i },\n  { key: 'explain', label: 'Explain (Giải thích / Hình thành kiến thức)', regex: /(?:explain|giải thích|khái niệm|kiến thức cốt lõi)/i },\n  { key: 'elaborate', label: 'Elaborate (Vận dụng / Mở rộng)', regex: /(?:elaborate|vận dụng|luyện tập|thực hành|áp dụng)/i },\n  { key: 'evaluate', label: 'Evaluate (Đánh giá / Tổng kết)', regex: /(?:evaluate|đánh giá|tổng kết|wrap-up|exit ticket)/i },\n];\n\nexport class FiveEInstructionalEvaluator {\n  /**\n   * Evaluates the pedagogical structure of a Lesson Plan against the 5E Inquiry Model.\n   */\n  public static evaluateLesson(lesson: LessonPlan): DimensionScore {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    // 1. Audit Hook Scenario & Open-Ended Inquiries\n    if (!lesson.hookScenario || lesson.hookScenario.trim().length < 30) {\n      score -= 20;\n      findings.push({\n        id: '5e_weak_hook',\n        dimension: '5E_INSTRUCTIONAL_FIDELITY',\n        severity: 'MAJOR',\n        title: 'Shallow or Missing Real-World Hook',\n        description: 'The lesson lacks a compelling, high-stakes real-world scenario to trigger inquiry.',\n        remediationAdvice: 'Frame the lesson around an authentic engineering or domain problem (e.g. server crash, sensor failure, clinical anomaly).',\n      });\n    } else {\n      strengths.push('Engaging real-world hook scenario sets high-stakes context for inquiry.');\n    }\n\n    if (!lesson.hookQuestions || lesson.hookQuestions.length < 2) {\n      score -= 10;\n      findings.push({\n        id: '5e_insufficient_hook_questions',\n        dimension: '5E_INSTRUCTIONAL_FIDELITY',\n        severity: 'MINOR',\n        title: 'Insufficient Inquiry Questions in Hook',\n        description: 'Need at least 2 open-ended inquiry questions in the Engage phase to activate prior mental models.',\n        remediationAdvice: 'Add 2-3 provocative questions challenging common student assumptions.',\n      });\n    }\n\n    // 2. Audit 5E Stage Coverage in Sections\n    const sections = lesson.sections || [];\n    const coveredStages = new Set<string>();\n\n    for (const section of sections) {\n      for (const stage of FIVE_E_STAGES) {\n        if (stage.regex.test(section.title)) {\n          coveredStages.add(stage.key);\n        }\n      }\n    }\n\n    // Also check if Hook and ExitTicket cover Engage & Evaluate\n    if (lesson.hookScenario) coveredStages.add('engage');\n    if (lesson.exitTicket) coveredStages.add('evaluate');\n\n    const missingStages = FIVE_E_STAGES.filter((s) => !coveredStages.has(s.key));\n    if (missingStages.length > 0) {\n      score -= missingStages.length * 10;\n      findings.push({\n        id: '5e_missing_phases',\n        dimension: '5E_INSTRUCTIONAL_FIDELITY',\n        severity: missingStages.length > 2 ? 'CRITICAL' : 'MAJOR',\n        title: `Incomplete 5E Instructional Cycle (Missing ${missingStages.length} phase(s))`,\n        description: `Lesson plan does not clearly demarcate: ${missingStages.map((s) => s.label).join(', ')}.`,\n        remediationAdvice: 'Ensure the lesson explicitly walks through Engage -> Explore -> Explain -> Elaborate -> Evaluate.',\n      });\n    } else {\n      strengths.push('Full 5E Instructional Cycle (Engage, Explore, Explain, Elaborate, Evaluate) is completely covered.');\n    }\n\n    // 3. Audit Active Learning: Teacher Moves vs Student Actions\n    let passiveSections = 0;\n    for (let i = 0; i < sections.length; i++) {\n      const s = sections[i];\n      const studentAct = (s.studentActions || '').trim().toLowerCase();\n\n      // Check if student actions are merely passive (listening / sitting)\n      if (studentAct.includes('nghe giảng') || studentAct.includes('chép bài') || studentAct.includes('listen passively') || studentAct.length < 10) {\n        passiveSections++;\n      }\n    }\n\n    if (passiveSections > 0 && sections.length > 0) {\n      score -= passiveSections * 8;\n      findings.push({\n        id: '5e_passive_student_roles',\n        dimension: '5E_INSTRUCTIONAL_FIDELITY',\n        severity: 'MAJOR',\n        title: 'Passive Student Roles Detected in Lesson Sections',\n        description: `${passiveSections} section(s) assign passive roles (listening/copying) to students rather than active inquiry, pair-discussion, or hands-on experimentation.`,\n        remediationAdvice: 'Transform student actions into active tasks (e.g. Think-Pair-Share, code tracing, hypothesis testing, live bug hunting).',\n      });\n    } else if (sections.length > 0) {\n      strengths.push('Student roles emphasize active learning and hands-on participation throughout.');\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    return {\n      score,\n      weight: 0.15,\n      passed: score >= 75 && !findings.some((f) => f.severity === 'CRITICAL'),\n      strengths,\n      findings,\n    };\n  }\n}\n","import type { LessonPlan, CodeLab, ActivityLab } from '../schemas';\nimport type { AcademicAuditFinding, DimensionScore } from './types';\n\nconst VALID_MERMAID_STARTERS = [\n  'graph', 'flowchart', 'sequencediagram', 'statediagram', 'classdiagram', 'erdiagram', 'gantt', 'gitgraph'\n];\n\nexport class CodeHardwareFeasibilityEvaluator {\n  /**\n   * Audits technical accuracy, code syntax sanity, and hardware circuit safety.\n   */\n  public static evaluateTechnicalFeasibility(\n    lesson?: LessonPlan,\n    codeLab?: CodeLab,\n    activity?: ActivityLab\n  ): DimensionScore {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    // 1. Audit Guided Practice Code in Lesson\n    if (lesson?.guidedPractice) {\n      const { codeSnippet, codeLanguage, mermaidDiagram } = lesson.guidedPractice;\n\n      if (!codeSnippet || codeSnippet.trim().length < 15) {\n        score -= 20;\n        findings.push({\n          id: 'tech_empty_guided_code',\n          dimension: 'TECHNICAL_AUTHENTICITY',\n          severity: 'MAJOR',\n          title: 'Empty or Trivial Guided Practice Code',\n          description: 'Guided practice lacks runnable code snippet or domain calculation template.',\n          remediationAdvice: 'Provide a complete, runnable code example with explanatory line-by-line comments.',\n        });\n      } else {\n        // Embedded / Arduino specific checks\n        if (codeLanguage?.toLowerCase() === 'arduino' || codeLanguage?.toLowerCase() === 'cpp' || codeSnippet.includes('pinMode')) {\n          if (codeSnippet.includes('digitalWrite') && !codeSnippet.includes('pinMode') && !codeSnippet.includes('setup()')) {\n            score -= 15;\n            findings.push({\n              id: 'tech_arduino_missing_pinmode',\n              dimension: 'TECHNICAL_AUTHENTICITY',\n              severity: 'MAJOR',\n              title: 'Missing pinMode() Configuration in Arduino Code',\n              description: 'Code calls `digitalWrite()` without initializing the pin with `pinMode(pin, OUTPUT)`.',\n              remediationAdvice: 'Ensure `setup()` configures pin direction before writing digital states.',\n            });\n          }\n\n          if (codeSnippet.includes('delay(0)') || codeSnippet.includes('delay(-')) {\n            score -= 15;\n            findings.push({\n              id: 'tech_arduino_invalid_delay',\n              dimension: 'TECHNICAL_AUTHENTICITY',\n              severity: 'MAJOR',\n              title: 'Invalid delay() Parameter',\n              description: 'delay() duration must be a positive integer in milliseconds.',\n              remediationAdvice: 'Use realistic delay timings (e.g. 500ms, 1000ms).',\n            });\n          }\n        }\n        strengths.push('Guided practice features runnable code snippet with clear syntax.');\n      }\n\n      // Check Mermaid diagram syntax\n      if (mermaidDiagram) {\n        const cleanDiagram = mermaidDiagram.trim().toLowerCase();\n        const isValidStarter = VALID_MERMAID_STARTERS.some((starter) => cleanDiagram.startsWith(starter));\n        if (!isValidStarter) {\n          score -= 15;\n          findings.push({\n            id: 'tech_invalid_mermaid_syntax',\n            dimension: 'TECHNICAL_AUTHENTICITY',\n            severity: 'MAJOR',\n            title: 'Invalid Mermaid Diagram Syntax',\n            description: `Mermaid diagram does not start with a valid declaration (e.g. \"flowchart TD\", \"graph TD\", \"sequenceDiagram\"). Got: \"${mermaidDiagram.substring(0, 30)}...\"`,\n            remediationAdvice: 'Format Mermaid diagrams starting with `flowchart TD` or `sequenceDiagram`.',\n          });\n        } else {\n          strengths.push('Valid Mermaid architectural diagram included.');\n        }\n      }\n    }\n\n    // 2. Audit CodeLab (if present)\n    if (codeLab) {\n      const starter = codeLab.starterCode?.content || '';\n      const solution = codeLab.solutionCode?.content || '';\n\n      if (starter.length < 20 || solution.length < 20) {\n        score -= 25;\n        findings.push({\n          id: 'tech_codelab_incomplete_codes',\n          dimension: 'TECHNICAL_AUTHENTICITY',\n          severity: 'CRITICAL',\n          title: 'Incomplete CodeLab Starter / Solution Code',\n          description: 'CodeLab must provide both scaffolding starter code and complete reference solution code.',\n          remediationAdvice: 'Populate `starterCode` with TODO markers and `solutionCode` with tested implementation.',\n        });\n      } else {\n        strengths.push('CodeLab provides complete starter skeleton and working solution code.');\n      }\n\n      if (!codeLab.testCases || codeLab.testCases.length === 0) {\n        score -= 15;\n        findings.push({\n          id: 'tech_codelab_missing_testcases',\n          dimension: 'TECHNICAL_AUTHENTICITY',\n          severity: 'MAJOR',\n          title: 'Missing Automated Verification Test Cases',\n          description: 'CodeLab lacks test cases for students to self-verify their implementations.',\n          remediationAdvice: 'Add at least 2 concrete test cases with input and expected output assertions.',\n        });\n      }\n    }\n\n    // 3. Audit Hardware BOM Safety in Activity (if hardware is involved)\n    if (activity?.materialsBOM?.hardware && activity.materialsBOM.hardware.length > 0) {\n      const hwText = activity.materialsBOM.hardware.join(' ').toLowerCase();\n      const hasLED = hwText.includes('led');\n      const hasResistor = hwText.includes('điện trở') || hwText.includes('resistor') || hwText.includes('220') || hwText.includes('330') || hwText.includes('1k');\n\n      if (hasLED && !hasResistor) {\n        score -= 20;\n        findings.push({\n          id: 'tech_hardware_unsafe_led_no_resistor',\n          dimension: 'TECHNICAL_AUTHENTICITY',\n          severity: 'CRITICAL',\n          title: 'Dangerous Hardware Circuit: LED without Current-Limiting Resistor',\n          description: 'Activity specifies an LED on breadboard/microcontroller without a 220Ω-1kΩ current-limiting resistor, which causes electrical overload and burnout.',\n          remediationAdvice: 'Add a 220Ω or 330Ω current-limiting resistor to the hardware BOM.',\n        });\n      } else if (hasLED && hasResistor) {\n        strengths.push('Hardware BOM safely pairs LED with current-limiting resistor protection.');\n      }\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    return {\n      score,\n      weight: 0.15,\n      passed: score >= 75 && !findings.some((f) => f.severity === 'CRITICAL'),\n      strengths,\n      findings,\n    };\n  }\n}\n","import type { DiagnosticQuiz } from '../schemas';\nimport type { AcademicAuditFinding, DimensionScore } from './types';\n\nconst LAZY_DISTRACTOR_PATTERNS = [\n  /^(?:tất cả các đáp án trên đều (?:đúng|sai)|cả a,?\\s*b,?\\s*c đều (?:đúng|sai)|all of the above|none of the above)[\\.\\?!]?$/i,\n  /^(?:không có đáp án nào đúng|không có chức năng|không làm gì cả|không ảnh hưởng)[\\.\\?!]?$/i,\n  /^(?:đáp án khác|other)[\\.\\?!]?$/i,\n];\n\nexport class MisconceptionEvaluator {\n  /**\n   * Audits the psychometric and pedagogical rigor of diagnostic questions and their distractors.\n   */\n  public static evaluateQuiz(quiz: DiagnosticQuiz): DimensionScore {\n    const findings: AcademicAuditFinding[] = [];\n    const strengths: string[] = [];\n    let score = 100;\n\n    const questions = quiz.questions || [];\n    if (questions.length === 0) {\n      return {\n        score: 0,\n        weight: 0.20,\n        passed: false,\n        strengths: [],\n        findings: [\n          {\n            id: 'misconception_no_questions',\n            dimension: 'MISCONCEPTION_RIGOR',\n            severity: 'CRITICAL',\n            title: 'Empty Question Bank',\n            description: 'No questions provided in quiz artifact.',\n            remediationAdvice: 'Generate diagnostic questions with deliberate misconception traps.',\n          },\n        ],\n      };\n    }\n\n    let validDistractorCount = 0;\n    let questionsWithFullExplanations = 0;\n\n    for (let i = 0; i < questions.length; i++) {\n      const q = questions[i];\n      const qId = q.id || `Q${i + 1}`;\n      const options = q.options || [];\n\n      // 1. Check option count (Must have standard 4 options A, B, C, D)\n      if (options.length < 4) {\n        score -= 15;\n        findings.push({\n          id: `misconception_few_options_${qId}`,\n          dimension: 'MISCONCEPTION_RIGOR',\n          severity: 'MAJOR',\n          title: `Insufficient Distractors in ${qId}`,\n          description: `Question ${qId} has only ${options.length} options. Standard diagnostic rigor requires 4 plausible choices (1 key + 3 diagnostic distractors).`,\n          remediationAdvice: 'Provide 4 full options (A, B, C, D) representing distinct cognitive states.',\n          affectedElement: qId,\n        });\n      }\n\n      // 2. Check exactly ONE correct answer\n      const correctCount = options.filter((o) => o.isCorrect).length;\n      if (correctCount !== 1) {\n        score -= 25;\n        findings.push({\n          id: `misconception_invalid_correct_count_${qId}`,\n          dimension: 'MISCONCEPTION_RIGOR',\n          severity: 'CRITICAL',\n          title: `Key Assignment Error in ${qId}`,\n          description: `Question ${qId} has ${correctCount} correct options (must have exactly 1 true answer).`,\n          remediationAdvice: 'Set `isCorrect: true` on exactly one option and `isCorrect: false` on all distractors.',\n          affectedElement: qId,\n        });\n      }\n\n      // 3. Audit Distractor Quality & Explanation Depth\n      let missingExplanation = false;\n      let hasLazyDistractor = false;\n\n      for (const opt of options) {\n        const text = (opt.text || '').trim();\n        const explanation = (opt.explanation || '').trim();\n\n        // Check for lazy/trivial distractors\n        if (LAZY_DISTRACTOR_PATTERNS.some((p) => p.test(text))) {\n          hasLazyDistractor = true;\n          score -= 10;\n          findings.push({\n            id: `misconception_lazy_distractor_${qId}_${opt.id}`,\n            dimension: 'MISCONCEPTION_RIGOR',\n            severity: 'MAJOR',\n            title: `Low-Utility Distractor in ${qId} (${opt.id})`,\n            description: `Option \"${text}\" is a generic/throwaway distractor (\"All/None of the above\" or \"No effect\") that does not diagnose student cognitive models.`,\n            remediationAdvice: 'Replace with an authentic student misconception (e.g. inverted logic, missing pullup, off-by-one boundary, unit confusion).',\n            affectedElement: `${qId}.${opt.id}`,\n          });\n        }\n\n        // Check if explanation exists and explains WHY it is right or WHY it is a trap\n        if (!explanation || explanation.length < 20) {\n          missingExplanation = true;\n        } else {\n          validDistractorCount++;\n        }\n      }\n\n      if (missingExplanation) {\n        score -= 10;\n        findings.push({\n          id: `misconception_shallow_explanation_${qId}`,\n          dimension: 'MISCONCEPTION_RIGOR',\n          severity: 'MAJOR',\n          title: `Shallow Distractor Explanations in ${qId}`,\n          description: `Question ${qId} lacks detailed pedagogical explanations for all options. Students and teachers cannot diagnose root causes without option-level rationale.`,\n          remediationAdvice: 'For EVERY option (A, B, C, D), explicitly write why the choice is correct or what mental misconception it represents.',\n          affectedElement: qId,\n        });\n      } else {\n        questionsWithFullExplanations++;\n      }\n    }\n\n    if (questionsWithFullExplanations === questions.length && questions.length >= 3) {\n      strengths.push('All quiz questions feature rigorous 4-option breakdown with comprehensive misconception analysis.');\n    }\n\n    score = Math.max(0, Math.min(100, score));\n    return {\n      score,\n      weight: 0.20,\n      passed: score >= 75 && !findings.some((f) => f.severity === 'CRITICAL'),\n      strengths,\n      findings,\n    };\n  }\n}\n","export interface PedagogicalDensityReport {\n  score: number; // 0 - 100\n  handsOnRatio: number; // 0.0 - 1.0\n  activeVerbsCount: number;\n  interactiveElementsCount: number;\n  verdict: 'HIGH' | 'BALANCED' | 'PASSIVE';\n  recommendations: string[];\n}\n\nexport interface CognitiveLoadReport {\n  score: number; // 0 - 100 (higher = heavier cognitive load)\n  avgSentenceLength: number;\n  technicalTermsDensity: number; // %\n  gradeLevelEstimate: 'PRIMARY' | 'MIDDLE_SCHOOL' | 'HIGH_SCHOOL' | 'ADVANCED';\n  verdict: 'OPTIMAL' | 'OVERLOAD' | 'UNDERLOAD';\n  recommendations: string[];\n}\n\nexport interface CrossArtifactAlignmentReport {\n  score: number; // 0 - 100\n  loCoverageRatio: number; // 0.0 - 1.0\n  uncoveredObjectives: string[];\n  timelineContradictions: string[];\n  verdict: 'STRONG_ALIGNMENT' | 'PARTIAL_ALIGNMENT' | 'MISALIGNED';\n}\n\nconst ACTION_VERBS = [\n  'lắp ráp', 'chế tạo', 'xây dựng', 'lập trình', 'viết mã', 'thực hành', 'kiểm thử', 'đo đạc', 'phân tích',\n  'build', 'assemble', 'program', 'code', 'test', 'measure', 'debug', 'design', 'create', 'investigate'\n];\n\n/**\n * Evaluates the pedagogical density: measures active hands-on vs passive lecture.\n */\nexport function evaluatePedagogicalDensity(\n  artifactType: string,\n  content: string\n): PedagogicalDensityReport {\n  const lower = content.toLowerCase();\n  const sentences = content.split(/[.!?\\n]+/).filter((s) => s.trim().length > 0);\n  const words = content.split(/\\s+/).filter(Boolean);\n\n  let activeCount = 0;\n  for (const verb of ACTION_VERBS) {\n    const matches = lower.match(new RegExp(`\\\\b${verb}\\\\b`, 'g'));\n    if (matches) activeCount += matches.length;\n  }\n\n  // Count interactive blocks (checklists, code blocks, tables, questions)\n  const codeBlocks = (content.match(/```[\\s\\S]*?```/g) || []).length;\n  const checkboxes = (content.match(/\\[[ xX]\\]/g) || []).length;\n  const tables = (content.match(/\\|.*?\\|/g) || []).length / 2; // rough row count\n  const interactiveTotal = codeBlocks + checkboxes + Math.floor(tables);\n\n  const handsOnRatio = words.length > 0 ? Math.min(1, (activeCount * 10 + interactiveTotal * 15) / words.length) : 0.5;\n\n  let score = Math.round(handsOnRatio * 80 + Math.min(20, activeCount * 2));\n  score = Math.max(0, Math.min(100, score));\n\n  let verdict: PedagogicalDensityReport['verdict'] = 'BALANCED';\n  const recs: string[] = [];\n\n  if (score >= 70) {\n    verdict = 'HIGH';\n  } else if (score < 40) {\n    verdict = 'PASSIVE';\n    recs.push('Thêm các câu hỏi tương tác, thử thách lập trình hoặc hoạt động trải nghiệm thực hành.');\n  }\n\n  return {\n    score,\n    handsOnRatio: parseFloat(handsOnRatio.toFixed(2)),\n    activeVerbsCount: activeCount,\n    interactiveElementsCount: interactiveTotal,\n    verdict,\n    recommendations: recs,\n  };\n}\n\n/**\n * Evaluates Cognitive Load heuristic based on sentence length and technical density.\n */\nexport function evaluateCognitiveLoad(content: string): CognitiveLoadReport {\n  const sentences = content.split(/[.!?]+/).filter((s) => s.trim().length > 5);\n  const words = content.split(/\\s+/).filter(Boolean);\n\n  const avgSentenceLength = sentences.length > 0 ? words.length / sentences.length : 15;\n\n  // Technical term proxy: words with uppercase or camelCase or special identifiers\n  const technicalWords = words.filter((w) => /[A-Z]{2,}|[a-z]+[A-Z]|_|\\d+/.test(w));\n  const technicalDensity = words.length > 0 ? (technicalWords.length / words.length) * 100 : 5;\n\n  // Load score: 100 is max overload\n  let score = Math.round((avgSentenceLength / 25) * 50 + (technicalDensity / 20) * 50);\n  score = Math.max(0, Math.min(100, score));\n\n  let verdict: CognitiveLoadReport['verdict'] = 'OPTIMAL';\n  let gradeLevel: CognitiveLoadReport['gradeLevelEstimate'] = 'MIDDLE_SCHOOL';\n  const recs: string[] = [];\n\n  if (score > 75) {\n    verdict = 'OVERLOAD';\n    recs.push('Câu quá dài hoặc chứa quá nhiều thuật ngữ kỹ thuật dồn dập. Hãy chia nhỏ câu.');\n    gradeLevel = 'ADVANCED';\n  } else if (score <= 42) {\n    verdict = 'UNDERLOAD';\n    gradeLevel = 'PRIMARY';\n  } else {\n    gradeLevel = score > 60 ? 'HIGH_SCHOOL' : 'MIDDLE_SCHOOL';\n  }\n\n  return {\n    score,\n    avgSentenceLength: parseFloat(avgSentenceLength.toFixed(1)),\n    technicalTermsDensity: parseFloat(technicalDensity.toFixed(1)),\n    gradeLevelEstimate: gradeLevel,\n    verdict,\n    recommendations: recs,\n  };\n}\n\n/**\n * Evaluates cross-artifact alignment between a Lesson plan and a satellite artifact.\n */\nexport function evaluateCrossArtifactAlignment(\n  lessonObjectives: string[],\n  satelliteContent: string\n): CrossArtifactAlignmentReport {\n  const uncovered: string[] = [];\n  const satLower = satelliteContent.toLowerCase();\n\n  for (const lo of lessonObjectives) {\n    const loNorm = lo.toLowerCase().trim();\n    if (!loNorm) continue;\n    const tokens = loNorm.split(/\\s+/).filter((t) => t.length > 3);\n    const matched = tokens.filter((t) => satLower.includes(t));\n    if (tokens.length > 0 && matched.length / tokens.length < 0.4) {\n      uncovered.push(lo);\n    }\n  }\n\n  const coverageRatio = lessonObjectives.length > 0 ? (lessonObjectives.length - uncovered.length) / lessonObjectives.length : 1.0;\n  const score = Math.round(coverageRatio * 100);\n\n  return {\n    score,\n    loCoverageRatio: parseFloat(coverageRatio.toFixed(2)),\n    uncoveredObjectives: uncovered,\n    timelineContradictions: [],\n    verdict: score >= 80 ? 'STRONG_ALIGNMENT' : score >= 50 ? 'PARTIAL_ALIGNMENT' : 'MISALIGNED',\n  };\n}\n","export * from './lessonFlowParser.js';\nexport * from './artifactAstTypes.js';\nexport * from './headerDictionary.js';\nexport * from './artifactAstParser.js';\nexport * from './artifactAstProjection.js';\n","import { parseArtifactAst } from '../parsers/artifactAstParser.js';\nimport { resolveSlotNodes } from '../parsers/artifactAstProjection.js';\n\nexport interface SectionNode {\n  level: number;\n  title: string;\n  normalizedTitle: string;\n  lineStart: number;\n  lineEnd: number;\n  charCount: number;\n  content: string; // Including heading\n  body: string;    // Excluding heading\n}\n\nexport interface SectionBody {\n  /** Tiêu đề nguyên văn trong file — khớp semantic key đã resolve (có thể dài hơn key truyền\n   *  vào khi resolve bằng suffix match, vd `activitySequence` → `lessonDesignPlan.activitySequence`). */\n  title: string;\n  /** Nội dung dưới tiêu đề, KHÔNG gồm heading. Rỗng nếu section không có body. */\n  body: string;\n  /** `body` kèm heading — tiện cho call-site cần nguyên khối. */\n  content: string;\n  charCount: number;\n}\n\nconst norm = (s: string): string =>\n  s.toLowerCase().normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').replace(/[^a-z0-9]+/g, '');\n\n/**\n * Parses markdown headings (H1-H4) and returns a flat list of SectionNodes with exact line boundaries.\n */\nexport function listSections(markdown: string): SectionNode[] {\n  if (!markdown || !markdown.trim()) return [];\n\n  const lines = markdown.split('\\n');\n  const sections: SectionNode[] = [];\n  const headingIndices: { lineIdx: number; level: number; title: string }[] = [];\n\n  let inCodeFence = false;\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n    const trimmed = line.trim();\n\n    if (/^```/.test(trimmed)) {\n      inCodeFence = !inCodeFence;\n      continue;\n    }\n\n    if (inCodeFence) continue;\n\n    const match = line.match(/^(#{1,4})\\s+(.+)$/);\n    if (match) {\n      headingIndices.push({\n        lineIdx: i,\n        level: match[1].length,\n        title: match[2].trim(),\n      });\n    }\n  }\n\n  for (let h = 0; h < headingIndices.length; h++) {\n    const current = headingIndices[h];\n    const nextOfSameOrHigherLevel = headingIndices.slice(h + 1).find((other) => other.level <= current.level);\n    const lineEnd = nextOfSameOrHigherLevel ? nextOfSameOrHigherLevel.lineIdx - 1 : lines.length - 1;\n\n    const sectionLines = lines.slice(current.lineIdx, lineEnd + 1);\n    const bodyLines = lines.slice(current.lineIdx + 1, lineEnd + 1);\n    const content = sectionLines.join('\\n');\n    const body = bodyLines.join('\\n');\n\n    sections.push({\n      level: current.level,\n      title: current.title,\n      normalizedTitle: norm(current.title),\n      lineStart: current.lineIdx + 1, // 1-indexed\n      lineEnd: lineEnd + 1,\n      charCount: content.length,\n      content,\n      body,\n    });\n  }\n\n  return sections;\n}\n\n/**\n * Extracts a specific section matching sectionQuery (fuzzy substring match on normalized title).\n * If multiple sections match, returns the first match or optionally the one with target level.\n */\nexport function extractSection(\n  markdown: string,\n  sectionQuery: string,\n  options?: { targetLevel?: number }\n): SectionNode | null {\n  const sections = listSections(markdown);\n  const targetNorm = norm(sectionQuery);\n\n  const matched = sections.filter((s) => {\n    if (options?.targetLevel && s.level !== options.targetLevel) return false;\n    return s.normalizedTitle.includes(targetNorm) || targetNorm.includes(s.normalizedTitle);\n  });\n\n  return matched[0] || null;\n}\n\n/**\n * Replaces a target section's body with newBody, keeping its original heading intact.\n * Returns the modified markdown string. If section not found, returns original markdown.\n */\nexport function replaceSectionBody(\n  markdown: string,\n  sectionQuery: string,\n  newBody: string\n): { markdown: string; replaced: boolean } {\n  const node = extractSection(markdown, sectionQuery);\n  if (!node) {\n    return { markdown, replaced: false };\n  }\n\n  const lines = markdown.split('\\n');\n  const beforeLines = lines.slice(0, node.lineStart); // Includes the heading line\n  const afterLines = lines.slice(node.lineEnd);\n\n  const updated = [\n    ...beforeLines,\n    newBody.trim(),\n    ...afterLines,\n  ].join('\\n');\n\n  return { markdown: updated, replaced: true };\n}\n\n/**\n * Lấy phần thân của một section theo **semantic key**.\n *\n * Vì sao cần, khi `extractSection` không đủ: `extractSection` khớp theo *tên heading* đã chuẩn hoá\n * (`extractSection(md, 'teacherNotes')` → `null` vì tiêu đề thật là\n * `[OPTIONAL] C. Teacher Facilitation Notes`). Semantic key là địa chỉ mà\n * `inputContract.sourceSlots` / `resolveLessonSlotSpec` dùng, nên đó phải là địa chỉ đầu vào ở đây.\n *\n * `semanticIndex.get(key)` trả về node `heading` — **chỉ có dòng tiêu đề, không có body**\n * (`children` của node heading chỉ chứa text tiêu đề). Body phải cắt từ `markdown` theo\n * `position`, mà `listSections()` đã tính sẵn `lineEnd` (heading cùng cấp trở xuống).\n *\n * Dùng lại `resolveSlotNodes()` để resolve key, nên hỗ trợ sẵn cả ba dạng gọi:\n * key phẳng (`lessonFlow`), key lồng (`lessonDesignPlan.activitySequence`), key với tiền tố\n * cha (`lessonDesignPlan` → parent + toàn bộ con). Không viết lại logic match ở đây.\n *\n * @param markdown toàn bộ nội dung file\n * @param semanticKey semantic key cần lấy\n * @returns `null` nếu key không có trong semanticIndex — **không throw**, vì thiếu key là chuyện\n *          thường quen (artifact không mang section đó), không phải lỗi.\n */\nexport function getSectionBody(\n  markdown: string,\n  semanticKey: string,\n): SectionBody | null {\n  if (!markdown || !semanticKey) return null;\n\n  // Import động: sectionExtractor là tầng thấp, resolveSlotNodes thuộc tầng parser\n  // và cần semanticIndex đã parse. Import tĩnh sẽ tạo vòng phụ thuộc parsers → services.\n  const ast = parseArtifactAst(markdown);\n  const nodes = resolveSlotNodes(ast, semanticKey);\n  if (nodes.length === 0) return null;\n  const sections = listSections(markdown);\n  if (sections.length === 0) return null;\n\n  // `position.end.line` trong semanticIndex là 1-indexed và trỏ tới cuối dòng tiêu đề;\n  // `listSections` đánh số 1-indexed và `lineEnd` là dòng cuối của *cả section*. Khớp heading\n  // theo dòng + tiêu đề, vì heading trùng dòng trong code fence đã bị cả hai bên loại.\n  const blocks: string[] = [];\n  const titles: string[] = [];\n  let firstTitle = '';\n\n  for (const node of nodes) {\n    const endLine = node.position?.end?.line;\n    if (typeof endLine !== 'number') continue;\n\n    const section = sections.find(\n      (s) => s.lineEnd >= endLine && s.title === headingTextOf(node),\n    );\n    if (!section) continue;\n\n    if (!firstTitle) firstTitle = section.title;\n    titles.push(section.title);\n    blocks.push(section.content);\n  }\n\n  if (blocks.length === 0) return null;\n\n  // `content` gồm heading + toàn bộ subtree. Bỏ heading ở đầu mỗi block để lấy **body**,\n  // vì semantic key là địa chỉ của section chứ không phải của cây con: với\n  // `lessonDesignPlan` (cha) thì các con đã được ghép vào riêng, không cần lặp lại.\n  const bodies = blocks.map((c) => stripLeadingHeading(c).trim());\n  const body = bodies.join('\\n\\n').trim();\n  const content = blocks.join('\\n\\n');\n\n  return {\n    title: firstTitle,\n    body,\n    content,\n    charCount: body.length,\n  };\n}\n\n/**\n * Bỏ **đúng một** heading đầu tiên (và dòng trống ngay sau nó) ở đầu khối markdown.\n *\n * Chỉ một, không phải \"mọi heading liên tiếp\": khối của một section cha vẫn chứa heading của\n * các con (`### 1. Engage` …), và đó là nội dung hợp lệ phải giữ lại.\n */\nfunction stripLeadingHeading(block: string): string {\n  const lines = block.split('\\n');\n  let i = 0;\n  while (i < lines.length && lines[i].trim() === '') i++;\n  if (i < lines.length && /^#{1,6}\\s/.test(lines[i])) i++;\n  while (i < lines.length && lines[i].trim() === '') i++;\n  return lines.slice(i).join('\\n');\n}\n\n/** Node `heading` giữ text tiêu đề trong `children`, không có field `title`. */\nfunction headingTextOf(node: { type: string; children?: Array<{ value?: string }> }): string {\n  if (node.type !== 'heading') return '';\n  return (node.children ?? [])\n    .map((c) => c.value ?? '')\n    .join('')\n    .trim();\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// @thanh01.pmt/curriculum-kit — Prompt Lab resolver\n//\n// The single place where a saved prompt template becomes a real prompt, and the\n// single place that answers \"what fields can this artifact offer?\".\n//\n// Why it lives in the kit and not in the app: the prompt lab and the real\n// generation path must resolve the SAME template the same way. Two resolvers\n// means an experiment that passes stops predicting production the moment the two\n// paths diverge. Nothing here knows about HTTP, storage or UI.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { z } from 'zod';\nimport { parseLessonFlow } from '../parsers/lessonFlowParser.js';\nimport { getSectionBody, listSections } from './sectionExtractor.js';\nimport { getContract } from '../registry/artifactRegistry.js';\n\n// ───────────────────────────────────────────────────────────────────────────────\n// Scopes — measured, not invented\n// ───────────────────────────────────────────────────────────────────────────────\n\n/**\n * Which document a field's value is read from.\n *\n * This is PROVENANCE, not a permission. Every step may draw on every earlier step —\n * `SOT_GENERATION_ORDER` in `sotOwnership.ts` already models that (\"information flows\n * strictly DOWN this list\"), and which fields a prompt actually uses is the user's\n * call, not something this taxonomy decides.\n *\n * The values exist for one mechanical reason: a saved ref says *where* to read from,\n * so `phase.4` on a lesson prompt and `keyTerms` on an exposition prompt resolve from\n * different files. Merge them into a single \"previous artifact\" pointer and a prompt\n * saved against a lesson would silently read the wrong document.\n *\n * Generation order, for reference (steps 1-8 are SOT, 9 KX, 10 lesson, 11+ satellites):\n *   1 LEARNER_PROFILE · 2 PROJECT_BRIEF · 3 REFERENCE_PACK · 4 STANDARD_STACK\n *   5 CURRICULUM_FRAMEWORK · 6 CONTENT_STYLE_GUIDE · 7 ART_DIRECTION · 8 ALIGNMENT_MATRIX\n */\nexport type FieldScope = 'satellite' | 'sot' | 'lesson' | 'activity';\n\nexport type FieldTier = 'zod' | 'semantic';\n\n/**\n * The four states a field can be in, from the plan:\n *   `real`     — schema declares it AND the extracted typed data holds it.\n *   `section`  — schema does not declare it, but a real markdown section carries it.\n *   `declared` — schema declares it, no value yet (no file generated, or the\n *                extractor does not run for this type).\n *   `missing`  — schema declares it and the file exists but the value is absent.\n *\n * Measured: 19 of 21 artifact types return null typed data, so `declared` is the\n * normal state for the Zod column. That is a fact about extraction coverage, not\n * a bug in the browser, and showing it honestly is the point of having four states.\n */\nexport type FieldState = 'real' | 'section' | 'declared' | 'missing';\n\nexport type FieldKind = 'string' | 'number' | 'boolean' | 'list' | 'object';\n\nexport interface FieldDef {\n  scope: FieldScope;\n  /** Address inside its scope. `$` = Zod output field, `@` = semantic key/section. */\n  path: string;\n  tier: FieldTier;\n  label: string;\n  kind: FieldKind;\n  state: FieldState;\n  ownerArtifactType: string;\n  /** Character count of the real value — a chip bigger than any budget is undraggable. */\n  charCount?: number;\n  preview?: string;\n  description?: string;\n}\n\nexport interface FieldRef {\n  scope: FieldScope;\n  ownerArtifactType: string;\n  tier: FieldTier;\n  path: string;\n  renderAs?: 'markdown' | 'compact';\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// Template resolution\n// ───────────────────────────────────────────────────────────────────────────────\n\n/**\n * A value containing `{{` needs no escaping, and that is deliberate.\n *\n * `String.replace` scans the ORIGINAL string once; the string a replacer returns is\n * spliced in verbatim and never rescanned. So a field whose value happens to contain\n * `{{@x}}` comes out as literal text, not as a second substitution. Verified, not\n * assumed — and worth knowing, because an earlier version of this file \"escaped\" `{{`\n * to `{` + `\\u007b`, which is literally the same two characters it was trying to\n * neutralise.\n *\n * If a second pass is ever added above this one, escaping becomes necessary — and\n * then it must use a marker the placeholder regex cannot match.\n */\n\nconst PLACEHOLDER = /\\{\\{\\s*([$@])([A-Za-z0-9_.[\\]-]+)\\s*\\}\\}/g;\n\n/**\n * Replace `{{$field}}` / `{{@section}}` with the value the resolver returns.\n *\n * A ref the resolver cannot resolve is left in place verbatim rather than replaced\n * with an empty string: a prompt that visibly still contains `{{@lessonFlow}}` is a\n * bug report, a prompt that silently lost a section is not.\n */\nexport function resolveTemplate(\n  template: string,\n  refs: readonly FieldRef[],\n  resolve: (ref: FieldRef) => string | undefined,\n): { prompt: string; unresolved: string[] } {\n  const unresolved: string[] = [];\n  const byPath = new Map(refs.map((r) => [`${r.tier === 'zod' ? '$' : '@'}${r.path}`, r]));\n\n  const prompt = template.replace(PLACEHOLDER, (whole, sigil: string, path: string) => {\n    const ref = byPath.get(`${sigil}${path}`);\n    const value = ref ? resolve(ref) : undefined;\n    if (value === undefined) {\n      unresolved.push(`${sigil}${path}`);\n      return whole;\n    }\n    return value;\n  });\n\n  return { prompt, unresolved };\n}\n\n/** Every `{{…}}` in the template, whether or not it has a matching ref. */\nexport function extractPlaceholders(template: string): string[] {\n  const found: string[] = [];\n  for (const m of template.matchAll(PLACEHOLDER)) found.push(m[0]);\n  return found;\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// Reading a field's real value\n// ───────────────────────────────────────────────────────────────────────────────\n\nconst PHASE_PATH = /^phase\\.(\\d+)(?:\\.(\\d+))?$/;\n\n/**\n * The split strategy for one field's body, independent of where the body came from.\n * Kept separate from `readFieldValue` so reading a sub-part and listing all sub-parts\n * can never disagree about what the pieces are.\n */\nexport function splitBody(body: string, path: string): SplitOption[] {\n  const byHeading = splitByHeadings(body);\n  if (byHeading.length > 1) return withPaths(path, byHeading);\n  return withPaths(path, splitTableRows(body));\n}\n\n/**\n * Read one field's value out of a markdown document, or `undefined` if the document\n * does not contain it.\n *\n * Two addressing schemes, because the plan needs both:\n *   - `phase.N` / `phase.N.M` — positional, taken from `parseLessonFlow().phases`.\n *     Positional because phases are model-dependent: a lesson may have five (5E,\n *     GENERAL) or six (EDP), and two same-named phases must not collide.\n *   - anything else — a semantic key, via `getSectionBody`.\n */\nexport function readFieldValue(markdown: string, path: string): string | undefined {\n  const phase = PHASE_PATH.exec(path);\n  if (!phase) return getSectionBody(markdown, path)?.body;\n\n  const parent = `phase.${phase[1]}`;\n  // Luôn đọc phase CHA, không đọc lại chính path này — nếu không sẽ đệ quy vô hạn\n  // giữa readFieldValue và listFieldSplits.\n  const whole = readPhaseContent(markdown, parent);\n  if (whole === undefined) return undefined;\n  if (!phase[2]) return whole;\n\n  return splitBody(whole, parent)[Number(phase[2]) - 1]?.value;\n}\n\nfunction readPhaseContent(markdown: string, path: string): string | undefined {\n  return parseLessonFlow(markdown).phases[Number(path.slice('phase.'.length)) - 1]?.content;\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// Splitting an oversized field\n// ───────────────────────────────────────────────────────────────────────────────\n\nexport interface SplitOption {\n  path: string;\n  label: string;\n  charCount: number;\n  preview: string;\n  value: string;\n}\n\nconst PREVIEW_CHARS = 400;\n\n/**\n * Break one field into draggable parts, or `[]` when it is already small enough.\n *\n * Measured reason this exists: `framework.scopeAndSequence` is a single 10,123-char\n * table of 30 lesson rows — nobody can drag that into a prompt, and no budget covers\n * it. Two strategies, applied in the order that yields parts:\n *\n *   1. child headings — a phase with `#### Bước 1..6` splits into its six steps.\n *      `lessonFlow.phase.4` measured 3,406 chars → 6 parts.\n *   2. table rows — `scopeAndSequence` has no child heading, only rows.\n *\n * Only immediate children, so a part is never larger than its parent.\n */\nexport function listFieldSplits(markdown: string, path: string): SplitOption[] {\n  const body = readFieldValue(markdown, path);\n  if (!body) return [];\n\n  return splitBody(body, path);\n}\n\n/**\n * Split `body` at its own sub-headings.\n *\n * `body` never contains its own heading — `getSectionBody` and `parseLessonFlow` both\n * strip it — so EVERY heading left inside is a child. Measured: `phase.4` yields six\n * `#### Bước` blocks, and the old version dropped the first one as if it were the\n * section's own title, returning five.\n *\n * Only the shallowest level present becomes a part, so a part is never bigger than\n * the field it came from.\n */\nfunction splitByHeadings(body: string): Array<{ label: string; text: string }> {\n  const lines = body.split('\\n');\n  const marks: Array<{ lineIdx: number; level: number; label: string }> = [];\n  let inFence = false;\n\n  lines.forEach((line, lineIdx) => {\n    if (/^\\s*(```|~~~)/.test(line)) inFence = !inFence;\n    if (inFence) return;\n    const m = /^(#{2,6})\\s+(.*)$/.exec(line);\n    if (m) marks.push({ lineIdx, level: m[1].length, label: m[2].trim() });\n  });\n\n  if (marks.length === 0) return [];\n  const shallowest = Math.min(...marks.map((m) => m.level));\n  const children = marks.filter((m) => m.level === shallowest);\n  if (children.length === 0) return [];\n\n  const parts = children.map((child, i) => ({\n    label: child.label,\n    text: lines.slice(child.lineIdx, children[i + 1]?.lineIdx ?? lines.length).join('\\n').trim(),\n  }));\n\n  // Nội dung nằm TRƯỚC heading đầu tiên không thuộc heading nào — giữ lại thay vì\n  // làm mất, gắn nhãn rõ để không bị nhầm là một bước có tên.\n  const preamble = lines.slice(0, children[0].lineIdx).join('\\n').trim();\n  if (preamble) parts.unshift({ label: '(phần mở đầu)', text: preamble });\n\n  return parts;\n}\n\n/**\n * Data rows of a markdown table, header excluded.\n *\n * Measured: `scopeAndSequence` is one 10,123-char table whose rows are one per\n * lesson code, which is exactly the granularity a prompt wants.\n */\nfunction splitTableRows(body: string): Array<{ label: string; text: string }> {\n  const rows = body.split('\\n').filter((l) => /^\\s*\\|.*\\|\\s*$/.test(l));\n  if (rows.length < 3) return []; // header + separator + at least one data row\n\n  const data = rows.slice(2).map((r) => r.trim());\n  return data.map((text) => {\n    const cells = text.split('|').map((c) => c.trim()).filter(Boolean);\n    return { label: cells[1] ?? cells[0] ?? text.slice(0, 40), text };\n  });\n}\n\nfunction withPaths(path: string, parts: Array<{ label: string; text: string }>): SplitOption[] {\n  return parts.map((part, i) => ({\n    path: `${path}.${i + 1}`,\n    label: part.label,\n    charCount: part.text.length,\n    preview: part.text.slice(0, PREVIEW_CHARS),\n    value: part.text,\n  }));\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// The field browser: what can this artifact offer?\n// ───────────────────────────────────────────────────────────────────────────────\n\nexport interface FieldSource {\n  scope: FieldScope;\n  /** Artifact the field belongs to — `lesson`, `act`, or the SOT document kind. */\n  artifactType: string;\n  /** Raw markdown of the generated document, when there is one. */\n  markdown?: string;\n  /** Typed data extracted by the artifact's own extractor, when it runs. */\n  typedData?: Record<string, unknown> | null;\n  /** Semantic keys to offer. Defaults to the standard set for the document. */\n  keys?: readonly string[];\n}\n\nconst LESSON_KEYS = [\n  'lessonDesignPlan',\n  'lessonDesignPlan.learningObjectives',\n  'lessonDesignPlan.activitySequence',\n  'lessonDesignPlan.resourceMap',\n  'lessonDesignPlan.assessmentMap',\n  'lessonDesignPlan.artifactContract',\n  'lessonFlow',\n  'teacherNotes',\n] as const;\n\nconst SOT_KEYS = [\n  // framework\n  'courseOverview',\n  'globalLearningObjectives',\n  'structuralHierarchy',\n  'scopeAndSequence',\n  'standardLessonFormat',\n  // knowledge exposition\n  'sessionScope',\n  'keyTerms',\n  'conceptNarratives',\n  'workedMicroExamples',\n  'commonMistakes',\n  'selfCheckQuestions',\n] as const;\n\n/** Chips whose real value exceeds this are worth offering a \"split\" button on. */\nexport const SPLIT_THRESHOLD_CHARS = 2_000;\n\n/**\n * Build the browser's chip list for one source document.\n *\n * Two columns because the two tiers answer different questions and neither wins:\n *\n * - `$` (Zod `outputSchema`) knows the TYPE and can validate. 20 of 21 artifact\n *   types declare one; only `bom` lacks it.\n * - `@` (semantic sections from the actual markdown) knows the REAL VALUE. Only\n *   `lesson` and `quiz` produce typed data — `act`, `guide`, `handout`, `slide`\n *   and `ext` all return null — so a Zod-only browser would show 16 of 17 ACT\n *   fields empty.\n */\nexport function buildFieldDefs(source: FieldSource): FieldDef[] {\n  const { scope, artifactType, markdown, typedData } = source;\n  const defs: FieldDef[] = [];\n  const seen = new Set<string>();\n\n  if (markdown) {\n    // Phase là khái niệm của bài học, không phải của mọi tài liệu. Đo được: framework\n    // có một mục \"B.\" và mấy dòng `### N.` trong bảng, nên `parseLessonFlow` ra 8\n    // phase giả — và `phase.1` của framework đè lên `phase.1` của lesson trong\n    // danh sách hợp nhất. Chỉ bài học mới có phase.\n    const flow = artifactType === 'lesson' ? parseLessonFlow(markdown) : null;\n    flow?.phases.forEach((phase, i) => {\n      const path = `phase.${i + 1}`;\n      seen.add(path);\n      defs.push({\n        scope,\n        path,\n        tier: 'semantic',\n        label: phase.phaseName,\n        kind: 'string',\n        state: 'section',\n        ownerArtifactType: artifactType,\n        charCount: phase.content.length,\n        preview: phase.content.slice(0, PREVIEW_CHARS),\n        description: phase.timing ? `Thời lượng: ${phase.timing}` : undefined,\n      });\n    });\n\n    const keys = source.keys ?? (scope === 'lesson' ? LESSON_KEYS : SOT_KEYS);\n    for (const key of keys) {\n      if (seen.has(key)) continue;\n      // `lessonFlow` là vỏ chứa chính các phase vừa liệt kê (20,626 chars = 6 phase).\n      // Giữ cả hai là hiện một nội dung hai lần, và chip cả khối thì không kéo nổi.\n      if (flow && key === 'lessonFlow') continue;\n      const body = getSectionBody(markdown, key);\n      if (!body) continue;\n      seen.add(key);\n      defs.push({\n        scope,\n        path: key,\n        tier: 'semantic',\n        label: body.title,\n        kind: 'string',\n        state: 'section',\n        ownerArtifactType: artifactType,\n        charCount: body.charCount,\n        preview: body.body.slice(0, PREVIEW_CHARS),\n      });\n    }\n  }\n\n  for (const field of zodFieldDefs(artifactType, typedData ?? null)) {\n    const path = field.path;\n    if (seen.has(path)) continue;\n    seen.add(path);\n    defs.push({ ...field, scope, ownerArtifactType: artifactType });\n  }\n\n  return dropParentsOfEmittedChildren(defs);\n}\n\n/**\n * Remove a field whose dotted children are already listed.\n *\n * Measured: `lessonDesignPlan` is 17,774 chars and its five `lessonDesignPlan.*`\n * children total the same text. Offering both means the browser shows every content\n * twice and the parent chip is the one nobody can drag.\n */\nfunction dropParentsOfEmittedChildren(defs: FieldDef[]): FieldDef[] {\n  const paths = new Set(defs.map((d) => d.path));\n  return defs.filter((d) => ![...paths].some((p) => p.startsWith(`${d.path}.`)));\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// Reading the Zod output schema\n// ───────────────────────────────────────────────────────────────────────────────\n\nconst UNWRAPPERS = new Set([\n  'ZodOptional',\n  'ZodNullable',\n  'ZodDefault',\n  'ZodCatch',\n  'ZodReadonly',\n  'ZodBranded',\n  'ZodEffects',\n  'ZodLazy',\n  'ZodPipeline',\n]);\n\n/**\n * Peel the wrappers that hide the real type (`optional`, `default`, `describe`,\n * `lazy`…). Without this, a field typed `z.string().optional().describe(…)` would\n * read as \"unknown\" and every derived field would collapse.\n */\nfunction unwrap(schema: z.ZodTypeAny): z.ZodTypeAny {\n  let current = schema;\n  // 10 là biên an toàn, không phải giá trị đo: độ sâu wrapper thật đo được là 1\n  // (`ZodDefault(ZodOptional(...))` ở `act.reflectionQuestion`, `quiz.rubric` là sâu\n  // nhất). Mutation hạ xuống 1 không làm test đỏ vì lớp ngoài và lớp trong đều cho\n  // cùng kind `string` — nên đừng đợi test bảo vệ thứ này.\n  for (let i = 0; i < 10; i++) {\n    const def = current._def as Record<string, any>;\n    if (!UNWRAPPERS.has(def.typeName)) return current;\n    const inner = def.innerType ?? def.schema ?? def.type ?? def.innerType?._zod?.def;\n    if (!inner || inner === current) return current;\n    current = inner;\n  }\n  return current;\n}\n\nfunction kindOf(schema: z.ZodTypeAny): FieldKind {\n  switch ((unwrap(schema)._def as any).typeName) {\n    case 'ZodArray':\n    case 'ZodTuple':\n      return 'list';\n    case 'ZodObject':\n    case 'ZodRecord':\n    case 'ZodMap':\n    case 'ZodIntersection':\n      return 'object';\n    case 'ZodNumber':\n    case 'ZodBigInt':\n      return 'number';\n    case 'ZodBoolean':\n      return 'boolean';\n    default:\n      return 'string';\n  }\n}\n\n/**\n * The Zod column: every field the artifact's `outputSchema` demands, whether or not\n * a value exists for it.\n *\n * This is the \"define the fields up front, for every artifact\" column — it is\n * derivable from `outputSchema` for 20 of 21 types, so it needs no new schema.\n */\n/** The Zod column before it is attached to a scope — see `buildFieldDefs`. */\nexport type ZodFieldDef = Omit<FieldDef, 'scope' | 'ownerArtifactType'>;\n\nexport function zodFieldDefs(\n  artifactType: string,\n  typedData: Record<string, unknown> | null,\n): ZodFieldDef[] {\n  const contract = getContract(artifactType as any);\n  const schema = contract?.outputSchema;\n  const defs: ZodFieldDef[] = [];\n  if (!schema) return defs;\n\n  const root = unwrap(schema as z.ZodTypeAny);\n  const shape = (root as any).shape ?? (root._def as any).shape?.();\n  if (!shape) return defs;\n\n  for (const [key, fieldSchema] of Object.entries(shape as Record<string, z.ZodTypeAny>)) {\n    const kind = kindOf(fieldSchema);\n    const has = typedData ? Object.prototype.hasOwnProperty.call(typedData, key) : false;\n    const value = has ? (typedData as Record<string, unknown>)[key] : undefined;\n    defs.push({\n      path: key,\n      tier: 'zod',\n      label: key,\n      kind,\n      state: has ? 'real' : typedData ? 'missing' : 'declared',\n      description: describeField(fieldSchema),\n      charCount: has && typeof value === 'string' ? value.length : undefined,\n      preview: has ? previewValue(value) : undefined,\n    });\n  }\n\n  return defs;\n}\n\nfunction describeField(schema: z.ZodTypeAny): string | undefined {\n  const desc = (schema as any).description ?? (schema._def as any).description;\n  return typeof desc === 'string' ? desc : undefined;\n}\n\nfunction previewValue(value: unknown): string | undefined {\n  if (value === null || value === undefined) return undefined;\n  if (typeof value === 'string') return value.slice(0, PREVIEW_CHARS);\n  try {\n    return JSON.stringify(value).slice(0, PREVIEW_CHARS);\n  } catch {\n    return undefined;\n  }\n}\n\n// ───────────────────────────────────────────────────────────────────────────────\n// Building the full multi-source browser\n// ───────────────────────────────────────────────────────────────────────────────\n\nexport interface FieldSourceGroup extends FieldSource {\n  /** Display name in the browser, e.g. \"Framework\", \"Knowledge Exposition\". */\n  label: string;\n}\n\n/**\n * The browser's input: every document a prompt may draw from, grouped by where it\n * comes from.\n *\n * Groups are kept separate instead of merged because a chip must say where its\n * value came from — `phase.4` is a lesson (previous step) while `keyTerms` is KX\n * (generated before the course even started). Merging them would hide the very\n * distinction that makes a saved prompt reusable on another lesson.\n */\nexport function buildFieldBrowser(groups: readonly FieldSourceGroup[]): FieldDef[] {\n  return groups.flatMap((g) => buildFieldDefs(g));\n}","import { createClient, type SupabaseClient } from '@supabase/supabase-js';\nimport {\n  FrameworkPackSchema,\n  type FrameworkPack,\n  type FrameworkMapping,\n  type FrameworkStatement,\n} from './frameworkPackSchema';\n\n/**\n * Standards Registry Adapter — Supabase-backed runtime plane for Framework Packs.\n *\n * Read path (generation): loadPacksForCourse() → FrameworkPack[] hydrated from\n *   standards_frameworks + standards_statements + standards_mappings (+ overrides\n *   applied with resolution order override > pack-embedded, 'retired' removes).\n * Write path (intake): importPack() persists a validated pack; adopt/deprecate\n *   manage lifecycle. Write access uses a service-role client (intake runs\n *   server-side); RLS governs client-side reads.\n */\n\nexport interface StandardsRegistryConfig {\n  supabaseUrl?: string;\n  supabaseServiceRoleKey?: string;\n  supabaseAnonKey?: string;\n  client?: SupabaseClient;\n}\n\nexport interface HydratedPack extends FrameworkPack {\n  /** DB id of the standards_frameworks row */\n  dbId: string;\n  status: 'draft' | 'active' | 'deprecated';\n  organizationCode: string | null;\n}\n\nexport interface ImportPackResult {\n  frameworkDbId: string;\n  statementsInserted: number;\n  mappingsInserted: number;\n}\n\nexport class StandardsRegistryAdapter {\n  private client: SupabaseClient;\n\n  constructor(config: StandardsRegistryConfig = {}) {\n    if (config.client) {\n      this.client = config.client;\n      return;\n    }\n    const url = config.supabaseUrl || process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || '';\n    const key =\n      config.supabaseServiceRoleKey ||\n      process.env.SUPABASE_SERVICE_ROLE_KEY ||\n      config.supabaseAnonKey ||\n      process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n      '';\n    if (!url || !key) {\n      throw new Error('StandardsRegistryAdapter: Supabase URL/key missing (pass client or env).');\n    }\n    this.client = createClient(url, key);\n  }\n\n  // ─── Intake (write path — service role) ───────────────────────────────────\n\n  /** Persist a schema-validated pack as a new framework (status=draft). */\n  async importPack(pack: FrameworkPack, opts?: { organizationCode?: string | null; createdBy?: string; originalFilePath?: string }): Promise<ImportPackResult> {\n    const parsed = FrameworkPackSchema.safeParse(pack);\n    if (!parsed.success) {\n      throw new Error('importPack: pack failed schema validation: ' + parsed.error.issues.map((i) => i.path.join('.') + ': ' + i.message).join('; '));\n    }\n    const p = parsed.data;\n\n    const { data: fw, error: fwErr } = await this.client\n      .from('standards_frameworks')\n      .insert({\n        pack_id: p.manifest.id,\n        content_version: p.manifest.contentVersion,\n        name: p.manifest.name,\n        spec_version: p.manifest.specVersion,\n        subject: p.manifest.subject,\n        languages: p.manifest.languages,\n        grade_model: p.manifest.gradeModel,\n        provenance: p.manifest.provenance,\n        trust: p.manifest.trust,\n        status: 'draft',\n        organization_code: opts?.organizationCode ?? (p.manifest.trust === 'verified' ? null : p.manifest.provenance.importedBy?.replace(/^org:/, '') || null),\n        original_file_path: opts?.originalFilePath ?? null,\n        created_by: opts?.createdBy ?? null,\n      })\n      .select('id')\n      .single();\n    if (fwErr) throw new Error('importPack: framework insert failed: ' + fwErr.message);\n\n    const frameworkId = fw.id as string;\n\n    const statementRows = p.statements.map((s: FrameworkStatement) => ({\n      framework_id: frameworkId,\n      statement_id: s.id,\n      parent_statement_id: s.parentId ?? null,\n      grade_min: s.gradeBand[0],\n      grade_max: s.gradeBand[1],\n      texts: s.texts,\n      classifications: s.classifications ?? [],\n      bloom_hint: s.bloomHint ?? null,\n      keywords: s.keywords ?? [],\n      source_ref: s.sourceRef ?? null,\n      provenance: s.provenance,\n    }));\n\n    const { error: stErr, count: stCount } = await this.client\n      .from('standards_statements')\n      .insert(statementRows, { count: 'exact' });\n    if (stErr) throw new Error('importPack: statement insert failed: ' + stErr.message);\n\n    let mappingCount = 0;\n    if (p.mappings && p.mappings.length > 0) {\n      const mappingRows = p.mappings.map((m: FrameworkMapping) => ({\n        framework_id: frameworkId,\n        statement_id: m.statementId,\n        target_ref: m.targetRef,\n        kind: m.kind,\n        confidence: m.confidence,\n        provenance: m.provenance,\n      }));\n      const { error: mpErr, count: mpCount } = await this.client\n        .from('standards_mappings')\n        .insert(mappingRows, { count: 'exact' });\n      if (mpErr) throw new Error('importPack: mapping insert failed: ' + mpErr.message);\n      mappingCount = mpCount ?? mappingRows.length;\n    }\n\n    return { frameworkDbId: frameworkId, statementsInserted: stCount ?? statementRows.length, mappingsInserted: mappingCount };\n  }\n\n  /** Activate a draft framework (immutable version is now live). */\n  async activatePack(frameworkDbId: string): Promise<void> {\n    const { error } = await this.client\n      .from('standards_frameworks')\n      .update({ status: 'active' })\n      .eq('id', frameworkDbId)\n      .eq('status', 'draft');\n    if (error) throw new Error('activatePack failed: ' + error.message);\n  }\n\n  async deprecatePack(frameworkDbId: string): Promise<void> {\n    const { error } = await this.client\n      .from('standards_frameworks')\n      .update({ status: 'deprecated' })\n      .eq('id', frameworkDbId);\n    if (error) throw new Error('deprecatePack failed: ' + error.message);\n  }\n\n  async adoptPack(frameworkDbId: string, organizationCode: string, adoptedBy?: string): Promise<void> {\n    const { error } = await this.client.from('standards_org_adoptions').upsert(\n      { framework_id: frameworkDbId, organization_code: organizationCode, adopted_by: adoptedBy ?? null },\n      { onConflict: 'organization_code,framework_id' }\n    );\n    if (error) throw new Error('adoptPack failed: ' + error.message);\n  }\n\n  // ─── Runtime (read path — generation) ─────────────────────────────────────\n\n  /**\n   * Load all packs usable by an org: platform packs (verified, org IS NULL) +\n   * org packs + org adoptions. Hydrated into the same FrameworkPack shape the\n   * in-memory Phase-1 components consume (injector / coverage gate / judge).\n   */\n  async loadPacksForOrg(organizationCode: string | null): Promise<HydratedPack[]> {\n    // Visible frameworks = platform (org NULL, active) OR org-owned OR adopted\n    let query = this.client\n      .from('standards_frameworks')\n      .select('*, standards_org_adoptions(organization_code)')\n      .eq('status', 'active');\n    const { data: frameworks, error } = await query;\n    if (error) throw new Error('loadPacksForOrg: ' + error.message);\n\n    const visible = (frameworks ?? []).filter((f: any) => {\n      const own = f.organization_code && organizationCode && f.organization_code === organizationCode;\n      const global = !f.organization_code;\n      const adopted = organizationCode && (f.standards_org_adoptions ?? []).some((a: any) => a.organization_code === organizationCode);\n      return global || own || adopted;\n    });\n\n    if (visible.length === 0) return [];\n\n    const ids = visible.map((f: any) => f.id);\n    const [{ data: statements, error: stErr }, { data: mappings, error: mpErr }, { data: overrides, error: ovErr }] = await Promise.all([\n      this.client.from('standards_statements').select('*').in('framework_id', ids),\n      this.client.from('standards_mappings').select('*').in('framework_id', ids),\n      this.client.from('standards_mapping_overrides').select('*').in('framework_id', ids),\n    ]);\n    if (stErr) throw new Error('loadPacksForOrg statements: ' + stErr.message);\n\n    const overridesByFw = new Map<string, any[]>();\n    for (const o of overrides ?? []) {\n      const list = overridesByFw.get(o.framework_id) ?? [];\n      list.push(o);\n      overridesByFw.set(o.framework_id, list);\n    }\n\n    return visible.map((f: any) => {\n      const stmts = (statements ?? [])\n        .filter((s: any) => s.framework_id === f.id)\n        .map((s: any) => ({\n          id: s.statement_id,\n          parentId: s.parent_statement_id ?? undefined,\n          gradeBand: [s.grade_min, s.grade_max] as [number, number],\n          texts: s.texts,\n          classifications: s.classifications ?? [],\n          bloomHint: s.bloom_hint ?? undefined,\n          keywords: s.keywords ?? [],\n          sourceRef: s.source_ref ?? undefined,\n          provenance: s.provenance ?? { method: 'imported' },\n        }));\n\n      // Resolution order: override (unless retired) > pack-embedded\n      const ov = overridesByFw.get(f.id) ?? [];\n      const retired = new Set(ov.filter((o: any) => o.kind === 'retired').map((o: any) => o.statement_id + '|' + o.target_ref));\n      const embedded: FrameworkMapping[] = (mappings ?? [])\n        .filter((m: any) => m.framework_id === f.id)\n        .map((m: any) => ({\n          statementId: m.statement_id,\n          targetRef: m.target_ref,\n          kind: m.kind,\n          confidence: Number(m.confidence),\n          provenance: m.provenance ?? { method: 'imported' },\n        }));\n      const overlay: FrameworkMapping[] = ov\n        .filter((o: any) => o.kind !== 'retired')\n        .map((o: any) => ({\n          statementId: o.statement_id,\n          targetRef: o.target_ref,\n          kind: o.kind,\n          confidence: Number(o.confidence),\n          provenance: { method: 'human', reviewedBy: o.created_by ?? 'overlay', note: o.note ?? undefined },\n        }));\n\n      const bridge = new Map<string, FrameworkMapping>();\n      for (const m of embedded) bridge.set(m.statementId + '|' + m.targetRef, m);\n      for (const m of overlay) bridge.set(m.statementId + '|' + m.targetRef, m);\n      const finalMappings = [...bridge.values()].filter((m) => !retired.has(m.statementId + '|' + m.targetRef));\n\n      const hydrated = FrameworkPackSchema.safeParse({\n        manifest: {\n          id: f.pack_id,\n          name: f.name,\n          specVersion: f.spec_version || '1.0',\n          contentVersion: f.content_version,\n          subject: f.subject,\n          languages: f.languages,\n          gradeModel: f.grade_model,\n          provenance: f.provenance,\n          trust: f.trust,\n        },\n        statements: stmts,\n        mappings: finalMappings,\n      });\n      if (!hydrated.success) {\n        throw new Error('loadPacksForOrg: hydrated pack \"' + f.pack_id + '\" failed schema: ' + hydrated.error.issues[0]?.message);\n      }\n\n      return { ...hydrated.data, dbId: f.id, status: f.status, organizationCode: f.organization_code ?? null } as HydratedPack;\n    });\n  }\n}\n"]}