@stravica-ai/rcf-schemas 0.2.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 (82) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/LICENSE +202 -0
  3. package/README.md +165 -0
  4. package/docs/README.md +37 -0
  5. package/docs/adr.md +42 -0
  6. package/docs/build-sequence.md +44 -0
  7. package/docs/common.md +43 -0
  8. package/docs/fbs.md +75 -0
  9. package/docs/file-layout.md +62 -0
  10. package/docs/id-conventions.md +60 -0
  11. package/docs/manifest.md +70 -0
  12. package/docs/prd.md +64 -0
  13. package/docs/req.md +57 -0
  14. package/docs/tac.md +49 -0
  15. package/docs/tad.md +76 -0
  16. package/docs/test-suite.md +56 -0
  17. package/docs/user-story.md +61 -0
  18. package/fixtures/invalid/adr/adr-001-authoring-status.json +13 -0
  19. package/fixtures/invalid/adr/adr-002-supersededBy-bad-id.json +14 -0
  20. package/fixtures/invalid/adr/adr-003-missing-tadId.json +12 -0
  21. package/fixtures/invalid/build-sequence/bs-001-legacy-fbs-array.json +11 -0
  22. package/fixtures/invalid/build-sequence/bs-002-missing-prdId.json +7 -0
  23. package/fixtures/invalid/fbs/fbs-001-storyScope-wrapper.json +16 -0
  24. package/fixtures/invalid/fbs/fbs-002-empty-acIds.json +13 -0
  25. package/fixtures/invalid/fbs/fbs-003-authoring-status.json +13 -0
  26. package/fixtures/invalid/fbs/fbs-004-plain-int-acId.json +13 -0
  27. package/fixtures/invalid/fbs/fbs-005-missing-buildOrder.json +12 -0
  28. package/fixtures/invalid/fbs/fbs-006-buildOrder-zero.json +13 -0
  29. package/fixtures/invalid/manifest/manifest-001-userStories-array.json +10 -0
  30. package/fixtures/invalid/manifest/manifest-002-legacy-buildSequence.json +7 -0
  31. package/fixtures/invalid/manifest/manifest-003-wrong-version.json +7 -0
  32. package/fixtures/invalid/prd/prd-001-typoed-status.json +10 -0
  33. package/fixtures/invalid/prd/prd-002-legacy-requirementIds.json +11 -0
  34. package/fixtures/invalid/prd/prd-003-missing-objectives.json +9 -0
  35. package/fixtures/invalid/req/req-001-bad-prefix.json +13 -0
  36. package/fixtures/invalid/req/req-002-unknown-category.json +13 -0
  37. package/fixtures/invalid/req/req-003-missing-prdId.json +12 -0
  38. package/fixtures/invalid/tac/tac-001-empty-responsibilities.json +12 -0
  39. package/fixtures/invalid/tac/tac-002-bad-dependency-kind.json +15 -0
  40. package/fixtures/invalid/tac/tac-003-missing-tadId.json +11 -0
  41. package/fixtures/invalid/tad/tad-001-legacy-componentIds.json +16 -0
  42. package/fixtures/invalid/tad/tad-002-partial-deployment.json +17 -0
  43. package/fixtures/invalid/test-suite/ts-001-missing-usId.json +18 -0
  44. package/fixtures/invalid/test-suite/ts-002-empty-acIds.json +19 -0
  45. package/fixtures/invalid/test-suite/ts-003-bad-tc-id.json +19 -0
  46. package/fixtures/invalid/test-suite/ts-004-bad-tc-status.json +19 -0
  47. package/fixtures/invalid/test-suite/ts-005-bad-test-level.json +12 -0
  48. package/fixtures/invalid/user-story/us-001-empty-acs.json +14 -0
  49. package/fixtures/invalid/user-story/us-002-ac-missing-testable.json +19 -0
  50. package/fixtures/valid/adr/adr-001-minimal.json +13 -0
  51. package/fixtures/valid/adr/adr-002-comprehensive.json +27 -0
  52. package/fixtures/valid/adr/adr-003-draft-status.json +13 -0
  53. package/fixtures/valid/build-sequence/bs-001-minimal.json +8 -0
  54. package/fixtures/valid/build-sequence/bs-002-comprehensive.json +11 -0
  55. package/fixtures/valid/fbs/fbs-001-minimal.json +13 -0
  56. package/fixtures/valid/fbs/fbs-002-comprehensive.json +34 -0
  57. package/fixtures/valid/manifest/manifest-001-minimal.json +7 -0
  58. package/fixtures/valid/manifest/manifest-002-with-description.json +8 -0
  59. package/fixtures/valid/prd/prd-001-minimal.json +12 -0
  60. package/fixtures/valid/prd/prd-002-comprehensive.json +34 -0
  61. package/fixtures/valid/req/req-001-minimal.json +13 -0
  62. package/fixtures/valid/req/req-002-comprehensive.json +15 -0
  63. package/fixtures/valid/tac/tac-001-minimal.json +15 -0
  64. package/fixtures/valid/tac/tac-002-comprehensive.json +49 -0
  65. package/fixtures/valid/tad/tad-001-minimal.json +14 -0
  66. package/fixtures/valid/tad/tad-002-comprehensive.json +71 -0
  67. package/fixtures/valid/test-suite/ts-001-minimal.json +19 -0
  68. package/fixtures/valid/test-suite/ts-002-comprehensive.json +32 -0
  69. package/fixtures/valid/user-story/us-001-minimal.json +20 -0
  70. package/fixtures/valid/user-story/us-002-hierarchical-acs.json +40 -0
  71. package/package.json +44 -0
  72. package/schemas/adr.schema.json +58 -0
  73. package/schemas/build-sequence.schema.json +22 -0
  74. package/schemas/common.schema.json +103 -0
  75. package/schemas/fbs.schema.json +90 -0
  76. package/schemas/manifest.schema.json +17 -0
  77. package/schemas/prd.schema.json +49 -0
  78. package/schemas/req.schema.json +39 -0
  79. package/schemas/tac.schema.json +73 -0
  80. package/schemas/tad.schema.json +162 -0
  81. package/schemas/test-suite.schema.json +61 -0
  82. package/schemas/user-story.schema.json +56 -0
