@moreih29/nexus-core 0.1.1 → 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 (43) hide show
  1. package/README.md +4 -3
  2. package/agents/architect/body.md +7 -6
  3. package/agents/designer/body.md +3 -3
  4. package/agents/engineer/body.md +8 -8
  5. package/agents/postdoc/body.md +4 -4
  6. package/agents/researcher/body.md +4 -4
  7. package/agents/reviewer/body.md +2 -2
  8. package/agents/strategist/body.md +4 -4
  9. package/agents/tester/body.md +2 -2
  10. package/agents/writer/body.md +1 -1
  11. package/conformance/README.md +125 -0
  12. package/conformance/scenarios/full-plan-cycle.json +132 -0
  13. package/conformance/scenarios/task-deps-ordering.json +83 -0
  14. package/conformance/schema/fixture.schema.json +224 -0
  15. package/conformance/state-schemas/agent-tracker.schema.json +58 -0
  16. package/conformance/state-schemas/history.schema.json +124 -0
  17. package/conformance/state-schemas/plan.schema.json +72 -0
  18. package/conformance/state-schemas/runtime.schema.json +25 -0
  19. package/conformance/state-schemas/tasks.schema.json +93 -0
  20. package/conformance/tools/plan-decide.json +70 -0
  21. package/conformance/tools/plan-start.json +67 -0
  22. package/conformance/tools/task-add.json +73 -0
  23. package/conformance/tools/task-close.json +98 -0
  24. package/docs/behavioral-contracts.md +145 -0
  25. package/docs/consumer-implementation-guide.md +844 -0
  26. package/docs/nexus-layout.md +234 -0
  27. package/docs/nexus-state-overview.md +185 -0
  28. package/docs/nexus-tools-contract.md +427 -0
  29. package/manifest.json +124 -111
  30. package/package.json +5 -1
  31. package/schema/common.schema.json +0 -4
  32. package/schema/skill.schema.json +16 -1
  33. package/schema/vocabulary.schema.json +14 -9
  34. package/skills/nx-init/body.md +6 -9
  35. package/skills/nx-init/meta.yml +1 -0
  36. package/skills/nx-plan/body.md +14 -11
  37. package/skills/nx-plan/meta.yml +3 -0
  38. package/skills/nx-run/body.md +4 -4
  39. package/skills/nx-run/meta.yml +3 -0
  40. package/skills/nx-setup/body.md +9 -9
  41. package/skills/nx-setup/meta.yml +1 -0
  42. package/skills/nx-sync/meta.yml +1 -0
  43. package/vocabulary/capabilities.yml +58 -25
