@thanh01.pmt/domain-kit 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +42 -11
  2. package/dist/{chunk-Y7MRFFDJ.mjs → chunk-HILSUZOF.mjs} +3 -3
  3. package/dist/{chunk-Y7MRFFDJ.mjs.map → chunk-HILSUZOF.mjs.map} +1 -1
  4. package/dist/{chunk-MCHHEBH3.mjs → chunk-LZQLLAYP.mjs} +5 -5
  5. package/dist/{chunk-MCHHEBH3.mjs.map → chunk-LZQLLAYP.mjs.map} +1 -1
  6. package/dist/{chunk-MSRKUZLY.mjs → chunk-PKUEOSZ3.mjs} +23 -2
  7. package/dist/chunk-PKUEOSZ3.mjs.map +1 -0
  8. package/dist/{chunk-LKSVTRQE.mjs → chunk-QJF4QCBJ.mjs} +28 -3
  9. package/dist/chunk-QJF4QCBJ.mjs.map +1 -0
  10. package/dist/curriculumFeedEmitter-6IK6PFDH.mjs +4 -0
  11. package/dist/{curriculumFeedEmitter-FYAWMPE6.mjs.map → curriculumFeedEmitter-6IK6PFDH.mjs.map} +1 -1
  12. package/dist/{curriculumFeedSchema-C8ZP3XMi.d.ts → curriculumFeedSchema-B66H3gEV.d.cts} +140 -0
  13. package/dist/{curriculumFeedSchema-C8ZP3XMi.d.cts → curriculumFeedSchema-B66H3gEV.d.ts} +140 -0
  14. package/dist/feed/index.cjs +46 -0
  15. package/dist/feed/index.cjs.map +1 -1
  16. package/dist/feed/index.d.cts +1 -1
  17. package/dist/feed/index.d.ts +1 -1
  18. package/dist/feed/index.mjs +2 -2
  19. package/dist/graph/index.cjs +1 -0
  20. package/dist/graph/index.d.cts +1 -1
  21. package/dist/graph/index.d.ts +1 -1
  22. package/dist/graph/index.mjs +1 -1
  23. package/dist/{hybridGraphPipeline-NZAWAPt_.d.ts → hybridGraphPipeline-DXQDbBEj.d.ts} +14 -2
  24. package/dist/{hybridGraphPipeline-BhFyh3cm.d.cts → hybridGraphPipeline-dT-bio-3.d.cts} +14 -2
  25. package/dist/index.cjs +47 -0
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +2 -2
  28. package/dist/index.d.ts +2 -2
  29. package/dist/index.mjs +4 -4
  30. package/dist/pipeline/index.cjs +46 -0
  31. package/dist/pipeline/index.cjs.map +1 -1
  32. package/dist/pipeline/index.d.cts +2 -2
  33. package/dist/pipeline/index.d.ts +2 -2
  34. package/dist/pipeline/index.mjs +4 -4
  35. package/dist/schemas/index.cjs +21 -0
  36. package/dist/schemas/index.cjs.map +1 -1
  37. package/dist/schemas/index.d.cts +1 -1
  38. package/dist/schemas/index.d.ts +1 -1
  39. package/dist/schemas/index.mjs +1 -1
  40. package/package.json +1 -1
  41. package/dist/chunk-LKSVTRQE.mjs.map +0 -1
  42. package/dist/chunk-MSRKUZLY.mjs.map +0 -1
  43. package/dist/curriculumFeedEmitter-FYAWMPE6.mjs +0 -4
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ export { i as ArchEdgeSchema, A as ArchNodeSchema, x as ArchitectureDetail, j as
2
2
  export { b as Concept, d as ConceptCategory, c as ConceptCategorySchema, m as ConceptIntroduction, i as ConceptIntroductionSchema, C as ConceptSchema, l as DevelopmentPhase, D as DevelopmentPhaseSchema, j as HybridGraph, H as HybridGraphSchema, g as KnowledgeGraph, K as KnowledgeGraphSchema, f as LearningPathStep, L as LearningPathStepSchema, a as ProblemType, P as ProblemTypeSchema, k as ProjectConceptLink, h as ProjectConceptLinkSchema, e as SubjectInfo, S as SubjectInfoSchema } from './hybridGraphSchema-nrUeSwpU.cjs';
3
3
  export { ExperimentProcedureSchema, GrammarRuleSchema, HardwareFeatureExtensionSchema, HardwareStepSchema, HardwareTaskExtensionSchema, HardwareTechStackExtensionSchema, LanguageConceptExtension, LanguageConceptExtensionSchema, MathConceptExtension, MathConceptExtensionSchema, MathTheoremSchema, ScienceConceptExtension, ScienceConceptExtensionSchema, ShapeSchema, ThreeDesignFeatureExtensionSchema, ThreeDesignTaskExtensionSchema, ThreeDesignTechStackExtensionSchema, WiringSchema } from './schemas/index.cjs';
4
4
  export { a as DetectionConfidenceSchema, e as DomainCategory, D as DomainCategorySchema, c as DomainProfile, b as DomainProfileSchema, g as GraphType, G as GraphTypeSchema, d as InputType, I as InputTypeSchema, f as LearningMode, L as LearningModeSchema } from './domainProfileSchema-CwT3Ffsw.cjs';
5
- export { g as CurriculumFeed, C as CurriculumFeedSchema, i as FeedEdge, c as FeedEdgeSchema, j as FeedGrouping, d as FeedGroupingSchema, F as FeedKeywordsSchema, h as FeedNode, b as FeedNodeSchema, f as FeedPhase, e as FeedPhaseSchema, a as FeedScaffoldCandidateSchema, v as validateCurriculumFeed } from './curriculumFeedSchema-C8ZP3XMi.cjs';
5
+ export { g as CurriculumFeed, C as CurriculumFeedSchema, i as FeedEdge, c as FeedEdgeSchema, j as FeedGrouping, d as FeedGroupingSchema, F as FeedKeywordsSchema, h as FeedNode, b as FeedNodeSchema, f as FeedPhase, e as FeedPhaseSchema, a as FeedScaffoldCandidateSchema, v as validateCurriculumFeed } from './curriculumFeedSchema-B66H3gEV.cjs';
6
6
  export { C as CppParseResult, P as PythonParseResult, S as SwiftParseResult, T as TsParseResult, f as mergeCppResults, d as mergePythonResults, m as mergeSwiftResults, b as mergeTsResults, e as parseCppFile, c as parsePythonFile, p as parseSwiftFile, a as parseTsFile } from './cpp-CZUPqJt9.cjs';
7
7
  export { P as ParsedSyllabus, a as SyllabusTopic, S as SyllabusUnit, p as parseSyllabus } from './syllabusParser-MSX1fEzW.cjs';
8
8
  export { K as Keyword, S as SourceContext, e as extractKeywords } from './keywordExtractor-BxlGRMHC.cjs';
@@ -10,7 +10,7 @@ export { FileRelevanceScore, scoreByContent, scoreByPath, scoreFiles, selectRele
10
10
  export { DetectDomainOptions, DetectInputTypeOptions, DetectLearningModeOptions, DomainDetectionResult, InputTypeDetectionResult, LearningModeDetectionResult, detectDomain, detectInputType, detectLearningMode } from './detector/index.cjs';
11
11
  export { D as DetectDomainProfileOptions, d as detectDomainProfile } from './domainProfileDetector-bzugdQmS.cjs';
12
12
  export { CIO_CODE_RE, CONCEPT_CODE_RE, DepthLayerAudit, ExtractOverviewOptions, ExtractScaffoldOptions, ExtractStepsOptions, LEARNER_CLAUSE, SIO_CODE_RE, ULO_CODE_RE, assignConceptCodes, auditDepthLayers, cioActionSlug, cioCode, conceptCodeFromName, extractFeatureSteps, extractFeatureStepsBatched, extractProjectOverview, extractScaffold, sioCode, standardStatement, techTagFor, uloCode } from './graph/index.cjs';
13
- export { H as Hallucination, i as HybridGraphPipelineOptions, j as HybridGraphPipelineResult, K as KnowledgeGraphPipelineOptions, a as KnowledgeGraphPipelineResult, f as KnowledgeGraphVerificationReport, V as VerifyOptions, e as auditSyllabusCoverage, c as breakPrerequisiteCycles, d as detectPrerequisiteCycles, h as generateHybridGraph, g as generateKnowledgeGraph, b as verifyKnowledgeGraph, v as verifyProjectGraph } from './hybridGraphPipeline-BhFyh3cm.cjs';
13
+ export { H as Hallucination, j as HybridGraphPipelineOptions, k as HybridGraphPipelineResult, K as KnowledgeGraphPipelineOptions, a as KnowledgeGraphPipelineResult, f as KnowledgeGraphVerificationReport, V as VerifyOptions, i as auditPhasePlan, e as auditSyllabusCoverage, c as breakPrerequisiteCycles, d as detectPrerequisiteCycles, h as generateHybridGraph, g as generateKnowledgeGraph, b as verifyKnowledgeGraph, v as verifyProjectGraph } from './hybridGraphPipeline-dT-bio-3.cjs';
14
14
  export { C as ConceptMapping, E as EscalateOptions, e as escalateAndMapConcepts } from './conceptEscalator-ltRLtPhf.cjs';
15
15
  export { ConceptMatch, ProposedConcept, ResolveConceptsOptions, ResolveConceptsResult, ResolvedConcept, resolveConcepts } from './concepts/index.cjs';
16
16
  export { AssembleOptions, AssembledMilestone, AssembledPhase, AssembledRoadmap, assembleRoadmap } from './assembly/index.cjs';
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { i as ArchEdgeSchema, A as ArchNodeSchema, x as ArchitectureDetail, j as
2
2
  export { b as Concept, d as ConceptCategory, c as ConceptCategorySchema, m as ConceptIntroduction, i as ConceptIntroductionSchema, C as ConceptSchema, l as DevelopmentPhase, D as DevelopmentPhaseSchema, j as HybridGraph, H as HybridGraphSchema, g as KnowledgeGraph, K as KnowledgeGraphSchema, f as LearningPathStep, L as LearningPathStepSchema, a as ProblemType, P as ProblemTypeSchema, k as ProjectConceptLink, h as ProjectConceptLinkSchema, e as SubjectInfo, S as SubjectInfoSchema } from './hybridGraphSchema-nrUeSwpU.js';
3
3
  export { ExperimentProcedureSchema, GrammarRuleSchema, HardwareFeatureExtensionSchema, HardwareStepSchema, HardwareTaskExtensionSchema, HardwareTechStackExtensionSchema, LanguageConceptExtension, LanguageConceptExtensionSchema, MathConceptExtension, MathConceptExtensionSchema, MathTheoremSchema, ScienceConceptExtension, ScienceConceptExtensionSchema, ShapeSchema, ThreeDesignFeatureExtensionSchema, ThreeDesignTaskExtensionSchema, ThreeDesignTechStackExtensionSchema, WiringSchema } from './schemas/index.js';
4
4
  export { a as DetectionConfidenceSchema, e as DomainCategory, D as DomainCategorySchema, c as DomainProfile, b as DomainProfileSchema, g as GraphType, G as GraphTypeSchema, d as InputType, I as InputTypeSchema, f as LearningMode, L as LearningModeSchema } from './domainProfileSchema-CwT3Ffsw.js';
5
- export { g as CurriculumFeed, C as CurriculumFeedSchema, i as FeedEdge, c as FeedEdgeSchema, j as FeedGrouping, d as FeedGroupingSchema, F as FeedKeywordsSchema, h as FeedNode, b as FeedNodeSchema, f as FeedPhase, e as FeedPhaseSchema, a as FeedScaffoldCandidateSchema, v as validateCurriculumFeed } from './curriculumFeedSchema-C8ZP3XMi.js';
5
+ export { g as CurriculumFeed, C as CurriculumFeedSchema, i as FeedEdge, c as FeedEdgeSchema, j as FeedGrouping, d as FeedGroupingSchema, F as FeedKeywordsSchema, h as FeedNode, b as FeedNodeSchema, f as FeedPhase, e as FeedPhaseSchema, a as FeedScaffoldCandidateSchema, v as validateCurriculumFeed } from './curriculumFeedSchema-B66H3gEV.js';
6
6
  export { C as CppParseResult, P as PythonParseResult, S as SwiftParseResult, T as TsParseResult, f as mergeCppResults, d as mergePythonResults, m as mergeSwiftResults, b as mergeTsResults, e as parseCppFile, c as parsePythonFile, p as parseSwiftFile, a as parseTsFile } from './cpp-CZUPqJt9.js';
7
7
  export { P as ParsedSyllabus, a as SyllabusTopic, S as SyllabusUnit, p as parseSyllabus } from './syllabusParser-MSX1fEzW.js';
8
8
  export { K as Keyword, S as SourceContext, e as extractKeywords } from './keywordExtractor-DU5XRN8-.js';
@@ -10,7 +10,7 @@ export { FileRelevanceScore, scoreByContent, scoreByPath, scoreFiles, selectRele
10
10
  export { DetectDomainOptions, DetectInputTypeOptions, DetectLearningModeOptions, DomainDetectionResult, InputTypeDetectionResult, LearningModeDetectionResult, detectDomain, detectInputType, detectLearningMode } from './detector/index.js';
11
11
  export { D as DetectDomainProfileOptions, d as detectDomainProfile } from './domainProfileDetector-DHb1T0zB.js';
12
12
  export { CIO_CODE_RE, CONCEPT_CODE_RE, DepthLayerAudit, ExtractOverviewOptions, ExtractScaffoldOptions, ExtractStepsOptions, LEARNER_CLAUSE, SIO_CODE_RE, ULO_CODE_RE, assignConceptCodes, auditDepthLayers, cioActionSlug, cioCode, conceptCodeFromName, extractFeatureSteps, extractFeatureStepsBatched, extractProjectOverview, extractScaffold, sioCode, standardStatement, techTagFor, uloCode } from './graph/index.js';
13
- export { H as Hallucination, i as HybridGraphPipelineOptions, j as HybridGraphPipelineResult, K as KnowledgeGraphPipelineOptions, a as KnowledgeGraphPipelineResult, f as KnowledgeGraphVerificationReport, V as VerifyOptions, e as auditSyllabusCoverage, c as breakPrerequisiteCycles, d as detectPrerequisiteCycles, h as generateHybridGraph, g as generateKnowledgeGraph, b as verifyKnowledgeGraph, v as verifyProjectGraph } from './hybridGraphPipeline-NZAWAPt_.js';
13
+ export { H as Hallucination, j as HybridGraphPipelineOptions, k as HybridGraphPipelineResult, K as KnowledgeGraphPipelineOptions, a as KnowledgeGraphPipelineResult, f as KnowledgeGraphVerificationReport, V as VerifyOptions, i as auditPhasePlan, e as auditSyllabusCoverage, c as breakPrerequisiteCycles, d as detectPrerequisiteCycles, h as generateHybridGraph, g as generateKnowledgeGraph, b as verifyKnowledgeGraph, v as verifyProjectGraph } from './hybridGraphPipeline-DXQDbBEj.js';
14
14
  export { C as ConceptMapping, E as EscalateOptions, e as escalateAndMapConcepts } from './conceptEscalator-YfMKIKCZ.js';
15
15
  export { ConceptMatch, ProposedConcept, ResolveConceptsOptions, ResolveConceptsResult, ResolvedConcept, resolveConcepts } from './concepts/index.js';
16
16
  export { AssembleOptions, AssembledMilestone, AssembledPhase, AssembledRoadmap, assembleRoadmap } from './assembly/index.js';
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import './chunk-R57WTNXW.mjs';
2
- export { runDomainPipeline, runHybridGraphPipeline, runKnowledgeGraphPipeline, runProjectGraphPipeline } from './chunk-MCHHEBH3.mjs';
3
- export { emitCurriculumFeed } from './chunk-LKSVTRQE.mjs';
2
+ export { runDomainPipeline, runHybridGraphPipeline, runKnowledgeGraphPipeline, runProjectGraphPipeline } from './chunk-LZQLLAYP.mjs';
3
+ export { emitCurriculumFeed } from './chunk-QJF4QCBJ.mjs';
4
4
  export { ArchEdgeSchema, ArchNodeSchema, ArchitectureDetailSchema, CapabilitySchema, ConceptCategorySchema, ConceptIntroductionSchema, ConceptSchema, DataIntegrationSchema, DecompositionSchema, DetectionConfidenceSchema, DevelopmentPhaseSchema, DevelopmentStageSchema, DomainCategorySchema, DomainProfileSchema, ExperienceComponentSchema, ExperienceSchema, ExperimentProcedureSchema, FeatureSchema, GrammarRuleSchema, GraphTypeSchema, HardwareFeatureExtensionSchema, HardwareStepSchema, HardwareTaskExtensionSchema, HardwareTechStackExtensionSchema, HybridGraphSchema, ImplementationSchema, InputTypeSchema, JourneySchema, JourneyStepSchema, KnowledgeGraphSchema, LanguageConceptExtensionSchema, LearningModeSchema, LearningPathStepSchema, MathConceptExtensionSchema, MathTheoremSchema, MilestoneDecompositionSchema, MissingGapSchema, NavigationSchema, ProblemTypeSchema, ProductGoalSchema, ProductSchema, ProductUserSchema, ProjectConceptLinkSchema, ProjectGraphSchema, ProjectInfoSchema, RequirementSchema, ScienceConceptExtensionSchema, ScreenSchema, ShapeSchema, StepEffortSchema, StepOutcomeSchema, StepSchema, SubjectInfoSchema, TaskEffortSchema, TaskOutcomeSchema, TaskSchema, TechDebtSchema, TechStackSchema, ThreeDesignFeatureExtensionSchema, ThreeDesignTaskExtensionSchema, ThreeDesignTechStackExtensionSchema, UiStateSchema, WiringSchema } from './chunk-VCPIWJ7R.mjs';
5
- export { CurriculumFeedSchema, FeedEdgeSchema, FeedGroupingSchema, FeedKeywordsSchema, FeedNodeSchema, FeedPhaseSchema, FeedScaffoldCandidateSchema, validateCurriculumFeed } from './chunk-MSRKUZLY.mjs';
5
+ export { CurriculumFeedSchema, FeedEdgeSchema, FeedGroupingSchema, FeedKeywordsSchema, FeedNodeSchema, FeedPhaseSchema, FeedScaffoldCandidateSchema, validateCurriculumFeed } from './chunk-PKUEOSZ3.mjs';
6
6
  import './chunk-IJZUV7N3.mjs';
7
7
  export { mergeCppResults, mergePythonResults, mergeSwiftResults, mergeTsResults, parseCppFile, parsePythonFile, parseSwiftFile, parseTsFile } from './chunk-DRVOV5ZD.mjs';
8
8
  export { scoreByContent, scoreByPath, scoreFiles, selectRelevantFiles } from './chunk-RKRNOVKO.mjs';
@@ -10,7 +10,7 @@ export { extractKeywords } from './chunk-XMHKWHVK.mjs';
10
10
  import './chunk-7XGWW6CB.mjs';
11
11
  export { detectDomain, detectDomainProfile, detectInputType, detectLearningMode } from './chunk-BL5NBKPH.mjs';
12
12
  import './chunk-ZKLT27T4.mjs';
13
- export { CIO_CODE_RE, CONCEPT_CODE_RE, LEARNER_CLAUSE, SIO_CODE_RE, ULO_CODE_RE, assignConceptCodes, auditDepthLayers, auditSyllabusCoverage, breakPrerequisiteCycles, cioActionSlug, cioCode, conceptCodeFromName, detectPrerequisiteCycles, escalateAndMapConcepts, extractFeatureSteps, extractFeatureStepsBatched, extractProjectOverview, extractScaffold, generateHybridGraph, generateKnowledgeGraph, sioCode, standardStatement, techTagFor, uloCode, verifyKnowledgeGraph, verifyProjectGraph } from './chunk-Y7MRFFDJ.mjs';
13
+ export { CIO_CODE_RE, CONCEPT_CODE_RE, LEARNER_CLAUSE, SIO_CODE_RE, ULO_CODE_RE, assignConceptCodes, auditDepthLayers, auditPhasePlan, auditSyllabusCoverage, breakPrerequisiteCycles, cioActionSlug, cioCode, conceptCodeFromName, detectPrerequisiteCycles, escalateAndMapConcepts, extractFeatureSteps, extractFeatureStepsBatched, extractProjectOverview, extractScaffold, generateHybridGraph, generateKnowledgeGraph, sioCode, standardStatement, techTagFor, uloCode, verifyKnowledgeGraph, verifyProjectGraph } from './chunk-HILSUZOF.mjs';
14
14
  export { parseSyllabus } from './chunk-T4Y2DE2W.mjs';
15
15
  import './chunk-KMYENICQ.mjs';
16
16
  export { resolveConcepts } from './chunk-KNDBODUQ.mjs';
@@ -88,6 +88,27 @@ var init_curriculumFeedSchema = __esm({
88
88
  references: zod.z.array(zod.z.object({ file: zod.z.string().min(1), evidence: zod.z.string().default("") })).default([]),
89
89
  feature_id: zod.z.string().nullable().default(null),
90
90
  concept_ref: zod.z.string().nullable().default(null),
91
+ // P52/T2.1: outcome.user_visible projected from the ProjectGraph step — the
92
+ // tangible checkpoint the session-cutting planner aims for (empty when the
93
+ // step declares no user-visible result). Concepts carry '' by default.
94
+ user_visible_deliverable: zod.z.string().default(""),
95
+ // P52/T3.1 — depth-reconcile inputs (optional/defaulted so old feeds
96
+ // validate unchanged):
97
+ // • depth_variants: minutes to teach this node at each depth level.
98
+ // ULO (know-it-exists) ≤ CIO (mechanism) ≤ SIO (implementation). All 3
99
+ // required so a downgrade never turns an anchor teach into a zero.
100
+ // • depth_scaffold_candidates: parallel to scaffold_candidates but
101
+ // acts on DEPTH (e.g. SIO→CIO) instead of lesson time.
102
+ // • is_core: concept is a Master-Tree core concept — reconciler must
103
+ // never downgrade it; escalate instead.
104
+ depth_variants: zod.z.object({ ulo: zod.z.number().int().nonnegative(), cio: zod.z.number().int().nonnegative(), sio: zod.z.number().int().nonnegative() }).optional(),
105
+ depth_scaffold_candidates: zod.z.array(zod.z.object({
106
+ from_depth: zod.z.enum(["ulo", "cio", "sio"]),
107
+ to_depth: zod.z.enum(["ulo", "cio", "sio"]),
108
+ minutes_saved: zod.z.number().int().nonnegative(),
109
+ reason: zod.z.string().default("")
110
+ })).optional(),
111
+ is_core: zod.z.boolean().default(false),
91
112
  // Progressive-completion bookkeeping (feed v2, additive):
92
113
  // phase_id = development phase that introduces/uses this node;
93
114
  // introduce_aspect = how the phase teaches a concept node (first intro, advanced
@@ -172,6 +193,10 @@ function feedNodeFromStep(step, featureId) {
172
193
  references: arr(step.files).map((f) => ({ file: str(f), evidence: "step file" })).filter((f) => f.file),
173
194
  feature_id: featureId,
174
195
  concept_ref: null,
196
+ // P52/T2.1: carry the step's tangible outcome so the planner can cut
197
+ // sessions at user-visible checkpoints instead of raw minute counts.
198
+ user_visible_deliverable: str(step.outcome?.user_visible),
199
+ is_core: false,
175
200
  phase_id: "",
176
201
  introduce_aspect: null
177
202
  };
@@ -190,6 +215,20 @@ function deriveConceptDepthHint(concept) {
190
215
  if (str(concept.cio) || prereqs.length >= 1) return "cio";
191
216
  return "ulo";
192
217
  }
218
+ function deriveDepthInputs(minutes, depth) {
219
+ const ulo = Math.max(5, Math.round(minutes * 0.35));
220
+ const cio = Math.max(ulo + 5, Math.round(minutes * 0.65));
221
+ const sio = Math.max(cio + 5, minutes);
222
+ const variants = { ulo, cio, sio };
223
+ const candidates = [];
224
+ if (depth === "sio") {
225
+ candidates.push({ from_depth: "sio", to_depth: "cio", minutes_saved: sio - cio, reason: "SIO implementation practice deferred \u2014 CIO mechanism suffices for downstream consumers" });
226
+ }
227
+ if (depth === "cio" || depth === "sio") {
228
+ candidates.push({ from_depth: depth, to_depth: "ulo", minutes_saved: (depth === "sio" ? sio : cio) - ulo, reason: "Mechanism deferred \u2014 ULO awareness suffices (know-it-exists); never below the ULO floor" });
229
+ }
230
+ return { depth_variants: variants, depth_scaffold_candidates: candidates };
231
+ }
193
232
  function feedNodeFromConcept(concept) {
194
233
  const id = str(concept.id);
195
234
  const pts = arr(concept.problem_types).map((p) => str(p.bloom_level, "Understand")).filter((b) => b in BLOOM_RANK).sort((a, b) => BLOOM_RANK[a] - BLOOM_RANK[b]);
@@ -219,6 +258,10 @@ function feedNodeFromConcept(concept) {
219
258
  references,
220
259
  feature_id: null,
221
260
  concept_ref: id,
261
+ user_visible_deliverable: "",
262
+ // concepts are taught, not shipped — checkpoints live on product steps
263
+ ...deriveDepthInputs(Math.max(0, Math.round(num(concept.estimated_minutes, 15))), deriveConceptDepthHint(concept)),
264
+ is_core: false,
222
265
  phase_id: "",
223
266
  introduce_aspect: null
224
267
  };
@@ -325,6 +368,8 @@ function emitFromHybrid(hybrid, opts) {
325
368
  prevNode.concept_codes = [str(c.code) || cid];
326
369
  prevNode.keywords = { all: strs(c.keywords), new: [], prerequisite: [] };
327
370
  prevNode.scaffolding = { scaffold_candidates: [], core_value_minutes: 0 };
371
+ prevNode.depth_variants = { ulo: prevNode.estimated_minutes, cio: prevNode.estimated_minutes, sio: prevNode.estimated_minutes };
372
+ prevNode.depth_scaffold_candidates = [];
328
373
  nodes.push(prevNode);
329
374
  conceptOrder.push(prevNode.id);
330
375
  continue;
@@ -349,6 +394,7 @@ function emitFromHybrid(hybrid, opts) {
349
394
  node.name = str(c.name, cid) + " (advanced)";
350
395
  node.phase_id = pid;
351
396
  node.introduce_aspect = "advanced";
397
+ node.depth_scaffold_candidates = [{ from_depth: "sio", to_depth: "cio", minutes_saved: Math.round(node.estimated_minutes * 0.3), reason: "advanced revisit may drop to CIO recap without breaking first-teach chain" }];
352
398
  node.estimated_minutes = Math.max(15, Math.round(node.estimated_minutes * 0.5));
353
399
  node.concept_codes = [str(c.code) || cid];
354
400
  edges.push({ from: cid, to: revisitId, kind: "knowledge", reason: "advanced revisit of " + cid + " at phase " + pid });