@namewta/speculo 2.0.3 → 2.0.5

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 (84) hide show
  1. package/package.json +1 -1
  2. package/template/canonical/canonical-specdev-goal-plan.md +2145 -1003
  3. package/template/canonical/canonical-specdev-grill-with-docs.md +1948 -506
  4. package/template/canonical/canonical-specdev-spec.md +2046 -604
  5. package/template/canonical/canonical-specdev-tickets.md +1978 -518
  6. package/template/canonical/canonical-specdev-wayfinder.md +2393 -951
  7. package/template/commands/git-history-squash/scripts/git-history-squash.mjs +4 -4
  8. package/template/references/coordination/coordination-contract.md +7 -5
  9. package/template/references/coordination/result-and-recovery.md +1 -1
  10. package/template/references/coordination/session-files.md +2 -2
  11. package/template/references/coordination/task-brief.md +4 -4
  12. package/template/references/retrospective/references/friction-taxonomy.md +1 -1
  13. package/template/references/writing-for-agents/references/project-skill-maintenance.md +29 -0
  14. package/template/references/writing-for-agents/writing-contract.md +2 -0
  15. package/template/workflows/specdev/SKILL.md +1 -1
  16. package/template/workflows/specdev/common/README.md +1 -1
  17. package/template/workflows/specdev/common/rules/artifact-contract.md +1 -1
  18. package/template/workflows/specdev/common/rules/change-completion.md +6 -6
  19. package/template/workflows/specdev/common/rules/domain-runtime.md +2 -2
  20. package/template/workflows/specdev/common/rules/evidence-and-verification.md +17 -34
  21. package/template/workflows/specdev/common/rules/execution-policy.md +24 -16
  22. package/template/workflows/specdev/common/rules/operating-governance.md +1 -1
  23. package/template/workflows/specdev/common/rules/parent-implementation-orchestration.md +4 -2
  24. package/template/workflows/specdev/common/rules/path-ownership.md +9 -7
  25. package/template/workflows/specdev/common/rules/workflow-routing.md +1 -1
  26. package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +6 -2
  27. package/template/workflows/specdev/common/schemas/execution-context.schema.json +67 -0
  28. package/template/workflows/specdev/common/schemas/execution-record.schema.json +154 -0
  29. package/template/workflows/specdev/common/schemas/goal-plan.schema.json +15 -55
  30. package/template/workflows/specdev/common/schemas/implementation-plan.schema.json +15 -55
  31. package/template/workflows/specdev/common/schemas/retro-approval.schema.json +44 -0
  32. package/template/workflows/specdev/common/schemas/retro-archive.schema.json +99 -0
  33. package/template/workflows/specdev/common/schemas/retro-execution.schema.json +112 -0
  34. package/template/workflows/specdev/common/schemas/retro-upgrade.schema.json +163 -0
  35. package/template/workflows/specdev/common/schemas/retrospective.schema.json +119 -14
  36. package/template/workflows/specdev/common/skills/code-review/references/review-evidence.md +2 -2
  37. package/template/workflows/specdev/common/skills/code-review/references/source-discovery.md +2 -0
  38. package/template/workflows/specdev/common/skills/code-review/references/working-tree-review.md +1 -1
  39. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +15 -34
  40. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +27 -56
  41. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +10 -54
  42. package/template/workflows/specdev/common/tools/README.md +10 -0
  43. package/template/workflows/specdev/common/tools/delivery-artifacts.mjs +4 -4
  44. package/template/workflows/specdev/common/tools/execution-context.mjs +104 -0
  45. package/template/workflows/specdev/common/tools/plan-contract.mjs +3 -1
  46. package/template/workflows/specdev/common/tools/review-evidence.mjs +2 -2
  47. package/template/workflows/specdev/common/tools/review-scope.mjs +4 -2
  48. package/template/workflows/specdev/common/tools/tests/engineering.test.mjs +2 -2
  49. package/template/workflows/specdev/common/tools/tests/review-fixture.mjs +4 -4
  50. package/template/workflows/specdev/common/tools/tests/review-working-tree.test.mjs +4 -3
  51. package/template/workflows/specdev/common/tools/ticket-control.mjs +17 -12
  52. package/template/workflows/specdev/common/tools/validate-retro.mjs +331 -0
  53. package/template/workflows/specdev/common/tools/validate-specdev.mjs +135 -105
  54. package/template/workflows/specdev/specdev-a-archive-and-consolidate/SKILL.md +2 -1
  55. package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/operation-contract.md +2 -0
  56. package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/retro-archive.md +27 -0
  57. package/template/workflows/specdev/specdev-c-code-review/SKILL.md +1 -1
  58. package/template/workflows/specdev/specdev-i-implement/SKILL.md +3 -3
  59. package/template/workflows/specdev/specdev-i-implement/assets/evidence-template.md +37 -29
  60. package/template/workflows/specdev/specdev-i-implement/references/execution-preflight.md +16 -16
  61. package/template/workflows/specdev/specdev-i-implement/references/implementation-procedure.md +21 -37
  62. package/template/workflows/specdev/specdev-i-implement/references/merge-conflict-protocol.md +8 -18
  63. package/template/workflows/specdev/specdev-p-goal-plan/SKILL.md +3 -3
  64. package/template/workflows/specdev/specdev-p-goal-plan/assets/goal-plan-template.md +23 -26
  65. package/template/workflows/specdev/specdev-p-goal-plan/references/completion-control.md +11 -14
  66. package/template/workflows/specdev/specdev-p-goal-plan/references/lead-orchestration.md +12 -33
  67. package/template/workflows/specdev/specdev-p-goal-plan/references/map-control.md +1 -1
  68. package/template/workflows/specdev/specdev-p-goal-plan/references/multi-change-plan.md +11 -16
  69. package/template/workflows/specdev/specdev-p-goal-plan/references/multi-conflict-and-drift.md +2 -2
  70. package/template/workflows/specdev/specdev-p-goal-plan/references/multi-execution-loop.md +6 -6
  71. package/template/workflows/specdev/specdev-p-goal-plan/references/orchestration-protocol.md +13 -44
  72. package/template/workflows/specdev/specdev-p-goal-plan/references/planning-modes.md +18 -25
  73. package/template/workflows/specdev/specdev-p-goal-plan/references/single-change-plan.md +16 -16
  74. package/template/workflows/specdev/specdev-r-retro/SKILL.md +15 -11
  75. package/template/workflows/specdev/specdev-r-retro/assets/retro-template.md +26 -14
  76. package/template/workflows/specdev/specdev-r-retro/assets/upgrade-plan-template.md +41 -0
  77. package/template/workflows/specdev/specdev-r-retro/references/development-retrospective.md +42 -0
  78. package/template/workflows/specdev/specdev-r-retro/references/records.md +47 -0
  79. package/template/workflows/specdev/specdev-r-retro/references/skill-upgrade.md +13 -0
  80. package/template/workflows/specdev/specdev-t-tickets/SKILL.md +2 -0
  81. package/template/workflows/specdev/specdev-t-tickets/assets/ticket-template.md +1 -1
  82. package/template/workflows/specdev/specdev-t-tickets/assets/tickets-map-template.md +6 -6
  83. package/template/workflows/specdev/specdev-t-tickets/references/planning-procedure.md +2 -2
  84. package/template/workflows/specdev/specdev-t-tickets/references/ticket-readiness.md +3 -3
