@agent-ix/spec-objects-security 0.5.0 → 0.9.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 (76) hide show
  1. package/README.md +2 -0
  2. package/manifest.yaml +247 -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/skeletons/asset.md +22 -14
  52. package/skeletons/asset.sysml.md +27 -0
  53. package/skeletons/attack_surface.md +21 -18
  54. package/skeletons/audit_event.md +31 -18
  55. package/skeletons/audit_finding.md +22 -18
  56. package/skeletons/auth_flow.md +56 -21
  57. package/skeletons/control.md +45 -16
  58. package/skeletons/cors_policy.md +33 -17
  59. package/skeletons/csrf_token.md +17 -13
  60. package/skeletons/data_classification.md +23 -18
  61. package/skeletons/encryption_key.md +19 -12
  62. package/skeletons/jwt_claim.md +25 -14
  63. package/skeletons/mfa_method.md +17 -11
  64. package/skeletons/password_policy.md +35 -20
  65. package/skeletons/permission.md +18 -12
  66. package/skeletons/policy.md +33 -17
  67. package/skeletons/risk.md +20 -14
  68. package/skeletons/role.md +20 -13
  69. package/skeletons/scope.md +18 -12
  70. package/skeletons/secret.md +23 -16
  71. package/skeletons/secret.sysml.md +29 -0
  72. package/skeletons/session_config.md +35 -18
  73. package/skeletons/threat.md +22 -11
  74. package/skeletons/threat.sysml.md +26 -0
  75. package/skeletons/trust_boundary.md +51 -16
  76. 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,7 @@ object_types:
21
54
  protects: [externally-exposed]
22
55
  references: [auth_flow]
23
56
  data_schema:
24
- type: object
57
+ schema: schemas/AuthFlow.json
25
58
  body_extraction:
26
59
  yield_pattern:
27
60
  match:
@@ -45,13 +78,18 @@ object_types:
45
78
  after_heading: Flow
46
79
  required: true
47
80
  language: mermaid
81
+ # Added at 0.2.0 (FR-005): the `## Operations` subsections.
82
+ operations:
83
+ from: section_body
84
+ after_heading: Operations
85
+ required: false
48
86
  - name: permission
49
87
  allowed_links:
50
88
  grants: [scope]
51
89
  guards: [externally-exposed]
52
90
  references: [role]
53
91
  data_schema:
54
- type: object
92
+ schema: schemas/Permission.json
55
93
  body_extraction:
56
94
  yield_pattern:
57
95
  match:
@@ -68,11 +106,17 @@ object_types:
68
106
  path:
69
107
  - verb
70
108
  required: true
109
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
110
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
111
+ properties:
112
+ from: section_body
113
+ after_heading: Properties
114
+ required: false
71
115
  - name: scope
72
116
  allowed_links:
73
117
  references: [permission]
74
118
  data_schema:
75
- type: object
119
+ schema: schemas/Scope.json
76
120
  body_extraction:
77
121
  yield_pattern:
78
122
  match:
@@ -83,12 +127,18 @@ object_types:
83
127
  from: section_body
84
128
  after_heading: Grants
85
129
  required: true
130
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
131
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
132
+ properties:
133
+ from: section_body
134
+ after_heading: Properties
135
+ required: false
86
136
  - name: role
87
137
  allowed_links:
88
138
  grants: [permission]
89
139
  references: [role]
90
140
  data_schema:
91
- type: object
141
+ schema: schemas/Role.json
92
142
  body_extraction:
93
143
  yield_pattern:
94
144
  match:
@@ -99,12 +149,18 @@ object_types:
99
149
  from: section_body
100
150
  after_heading: Permissions
101
151
  required: true
152
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
153
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
154
+ properties:
155
+ from: section_body
156
+ after_heading: Properties
157
+ required: false
102
158
  - name: secret
103
159
  roles: [sensitive]
104
160
  allowed_links:
105
161
  references: [secret]
106
162
  data_schema:
107
- type: object
163
+ schema: schemas/Secret.json
108
164
  body_extraction:
109
165
  yield_pattern:
110
166
  match:
@@ -115,12 +171,18 @@ object_types:
115
171
  from: section_body
116
172
  after_heading: Rotation
117
173
  required: true
174
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
175
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
176
+ properties:
177
+ from: section_body
178
+ after_heading: Properties
179
+ required: false
118
180
  - name: encryption_key
119
181
  roles: [sensitive]
120
182
  allowed_links:
121
183
  encrypts: [sensitive, data_classification]
122
184
  data_schema:
123
- type: object
185
+ schema: schemas/EncryptionKey.json
124
186
  body_extraction:
125
187
  yield_pattern:
126
188
  match:
@@ -137,11 +199,17 @@ object_types:
137
199
  path:
138
200
  - rotation
139
201
  required: false
202
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
203
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
204
+ properties:
205
+ from: section_body
206
+ after_heading: Properties
207
+ required: false
140
208
  - name: session_config
141
209
  allowed_links:
142
210
  references: [auth_flow, jwt_claim]
143
211
  data_schema:
144
- type: object
212
+ schema: schemas/SessionConfig.json
145
213
  body_extraction:
146
214
  yield_pattern:
147
215
  match:
@@ -152,12 +220,17 @@ object_types:
152
220
  from: section_body
153
221
  after_heading: Settings
154
222
  required: true
223
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
224
+ invariants:
225
+ from: section_body
226
+ after_heading: Invariants
227
+ required: false
155
228
  - name: data_classification
156
229
  allowed_links:
157
230
  classifies: [persistable, externally-exposed, sensitive]
158
231
  references: [data_classification]
159
232
  data_schema:
160
- type: object
233
+ schema: schemas/DataClassification.json
161
234
  body_extraction:
162
235
  yield_pattern:
163
236
  match:
@@ -168,12 +241,18 @@ object_types:
168
241
  from: section_body
169
242
  after_heading: Handling
170
243
  required: true
244
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
245
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
246
+ properties:
247
+ from: section_body
248
+ after_heading: Properties
249
+ required: false
171
250
  - name: trust_boundary
172
251
  allowed_links:
173
252
  contains: [asset, api_endpoint]
174
253
  references: [trust_boundary]
175
254
  data_schema:
176
- type: object
255
+ schema: schemas/TrustBoundary.json
177
256
  body_extraction:
178
257
  yield_pattern:
179
258
  match:
@@ -185,12 +264,23 @@ object_types:
185
264
  after_heading: Boundary
186
265
  required: true
187
266
  language: mermaid
267
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
268
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
269
+ properties:
270
+ from: section_body
271
+ after_heading: Properties
272
+ required: false
273
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
274
+ invariants:
275
+ from: section_body
276
+ after_heading: Invariants
277
+ required: false
188
278
  - name: audit_event
189
279
  roles: [event-like]
190
280
  allowed_links:
191
281
  references: [audit_event]
192
282
  data_schema:
193
- type: object
283
+ schema: schemas/AuditEvent.json
194
284
  body_extraction:
195
285
  yield_pattern:
196
286
  match:
@@ -202,12 +292,18 @@ object_types:
202
292
  after_heading: Event Schema
203
293
  required: true
204
294
  language: json
295
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
296
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
297
+ properties:
298
+ from: section_body
299
+ after_heading: Properties
300
+ required: false
205
301
  - name: csrf_token
206
302
  roles: [sensitive]
207
303
  allowed_links:
208
304
  references: [csrf_token]
209
305
  data_schema:
210
- type: object
306
+ schema: schemas/CsrfToken.json
211
307
  body_extraction:
212
308
  yield_pattern:
213
309
  match:
@@ -219,11 +315,17 @@ object_types:
219
315
  path:
220
316
  - rotation_window
221
317
  required: true
318
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
319
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
320
+ properties:
321
+ from: section_body
322
+ after_heading: Properties
323
+ required: false
222
324
  - name: cors_policy
223
325
  allowed_links:
224
326
  references: [cors_policy]
225
327
  data_schema:
226
- type: object
328
+ schema: schemas/CorsPolicy.json
227
329
  body_extraction:
228
330
  yield_pattern:
229
331
  match:
@@ -234,11 +336,16 @@ object_types:
234
336
  from: section_body
235
337
  after_heading: Origins
236
338
  required: true
339
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
340
+ invariants:
341
+ from: section_body
342
+ after_heading: Invariants
343
+ required: false
237
344
  - name: password_policy
238
345
  allowed_links:
239
346
  references: [password_policy]
240
347
  data_schema:
241
- type: object
348
+ schema: schemas/PasswordPolicy.json
242
349
  body_extraction:
243
350
  yield_pattern:
244
351
  match:
@@ -249,11 +356,16 @@ object_types:
249
356
  from: section_body
250
357
  after_heading: Rules
251
358
  required: true
359
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
360
+ invariants:
361
+ from: section_body
362
+ after_heading: Invariants
363
+ required: false
252
364
  - name: mfa_method
253
365
  allowed_links:
254
366
  references: [mfa_method]
