# Personal ontology schema — types for content artifacts and career opportunities. # Used by PersonalOntology projects to track what to write, where to apply, and how to present work. # # Design decisions: # - Content and Opportunity are independent types; linked_nodes connects them to core.ncl node IDs. # - audience and fit_signals use closed enums to force explicit categorization. # - PersonalConfig is the export contract for .ontology/personal.ncl in consumer projects. let content_kind_type = [| 'BlogPost, 'ConferenceProposal, 'CV, 'Application, 'Email, 'Thread, |] in let content_status_type = [| 'Idea, 'Draft, 'Review, 'Published, 'Rejected, 'Archived, |] in let opportunity_kind_type = [| 'Conference, 'Job, 'Grant, 'Collaboration, 'Podcast, |] in let opportunity_status_type = [| 'Watching, 'Evaluating, 'Active, 'Submitted, 'Closed, |] in let audience_type = [| 'Technical, 'HiringManager, 'GeneralPublic, 'Community, 'Academic, |] in let content_type = { id | String, kind | content_kind_type, title | String | default = "", status | content_status_type, linked_nodes | Array String | default = [], audience | audience_type, note | String | default = "", } in let opportunity_type = { id | String, kind | opportunity_kind_type, name | String, status | opportunity_status_type, fit_signals | Array String | default = [], linked_nodes | Array String | default = [], deadline | String | default = "", note | String | default = "", } in { ContentKind = content_kind_type, ContentStatus = content_status_type, OpportunityKind = opportunity_kind_type, OpportunityStatus = opportunity_status_type, Audience = audience_type, Content = content_type, Opportunity = opportunity_type, PersonalConfig = { contents | Array content_type | default = [], opportunities | Array opportunity_type | default = [], }, }