@@ -0,0 +1,67 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:specdev:execution-context:v1",
4
+ "title": "SpecDev change Execution Context",
5
+ "type": "object",
6
+ "required": [
7
+ "schema_version",
8
+ "change",
9
+ "workspace_policy",
10
+ "workspace_ref",
11
+ "branch",
12
+ "base_sha",
13
+ "owner",
14
+ "ticket_execution"
15
+ ],
16
+ "properties": {
17
+ "schema_version": {
18
+ "const": 1
19
+ },
20
+ "change": {
21
+ "type": "string",
22
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
23
+ },
24
+ "workspace_policy": {
25
+ "enum": [
26
+ "current",
27
+ "worktree"
28
+ ]
29
+ },
30
+ "workspace_ref": {
31
+ "type": "string",
32
+ "minLength": 1
33
+ },
34
+ "branch": {
35
+ "type": "string",
36
+ "minLength": 1
37
+ },
38
+ "base_sha": {
39
+ "type": "string",
40
+ "pattern": "^[a-f0-9]{40}(?:[a-f0-9]{24})?$"
41
+ },
42
+ "owner": {
43
+ "type": "string",
44
+ "minLength": 1
45
+ },
46
+ "ticket_execution": {
47
+ "enum": [
48
+ "auto",
49
+ "serial",
50
+ "parallel"
51
+ ]
52
+ },
53
+ "max_parallel_tickets": {
54
+ "type": "integer",
55
+ "minimum": 1
56
+ },
57
+ "concurrent_implementation_limit": {
58
+ "type": "integer",
59
+ "minimum": 1
60
+ },
61
+ "integration_attempt_limit": {
62
+ "type": "integer",
63
+ "minimum": 1
64
+ }
65
+ },
66
+ "additionalProperties": false
67
+ }
@@ -0,0 +1,154 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:specdev:execution-record:v1",
4
+ "title": "SpecDev execution evidence",
5
+ "type": "object",
6
+ "required": [
7
+ "schema_version",
8
+ "workspace_context",
9
+ "implementation_owners",
10
+ "status",
11
+ "checkpoint",
12
+ "verification",
13
+ "attempts"
14
+ ],
15
+ "additionalProperties": false,
16
+ "properties": {
17
+ "schema_version": {
18
+ "const": 1
19
+ },
20
+ "ticket_id": {
21
+ "type": "string",
22
+ "pattern": "^T-\\d{2,}$"
23
+ },
24
+ "purpose": {
25
+ "const": "direct-spec"
26
+ },
27
+ "change": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "workspace_context": {
32
+ "const": "README.md#execution-context"
33
+ },
34
+ "implementation_owners": {
35
+ "type": "array",
36
+ "minItems": 1,
37
+ "uniqueItems": true,
38
+ "items": {
39
+ "type": "string",
40
+ "minLength": 1
41
+ }
42
+ },
43
+ "status": {
44
+ "enum": [
45
+ "active",
46
+ "review",
47
+ "verified",
48
+ "blocked",
49
+ "cancelled"
50
+ ]
51
+ },
52
+ "checkpoint": {
53
+ "type": [
54
+ "string",
55
+ "null"
56
+ ]
57
+ },
58
+ "attempts": {
59
+ "type": "integer",
60
+ "minimum": 0
61
+ },
62
+ "verification": {
63
+ "type": "object",
64
+ "required": [
65
+ "status",
66
+ "evidence",
67
+ "e2e"
68
+ ],
69
+ "properties": {
70
+ "status": {
71
+ "enum": [
72
+ "pending",
73
+ "passed",
74
+ "failed"
75
+ ]
76
+ },
77
+ "evidence": {
78
+ "type": [
79
+ "string",
80
+ "null"
81
+ ]
82
+ },
83
+ "e2e": {
84
+ "type": "object",
85
+ "required": [
86
+ "required",
87
+ "status",
88
+ "reason",
89
+ "evidence"
90
+ ],
91
+ "properties": {
92
+ "required": {
93
+ "type": "boolean"
94
+ },
95
+ "status": {
96
+ "enum": [
97
+ "pending",
98
+ "passed",
99
+ "failed",
100
+ "not-required"
101
+ ]
102
+ },
103
+ "reason": {
104
+ "type": [
105
+ "string",
106
+ "null"
107
+ ]
108
+ },
109
+ "evidence": {
110
+ "type": [
111
+ "string",
112
+ "null"
113
+ ]
114
+ }
115
+ },
116
+ "additionalProperties": false
117
+ }
118
+ },
119
+ "additionalProperties": false
120
+ }
121
+ },
122
+ "oneOf": [
123
+ {
124
+ "required": [
125
+ "ticket_id"
126
+ ],
127
+ "not": {
128
+ "anyOf": [
129
+ {
130
+ "required": [
131
+ "purpose"
132
+ ]
133
+ },
134
+ {
135
+ "required": [
136
+ "change"
137
+ ]
138
+ }
139
+ ]
140
+ }
141
+ },
142
+ {
143
+ "required": [
144
+ "purpose",
145
+ "change"
146
+ ],
147
+ "not": {
148
+ "required": [
149
+ "ticket_id"
150
+ ]
151
+ }
152
+ }
153
+ ]
154
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "urn:speculo:specdev:goal-plan:v7",
3
+ "$id": "urn:speculo:specdev:goal-plan:v8",
4
4
  "title": "SpecDev Goal Plan Frontmatter",