255
367
  data_schema:
256
- type: object
368
+ schema: schemas/MfaMethod.json
257
369
  body_extraction:
258
370
  yield_pattern:
259
371
  match:
@@ -270,12 +382,18 @@ object_types:
270
382
  path:
271
383
  - factor
272
384
  required: false
385
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
386
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
387
+ properties:
388
+ from: section_body
389
+ after_heading: Properties
390
+ required: false
273
391
  - name: jwt_claim
274
392
  roles: [sensitive]
275
393
  allowed_links:
276
394
  references: [jwt_claim]
277
395
  data_schema:
278
- type: object
396
+ schema: schemas/JwtClaim.json
279
397
  body_extraction:
280
398
  yield_pattern:
281
399
  match:
@@ -287,12 +405,18 @@ object_types:
287
405
  after_heading: Schema
288
406
  required: true
289
407
  language: json
408
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
409
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
410
+ properties:
411
+ from: section_body
412
+ after_heading: Properties
413
+ required: false
290
414
  - name: threat
291
415
  allowed_links:
292
416
  threatens: [asset, attack_surface]
293
417
  exploits: [vulnerability]
294
418
  data_schema:
295
- type: object
419
+ schema: schemas/Threat.json
296
420
  body_extraction:
297
421
  yield_pattern:
298
422
  match:
@@ -321,13 +445,19 @@ object_types:
321
445
  path:
322
446
  - vector
323
447
  required: true
448
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
449
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
450
+ properties:
451
+ from: section_body
452
+ after_heading: Properties
453
+ required: false
324
454
  - name: control
325
455
  allowed_links:
326
456
  mitigates: [threat, risk, vulnerability]
327
457
  implements: [policy]
328
458
  protects: [externally-exposed, asset]
329
459
  data_schema:
330
- type: object
460
+ schema: schemas/Control.json
331
461
  body_extraction:
332
462
  yield_pattern:
333
463
  match:
@@ -338,12 +468,23 @@ object_types:
338
468
  from: section_body
339
469
  after_heading: Mappings
340
470
  required: true
471
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
472
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
473
+ properties:
474
+ from: section_body
475
+ after_heading: Properties
476
+ required: false
477
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
478
+ invariants:
479
+ from: section_body
480
+ after_heading: Invariants
481
+ required: false
341
482
  - name: risk
342
483
  allowed_links:
343
484
  arises_from: [threat, vulnerability]
344
485
  references: [asset]
345
486
  data_schema:
346
- type: object
487
+ schema: schemas/Risk.json
347
488
  body_extraction:
348
489
  yield_pattern:
349
490
  match:
@@ -360,12 +501,18 @@ object_types:
360
501
  path:
361
502
  - impact
362
503
  required: true
504
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
505
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
506
+ properties:
507
+ from: section_body
508
+ after_heading: Properties
509
+ required: false
363
510
  - name: vulnerability
364
511
  allowed_links:
365
512
  affects: [asset, attack_surface]
366
513
  references: [vulnerability]
367
514
  data_schema:
368
- type: object
515
+ schema: schemas/Vulnerability.json
369
516
  body_extraction:
370
517
  yield_pattern:
371
518
  match:
@@ -382,11 +529,17 @@ object_types:
382
529
  path:
383
530
  - severity
384
531
  required: true
532
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
533
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
534
+ properties:
535
+ from: section_body
536
+ after_heading: Properties
537
+ required: false
385
538
  - name: asset
386
539
  allowed_links:
387
540
  references: [data_classification, trust_boundary]
388
541
  data_schema:
389
- type: object
542
+ schema: schemas/Asset.json
390
543
  body_extraction:
391
544
  yield_pattern:
392
545
  match:
@@ -397,12 +550,18 @@ object_types:
397
550
  from: section_body
398
551
  after_heading: Description
399
552
  required: true
553
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
554
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
555
+ properties:
556
+ from: section_body
557
+ after_heading: Properties
558
+ required: false
400
559
  - name: attack_surface
401
560
  roles: [externally-exposed]
402
561
  allowed_links:
403
562
  exposes: [asset, api_endpoint]
404
563
  data_schema:
405
- type: object
564
+ schema: schemas/AttackSurface.json
406
565
  body_extraction:
407
566
  yield_pattern:
408
567
  match:
@@ -413,11 +572,17 @@ object_types:
413
572
  from: section_body
414
573
  after_heading: Entry Points
415
574
  required: true
575
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
576
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
577
+ properties:
578
+ from: section_body
579
+ after_heading: Properties
580
+ required: false
416
581
  - name: policy
