@agent-ix/spec-objects-security 0.5.0 → 0.8.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 (77) hide show
  1. package/README.md +2 -0
  2. package/manifest.yaml +270 -26
  3. package/package.json +8 -2
  4. package/schemas/Asset.json +78 -0
  5. package/schemas/AttackSurface.json +55 -0
  6. package/schemas/AuditEvent.json +57 -0
  7. package/schemas/AuditFinding.json +67 -0
  8. package/schemas/AuthFlow.json +69 -0
  9. package/schemas/ConfidentialityLevel.json +13 -0
  10. package/schemas/Control.json +83 -0
  11. package/schemas/ControlEffectiveness.json +12 -0
  12. package/schemas/ControlMapping.json +26 -0
  13. package/schemas/CorsPolicy.json +46 -0
  14. package/schemas/CsrfToken.json +46 -0
  15. package/schemas/DataClassification.json +61 -0
  16. package/schemas/DefaultedField.json +14 -0
  17. package/schemas/EffectivenessField.json +15 -0
  18. package/schemas/EncryptionKey.json +78 -0
  19. package/schemas/FindingStatus.json +14 -0
  20. package/schemas/FlowStep.json +24 -0
  21. package/schemas/IdentityField.json +15 -0
  22. package/schemas/Impact.json +14 -0
  23. package/schemas/ImpactField.json +15 -0
  24. package/schemas/JwtClaim.json +49 -0
  25. package/schemas/LevelField.json +15 -0
  26. package/schemas/Likelihood.json +14 -0
  27. package/schemas/LikelihoodField.json +15 -0
  28. package/schemas/MfaFactorKind.json +12 -0
  29. package/schemas/MfaMethod.json +69 -0
  30. package/schemas/OccurrenceField.json +14 -0
  31. package/schemas/OccurrenceTypeRef.json +15 -0
  32. package/schemas/PasswordPolicy.json +40 -0
  33. package/schemas/Permission.json +49 -0
  34. package/schemas/Policy.json +52 -0
  35. package/schemas/Risk.json +79 -0
  36. package/schemas/Role.json +55 -0
  37. package/schemas/Scope.json +49 -0
  38. package/schemas/Secret.json +78 -0
  39. package/schemas/SecretLifecycle.json +14 -0
  40. package/schemas/SessionConfig.json +43 -0
  41. package/schemas/Severity.json +14 -0
  42. package/schemas/SeverityField.json +15 -0
  43. package/schemas/StatusField.json +15 -0
  44. package/schemas/StrideCategory.json +15 -0
  45. package/schemas/StrideCategoryField.json +15 -0
  46. package/schemas/Threat.json +67 -0
  47. package/schemas/TrustBoundary.json +69 -0
  48. package/schemas/TrustLevel.json +12 -0
  49. package/schemas/TrustLevelField.json +15 -0
  50. package/schemas/Vulnerability.json +70 -0
  51. package/schemas/toolchain.json +97 -0
  52. package/skeletons/asset.md +22 -14
  53. package/skeletons/asset.sysml.md +27 -0
  54. package/skeletons/attack_surface.md +21 -18
  55. package/skeletons/audit_event.md +31 -18
  56. package/skeletons/audit_finding.md +22 -18
  57. package/skeletons/auth_flow.md +56 -21
  58. package/skeletons/control.md +45 -16
  59. package/skeletons/cors_policy.md +33 -17
  60. package/skeletons/csrf_token.md +17 -13
  61. package/skeletons/data_classification.md +23 -18
  62. package/skeletons/encryption_key.md +19 -12
  63. package/skeletons/jwt_claim.md +25 -14
  64. package/skeletons/mfa_method.md +17 -11
  65. package/skeletons/password_policy.md +35 -20
  66. package/skeletons/permission.md +18 -12
  67. package/skeletons/policy.md +33 -17
  68. package/skeletons/risk.md +20 -14
  69. package/skeletons/role.md +20 -13
  70. package/skeletons/scope.md +18 -12
  71. package/skeletons/secret.md +23 -16
  72. package/skeletons/secret.sysml.md +29 -0
  73. package/skeletons/session_config.md +35 -18
  74. package/skeletons/threat.md +22 -11
  75. package/skeletons/threat.sysml.md +26 -0
  76. package/skeletons/trust_boundary.md +51 -16
  77. package/skeletons/vulnerability.md +18 -15
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # spec-objects-security
2
2
 