@@ -0,0 +1,49 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.2.0/prd.schema.json",
4
+ "title": "RCF PRD",
5
+ "description": "Product Requirements Document. One per project. The PRD is a pure shell document; requirement bodies live in individual req.schema.json files and each REQ carries the mandatory prdId back-reference. The walker computes the PRD's requirement list by inverting REQ.prdId at load time.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "prdId",
10
+ "productName",
11
+ "version",
12
+ "status",
13
+ "problemStatement",
14
+ "objectives",
15
+ "createdAt",
16
+ "updatedAt"
17
+ ],
18
+ "properties": {
19
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
20
+ "productName": { "type": "string", "minLength": 1 },
21
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
22
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
23
+ "executiveSummary": { "type": "string" },
24
+ "problemStatement": { "type": "string", "minLength": 1 },
25
+ "targetUsers": {
26
+ "type": "array",
27
+ "items": { "type": "string", "minLength": 1 }
28
+ },
29
+ "inScope": {
30
+ "type": "array",
31
+ "items": { "type": "string", "minLength": 1 }
32
+ },
33
+ "outOfScope": {
34
+ "type": "array",
35
+ "items": { "type": "string", "minLength": 1 }
36
+ },
37
+ "objectives": {
38
+ "type": "array",
39
+ "minItems": 1,
40
+ "items": { "type": "string", "minLength": 1 }
41
+ },
42
+ "constraints": {
43
+ "type": "array",
44
+ "items": { "type": "string", "minLength": 1 }
45
+ },
46
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
47
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
48
+ }
49
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.2.0/req.schema.json",
4
+ "title": "RCF Requirement",
5
+ "description": "Individual requirement within a PRD. One file per requirement. Recommended path: rcf/requirements/REQ-001.json. Carries the mandatory prdId parent reference; the PRD does not list its requirements.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "reqId",
10
+ "prdId",
11
+ "title",
12
+ "description",
13
+ "category",
14
+ "domain",
15
+ "priority",
16
+ "version",
17
+ "status",
18
+ "createdAt",
19
+ "updatedAt"
20
+ ],
21
+ "properties": {
22
+ "reqId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/reqId" },
23
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
24
+ "title": { "type": "string", "minLength": 1 },
25
+ "description": { "type": "string", "minLength": 1 },
26
+ "category": { "enum": ["functional", "nonFunctional", "technical", "security"] },
27
+ "domain": { "type": "string", "minLength": 1 },
28
+ "priority": { "enum": ["must", "should", "could", "wont"] },
29
+ "rationale": { "type": "string" },
30
+ "tags": {
31
+ "type": "array",
32
+ "items": { "type": "string" }
33
+ },
34
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
35
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
36
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
37
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
38
+ }
39
+ }
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.2.0/tac.schema.json",
4
+ "title": "RCF Technical Architecture Component",
5
+ "description": "One per architectural component. Verbose per-component descriptions are fine; the schema does not constrain length.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "tacId",
10
+ "prdId",
11
+ "tadId",
12
+ "version",
13
+ "status",
14
+ "name",
15
+ "purpose",
16
+ "responsibilities",
17
+ "createdAt",
18
+ "updatedAt"
19
+ ],
20
+ "properties": {
21
+ "tacId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tacId" },
22
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
23
+ "tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tadId" },
24
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
25
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
26
+
27
+ "name": { "type": "string", "minLength": 1 },
28
+ "purpose": { "type": "string", "minLength": 1 },
29
+ "responsibilities": {
30
+ "type": "array",
31
+ "minItems": 1,
32
+ "items": { "type": "string", "minLength": 1 }
33
+ },
34
+
35
+ "internalStructure": { "type": "string" },
36
+ "interfaces": {
37
+ "type": "array",
38
+ "items": { "$ref": "#/$defs/interfaceDef" }
39
+ },
40
+ "dependencies": {
41
+ "type": "array",
42
+ "items": { "$ref": "#/$defs/dependencyRef" }
43
+ },
44
+ "tradeoffs": { "type": "string" },
45
+ "notes": { "type": "string" },
46
+
47
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
48
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
49
+ },
50
+ "$defs": {
51
+ "interfaceDef": {
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "required": ["name", "kind"],
55
+ "properties": {
56
+ "name": { "type": "string", "minLength": 1 },
57
+ "kind": { "type": "string", "minLength": 1 },
58
+ "description": { "type": "string" }
59
+ }
60
+ },
61
+ "dependencyRef": {
62
+ "type": "object",
63
+ "additionalProperties": false,
64
+ "required": ["name", "kind"],
65
+ "properties": {
66
+ "name": { "type": "string", "minLength": 1 },
67
+ "kind": { "enum": ["tac", "external"] },
68
+ "tacId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tacId" },
69
+ "description": { "type": "string" }
70
+ }
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.2.0/tad.schema.json",
4
+ "title": "RCF Technical Architecture Document",
5
+ "description": "Master Technical Architecture Document. One per project. TACs and ADRs each carry the mandatory tadId parent reference; the TAD does not list them. The walker computes both children lists by inverting TAC.tadId and ADR.tadId at load time. The schema defines the FULL set of possible sections; what's required for a given project is a tooling decision.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "tadId",
10
+ "prdId",
11
+ "version",
12
+ "status",
13
+ "systemOverview",
14
+ "createdAt",
15
+ "updatedAt"
16
+ ],
17
+ "properties": {
18
+ "tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tadId" },
19
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
20
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
21
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
22
+
23
+ "systemOverview": { "$ref": "#/$defs/systemOverview" },
24
+
25
+ "architecturePrinciples": {
26
+ "type": "array",
27
+ "items": { "$ref": "#/$defs/principle" }
28
+ },
29
+ "dataArchitecture": { "$ref": "#/$defs/dataArchitecture" },
30
+ "integrationArchitecture": { "$ref": "#/$defs/integrationArchitecture" },
31
+ "securityArchitecture": { "$ref": "#/$defs/securityArchitecture" },
32
+ "deploymentArchitecture": { "$ref": "#/$defs/deploymentArchitecture" },
33
+ "operationalConcerns": { "$ref": "#/$defs/operationalConcerns" },
34
+
35
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
36
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
37
+ },
38
+ "$defs": {
39
+ "systemOverview": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["executiveSummary", "systemPurpose", "architecturalApproach", "keyCapabilities"],
43
+ "properties": {
44
+ "executiveSummary": { "type": "string", "minLength": 1 },
45
+ "systemPurpose": { "type": "string", "minLength": 1 },
46
+ "architecturalApproach": { "type": "string", "minLength": 1 },
47
+ "keyCapabilities": {
48
+ "type": "array",
49
+ "minItems": 1,
50
+ "items": { "type": "string", "minLength": 1 }
51
+ }
52
+ }
53
+ },
54
+ "principle": {
55
+ "type": "object",
56
+ "additionalProperties": false,
57
+ "required": ["name", "description", "rationale"],
58
+ "properties": {
59
+ "name": { "type": "string", "minLength": 1 },
60
+ "description": { "type": "string", "minLength": 1 },
61
+ "rationale": { "type": "string", "minLength": 1 }
62
+ }
63
+ },
64
+ "dataArchitecture": {
65
+ "type": "object",
66
+ "additionalProperties": false,
67
+ "required": ["dataStores", "coreEntities"],
68
+ "properties": {
69
+ "dataStores": {
70
+ "type": "array",
71
+ "minItems": 1,
72
+ "items": {
73
+ "type": "object",
74
+ "additionalProperties": false,
75
+ "required": ["name", "kind"],
76
+ "properties": {
77
+ "name": { "type": "string", "minLength": 1 },
78
+ "kind": { "type": "string", "minLength": 1 },
79
+ "purpose": { "type": "string" }
80
+ }
81
+ }
82
+ },
83
+ "coreEntities": {
84
+ "type": "array",
85
+ "minItems": 1,
86
+ "items": {
87
+ "type": "object",
88
+ "additionalProperties": false,
89
+ "required": ["name"],
90
+ "properties": {
91
+ "name": { "type": "string", "minLength": 1 },
92
+ "description": { "type": "string" }
93
+ }
94
+ }
95
+ },
96
+ "dataFlow": { "type": "string" },
97
+ "retention": { "type": "string" }
98
+ }
99
+ },
100
+ "integrationArchitecture": {
101
+ "type": "object",
102
+ "additionalProperties": false,
103
+ "required": ["apiDesign"],
104
+ "properties": {
105
+ "apiDesign": { "type": "string", "minLength": 1 },
106
+ "externalSystems": {
107
+ "type": "array",
108
+ "items": {
109
+ "type": "object",
110
+ "additionalProperties": false,
111
+ "required": ["name"],
112
+ "properties": {
113
+ "name": { "type": "string", "minLength": 1 },
114
+ "purpose": { "type": "string" },
115
+ "protocol": { "type": "string" }
116
+ }
117
+ }
118
+ },
119
+ "eventModel": { "type": "string" }
120
+ }
121
+ },
122
+ "securityArchitecture": {
123
+ "type": "object",
124
+ "additionalProperties": false,
125
+ "required": ["authenticationPattern", "authorizationModel"],
126
+ "properties": {
127
+ "authenticationPattern": { "type": "string", "minLength": 1 },
128
+ "authorizationModel": { "type": "string", "minLength": 1 },
129
+ "secretsManagement": { "type": "string" },
130
+ "threatModel": { "type": "string" },
131
+ "complianceRequirements": {
132
+ "type": "array",
133
+ "items": { "type": "string" }
134
+ }
135
+ }
136
+ },
137
+ "deploymentArchitecture": {
138
+ "type": "object",
139
+ "additionalProperties": false,
140
+ "required": ["targetEnvironment"],
141
+ "properties": {
142
+ "targetEnvironment": { "type": "string", "minLength": 1 },
143
+ "topology": { "type": "string" },
144
+ "scaling": { "type": "string" },
145
+ "cicd": { "type": "string" }
146
+ }
147
+ },
148
+ "operationalConcerns": {
149
+ "type": "object",
150
+ "additionalProperties": false,
151
+ "required": ["healthChecks", "logging"],
152
+ "properties": {
153
+ "healthChecks": { "type": "string", "minLength": 1 },
154
+ "logging": { "type": "string", "minLength": 1 },
155
+ "metrics": { "type": "string" },
156
+ "alerting": { "type": "string" },
157
+ "backup": { "type": "string" },
158
+ "disasterRecovery": { "type": "string" }
159
+ }
160
+ }
161
+ }
162
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.2.0/test-suite.schema.json",
4
+ "title": "RCF Test Suite",
5
+ "description": "One file per Test Suite. Verifies one or more Acceptance Criteria (on the User Story identified by usId) via inline Test Cases. Test Suites hold the AC references; ACs stay clean of downstream references. Test-run status per TC is authored (Phase 3.7) and later derived from real test runs (Phase 6+).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "id",
10
+ "usId",
11
+ "title",
12
+ "purpose",
13
+ "testLevel",
14
+ "acIds",
15
+ "testCases",
16
+ "status",
17
+ "createdAt",
18
+ "updatedAt"
19
+ ],
20
+ "properties": {
21
+ "id": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tsId" },
22
+ "usId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/usId" },
23
+ "title": { "type": "string", "minLength": 1 },
24
+ "purpose": { "type": "string", "minLength": 1 },
25
+ "testLevel": { "enum": ["unit", "integration", "e2e", "contract", "manual"] },
26
+ "acIds": {
27
+ "type": "array",
28
+ "minItems": 1,
29
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/acId" }
30
+ },
31
+ "testCases": {
32
+ "type": "array",
33
+ "minItems": 0,
34
+ "items": { "$ref": "#/$defs/testCase" }
35
+ },
36
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
37
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
38
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
39
+ },
40
+ "$defs": {
41
+ "testCase": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": ["id", "acId", "description", "status"],
45
+ "properties": {
46
+ "id": {
47
+ "type": "string",
48
+ "pattern": "^TC-\\d{3}-[a-z0-9-]+$",
49
+ "description": "Test Case identifier. TS suffix (three digits) joined to a lowercase alphanumeric slug (hyphens allowed)."
50
+ },
51
+ "acId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/acId" },
52
+ "description": { "type": "string", "minLength": 1 },
53
+ "testPointer": {
54
+ "type": "string",
55
+ "description": "Optional pointer to the executable test, format: filePath::testName."
56
+ },
57
+ "status": { "enum": ["pending", "passing", "failing", "skipped"] }
58
+ }
59
+ }
60
+ }
61
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.2.0/user-story.schema.json",
4
+ "title": "RCF User Story",
5
+ "description": "User Story document. One file per US. Contains its Acceptance Criteria inline as acceptanceCriteria[].",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "usId",
10
+ "prdId",
11
+ "reqId",
12
+ "version",
13
+ "status",
14
+ "title",
15
+ "asA",
16
+ "iWant",
17
+ "soThat",
18
+ "acceptanceCriteria",
19
+ "createdAt",
20
+ "updatedAt"
21
+ ],
22
+ "properties": {
23
+ "usId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/usId" },
24
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
25
+ "reqId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/reqId" },
26
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
27
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
28
+ "title": { "type": "string", "minLength": 1 },
29
+ "description": { "type": "string" },
30
+ "asA": { "type": "string", "minLength": 1 },
31
+ "iWant": { "type": "string", "minLength": 1 },
32
+ "soThat": { "type": "string", "minLength": 1 },
33
+ "acceptanceCriteria": {
34
+ "type": "array",
35
+ "minItems": 1,
36
+ "items": { "$ref": "#/$defs/acceptanceCriterion" }
37
+ },
38
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
39
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
40
+ },
41
+ "$defs": {
42
+ "acceptanceCriterion": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "required": ["id", "description", "testable"],
46
+ "properties": {
47
+ "id": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/acId" },
48
+ "description": { "type": "string", "minLength": 1 },
49
+ "given": { "type": "string" },
50
+ "when": { "type": "string" },
51
+ "then": { "type": "string" },
52
+ "testable": { "type": "boolean" }
53
+ }
54
+ }
55
+ }
56
+ }