5
5
  "type": "object",
6
6
  "required": [
@@ -11,15 +11,13 @@
11
11
  "modes",
12
12
  "orchestration",
13
13
  "lead",
14
- "concurrent_implementation_limit",
15
14
  "integration_attempt_limit",
16
- "ticket_workspace_policy",
17
- "integration_gate",
18
- "ready_for_execution"
15
+ "ready_for_execution",
16
+ "ticket_execution"
19
17
  ],
20
18
  "properties": {
21
19
  "schema_version": {
22
- "const": 7
20
+ "const": 8
23
21
  },
24
22
  "artifact": {
25
23
  "const": "goal-plan"
@@ -64,61 +62,23 @@
64
62
  "type": "integer",
65
63
  "minimum": 1
66
64
  },
67
- "ticket_workspace_policy": {
68
- "enum": [
69
- "current",
70
- "required"
71
- ]
65
+ "ready_for_execution": {
66
+ "type": "boolean"
72
67
  },
73
- "integration_gate": {
68
+ "ticket_execution": {
74
69
  "enum": [
75
- "direct-parent",
76
- "candidate-merge"
77
- ]
70
+ "auto",
71
+ "serial",
72
+ "parallel"
73
+ ],
74
+ "default": "auto"
78
75
  },
79
- "ready_for_execution": {
80
- "type": "boolean"
76
+ "max_parallel_tickets": {
77
+ "type": "integer",
78
+ "minimum": 1
81
79
  }
82
80
  },
83
81
  "allOf": [
84
- {
85
- "if": {
86
- "properties": {
87
- "ticket_workspace_policy": {
88
- "const": "current"
89
- }
90
- },
91
- "required": [
92
- "ticket_workspace_policy"
93
- ]
94
- },
95
- "then": {
96
- "properties": {
97
- "integration_gate": {
98
- "const": "direct-parent"
99
- }
100
- }
101
- }
102
- },
103
- {
104
- "if": {
105
- "properties": {
106
- "ticket_workspace_policy": {
107
- "const": "required"
108
- }
109
- },
110
- "required": [
111
- "ticket_workspace_policy"
112
- ]
113
- },
114
- "then": {
115
- "properties": {
116
- "integration_gate": {
117
- "const": "candidate-merge"
118
- }
119
- }
120
- }
121
- },
122
82
  {
123
83
  "if": {
124
84
  "properties": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "urn:speculo:specdev:implementation-plan:v2",
3
+ "$id": "urn:speculo:specdev:implementation-plan:v3",
4
4
  "title": "SpecDev Parent Implementation Plan Frontmatter",
5
5
  "type": "object",
6
6
  "required": [
@@ -11,15 +11,13 @@
11
11
  "source_map_revision",
12
12
  "orchestration",
13
13
  "lead",
14
- "concurrent_implementation_limit",
15
14
  "integration_attempt_limit",
16
- "ticket_workspace_policy",
17
- "integration_gate",
18
- "ready_for_execution"
15
+ "ready_for_execution",
16
+ "ticket_execution"
19
17
  ],
20
18
  "properties": {
21
19
  "schema_version": {
22
- "const": 2
20
+ "const": 3
23
21
  },
24
22
  "artifact": {
25
23
  "const": "implementation-plan"
@@ -55,61 +53,23 @@
55
53
  "type": "integer",
56
54
  "minimum": 1
57
55
  },
58
- "ticket_workspace_policy": {
59
- "enum": [
60
- "current",
61
- "required"
62
- ]
56
+ "ready_for_execution": {
57
+ "type": "boolean"
63
58
  },
64
- "integration_gate": {
59
+ "ticket_execution": {
65
60
  "enum": [
66
- "direct-parent",
67
- "candidate-merge"
68
- ]
61
+ "auto",
62
+ "serial",
63
+ "parallel"
64
+ ],
65
+ "default": "auto"
69
66
  },
70
- "ready_for_execution": {
71
- "type": "boolean"
67
+ "max_parallel_tickets": {
68
+ "type": "integer",
69
+ "minimum": 1
72
70
  }
73
71
  },
74
72
  "allOf": [
75
- {
76
- "if": {
77
- "properties": {
78
- "ticket_workspace_policy": {
79
- "const": "current"
80
- }
81
- },
82
- "required": [
83
- "ticket_workspace_policy"
84
- ]
85
- },
86
- "then": {
87
- "properties": {
88
- "integration_gate": {
89
- "const": "direct-parent"
90
- }
91
- }
92
- }
93
- },
94
- {
95
- "if": {
96
- "properties": {
97
- "ticket_workspace_policy": {
98
- "const": "required"
99
- }
100
- },
101
- "required": [
102
- "ticket_workspace_policy"
103
- ]
104
- },
105
- "then": {
106
- "properties": {
107
- "integration_gate": {
108
- "const": "candidate-merge"
109
- }
110
- }
111
- }
112
- },
113
73
  {
114
74
  "if": {
115
75
  "properties": {
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:specdev:retro-approval:v1",
4
+ "type": "object",
5
+ "required": [
6
+ "schema_version",
7
+ "source",
8
+ "snapshot",
9
+ "sha256",
10
+ "quote",
11
+ "confirmed_at",
12
+ "plan_sha256"
13
+ ],
14
+ "properties": {
15
+ "schema_version": {
16
+ "const": 1
17
+ },
18
+ "source": {
19
+ "type": "string",
20
+ "minLength": 1
21
+ },
22
+ "snapshot": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ },
26
+ "sha256": {
27
+ "type": "string",
28
+ "pattern": "^[a-f0-9]{64}$"
29
+ },
30
+ "quote": {
31
+ "type": "string",
32
+ "minLength": 1
33
+ },
34
+ "confirmed_at": {
35
+ "type": "string",
36
+ "format": "date-time"
37
+ },
38
+ "plan_sha256": {
39
+ "type": "string",
40
+ "pattern": "^[a-f0-9]{64}$"
41
+ }
42
+ },
43
+ "additionalProperties": false
44
+ }
@@ -0,0 +1,99 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:specdev:retro-archive:v1",
4
+ "type": "object",
5
+ "required": [
6
+ "schema_version",
7
+ "id",
8
+ "owner",
9
+ "upgrade",
10
+ "source",
11
+ "target",
12
+ "plan_sha256",
13
+ "approval_sha256",
14
+ "result",
15
+ "time",
16
+ "entries"
17
+ ],
18
+ "properties": {
19
+ "schema_version": {
20
+ "const": 1
21
+ },
22
+ "id": {
23
+ "type": "string",
24
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
25
+ },
26
+ "owner": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "upgrade": {
31
+ "type": "string",
32
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
33
+ },
34
+ "source": {
35
+ "type": "string",
36
+ "minLength": 1
37
+ },
38
+ "target": {
39
+ "type": "string",
40
+ "minLength": 1
41
+ },
42
+ "plan_sha256": {
43
+ "type": "string",
44
+ "pattern": "^[a-f0-9]{64}$"
45
+ },
46
+ "approval_sha256": {
47
+ "type": "string",
48
+ "pattern": "^[a-f0-9]{64}$"
49
+ },
50
+ "result": {
51
+ "enum": [
52
+ "moved",
53
+ "verified"
54
+ ]
55
+ },
56
+ "time": {
57
+ "type": "string",
58
+ "format": "date-time"
59
+ },
60
+ "entries": {
61
+ "type": "array",
62
+ "items": {
63
+ "type": "object",
64
+ "required": [
65
+ "path",
66
+ "type",
67
+ "mode"
68
+ ],
69
+ "properties": {
70
+ "path": {
71
+ "type": "string",
72
+ "minLength": 1
73
+ },
74
+ "type": {
75
+ "enum": [
76
+ "file",
77
+ "directory",
78
+ "symlink"
79
+ ]
80
+ },
81
+ "mode": {
82
+ "type": "integer"
83
+ },
84
+ "sha256": {
85
+ "type": "string",
86
+ "pattern": "^[a-f0-9]{64}$"
87
+ },
88
+ "target": {
89
+ "type": "string",
90
+ "minLength": 1
91
+ }
92
+ },
93
+ "additionalProperties": false
94
+ },
95
+ "minItems": 1
96
+ }
97
+ },
98
+ "additionalProperties": false
99
+ }
@@ -0,0 +1,112 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:specdev:retro-execution:v1",
4
+ "type": "object",
5
+ "required": [
6
+ "schema_version",
7
+ "plan_sha256",
8
+ "approval_sha256",
9
+ "status",
10
+ "results"
11
+ ],
12
+ "properties": {
13
+ "schema_version": {
14
+ "const": 1
15
+ },
16
+ "plan_sha256": {
17
+ "type": "string",
18
+ "pattern": "^[a-f0-9]{64}$"
19
+ },
20
+ "approval_sha256": {
21
+ "type": "string",
22
+ "pattern": "^[a-f0-9]{64}$"
23
+ },
24
+ "status": {
25
+ "enum": [
26
+ "applying",
27
+ "blocked",
28
+ "verified"
29
+ ]
30
+ },
31
+ "results": {
32
+ "type": "array",
33
+ "items": {
34
+ "type": "object",
35
+ "required": [
36
+ "path",
37
+ "result",
38
+ "sha256",
39
+ "evidence",
40
+ "evidence_sha256",
41
+ "method",
42
+ "observed",
43
+ "command",
44
+ "exit"
45
+ ],
46
+ "properties": {
47
+ "path": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ },
51
+ "result": {
52
+ "enum": [
53
+ "passed",
54
+ "failed",
55
+ "pending"
56
+ ]
57
+ },
58
+ "sha256": {
59
+ "anyOf": [
60
+ {
61
+ "type": "string",
62
+ "pattern": "^[a-f0-9]{64}$"
63
+ },
64
+ {
65
+ "type": "null"
66
+ }
67
+ ]
68
+ },
69
+ "evidence": {
70
+ "type": "string",
71
+ "minLength": 1
72
+ },
73
+ "evidence_sha256": {
74
+ "type": "string",
75
+ "pattern": "^[a-f0-9]{64}$"
76
+ },
77
+ "method": {
78
+ "type": "string",
79
+ "minLength": 1
80
+ },
81
+ "observed": {
82
+ "type": "string",
83
+ "minLength": 1
84
+ },
85
+ "command": {
86
+ "anyOf": [
87
+ {
88
+ "type": "string",
89
+ "minLength": 1
90
+ },
91
+ {
92
+ "type": "null"
93
+ }
94
+ ]
95
+ },
96
+ "exit": {
97
+ "anyOf": [
98
+ {
99
+ "type": "integer"
100
+ },
101
+ {
102
+ "type": "null"
103
+ }
104
+ ]
105
+ }
106
+ },
107
+ "additionalProperties": false
108
+ }
109
+ }
110
+ },
111
+ "additionalProperties": false
112
+ }