417
582
  allowed_links:
418
583
  governs: [control, role, permission, data_classification]
419
584
  data_schema:
420
- type: object
585
+ schema: schemas/Policy.json
421
586
  body_extraction:
422
587
  yield_pattern:
423
588
  match:
@@ -428,12 +593,17 @@ object_types:
428
593
  from: section_body
429
594
  after_heading: Policy
430
595
  required: true
596
+ # Added at 0.2.0 (FR-005): the `## Invariants` OCL clauses.
597
+ invariants:
598
+ from: section_body
599
+ after_heading: Invariants
600
+ required: false
431
601
  - name: audit_finding
432
602
  allowed_links:
433
603
  traces_to: [risk]
434
604
  references: [control, vulnerability, asset]
435
605
  data_schema:
436
- type: object
606
+ schema: schemas/AuditFinding.json
437
607
  body_extraction:
438
608
  yield_pattern:
439
609
  match:
@@ -444,11 +614,62 @@ object_types:
444
614
  from: section_body
445
615
  after_heading: Recommendation
446
616
  required: true
617
+ # Added at 0.2.0 (FR-005): the typed `## Properties` table the
618
+ # semantic layer reads. Optional, so every 0.1.0 artifact stays valid.
619
+ properties:
620
+ from: section_body
621
+ after_heading: Properties
622
+ required: false
447
623
 
448
624
  # FR-043: concrete-term lexicon — security / identity / auth objects.
625
+ # FR-058 (quire-rs v0.31.0): upward-trace completeness — the second half of
626
+ # agent-ix/spec-objects-security#5. Declaration, not code: the engine holds no
627
+ # archetype name, no verb and no direction.
628
+ #
629
+ # A threat nobody controls and a risk nobody treats are both perfectly
630
+ # well-formed documents that pass every schema and grammar check, and both are
631
+ # evidence of an unaddressed exposure. Nothing that reads a document on its own
632
+ # can see it; only reading the edge set upward can.
633
+ traceability:
634
+ required_relations:
635
+ # STRIDE without coverage is a list. A threat with no inbound `mitigates` is
636
+ # one somebody enumerated and then left.
637
+ - name: threat-has-control
638
+ from: threat
639
+ edges: [mitigates]
640
+ to: []
641
+ direction: incoming
642
+ check: uncontrolled-threat
643
+ # The same statement about the scored artefact rather than the mechanism: a
644
+ # risk with no treatment was assessed and then dropped.
645
+ - name: risk-has-treatment
646
+ from: risk
647
+ edges: [mitigates]
648
+ to: []
649
+ direction: incoming
650
+ check: untreated-risk
651
+ # `direction: incoming` throughout, because the mitigation is authored from
652
+ # the control's or requirement's end — a control says what it mitigates. A
653
+ # threat listing its own controls would duplicate the fact and let the two
654
+ # drift.
655
+ #
656
+ # DELIBERATELY NOT DECLARED: `vulnerability`. #5 names "threat/hazard/risk"
657
+ # and a vulnerability is a property of an implementation rather than a thing
658
+ # the specification owes a response to. Adding it would widen the ticket.
659
+ #
660
+ # ALSO NOT DECLARED: the reverse direction, "every security-classified
661
+ # requirement traces to an upstream threat". It needs a way to say a
662
+ # requirement is security-classified, and no such axis exists — neither this
663
+ # module nor iso declares one. Filed rather than invented.
664
+ #
665
+ # A risk that transitively arises from itself states nothing, and no
666
+ # per-document check can see it: the defect is a property of the graph.
667
+ acyclic_edges:
668
+ - arises_from
669
+
449
670
  lexicon:
450
671
  token: {definition: a bearer credential representing identity or grant}
451
- secret: {definition: a confidential value (key, password) kept out of code}
672
+ secret: {definition: "a confidential value (key, password) kept out of code"}
452
673
  scope: {definition: a named permission boundary on a grant}
453
674
  claim: {definition: an assertion carried in a token}
454
675
  permission: {definition: an allowed action on a resource}
@@ -460,5 +681,5 @@ lexicon:
460
681
  nonce: {definition: a single-use value preventing replay}
461
682
  hash: {definition: a fixed-size digest of input}
462
683
  cipher: {definition: an encryption/decryption algorithm}
463
- audit: {definition: a recorded, tamper-evident event trail}
684
+ audit: {definition: "a recorded, tamper-evident event trail"}
464
685
  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.9.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/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/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/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/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/DefaultedField.json"
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
77
+ ]
78
+ }