let s = import "purpose-schema.ncl" in let c = import "purpose-constraints.ncl" in # Factory for purpose.ncl files. # Pattern mirrors adrs/adr-defaults.ncl: imports schema + constraints, exposes make_* factories. # Cross-field constraints (ValidAppliesTo, SeoAppliesTo, ObjectiveAudienceCoverage) are applied # here after schema validation so all fields are visible in the same record — same pattern as # RequiresJustificationWhenRisky in adr-defaults.ncl. { make_purpose = fun data => let result | s.PurposeFile = data in let result | c.NonEmptyObjectives = result in let result | c.AtLeastOneHardCriterion = result in let result | c.AtLeastOneHardSeoCriterion = result in let result | c.ObjectiveAudienceCoverage = result in let result | c.ValidAppliesTo = result in let result | c.SeoAppliesTo = result in result, PurposeFile = s.PurposeFile, PurposeDeclaration = s.PurposeDeclaration, PublicationIntent = s.PublicationIntent, ContentObjective = s.ContentObjective, ValidationCriteria = s.ValidationCriteria, SeoCriterion = s.SeoCriterion, PropagationChannel = s.PropagationChannel, }