3
+ [![Discord](https://img.shields.io/badge/Discord-Join%20us-5865F2?logo=discord&logoColor=white)](https://discord.gg/6qsdhSPE)
4
+
3
5
  > Filament Module: tier-2 security and identity ObjectTypes (threats, controls, auth flows, secrets, policies)
4
6
 
5
7
  `spec-objects-security` is an **Agent-IX Filament module**: a `manifest.yaml` plus per-kind authoring **skeletons** (and frontmatter schemas) that teach the spec tooling a vocabulary of object kinds. It is not a standalone app — it is loaded by [`quire-cli`](https://github.com/agent-ix/quire-cli) and [`quoin`](https://github.com/agent-ix/quoin) to author and validate Markdown spec artifacts.
package/manifest.yaml CHANGED
@@ -1,7 +1,40 @@
1
1
  manifest_version: 1.0.0
2
2
  name: spec-objects-security
3
- version: 0.1.0
3
+ version: 0.2.0
4
4
  description: 'Filament Module: tier-2 security and identity ObjectTypes (threats, controls, auth flows, secrets, policies)'
5
+ semantic:
6
+ contract_version: 1.0.0
7
+ semantic_core: 0.3.0
8
+ package: agent-ix/spec-objects-security
9
+ exports:
10
+ - auth_flow
11
+ - permission
12
+ - scope
13
+ - role
14
+ - secret
15
+ - encryption_key
16
+ - session_config
17
+ - data_classification
18
+ - trust_boundary
19
+ - audit_event
20
+ - csrf_token
21
+ - cors_policy
22
+ - password_policy
23
+ - mfa_method
24
+ - jwt_claim
25
+ - threat
26
+ - control
27
+ - risk
28
+ - vulnerability
29
+ - asset
30
+ - attack_surface
31
+ - policy
32
+ - audit_finding
33
+ imports: {}
34
+ targets: [json-schema, markdown]
35
+ mappings: [typed-table, sysml-fence, ocl-clause]
36
+ compatibility_posture: additive
37
+ legacy_forms: warning
5
38
  nav:
6
39
  category:
7
40
  slug: security
@@ -21,7 +54,8 @@ object_types:
21
54
  protects: [externally-exposed]
22
55
  references: [auth_flow]
23
56
  data_schema:
24
- type: object
57
+ schema: schemas/AuthFlow.json
58
+ digest: sha256:3e0bf1f277ead76fe354693c49563ffd73c990086822ac8b8ad91225589d9e49
25
59
  body_extraction:
26
60
  yield_pattern:
27
61
  match:
@@ -45,13 +79,19 @@ object_types:
45
79
  after_heading: Flow
46
80
  required: true
47
81
  language: mermaid
82
+ # Added at 0.2.0 (FR-005): the `## Operations` subsections.
83
+ operations:
84
+ from: section_body
85
+ after_heading: Operations
86
+ required: false
48
87
  - name: permission
49
88
  allowed_links:
50
89
  grants: [scope]
51
90
  guards: [externally-exposed]
52
91
  references: [role]
53
92
  data_schema:
54
- type: object
93
+ schema: schemas/Permission.json
94
+ digest: sha256:fbe12967f34580936a83f496ca51f7f879c01affaa39c66988d724de169e1220
55
95
  body_extraction:
56
96
  yield_pattern:
57
97
  match:
@@ -68,11 +108,18 @@ object_types:
68
108
  path:
69
109
  - verb
70
110
  required: true
111
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
112
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
113
+ properties:
114
+ from: section_body
115
+ after_heading: Properties
116
+ required: false
71
117
  - name: scope
72
118
  allowed_links:
73
119
  references: [permission]
74
120
  data_schema:
75
- type: object
121
+ schema: schemas/Scope.json
122
+ digest: sha256:8d68d19fc7950d9a17b3d0e757e276689a002d15316133e9d774f220c0af52d2
76
123
  body_extraction:
77
124
  yield_pattern:
78
125
  match:
@@ -83,12 +130,19 @@ object_types:
83
130
  from: section_body
84
131
  after_heading: Grants
85
132
  required: true
133
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
134
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
135
+ properties:
136
+ from: section_body
137
+ after_heading: Properties
138
+ required: false
86
139
  - name: role
87
140
  allowed_links:
88
141
  grants: [permission]
89
142
  references: [role]
90
143
  data_schema:
91
- type: object
144
+ schema: schemas/Role.json
145
+ digest: sha256:407a81699de5fea5f1a7868b456216afa99201f82bbe11f1c6203784c1ee7e33
92
146
  body_extraction:
93
147
  yield_pattern:
94
148
  match:
@@ -99,12 +153,19 @@ object_types:
99
153
  from: section_body
100
154
  after_heading: Permissions
101
155
  required: true
156
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
157
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
158
+ properties:
159
+ from: section_body
160
+ after_heading: Properties
161
+ required: false
102
162
  - name: secret
103
163
  roles: [sensitive]
104
164
  allowed_links:
105
165
  references: [secret]
106
166
  data_schema:
107
- type: object
167
+ schema: schemas/Secret.json
168
+ digest: sha256:2d06ce2ad6ea0a23014a301529a4caa1691a3757ed9f4b4b5dc3f9b559fd1586
108
169
  body_extraction:
109
170
  yield_pattern:
110
171
  match:
@@ -115,12 +176,19 @@ object_types:
115
176
  from: section_body
116
177
  after_heading: Rotation
117
178
  required: true
179
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
180
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
181
+ properties:
182
+ from: section_body
183
+ after_heading: Properties
184
+ required: false
118
185
  - name: encryption_key
119
186
  roles: [sensitive]
120
187
  allowed_links:
121
188
  encrypts: [sensitive, data_classification]
122
189
  data_schema:
123
- type: object
190
+ schema: schemas/EncryptionKey.json
191
+ digest: sha256:171b8ffdececb9061db539f4a4bbc410df6f76494bb53819728cc610f41eb54c
124
192
  body_extraction:
125
193
  yield_pattern:
126
194
  match:
@@ -137,11 +205,18 @@ object_types:
137
205
  path:
138
206
  - rotation
139
207
  required: false
208
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
209
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
210
+ properties:
211
+ from: section_body
212
+ after_heading: Properties
213
+ required: false
140
214
  - name: session_config
141
215
  allowed_links:
142
216
  references: [auth_flow, jwt_claim]
143
217
  data_schema:
144
- type: object
218
+ schema: schemas/SessionConfig.json
219
+ digest: sha256:125c2d9668ecc9cc031950916069754a33a315b33c6c9069151da8c651def4fd
145
220
  body_extraction:
146
221
  yield_pattern:
147
222
  match:
@@ -152,12 +227,18 @@ object_types:
152
227
  from: section_body
153
228
  after_heading: Settings
154
229
  required: true
230
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
231
+ invariants:
232
+ from: section_body
233
+ after_heading: Invariants
234
+ required: false
155
235
  - name: data_classification
156
236
  allowed_links:
157
237
  classifies: [persistable, externally-exposed, sensitive]
158
238
  references: [data_classification]
159
239
  data_schema:
160
- type: object
240
+ schema: schemas/DataClassification.json
241
+ digest: sha256:32e1217369954ee17b09fa4aba8b02a062fa2a432f124dd99f87db468f87b9ec
161
242
  body_extraction:
162
243
  yield_pattern:
163
244
  match:
@@ -168,12 +249,19 @@ object_types:
168
249
  from: section_body
169
250
  after_heading: Handling
170
251
  required: true
252
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
253
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
254
+ properties:
255
+ from: section_body
256
+ after_heading: Properties
257
+ required: false
171
258
  - name: trust_boundary
172
259
  allowed_links:
173
260
  contains: [asset, api_endpoint]
174
261
  references: [trust_boundary]
175
262
  data_schema:
176
- type: object
263
+ schema: schemas/TrustBoundary.json
264
+ digest: sha256:0069a8d8e1dae0353bbb5446983138a6ac6be2aba5cb0bc93e195d284372ef84
177
265
  body_extraction:
178
266
  yield_pattern:
179
267
  match:
@@ -185,12 +273,24 @@ object_types:
185
273
  after_heading: Boundary
186
274
  required: true
187
275
  language: mermaid
276
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
277
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
278
+ properties:
279
+ from: section_body
280
+ after_heading: Properties
281
+ required: false
282
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
283
+ invariants:
284
+ from: section_body
285
+ after_heading: Invariants
286
+ required: false
188
287
  - name: audit_event
189
288
  roles: [event-like]
190
289
  allowed_links:
191
290
  references: [audit_event]
192
291
  data_schema:
193
- type: object
292
+ schema: schemas/AuditEvent.json
293
+ digest: sha256:bd4fed5dc4d80f9041b368d151789d9b2c2a39b4c72f1c1c71a30820b70f52ec
194
294
  body_extraction:
195
295
  yield_pattern:
196
296
  match:
@@ -202,12 +302,19 @@ object_types:
202
302
  after_heading: Event Schema
203
303
  required: true
204
304
  language: json
305
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
306
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
307
+ properties:
308
+ from: section_body
309
+ after_heading: Properties
310
+ required: false
205
311
  - name: csrf_token
206
312
  roles: [sensitive]
207
313
  allowed_links:
208
314
  references: [csrf_token]
209
315
  data_schema:
210
- type: object
316
+ schema: schemas/CsrfToken.json
317
+ digest: sha256:7abfff62af262c21376408e97faa1fc1546df2a9954c59aae5af25ee9469c254
211
318
  body_extraction:
212
319
  yield_pattern:
213
320
  match:
@@ -219,11 +326,18 @@ object_types:
219
326
  path:
220
327
  - rotation_window
221
328
  required: true
329
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
330
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
331
+ properties:
332
+ from: section_body
333
+ after_heading: Properties
334
+ required: false
222
335
  - name: cors_policy
223
336
  allowed_links:
224
337
  references: [cors_policy]
225
338
  data_schema:
226
- type: object
339
+ schema: schemas/CorsPolicy.json
340
+ digest: sha256:55b8cb1c09cc43d8daa6aa7c461d3ede2f8c600d51f5c74cff0facfed0fe1af3
227
341
  body_extraction:
228
342
  yield_pattern:
229
343
  match:
@@ -234,11 +348,17 @@ object_types:
234
348
  from: section_body
235
349
  after_heading: Origins
236
350
  required: true
351
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
352
+ invariants:
353
+ from: section_body
354
+ after_heading: Invariants
355
+ required: false
237
356
  - name: password_policy
238
357
  allowed_links:
239
358
  references: [password_policy]
240
359
  data_schema:
241
- type: object
360
+ schema: schemas/PasswordPolicy.json
361
+ digest: sha256:3deb79e250c2ee75b380a5c50c0f2942b9fa4d7207c8b2b5b2bce1bd8aad408f
242
362
  body_extraction:
243
363
  yield_pattern:
244
364
  match:
@@ -249,11 +369,17 @@ object_types:
249
369
  from: section_body
250
370
  after_heading: Rules
251
371
  required: true
372
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
373
+ invariants:
374
+ from: section_body
375
+ after_heading: Invariants
376
+ required: false
252
377
  - name: mfa_method
253
378
  allowed_links:
254
379
  references: [mfa_method]
255
380
  data_schema:
256
- type: object
381
+ schema: schemas/MfaMethod.json
382
+ digest: sha256:89797c934801cba2523b6d79c2ec746cdb79d18b3e071a3693e37fb0fea04064
257
383
  body_extraction:
258
384
  yield_pattern:
259
385
  match:
@@ -270,12 +396,19 @@ object_types:
270
396
  path:
271
397
  - factor
272
398
  required: false
399
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
400
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
401
+ properties:
402
+ from: section_body
403
+ after_heading: Properties
404
+ required: false
273
405
  - name: jwt_claim
274
406
  roles: [sensitive]
275
407
  allowed_links:
276
408
  references: [jwt_claim]
277
409
  data_schema:
278
- type: object
410
+ schema: schemas/JwtClaim.json
411
+ digest: sha256:7c38c084af9264b74dfa135e11825a0f09211664b325093e632521155c006321
279
412
  body_extraction:
280
413
  yield_pattern:
281
414
  match:
@@ -287,12 +420,19 @@ object_types:
287
420
  after_heading: Schema
288
421
  required: true
289
422
  language: json
423
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
424
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
425
+ properties:
426
+ from: section_body
427
+ after_heading: Properties
428
+ required: false
290
429
  - name: threat
291
430
  allowed_links:
292
431
  threatens: [asset, attack_surface]
293
432
  exploits: [vulnerability]
294
433
  data_schema:
295
- type: object
434
+ schema: schemas/Threat.json
435
+ digest: sha256:7103325eae471a7d8f8cf345b91297e89a169eaf9ee6f69b9925badc07b74046
296
436
  body_extraction:
297
437
  yield_pattern:
298
438
  match:
@@ -321,13 +461,20 @@ object_types:
321
461
  path:
322
462
  - vector
323
463
  required: true
464
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
465
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
466
+ properties:
467
+ from: section_body
468
+ after_heading: Properties
469
+ required: false
324
470
  - name: control
325
471
  allowed_links:
326
472
  mitigates: [threat, risk, vulnerability]
327
473
  implements: [policy]
328
474
  protects: [externally-exposed, asset]
329
475
  data_schema:
330
- type: object
476
+ schema: schemas/Control.json
477
+ digest: sha256:1ae3e01ec7d15725eb6bc179d75b583ebe5794a8724c08811cfaa8b0a013eacd
331
478
  body_extraction:
332
479
  yield_pattern:
333
480
  match:
@@ -338,12 +485,24 @@ object_types:
338
485
  from: section_body
339
486
  after_heading: Mappings
340
487
  required: true
488
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
489
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
490
+ properties:
491
+ from: section_body
492
+ after_heading: Properties
493
+ required: false
494
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
495
+ invariants:
496
+ from: section_body
497
+ after_heading: Invariants
498
+ required: false
341
499
  - name: risk
342
500
  allowed_links:
343
501
  arises_from: [threat, vulnerability]
344
502
  references: [asset]
345
503
  data_schema:
346
- type: object
504
+ schema: schemas/Risk.json
505
+ digest: sha256:08424445bfb977cd7f407dc2221b3728eb69d90e7ff94398781dc1105d4e6597
347
506
  body_extraction:
348
507
  yield_pattern:
349
508
  match:
@@ -360,12 +519,19 @@ object_types:
360
519
  path:
361
520
  - impact
362
521
  required: true
522
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
523
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
524
+ properties:
525
+ from: section_body
526
+ after_heading: Properties
527
+ required: false
363
528
  - name: vulnerability
364
529
  allowed_links:
365
530
  affects: [asset, attack_surface]
366
531
  references: [vulnerability]
367
532
  data_schema:
368
- type: object
533
+ schema: schemas/Vulnerability.json
534
+ digest: sha256:9c1f1e726faf41be9d6547bb2c84588c6339d0eb468d22e79b8a631ef11266b3
369
535
  body_extraction:
370
536
  yield_pattern:
371
537
  match:
@@ -382,11 +548,18 @@ object_types:
382
548
  path:
383
549
  - severity
384
550
  required: true
551
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
552
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
553
+ properties:
554
+ from: section_body
555
+ after_heading: Properties
556
+ required: false
385
557
  - name: asset
386
558
  allowed_links:
387
559
  references: [data_classification, trust_boundary]
388
560
  data_schema:
389
- type: object
561
+ schema: schemas/Asset.json
562
+ digest: sha256:d41e5f5acc58187e9237ee8ee0e3d173c403e24a557d053c1fbed8c9eebf7a37
390
563
  body_extraction:
391
564
  yield_pattern:
392
565
  match:
@@ -397,12 +570,19 @@ object_types:
397
570
  from: section_body
398
571
  after_heading: Description
399
572
  required: true
573
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
574
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
575
+ properties:
576
+ from: section_body
577
+ after_heading: Properties
578
+ required: false
400
579
  - name: attack_surface
401
580
  roles: [externally-exposed]
402
581
  allowed_links:
403
582
  exposes: [asset, api_endpoint]
404
583
  data_schema:
405
- type: object
584
+ schema: schemas/AttackSurface.json
585
+ digest: sha256:fd36db8ffc5df3b4dda5175b1bb14f1cf67b9e0c76a3a3fdf626bcea9961ccf3
406
586
  body_extraction:
407
587
  yield_pattern:
408
588
  match:
@@ -413,11 +593,18 @@ object_types:
413
593
  from: section_body
414
594
  after_heading: Entry Points
415
595
  required: true
596
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
597
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
598
+ properties:
599
+ from: section_body
600
+ after_heading: Properties
601
+ required: false
416
602
  - name: policy
417
603
  allowed_links:
418
604
  governs: [control, role, permission, data_classification]
419
605
  data_schema:
420
- type: object
606
+ schema: schemas/Policy.json
607
+ digest: sha256:824bb21f2689ed75c5cd33e361b56baa5a28555bbd3fe387510195982ef0c299
421
608
  body_extraction:
422
609
  yield_pattern:
423
610
  match:
@@ -428,12 +615,18 @@ object_types:
428
615
  from: section_body
429
616
  after_heading: Policy
430
617
  required: true
618
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
619
+ invariants:
620
+ from: section_body
621
+ after_heading: Invariants
622
+ required: false
431
623
  - name: audit_finding
432
624
  allowed_links:
433
625
  traces_to: [risk]
434
626
  references: [control, vulnerability, asset]
435
627
  data_schema:
436
- type: object
628
+ schema: schemas/AuditFinding.json
629
+ digest: sha256:e5c166f8dea995a7babd81f9f2d93ea14570965a7fe0dc3042135ab0924688a7
437
630
  body_extraction:
438
631
  yield_pattern:
439
632
  match:
@@ -444,11 +637,62 @@ object_types:
444
637
  from: section_body
445
638
  after_heading: Recommendation
446
639
  required: true
640
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
641
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
642
+ properties:
643
+ from: section_body
644
+ after_heading: Properties
645
+ required: false
447
646
 
448
647
  # FR-043: concrete-term lexicon — security / identity / auth objects.
648
+ # FR-058 (quire-rs v0.31.0): upward-trace completeness — the second half of
649
+ # agent-ix/spec-objects-security#5. Declaration, not code: the engine holds no
650
+ # archetype name, no verb and no direction.
651
+ #
652
+ # A threat nobody controls and a risk nobody treats are both perfectly
653
+ # well-formed documents that pass every schema and grammar check, and both are
654
+ # evidence of an unaddressed exposure. Nothing that reads a document on its own
655
+ # can see it; only reading the edge set upward can.
656
+ traceability:
657
+ required_relations:
658
+ # STRIDE without coverage is a list. A threat with no inbound `mitigates` is
659
+ # one somebody enumerated and then left.
660
+ - name: threat-has-control
661
+ from: threat
662
+ edges: [mitigates]
663
+ to: []
664
+ direction: incoming
665
+ check: uncontrolled-threat
666
+ # The same statement about the scored artefact rather than the mechanism: a
667
+ # risk with no treatment was assessed and then dropped.
668
+ - name: risk-has-treatment
669
+ from: risk
670
+ edges: [mitigates]
671
+ to: []
672
+ direction: incoming
673
+ check: untreated-risk
674
+ # `direction: incoming` throughout, because the mitigation is authored from
675
+ # the control's or requirement's end — a control says what it mitigates. A
676
+ # threat listing its own controls would duplicate the fact and let the two
677
+ # drift.
678
+ #
679
+ # DELIBERATELY NOT DECLARED: `vulnerability`. #5 names "threat/hazard/risk"
680
+ # and a vulnerability is a property of an implementation rather than a thing
681
+ # the specification owes a response to. Adding it would widen the ticket.
682
+ #
683
+ # ALSO NOT DECLARED: the reverse direction, "every security-classified
684
+ # requirement traces to an upstream threat". It needs a way to say a
685
+ # requirement is security-classified, and no such axis exists — neither this
686
+ # module nor iso declares one. Filed rather than invented.
687
+ #
688
+ # A risk that transitively arises from itself states nothing, and no
689
+ # per-document check can see it: the defect is a property of the graph.
690
+ acyclic_edges:
691
+ - arises_from
692
+
449
693
  lexicon:
450
694
  token: {definition: a bearer credential representing identity or grant}
451
- secret: {definition: a confidential value (key, password) kept out of code}
695
+ secret: {definition: "a confidential value (key, password) kept out of code"}
452
696
  scope: {definition: a named permission boundary on a grant}
453
697
  claim: {definition: an assertion carried in a token}
454
698
  permission: {definition: an allowed action on a resource}
@@ -460,5 +704,5 @@ lexicon:
460
704
  nonce: {definition: a single-use value preventing replay}
461
705
  hash: {definition: a fixed-size digest of input}
462
706
  cipher: {definition: an encryption/decryption algorithm}
463
- audit: {definition: a recorded, tamper-evident event trail}
707
+ audit: {definition: "a recorded, tamper-evident event trail"}
464
708
  policy: {definition: a declarative rule governing access or behavior}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-ix/spec-objects-security",
3
- "version": "0.5.0",
3
+ "version": "0.8.0",
4
4
  "description": "Filament Module: tier-2 security and identity ObjectTypes (threat, control, risk, asset, policy, auth_flow, role, scope, jwt_claim, secret)",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "author": "Agent IX <agents@agent-ix.dev>",
@@ -20,7 +20,8 @@
20
20
  "LICENSE"
21
21
  ],
22
22
  "scripts": {
23
- "prepack": "node scripts/stage-npm.mjs"
23
+ "prepack": "node scripts/stage-npm.mjs",
24
+ "postpack": "node scripts/stage-npm.mjs --clean"
24
25
  },
25
26
  "publishConfig": {
26
27
  "registry": "https://registry.npmjs.org/",
@@ -29,5 +30,10 @@
29
30
  "repository": {
30
31
  "type": "git",
31
32
  "url": "git+https://github.com/agent-ix/spec-objects-security.git"
33
+ },
34
+ "devDependencies": {
35
+ "@agent-ix/semantic-core": "0.3.0",
36
+ "@typespec/compiler": "1.15.0",
37
+ "@typespec/json-schema": "1.15.0"
32
38
  }
33
39
  }
@@ -0,0 +1,78 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/Asset.json",
4
+ "type": "object",
5
+ "properties": {
6
+ "fields": {
7
+ "type": "array",
8
+ "items": {
9
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/FieldDecl.json"
10
+ },
11
+ "minItems": 1,
12
+ "contains": {
13
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/IdentityField.json"
14
+ }
15
+ },
16
+ "relations": {
17
+ "type": "array",
18
+ "items": {
19
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/RelationDecl.json"
20
+ }
21
+ },
22
+ "clauses": {
23
+ "type": "array",
24
+ "items": {
25
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/ClauseRef.json"
26
+ }
27
+ },
28
+ "operations": {
29
+ "type": "array",
30
+ "items": {
31
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/OperationDecl.json"
32
+ }
33
+ },
34
+ "classification": {
35
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/ConfidentialityLevel.json"
36
+ },
37
+ "owner": {
38
+ "$ref": "https://schemas.agent-ix.org/semantic-core/0.3.0/SemanticId.json"
39
+ }
40
+ },
41
+ "required": [
42
+ "fields"
43
+ ],
44
+ "unevaluatedProperties": {
45
+ "not": {}
46
+ },
47
+ "description": "A thing worth protecting.",
48
+ "allOf": [
49
+ {
50
+ "properties": {
51
+ "fields": {
52
+ "items": {
53
+ "not": {
54
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
55
+ }
56
+ }
57
+ }
58
+ }
59
+ },
60
+ {
61
+ "properties": {
62
+ "operations": {
63
+ "items": {
64
+ "properties": {
65
+ "params": {
66
+ "items": {
67
+ "not": {
68
+ "$ref": "https://schemas.agent-ix.org/agent-ix/spec-objects-security/0.2.0/DefaultedField.json"
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
77
+ ]
78
+ }