@forwardimpact/schema 0.1.0 → 0.3.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 (67) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +58 -0
  3. package/bin/fit-schema.js +48 -21
  4. package/examples/behaviours/outcome_ownership.yaml +1 -1
  5. package/examples/behaviours/polymathic_knowledge.yaml +1 -1
  6. package/examples/behaviours/precise_communication.yaml +1 -1
  7. package/examples/behaviours/relentless_curiosity.yaml +1 -1
  8. package/examples/behaviours/systems_thinking.yaml +1 -1
  9. package/examples/capabilities/business.yaml +1 -1
  10. package/examples/capabilities/delivery.yaml +1 -1
  11. package/examples/capabilities/people.yaml +1 -1
  12. package/examples/capabilities/reliability.yaml +1 -1
  13. package/examples/capabilities/scale.yaml +1 -1
  14. package/examples/disciplines/data_engineering.yaml +1 -13
  15. package/examples/disciplines/engineering_management.yaml +1 -5
  16. package/examples/disciplines/software_engineering.yaml +1 -13
  17. package/examples/drivers.yaml +1 -1
  18. package/examples/framework.yaml +1 -1
  19. package/examples/grades.yaml +1 -1
  20. package/examples/questions/behaviours/outcome_ownership.yaml +1 -1
  21. package/examples/questions/behaviours/polymathic_knowledge.yaml +1 -1
  22. package/examples/questions/behaviours/precise_communication.yaml +1 -1
  23. package/examples/questions/behaviours/relentless_curiosity.yaml +1 -1
  24. package/examples/questions/behaviours/systems_thinking.yaml +1 -1
  25. package/examples/questions/skills/architecture_design.yaml +1 -1
  26. package/examples/questions/skills/cloud_platforms.yaml +1 -1
  27. package/examples/questions/skills/code_quality.yaml +1 -1
  28. package/examples/questions/skills/data_modeling.yaml +1 -1
  29. package/examples/questions/skills/devops.yaml +1 -1
  30. package/examples/questions/skills/full_stack_development.yaml +1 -1
  31. package/examples/questions/skills/sre_practices.yaml +1 -1
  32. package/examples/questions/skills/stakeholder_management.yaml +1 -1
  33. package/examples/questions/skills/team_collaboration.yaml +1 -1
  34. package/examples/questions/skills/technical_writing.yaml +1 -1
  35. package/examples/self-assessments.yaml +1 -1
  36. package/examples/stages.yaml +1 -1
  37. package/examples/tracks/platform.yaml +1 -6
  38. package/examples/tracks/sre.yaml +1 -6
  39. package/lib/schema-validation.js +1 -1
  40. package/lib/validation.js +2 -71
  41. package/package.json +5 -5
  42. package/schema/json/behaviour-questions.schema.json +1 -1
  43. package/schema/json/behaviour.schema.json +1 -1
  44. package/schema/json/capability.schema.json +1 -1
  45. package/schema/json/defs.schema.json +1 -1
  46. package/schema/json/discipline.schema.json +1 -10
  47. package/schema/json/drivers.schema.json +1 -1
  48. package/schema/json/framework.schema.json +1 -1
  49. package/schema/json/grades.schema.json +1 -1
  50. package/schema/json/self-assessments.schema.json +1 -1
  51. package/schema/json/skill-questions.schema.json +1 -1
  52. package/schema/json/stages.schema.json +1 -1
  53. package/schema/json/track.schema.json +1 -6
  54. package/schema/rdf/behaviour-questions.ttl +96 -0
  55. package/schema/rdf/behaviour.ttl +130 -0
  56. package/schema/rdf/capability.ttl +440 -0
  57. package/schema/rdf/defs.ttl +396 -0
  58. package/schema/rdf/discipline.ttl +313 -0
  59. package/schema/rdf/drivers.ttl +84 -0
  60. package/schema/rdf/framework.ttl +128 -0
  61. package/schema/rdf/grades.ttl +357 -0
  62. package/schema/rdf/self-assessments.ttl +147 -0
  63. package/schema/rdf/skill-questions.ttl +128 -0
  64. package/schema/rdf/stages.ttl +142 -0
  65. package/schema/rdf/track.ttl +225 -0
  66. package/schema/json/index.schema.json +0 -18
  67. package/schema/rdf/pathway.ttl +0 -2362