@@ -0,0 +1,224 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "fixture.schema.json",
4
+ "title": "Nexus Conformance Test Fixture",
5
+ "description": "Declarative test case for Nexus MCP tool behavioral verification",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["test_id", "description"],
9
+ "properties": {
10
+ "test_id": {
11
+ "type": "string",
12
+ "pattern": "^[a-z][a-z0-9_-]*$",
13
+ "description": "Unique identifier for this fixture, used for reporting"
14
+ },
15
+ "description": {
16
+ "type": "string",
17
+ "minLength": 10,
18
+ "description": "Human-readable description of what behavior this fixture verifies"
19
+ },
20
+ "precondition": {
21
+ "type": "object",
22
+ "description": "State that must be established before the action or steps are executed",
23
+ "additionalProperties": false,
24
+ "properties": {
25
+ "state_files": {
26
+ "type": "object",
27
+ "description": "Map of file path → content object (null means the file must not exist)",
28
+ "additionalProperties": {
29
+ "oneOf": [
30
+ { "type": "object" },
31
+ { "type": "null" }
32
+ ]
33
+ }
34
+ }
35
+ }
36
+ },
37
+ "action": {
38
+ "$ref": "#/$defs/action",
39
+ "description": "Single tool invocation — use for single-action fixtures; omit when using steps"
40
+ },
41
+ "steps": {
42
+ "type": "array",
43
+ "description": "Ordered sequence of tool invocations with per-step assertions — use for multi-step scenarios",
44
+ "minItems": 1,
45
+ "items": { "$ref": "#/$defs/step" }
46
+ },
47
+ "postcondition": {
48
+ "$ref": "#/$defs/postcondition",
49
+ "description": "Assertions evaluated after the action (or all steps) complete"
50
+ }
51
+ },
52
+ "$defs": {
53
+ "action": {
54
+ "type": "object",
55
+ "description": "A single tool invocation",
56
+ "additionalProperties": false,
57
+ "required": ["tool", "params"],
58
+ "properties": {
59
+ "tool": {
60
+ "type": "string",
61
+ "description": "Abstract tool name (e.g. plan_start, task_add). Must not include harness-specific prefixes."
62
+ },
63
+ "params": {
64
+ "type": "object",
65
+ "description": "Input parameters passed verbatim to the tool"
66
+ }
67
+ }
68
+ },
69
+ "postcondition": {
70
+ "type": "object",
71
+ "description": "Assertions on the state and return value after the action completes",
72
+ "additionalProperties": false,
73
+ "properties": {
74
+ "state_files": {
75
+ "type": "object",
76
+ "description": "Map of file path → assertion object (null means the file must not exist after the action)",
77
+ "additionalProperties": {
78
+ "oneOf": [
79
+ {
80
+ "type": "object",
81
+ "description": "JSONPath assertions on the file content. Keys are JSONPath expressions, values are expected values or matcher objects.",
82
+ "additionalProperties": {
83
+ "oneOf": [
84
+ { "type": "string" },
85
+ { "type": "number" },
86
+ { "type": "boolean" },
87
+ { "type": "null" },
88
+ {
89
+ "type": "object",
90
+ "description": "Matcher object for type checks and range assertions",
91
+ "required": ["type"],
92
+ "properties": {
93
+ "type": {
94
+ "type": "string",
95
+ "enum": ["iso8601", "string", "number", "boolean"],
96
+ "description": "Expected value type"
97
+ },
98
+ "min": {
99
+ "type": "number",
100
+ "description": "Minimum numeric value (for type: number)"
101
+ },
102
+ "max": {
103
+ "type": "number",
104
+ "description": "Maximum numeric value (for type: number)"
105
+ },
106
+ "minLength": {
107
+ "type": "number",
108
+ "description": "Minimum string length (for type: string)"
109
+ },
110
+ "pattern": {
111
+ "type": "string",
112
+ "description": "Regex pattern the value must match (for type: string)"
113
+ }
114
+ }
115
+ }
116
+ ]
117
+ }
118
+ },
119
+ { "type": "null" }
120
+ ]
121
+ }
122
+ },
123
+ "return_value": {
124
+ "type": "object",
125
+ "description": "JSONPath assertions on the tool return value. Same assertion syntax as state_files entries.",
126
+ "additionalProperties": {
127
+ "oneOf": [
128
+ { "type": "string" },
129
+ { "type": "number" },
130
+ { "type": "boolean" },
131
+ { "type": "null" },
132
+ {
133
+ "type": "object",
134
+ "required": ["type"],
135
+ "properties": {
136
+ "type": { "type": "string", "enum": ["iso8601", "string", "number", "boolean"] },
137
+ "min": { "type": "number" },
138
+ "max": { "type": "number" },
139
+ "minLength": { "type": "number" },
140
+ "pattern": { "type": "string" }
141
+ }
142
+ }
143
+ ]
144
+ }
145
+ },
146
+ "error": {
147
+ "type": "boolean",
148
+ "description": "If true, the action must produce an error response"
149
+ },
150
+ "error_contains": {
151
+ "type": "string",
152
+ "description": "The error message must contain this substring (implies error: true)"
153
+ }
154
+ }
155
+ },
156
+ "step": {
157
+ "type": "object",
158
+ "description": "One step in a multi-step scenario",
159
+ "additionalProperties": false,
160
+ "required": ["action"],
161
+ "properties": {
162
+ "description": {
163
+ "type": "string",
164
+ "description": "Optional human-readable label for this step"
165
+ },
166
+ "action": { "$ref": "#/$defs/action" },
167
+ "assert_return": {
168
+ "type": "object",
169
+ "description": "JSONPath assertions on the return value of this step's action",
170
+ "additionalProperties": {
171
+ "oneOf": [
172
+ { "type": "string" },
173
+ { "type": "number" },
174
+ { "type": "boolean" },
175
+ { "type": "null" },
176
+ {
177
+ "type": "object",
178
+ "required": ["type"],
179
+ "properties": {
180
+ "type": { "type": "string", "enum": ["iso8601", "string", "number", "boolean"] },
181
+ "min": { "type": "number" },
182
+ "max": { "type": "number" },
183
+ "minLength": { "type": "number" },
184
+ "pattern": { "type": "string" }
185
+ }
186
+ }
187
+ ]
188
+ }
189
+ },
190
+ "assert_state": {
191
+ "type": "object",
192
+ "description": "Map of file path → assertions on state files after this step completes. null means file must not exist.",
193
+ "additionalProperties": {
194
+ "oneOf": [
195
+ {
196
+ "type": "object",
197
+ "additionalProperties": {
198
+ "oneOf": [
199
+ { "type": "string" },
200
+ { "type": "number" },
201
+ { "type": "boolean" },
202
+ { "type": "null" },
203
+ {
204
+ "type": "object",
205
+ "required": ["type"],
206
+ "properties": {
207
+ "type": { "type": "string", "enum": ["iso8601", "string", "number", "boolean"] },
208
+ "min": { "type": "number" },
209
+ "max": { "type": "number" },
210
+ "minLength": { "type": "number" },
211
+ "pattern": { "type": "string" }
212
+ }
213
+ }
214
+ ]
215
+ }
216
+ },
217
+ { "type": "null" }
218
+ ]
219
+ }
220
+ }
221
+ }
222
+ }
223
+ }
224
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "conformance/state-schemas/agent-tracker.schema.json",
4
+ "title": "Nexus Agent Tracker",
5
+ "description": "Schema for .nexus/state/agent-tracker.json — registry of spawned agent instances tracked across a session",
6
+ "type": "array",
7
+ "items": {
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "required": ["agent_type", "agent_id", "started_at", "resume_count", "status"],
11
+ "properties": {
12
+ "agent_type": {
13
+ "type": "string",
14
+ "minLength": 1,
15
+ "description": "Qualified agent type identifier (e.g. 'claude-nexus:engineer')"
16
+ },
17
+ "agent_id": {
18
+ "type": "string",
19
+ "minLength": 1,
20
+ "description": "Unique agent instance identifier (UUID)"
21
+ },
22
+ "started_at": {
23
+ "type": "string",
24
+ "format": "date-time",
25
+ "description": "ISO 8601 timestamp when this agent instance was first started"
26
+ },
27
+ "last_resumed_at": {
28
+ "type": "string",
29
+ "format": "date-time",
30
+ "description": "ISO 8601 timestamp of the most recent resume, if the agent has been resumed"
31
+ },
32
+ "resume_count": {
33
+ "type": "number",
34
+ "minimum": 0,
35
+ "description": "Number of times this agent instance has been resumed"
36
+ },
37
+ "status": {
38
+ "type": "string",
39
+ "enum": ["running", "completed"],
40
+ "description": "Current lifecycle status of the agent instance"
41
+ },
42
+ "stopped_at": {
43
+ "type": "string",
44
+ "format": "date-time",
45
+ "description": "ISO 8601 timestamp when the agent completed or was stopped"
46
+ },
47
+ "last_message": {
48
+ "type": "string",
49
+ "description": "Last recorded output or status message from the agent"
50
+ },
51
+ "files_touched": {
52
+ "type": "array",
53
+ "items": { "type": "string" },
54
+ "description": "Paths of files created or modified by this agent instance"
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,124 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "conformance/state-schemas/history.schema.json",
4
+ "title": "Nexus History",
5
+ "description": "Schema for .nexus/history.json — append-only log of completed plan/execution cycles",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["cycles"],
9
+ "properties": {
10
+ "cycles": {
11
+ "type": "array",
12
+ "description": "Chronologically ordered list of completed execution cycles",
13
+ "items": {
14
+ "type": "object",
15
+ "additionalProperties": false,
16
+ "required": ["completed_at", "branch", "plan", "tasks"],
17
+ "properties": {
18
+ "completed_at": {
19
+ "type": "string",
20
+ "format": "date-time",
21
+ "description": "ISO 8601 timestamp when this cycle was closed"
22
+ },
23
+ "branch": {
24
+ "type": "string",
25
+ "minLength": 1,
26
+ "description": "Git branch active during this cycle"
27
+ },
28
+ "plan": {
29
+ "oneOf": [
30
+ { "$ref": "#/$defs/planFile" },
31
+ { "type": "null" }
32
+ ],
33
+ "description": "Snapshot of the plan at cycle completion, or null if no plan was active"
34
+ },
35
+ "tasks": {
36
+ "type": "array",
37
+ "description": "Snapshot of all tasks at cycle completion",
38
+ "items": { "$ref": "#/$defs/task" }
39
+ }
40
+ }
41
+ }
42
+ }
43
+ },
44
+ "$defs": {
45
+ "planFile": {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": ["id", "topic", "issues", "created_at"],
49
+ "properties": {
50
+ "id": {
51
+ "type": "number",
52
+ "minimum": 1
53
+ },
54
+ "topic": {
55
+ "type": "string",
56
+ "minLength": 1
57
+ },
58
+ "issues": {
59
+ "type": "array",
60
+ "items": {
61
+ "type": "object",
62
+ "additionalProperties": false,
63
+ "required": ["id", "title", "status"],
64
+ "properties": {
65
+ "id": { "type": "number", "minimum": 1 },
66
+ "title": { "type": "string", "minLength": 1 },
67
+ "status": { "type": "string", "enum": ["pending", "decided"] },
68
+ "decision": { "type": "string" },
69
+ "how_agents": {
70
+ "type": "array",
71
+ "items": { "type": "string" }
72
+ },
73
+ "how_summary": {
74
+ "type": "object",
75
+ "additionalProperties": { "type": "string" }
76
+ },
77
+ "how_agent_ids": {
78
+ "type": "object",
79
+ "additionalProperties": { "type": "string" }
80
+ }
81
+ }
82
+ }
83
+ },
84
+ "research_summary": { "type": "string" },
85
+ "created_at": {
86
+ "type": "string",
87
+ "format": "date-time"
88
+ }
89
+ }
90
+ },
91
+ "task": {
92
+ "type": "object",
93
+ "additionalProperties": false,
94
+ "required": ["id", "title", "context", "status", "deps"],
95
+ "properties": {
96
+ "id": { "type": "number", "minimum": 1 },
97
+ "title": { "type": "string", "minLength": 1 },
98
+ "context": { "type": "string", "minLength": 1 },
99
+ "approach": { "type": "string" },
100
+ "acceptance": { "type": "string" },
101
+ "risk": { "type": "string" },
102
+ "status": {
103
+ "type": "string",
104
+ "enum": ["pending", "in_progress", "completed"]
105
+ },
106
+ "deps": {
107
+ "type": "array",
108
+ "items": { "type": "number" }
109
+ },
110
+ "plan_issue": { "type": "number" },
111
+ "owner": { "type": "string" },
112
+ "owner_agent_id": { "type": "string" },
113
+ "owner_reuse_policy": {
114
+ "type": "string",
115
+ "enum": ["fresh", "resume_if_same_artifact", "resume"]
116
+ },
117
+ "created_at": {
118
+ "type": "string",
119
+ "format": "date-time"
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "conformance/state-schemas/plan.schema.json",
4
+ "title": "Nexus Plan State",
5
+ "description": "Schema for .nexus/state/plan.json — the active plan produced by nx-plan and consumed by MCP tools",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["id", "topic", "issues", "created_at"],
9
+ "properties": {
10
+ "id": {
11
+ "type": "number",
12
+ "minimum": 1,
13
+ "description": "Monotonically increasing plan identifier"
14
+ },
15
+ "topic": {
16
+ "type": "string",
17
+ "minLength": 1,
18
+ "description": "Human-readable topic or goal of this plan"
19
+ },
20
+ "issues": {
21
+ "type": "array",
22
+ "description": "Ordered list of issues analyzed during planning",
23
+ "items": {
24
+ "type": "object",
25
+ "additionalProperties": false,
26
+ "required": ["id", "title", "status"],
27
+ "properties": {
28
+ "id": {
29
+ "type": "number",
30
+ "minimum": 1
31
+ },
32
+ "title": {
33
+ "type": "string",
34
+ "minLength": 1
35
+ },
36
+ "status": {
37
+ "type": "string",
38
+ "enum": ["pending", "decided"]
39
+ },
40
+ "decision": {
41
+ "type": "string",
42
+ "description": "The recorded decision; present when status is 'decided'"
43
+ },
44
+ "how_agents": {
45
+ "type": "array",
46
+ "items": { "type": "string" },
47
+ "description": "Agent types consulted for this issue"
48
+ },
49
+ "how_summary": {
50
+ "type": "object",
51
+ "additionalProperties": { "type": "string" },
52
+ "description": "Key/value map of per-agent analysis summaries"
53
+ },
54
+ "how_agent_ids": {
55
+ "type": "object",
56
+ "additionalProperties": { "type": "string" },
57
+ "description": "Key/value map of agent type to agent instance ID"
58
+ }
59
+ }
60
+ }
61
+ },
62
+ "research_summary": {
63
+ "type": "string",
64
+ "description": "Optional background research summary compiled during planning"
65
+ },
66
+ "created_at": {
67
+ "type": "string",
68
+ "format": "date-time",
69
+ "description": "ISO 8601 timestamp when this plan was created"
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "conformance/state-schemas/runtime.schema.json",
4
+ "title": "Nexus Runtime State",
5
+ "description": "Schema for .nexus/state/runtime.json — ephemeral runtime configuration written by the harness at session start",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["teams_enabled", "session_started_at", "plugin_version"],
9
+ "properties": {
10
+ "teams_enabled": {
11
+ "type": "boolean",
12
+ "description": "Whether multi-agent team orchestration is active in this session"
13
+ },
14
+ "session_started_at": {
15
+ "type": "string",
16
+ "format": "date-time",
17
+ "description": "ISO 8601 timestamp when the current harness session was started"
18
+ },
19
+ "plugin_version": {
20
+ "type": "string",
21
+ "minLength": 1,
22
+ "description": "Version string of the harness plugin that wrote this file"
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "conformance/state-schemas/tasks.schema.json",
4
+ "title": "Nexus Tasks State",
5
+ "description": "Schema for .nexus/state/tasks.json — the task list produced by nx-plan and mutated by MCP tools during nx-run",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["goal", "decisions", "tasks"],
9
+ "properties": {
10
+ "goal": {
11
+ "type": "string",
12
+ "minLength": 1,
13
+ "description": "High-level goal statement for the current execution cycle"
14
+ },
15
+ "decisions": {
16
+ "type": "array",
17
+ "items": { "type": "string" },
18
+ "description": "Key decisions carried forward from planning that constrain execution"
19
+ },
20
+ "tasks": {
21
+ "type": "array",
22
+ "description": "Ordered list of tasks to be executed",
23
+ "items": {
24
+ "$ref": "#/$defs/task"
25
+ }
26
+ }
27
+ },
28
+ "$defs": {
29
+ "task": {
30
+ "type": "object",
31
+ "additionalProperties": false,
32
+ "required": ["id", "title", "context", "status", "deps"],
33
+ "properties": {
34
+ "id": {
35
+ "type": "number",
36
+ "minimum": 1
37
+ },
38
+ "title": {
39
+ "type": "string",
40
+ "minLength": 1
41
+ },
42
+ "context": {
43
+ "type": "string",
44
+ "minLength": 1,
45
+ "description": "Background context and motivation for this task"
46
+ },
47
+ "approach": {
48
+ "type": "string",
49
+ "description": "Implementation approach guidance"
50
+ },
51
+ "acceptance": {
52
+ "type": "string",
53
+ "description": "Acceptance criteria for task completion"
54
+ },
55
+ "risk": {
56
+ "type": "string",
57
+ "description": "Known risks or concerns"
58
+ },
59
+ "status": {
60
+ "type": "string",
61
+ "enum": ["pending", "in_progress", "completed"]
62
+ },
63
+ "deps": {
64
+ "type": "array",
65
+ "items": { "type": "number" },
66
+ "description": "Task IDs that must complete before this task can start"
67
+ },
68
+ "plan_issue": {
69
+ "type": "number",
70
+ "description": "ID of the plan issue that originated this task"
71
+ },
72
+ "owner": {
73
+ "type": "string",
74
+ "description": "Agent type assigned to own this task (e.g. 'engineer')"
75
+ },
76
+ "owner_agent_id": {
77
+ "type": "string",
78
+ "description": "Specific agent instance ID assigned to this task"
79
+ },
80
+ "owner_reuse_policy": {
81
+ "type": "string",
82
+ "enum": ["fresh", "resume_if_same_artifact", "resume"],
83
+ "description": "Policy controlling agent instance reuse across task executions"
84
+ },
85
+ "created_at": {
86
+ "type": "string",
87
+ "format": "date-time",
88
+ "description": "ISO 8601 timestamp when this task was created"
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,70 @@
1
+ [
2
+ {
3
+ "test_id": "plan_decide_happy_path",
4
+ "description": "plan_decide marks an issue as decided and records the decision summary on the issue object",
5
+ "precondition": {
6
+ "state_files": {
7
+ ".nexus/state/plan.json": {
8
+ "id": 1,
9
+ "topic": "Introduce conformance test fixtures",
10
+ "issues": [
11
+ {
12
+ "id": 1,
13
+ "title": "What fixture format best supports harness-neutral assertions?",
14
+ "status": "pending"
15
+ },
16
+ {
17
+ "id": 2,
18
+ "title": "Which tools should be covered in the MVP?",
19
+ "status": "pending"
20
+ }
21
+ ],
22
+ "research_summary": "Reviewed state-schemas and tool implementations.",
23
+ "created_at": "2026-04-12T00:00:00.000Z"
24
+ }
25
+ }
26
+ },
27
+ "action": {
28
+ "tool": "plan_decide",
29
+ "params": {
30
+ "issue_id": 1,
31
+ "summary": "Use declarative JSON with JSONPath assertions. Harness-neutral tool names only."
32
+ }
33
+ },
34
+ "postcondition": {
35
+ "return_value": {
36
+ "$.decided": true,
37
+ "$.allComplete": false,
38
+ "$.remaining.length": 1
39
+ },
40
+ "state_files": {
41
+ ".nexus/state/plan.json": {
42
+ "$.issues[0].status": "decided",
43
+ "$.issues[0].decision": "Use declarative JSON with JSONPath assertions. Harness-neutral tool names only.",
44
+ "$.issues[1].status": "pending"
45
+ }
46
+ }
47
+ }
48
+ },
49
+ {
50
+ "test_id": "plan_decide_no_active_plan_error",
51
+ "description": "plan_decide returns an error when no plan.json exists, because there is no active plan session to record decisions against",
52
+ "precondition": {
53
+ "state_files": {
54
+ ".nexus/state/plan.json": null
55
+ }
56
+ },
57
+ "action": {
58
+ "tool": "plan_decide",
59
+ "params": {
60
+ "issue_id": 1,
61
+ "summary": "Some decision"
62
+ }
63
+ },
64
+ "postcondition": {
65
+ "return_value": {
66
+ "$.error": "No active plan session"
67
+ }
68
+ }
69
+ }
70
+ ]