@@ -0,0 +1,396 @@
1
+ @prefix fit: <https://www.forwardimpact.team/schema/rdf/> .
2
+ @prefix sh: <http://www.w3.org/ns/shacl#> .
3
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
4
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
5
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
6
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
7
+
8
+ # =============================================================================
9
+ # Engineering Pathway Common Definitions
10
+ # =============================================================================
11
+ # Shared definitions for all pathway schemas: enumerations, common classes,
12
+ # and shared properties.
13
+ # =============================================================================
14
+
15
+ # -----------------------------------------------------------------------------
16
+ # Ontology Definition
17
+ # -----------------------------------------------------------------------------
18
+
19
+ fit: a owl:Ontology ;
20
+ rdfs:label "Engineering Pathway Schema"@en ;
21
+ rdfs:comment "SHACL schema for the Engineering Pathway framework - a unified system for defining engineering roles, skills, behaviours, and AI agent configurations."@en .
22
+
23
+ # =============================================================================
24
+ # ENUMERATIONS (Named Individuals)
25
+ # =============================================================================
26
+
27
+ # -----------------------------------------------------------------------------
28
+ # Skill Levels (5 levels from lowest to highest proficiency)
29
+ # -----------------------------------------------------------------------------
30
+
31
+ fit:SkillLevel a rdfs:Class ;
32
+ rdfs:label "Skill Level"@en ;
33
+ rdfs:comment "Skill proficiency level from lowest to highest"@en .
34
+
35
+ fit:awareness a fit:SkillLevel ;
36
+ rdfs:label "Awareness"@en ;
37
+ fit:ordinal 1 ;
38
+ rdfs:comment "Learning fundamentals, needs guidance"@en .
39
+
40
+ fit:foundational a fit:SkillLevel ;
41
+ rdfs:label "Foundational"@en ;
42
+ fit:ordinal 2 ;
43
+ rdfs:comment "Can apply basics independently"@en .
44
+
45
+ fit:working a fit:SkillLevel ;
46
+ rdfs:label "Working"@en ;
47
+ fit:ordinal 3 ;
48
+ rdfs:comment "Solid competence, handles ambiguity"@en .
49
+
50
+ fit:practitioner a fit:SkillLevel ;
51
+ rdfs:label "Practitioner"@en ;
52
+ fit:ordinal 4 ;
53
+ rdfs:comment "Deep expertise, leads and mentors"@en .
54
+
55
+ fit:expert a fit:SkillLevel ;
56
+ rdfs:label "Expert"@en ;
57
+ fit:ordinal 5 ;
58
+ rdfs:comment "Authority, shapes direction across org"@en .
59
+
60
+ # -----------------------------------------------------------------------------
61
+ # Behaviour Maturities (5 levels from lowest to highest)
62
+ # -----------------------------------------------------------------------------
63
+
64
+ fit:BehaviourMaturity a rdfs:Class ;
65
+ rdfs:label "Behaviour Maturity"@en ;
66
+ rdfs:comment "Behaviour maturity level from lowest to highest"@en .
67
+
68
+ fit:emerging a fit:BehaviourMaturity ;
69
+ rdfs:label "Emerging"@en ;
70
+ fit:ordinal 1 ;
71
+ rdfs:comment "Shows interest, needs prompting"@en .
72
+
73
+ fit:developing a fit:BehaviourMaturity ;
74
+ rdfs:label "Developing"@en ;
75
+ fit:ordinal 2 ;
76
+ rdfs:comment "Regular practice with guidance"@en .
77
+
78
+ fit:practicing a fit:BehaviourMaturity ;
79
+ rdfs:label "Practicing"@en ;
80
+ fit:ordinal 3 ;
81
+ rdfs:comment "Consistent application, proactive"@en .
82
+
83
+ fit:role_modeling a fit:BehaviourMaturity ;
84
+ rdfs:label "Role Modeling"@en ;
85
+ fit:ordinal 4 ;
86
+ rdfs:comment "Influences team culture"@en .
87
+
88
+ fit:exemplifying a fit:BehaviourMaturity ;
89
+ rdfs:label "Exemplifying"@en ;
90
+ fit:ordinal 5 ;
91
+ rdfs:comment "Shapes organizational culture"@en .
92
+
93
+ # -----------------------------------------------------------------------------
94
+ # Lifecycle Stages
95
+ # -----------------------------------------------------------------------------
96
+
97
+ fit:Stage a rdfs:Class ;
98
+ rdfs:label "Stage"@en ;
99
+ rdfs:comment "Engineering lifecycle stage"@en .
100
+
101
+ fit:plan a fit:Stage ;
102
+ rdfs:label "Plan"@en ;
103
+ rdfs:comment "Research, gather context, design"@en .
104
+
105
+ fit:code a fit:Stage ;
106
+ rdfs:label "Code"@en ;
107
+ rdfs:comment "Implement, test, iterate"@en .
108
+
109
+ fit:review a fit:Stage ;
110
+ rdfs:label "Review"@en ;
111
+ rdfs:comment "Verify, approve, document"@en .
112
+
113
+ # =============================================================================
114
+ # COMMON PROPERTIES
115
+ # =============================================================================
116
+
117
+ fit:id a rdf:Property ;
118
+ rdfs:label "id"@en ;
119
+ rdfs:comment "Unique identifier"@en ;
120
+ rdfs:range xsd:string .
121
+
122
+ fit:name a rdf:Property ;
123
+ rdfs:label "name"@en ;
124
+ rdfs:comment "Human-readable name"@en ;
125
+ rdfs:range xsd:string .
126
+
127
+ fit:description a rdf:Property ;
128
+ rdfs:label "description"@en ;
129
+ rdfs:comment "Description text"@en ;
130
+ rdfs:range xsd:string .
131
+
132
+ fit:emojiIcon a rdf:Property ;
133
+ rdfs:label "emojiIcon"@en ;
134
+ rdfs:comment "Emoji for visual representation"@en ;
135
+ rdfs:range xsd:string .
136
+
137
+ fit:displayOrder a rdf:Property ;
138
+ rdfs:label "displayOrder"@en ;
139
+ rdfs:comment "Order for display in UI"@en ;
140
+ rdfs:range xsd:integer .
141
+
142
+ fit:ordinal a rdf:Property ;
143
+ rdfs:label "ordinal"@en ;
144
+ rdfs:comment "Numeric position in ordered sequence"@en ;
145
+ rdfs:range xsd:integer .
146
+
147
+ fit:title a rdf:Property ;
148
+ rdfs:label "title"@en ;
149
+ rdfs:comment "Display title"@en ;
150
+ rdfs:range xsd:string .
151
+
152
+ fit:human a rdf:Property ;
153
+ rdfs:label "human"@en ;
154
+ rdfs:comment "Human-specific content"@en .
155
+
156
+ fit:agent a rdf:Property ;
157
+ rdfs:label "agent"@en ;
158
+ rdfs:comment "Agent-specific content"@en .
159
+
160
+ fit:minGrade a rdf:Property ;
161
+ rdfs:label "minGrade"@en ;
162
+ rdfs:comment "Minimum grade required"@en ;
163
+ rdfs:range fit:Grade .
164
+
165
+ fit:constraints a rdf:Property ;
166
+ rdfs:label "constraints"@en ;
167
+ rdfs:comment "Restrictions or things to avoid"@en ;
168
+ rdfs:range xsd:string .
169
+
170
+ # =============================================================================
171
+ # SHARED NESTED CLASSES
172
+ # =============================================================================
173
+
174
+ fit:LevelDescriptions a rdfs:Class ;
175
+ rdfs:label "Level Descriptions"@en ;
176
+ rdfs:comment "Description of expectations at each skill level"@en .
177
+
178
+ fit:MaturityDescriptions a rdfs:Class ;
179
+ rdfs:label "Maturity Descriptions"@en ;
180
+ rdfs:comment "Description of expectations at each behaviour maturity level"@en .
181
+
182
+ fit:ResponsibilitiesByLevel a rdfs:Class ;
183
+ rdfs:label "Responsibilities By Level"@en ;
184
+ rdfs:comment "Responsibility descriptions by skill level"@en .
185
+
186
+ # -----------------------------------------------------------------------------
187
+ # Level Description Properties
188
+ # -----------------------------------------------------------------------------
189
+
190
+ fit:awarenessDescription a rdf:Property ;
191
+ rdfs:label "awarenessDescription"@en ;
192
+ rdfs:comment "Description for awareness level"@en ;
193
+ rdfs:range xsd:string .
194
+
195
+ fit:foundationalDescription a rdf:Property ;
196
+ rdfs:label "foundationalDescription"@en ;
197
+ rdfs:comment "Description for foundational level"@en ;
198
+ rdfs:range xsd:string .
199
+
200
+ fit:workingDescription a rdf:Property ;
201
+ rdfs:label "workingDescription"@en ;
202
+ rdfs:comment "Description for working level"@en ;
203
+ rdfs:range xsd:string .
204
+
205
+ fit:practitionerDescription a rdf:Property ;
206
+ rdfs:label "practitionerDescription"@en ;
207
+ rdfs:comment "Description for practitioner level"@en ;
208
+ rdfs:range xsd:string .
209
+
210
+ fit:expertDescription a rdf:Property ;
211
+ rdfs:label "expertDescription"@en ;
212
+ rdfs:comment "Description for expert level"@en ;
213
+ rdfs:range xsd:string .
214
+
215
+ # -----------------------------------------------------------------------------
216
+ # Maturity Description Properties
217
+ # -----------------------------------------------------------------------------
218
+
219
+ fit:emergingDescription a rdf:Property ;
220
+ rdfs:label "emergingDescription"@en ;
221
+ rdfs:comment "Description for emerging maturity"@en ;
222
+ rdfs:range xsd:string .
223
+
224
+ fit:developingDescription a rdf:Property ;
225
+ rdfs:label "developingDescription"@en ;
226
+ rdfs:comment "Description for developing maturity"@en ;
227
+ rdfs:range xsd:string .
228
+
229
+ fit:practicingDescription a rdf:Property ;
230
+ rdfs:label "practicingDescription"@en ;
231
+ rdfs:comment "Description for practicing maturity"@en ;
232
+ rdfs:range xsd:string .
233
+
234
+ fit:roleModelingDescription a rdf:Property ;
235
+ rdfs:label "roleModelingDescription"@en ;
236
+ rdfs:comment "Description for role_modeling maturity"@en ;
237
+ rdfs:range xsd:string .
238
+
239
+ fit:exemplifyingDescription a rdf:Property ;
240
+ rdfs:label "exemplifyingDescription"@en ;
241
+ rdfs:comment "Description for exemplifying maturity"@en ;
242
+ rdfs:range xsd:string .
243
+
244
+ # =============================================================================
245
+ # SHARED SHACL SHAPES
246
+ # =============================================================================
247
+
248
+ # -----------------------------------------------------------------------------
249
+ # Level Descriptions Shape
250
+ # -----------------------------------------------------------------------------
251
+
252
+ fit:LevelDescriptionsShape a sh:NodeShape ;
253
+ sh:targetClass fit:LevelDescriptions ;
254
+ sh:property [
255
+ sh:path fit:awarenessDescription ;
256
+ sh:datatype xsd:string ;
257
+ sh:minCount 1 ;
258
+ sh:maxCount 1 ;
259
+ sh:name "awareness" ;
260
+ ] ;
261
+ sh:property [
262
+ sh:path fit:foundationalDescription ;
263
+ sh:datatype xsd:string ;
264
+ sh:minCount 1 ;
265
+ sh:maxCount 1 ;
266
+ sh:name "foundational" ;
267
+ ] ;
268
+ sh:property [
269
+ sh:path fit:workingDescription ;
270
+ sh:datatype xsd:string ;
271
+ sh:minCount 1 ;
272
+ sh:maxCount 1 ;
273
+ sh:name "working" ;
274
+ ] ;
275
+ sh:property [
276
+ sh:path fit:practitionerDescription ;
277
+ sh:datatype xsd:string ;
278
+ sh:minCount 1 ;
279
+ sh:maxCount 1 ;
280
+ sh:name "practitioner" ;
281
+ ] ;
282
+ sh:property [
283
+ sh:path fit:expertDescription ;
284
+ sh:datatype xsd:string ;
285
+ sh:minCount 1 ;
286
+ sh:maxCount 1 ;
287
+ sh:name "expert" ;
288
+ ] .
289
+
290
+ # -----------------------------------------------------------------------------
291
+ # Maturity Descriptions Shape
292
+ # -----------------------------------------------------------------------------
293
+
294
+ fit:MaturityDescriptionsShape a sh:NodeShape ;
295
+ sh:targetClass fit:MaturityDescriptions ;
296
+ sh:property [
297
+ sh:path fit:emergingDescription ;
298
+ sh:datatype xsd:string ;
299
+ sh:minCount 1 ;
300
+ sh:maxCount 1 ;
301
+ sh:name "emerging" ;
302
+ ] ;
303
+ sh:property [
304
+ sh:path fit:developingDescription ;
305
+ sh:datatype xsd:string ;
306
+ sh:minCount 1 ;
307
+ sh:maxCount 1 ;
308
+ sh:name "developing" ;
309
+ ] ;
310
+ sh:property [
311
+ sh:path fit:practicingDescription ;
312
+ sh:datatype xsd:string ;
313
+ sh:minCount 1 ;
314
+ sh:maxCount 1 ;
315
+ sh:name "practicing" ;
316
+ ] ;
317
+ sh:property [
318
+ sh:path fit:roleModelingDescription ;
319
+ sh:datatype xsd:string ;
320
+ sh:minCount 1 ;
321
+ sh:maxCount 1 ;
322
+ sh:name "role_modeling" ;
323
+ ] ;
324
+ sh:property [
325
+ sh:path fit:exemplifyingDescription ;
326
+ sh:datatype xsd:string ;
327
+ sh:minCount 1 ;
328
+ sh:maxCount 1 ;
329
+ sh:name "exemplifying" ;
330
+ ] .
331
+
332
+ # -----------------------------------------------------------------------------
333
+ # Responsibilities By Level Shape
334
+ # -----------------------------------------------------------------------------
335
+
336
+ fit:ResponsibilitiesByLevelShape a sh:NodeShape ;
337
+ sh:targetClass fit:ResponsibilitiesByLevel ;
338
+ sh:property [
339
+ sh:path fit:awarenessDescription ;
340
+ sh:datatype xsd:string ;
341
+ sh:minCount 1 ;
342
+ sh:maxCount 1 ;
343
+ sh:name "awareness" ;
344
+ ] ;
345
+ sh:property [
346
+ sh:path fit:foundationalDescription ;
347
+ sh:datatype xsd:string ;
348
+ sh:minCount 1 ;
349
+ sh:maxCount 1 ;
350
+ sh:name "foundational" ;
351
+ ] ;
352
+ sh:property [
353
+ sh:path fit:workingDescription ;
354
+ sh:datatype xsd:string ;
355
+ sh:minCount 1 ;
356
+ sh:maxCount 1 ;
357
+ sh:name "working" ;
358
+ ] ;
359
+ sh:property [
360
+ sh:path fit:practitionerDescription ;
361
+ sh:datatype xsd:string ;
362
+ sh:minCount 1 ;
363
+ sh:maxCount 1 ;
364
+ sh:name "practitioner" ;
365
+ ] ;
366
+ sh:property [
367
+ sh:path fit:expertDescription ;
368
+ sh:datatype xsd:string ;
369
+ sh:minCount 1 ;
370
+ sh:maxCount 1 ;
371
+ sh:name "expert" ;
372
+ ] .
373
+
374
+ # -----------------------------------------------------------------------------
375
+ # Index Shape (Auto-generated index files)
376
+ # -----------------------------------------------------------------------------
377
+
378
+ fit:Index a rdfs:Class ;
379
+ rdfs:label "Index"@en ;
380
+ rdfs:comment "Auto-generated index file for browser loading"@en .
381
+
382
+ fit:files a rdf:Property ;
383
+ rdfs:label "files"@en ;
384
+ rdfs:comment "List of file basenames in the directory"@en ;
385
+ rdfs:domain fit:Index ;
386
+ rdfs:range xsd:string .
387
+
388
+ fit:IndexShape a sh:NodeShape ;
389
+ sh:targetClass fit:Index ;
390
+ sh:property [
391
+ sh:path fit:files ;
392
+ sh:datatype xsd:string ;
393
+ sh:minCount 1 ;
394
+ sh:name "files" ;
395
+ sh:description "List of file basenames (without extension) in the directory" ;
396
+ ] .
@@ -0,0 +1,313 @@
1
+ @prefix fit: <https://www.forwardimpact.team/schema/rdf/> .
2
+ @prefix sh: <http://www.w3.org/ns/shacl#> .
3
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
4
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
5
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
6
+
7
+ # =============================================================================
8
+ # Discipline Schema
9
+ # =============================================================================
10
+ # Engineering specialization that defines T-shaped skill profiles.
11
+ # =============================================================================
12
+
13
+ # -----------------------------------------------------------------------------
14
+ # Classes
15
+ # -----------------------------------------------------------------------------
16
+
17
+ fit:Discipline a rdfs:Class ;
18
+ rdfs:label "Discipline"@en ;
19
+ rdfs:comment "Engineering specialization that defines T-shaped skill profiles"@en .
20
+
21
+ fit:DisciplineHumanSection a rdfs:Class ;
22
+ rdfs:label "Discipline Human Section"@en ;
23
+ rdfs:comment "Human-specific content for a discipline"@en .
24
+
25
+ fit:DisciplineAgentSection a rdfs:Class ;
26
+ rdfs:label "Discipline Agent Section"@en ;
27
+ rdfs:comment "Agent-specific content for a discipline"@en .
28
+
29
+ fit:BehaviourModifier a rdfs:Class ;
30
+ rdfs:label "Behaviour Modifier"@en ;
31
+ rdfs:comment "Modifier applied to a behaviour by a discipline or track"@en .
32
+
33
+ # -----------------------------------------------------------------------------
34
+ # Properties
35
+ # -----------------------------------------------------------------------------
36
+
37
+ fit:specialization a rdf:Property ;
38
+ rdfs:label "specialization"@en ;
39
+ rdfs:comment "Name of the specialization (e.g., Software Engineering)"@en ;
40
+ rdfs:domain fit:Discipline ;
41
+ rdfs:range xsd:string .
42
+
43
+ fit:roleTitle a rdf:Property ;
44
+ rdfs:label "roleTitle"@en ;
45
+ rdfs:comment "Base role title (e.g., Software Engineer)"@en ;
46
+ rdfs:domain fit:Discipline ;
47
+ rdfs:range xsd:string .
48
+
49
+ fit:isProfessional a rdf:Property ;
50
+ rdfs:label "isProfessional"@en ;
51
+ rdfs:comment "If true, this is an IC/professional discipline (default true)"@en ;
52
+ rdfs:domain fit:Discipline ;
53
+ rdfs:range xsd:boolean .
54
+
55
+ fit:isManagement a rdf:Property ;
56
+ rdfs:label "isManagement"@en ;
57
+ rdfs:comment "If true, this is a management discipline (default false)"@en ;
58
+ rdfs:domain fit:Discipline ;
59
+ rdfs:range xsd:boolean .
60
+
61
+ fit:validTracks a rdf:Property ;
62
+ rdfs:label "validTracks"@en ;
63
+ rdfs:comment "REQUIRED. Explicit list of valid tracks. Empty array = trackless only."@en ;
64
+ rdfs:domain fit:Discipline ;
65
+ rdfs:range fit:Track .
66
+
67
+ fit:coreSkills a rdf:Property ;
68
+ rdfs:label "coreSkills"@en ;
69
+ rdfs:comment "Primary skills for deep expertise (references skill IDs)"@en ;
70
+ rdfs:domain fit:Discipline ;
71
+ rdfs:range fit:Skill .
72
+
73
+ fit:supportingSkills a rdf:Property ;
74
+ rdfs:label "supportingSkills"@en ;
75
+ rdfs:comment "Secondary skills for supporting capabilities (references skill IDs)"@en ;
76
+ rdfs:domain fit:Discipline ;
77
+ rdfs:range fit:Skill .
78
+
79
+ fit:broadSkills a rdf:Property ;
80
+ rdfs:label "broadSkills"@en ;
81
+ rdfs:comment "Skills for general awareness (references skill IDs)"@en ;
82
+ rdfs:domain fit:Discipline ;
83
+ rdfs:range fit:Skill .
84
+
85
+ fit:behaviourModifiers a rdf:Property ;
86
+ rdfs:label "behaviourModifiers"@en ;
87
+ rdfs:comment "Modifiers to behaviour expectations"@en .
88
+
89
+ fit:professionalRoleSummary a rdf:Property ;
90
+ rdfs:label "professionalRoleSummary"@en ;
91
+ rdfs:comment "Role summary for professional/IC track. May use {roleTitle} placeholder."@en ;
92
+ rdfs:domain fit:DisciplineHumanSection ;
93
+ rdfs:range xsd:string .
94
+
95
+ fit:managementRoleSummary a rdf:Property ;
96
+ rdfs:label "managementRoleSummary"@en ;
97
+ rdfs:comment "Role summary for management track. May use {specialization} placeholder."@en ;
98
+ rdfs:domain fit:DisciplineHumanSection ;
99
+ rdfs:range xsd:string .
100
+
101
+ # Agent Section Properties
102
+ fit:identity a rdf:Property ;
103
+ rdfs:label "identity"@en ;
104
+ rdfs:comment "Core identity statement for the agent"@en ;
105
+ rdfs:range xsd:string .
106
+
107
+ fit:priority a rdf:Property ;
108
+ rdfs:label "priority"@en ;
109
+ rdfs:comment "Priority guidance for the agent"@en ;
110
+ rdfs:range xsd:string .
111
+
112
+ # Modifier Properties
113
+ fit:targetBehaviour a rdf:Property ;
114
+ rdfs:label "targetBehaviour"@en ;
115
+ rdfs:comment "The behaviour this modifier applies to"@en ;
116
+ rdfs:domain fit:BehaviourModifier ;
117
+ rdfs:range fit:Behaviour .
118
+
119
+ fit:modifierValue a rdf:Property ;
120
+ rdfs:label "modifierValue"@en ;
121
+ rdfs:comment "The modifier value (-1, 0, or 1)"@en ;
122
+ rdfs:range xsd:integer .
123
+
124
+ # =============================================================================
125
+ # SHACL SHAPES
126
+ # =============================================================================
127
+
128
+ # -----------------------------------------------------------------------------
129
+ # Discipline Shape
130
+ # -----------------------------------------------------------------------------
131
+
132
+ fit:DisciplineShape a sh:NodeShape ;
133
+ sh:targetClass fit:Discipline ;
134
+ sh:property [
135
+ sh:path fit:id ;
136
+ sh:datatype xsd:string ;
137
+ sh:pattern "^[a-z][a-z0-9_]*$" ;
138
+ sh:maxCount 1 ;
139
+ sh:name "id" ;
140
+ sh:description "Discipline identifier (derived from filename)" ;
141
+ ] ;
142
+ sh:property [
143
+ sh:path fit:specialization ;
144
+ sh:datatype xsd:string ;
145
+ sh:minCount 1 ;
146
+ sh:maxCount 1 ;
147
+ sh:name "specialization" ;
148
+ sh:description "Name of the specialization (e.g., Software Engineering)" ;
149
+ ] ;
150
+ sh:property [
151
+ sh:path fit:roleTitle ;
152
+ sh:datatype xsd:string ;
153
+ sh:minCount 1 ;
154
+ sh:maxCount 1 ;
155
+ sh:name "roleTitle" ;
156
+ sh:description "Base role title (e.g., Software Engineer)" ;
157
+ ] ;
158
+ sh:property [
159
+ sh:path fit:isProfessional ;
160
+ sh:datatype xsd:boolean ;
161
+ sh:maxCount 1 ;
162
+ sh:name "isProfessional" ;
163
+ sh:description "If true, this is an IC/professional discipline (default true)" ;
164
+ ] ;
165
+ sh:property [
166
+ sh:path fit:isManagement ;
167
+ sh:datatype xsd:boolean ;
168
+ sh:maxCount 1 ;
169
+ sh:name "isManagement" ;
170
+ sh:description "If true, this is a management discipline (default false)" ;
171
+ ] ;
172
+ sh:property [
173
+ sh:path fit:validTracks ;
174
+ sh:minCount 1 ;
175
+ sh:name "validTracks" ;
176
+ sh:description "REQUIRED. Valid track configurations. Use null for trackless (generalist)." ;
177
+ sh:or (
178
+ [ sh:datatype xsd:string ; sh:pattern "^[a-z][a-z0-9_]*$" ]
179
+ [ sh:nodeKind sh:Literal ; sh:hasValue "null" ]
180
+ ) ;
181
+ ] ;
182
+ sh:property [
183
+ sh:path fit:minGrade ;
184
+ sh:datatype xsd:string ;
185
+ sh:pattern "^[A-Z][A-Z0-9]*$" ;
186
+ sh:maxCount 1 ;
187
+ sh:name "minGrade" ;
188
+ sh:description "Minimum grade required for this discipline (grade ID)" ;
189
+ ] ;
190
+ sh:property [
191
+ sh:path fit:description ;
192
+ sh:datatype xsd:string ;
193
+ sh:maxCount 1 ;
194
+ sh:name "description" ;
195
+ sh:description "Description of the discipline's focus" ;
196
+ ] ;
197
+ sh:property [
198
+ sh:path fit:coreSkills ;
199
+ sh:datatype xsd:string ;
200
+ sh:pattern "^[a-z][a-z0-9_]*$" ;
201
+ sh:minCount 1 ;
202
+ sh:name "coreSkills" ;
203
+ sh:description "Primary skills for deep expertise (skill IDs)" ;
204
+ ] ;
205
+ sh:property [
206
+ sh:path fit:supportingSkills ;
207
+ sh:datatype xsd:string ;
208
+ sh:pattern "^[a-z][a-z0-9_]*$" ;
209
+ sh:name "supportingSkills" ;
210
+ sh:description "Secondary skills for supporting capabilities (skill IDs)" ;
211
+ ] ;
212
+ sh:property [
213
+ sh:path fit:broadSkills ;
214
+ sh:datatype xsd:string ;
215
+ sh:pattern "^[a-z][a-z0-9_]*$" ;
216
+ sh:name "broadSkills" ;
217
+ sh:description "Skills for general awareness (skill IDs)" ;
218
+ ] ;
219
+ sh:property [
220
+ sh:path fit:behaviourModifiers ;
221
+ sh:node fit:BehaviourModifierShape ;
222
+ sh:name "behaviourModifiers" ;
223
+ sh:description "Modifiers to behaviour expectations" ;
224
+ ] ;
225
+ sh:property [
226
+ sh:path fit:human ;
227
+ sh:node fit:DisciplineHumanSectionShape ;
228
+ sh:maxCount 1 ;
229
+ sh:name "human" ;
230
+ sh:description "Human-specific content" ;
231
+ ] ;
232
+ sh:property [
233
+ sh:path fit:agent ;
234
+ sh:node fit:DisciplineAgentSectionShape ;
235
+ sh:maxCount 1 ;
236
+ sh:name "agent" ;
237
+ sh:description "Agent-specific content" ;
238
+ ] .
239
+
240
+ # -----------------------------------------------------------------------------
241
+ # Discipline Human Section Shape
242
+ # -----------------------------------------------------------------------------
243
+
244
+ fit:DisciplineHumanSectionShape a sh:NodeShape ;
245
+ sh:targetClass fit:DisciplineHumanSection ;
246
+ sh:property [
247
+ sh:path fit:professionalRoleSummary ;
248
+ sh:datatype xsd:string ;
249
+ sh:maxCount 1 ;
250
+ sh:name "professionalRoleSummary" ;
251
+ sh:description "Role summary for professional/IC track" ;
252
+ ] ;
253
+ sh:property [
254
+ sh:path fit:managementRoleSummary ;
255
+ sh:datatype xsd:string ;
256
+ sh:maxCount 1 ;
257
+ sh:name "managementRoleSummary" ;
258
+ sh:description "Role summary for management track" ;
259
+ ] .
260
+
261
+ # -----------------------------------------------------------------------------
262
+ # Discipline Agent Section Shape
263
+ # -----------------------------------------------------------------------------
264
+
265
+ fit:DisciplineAgentSectionShape a sh:NodeShape ;
266
+ sh:targetClass fit:DisciplineAgentSection ;
267
+ sh:property [
268
+ sh:path fit:identity ;
269
+ sh:datatype xsd:string ;
270
+ sh:minCount 1 ;
271
+ sh:maxCount 1 ;
272
+ sh:name "identity" ;
273
+ sh:description "Core identity statement for the agent" ;
274
+ ] ;
275
+ sh:property [
276
+ sh:path fit:priority ;
277
+ sh:datatype xsd:string ;
278
+ sh:maxCount 1 ;
279
+ sh:name "priority" ;
280
+ sh:description "Priority guidance for the agent" ;
281
+ ] ;
282
+ sh:property [
283
+ sh:path fit:constraints ;
284
+ sh:datatype xsd:string ;
285
+ sh:name "constraints" ;
286
+ sh:description "Things the agent should avoid or never do" ;
287
+ ] .
288
+
289
+ # -----------------------------------------------------------------------------
290
+ # Behaviour Modifier Shape
291
+ # -----------------------------------------------------------------------------
292
+
293
+ fit:BehaviourModifierShape a sh:NodeShape ;
294
+ sh:targetClass fit:BehaviourModifier ;
295
+ sh:property [
296
+ sh:path fit:targetBehaviour ;
297
+ sh:datatype xsd:string ;
298
+ sh:pattern "^[a-z][a-z0-9_]*$" ;
299
+ sh:minCount 1 ;
300
+ sh:maxCount 1 ;
301
+ sh:name "targetBehaviour" ;
302
+ sh:description "The behaviour this modifier applies to" ;
303
+ ] ;
304
+ sh:property [
305
+ sh:path fit:modifierValue ;
306
+ sh:datatype xsd:integer ;
307
+ sh:minInclusive -1 ;
308
+ sh:maxInclusive 1 ;
309
+ sh:minCount 1 ;
310
+ sh:maxCount 1 ;
311
+ sh:name "modifierValue" ;
312
+ sh:description "Modifier value (-1, 0, or 1)" ;
313
+ ] .