@mmerterden/multi-agent-pipeline 20.30.0 → 20.33.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 (120) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +45 -0
  3. package/README.tr.md +59 -0
  4. package/docs/facts.json +3 -3
  5. package/install/_unattended-profile.mjs +61 -0
  6. package/install/catalog-history.json +1 -1
  7. package/install/claude.mjs +9 -2
  8. package/install/index.mjs +10 -1
  9. package/install/templates/claude-hooks.json +12 -1
  10. package/manifest.json +123 -82
  11. package/package.json +2 -1
  12. package/pipeline/commands/multi-agent/analysis/SKILL.md +4 -4
  13. package/pipeline/commands/multi-agent/office-on/SKILL.md +8 -7
  14. package/pipeline/commands/multi-agent/office-status/SKILL.md +1 -1
  15. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -1
  16. package/pipeline/commands/multi-agent/review/SKILL.md +4 -3
  17. package/pipeline/commands/multi-agent/scenario-audit/SKILL.md +4 -2
  18. package/pipeline/commands/multi-agent/sync/SKILL.md +12 -0
  19. package/pipeline/commands/multi-agent/test-gen/SKILL.md +29 -3
  20. package/pipeline/contract/CHANGELOG.md +46 -0
  21. package/pipeline/contract/README.md +22 -8
  22. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  23. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  24. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  25. package/pipeline/contract/fixtures/launch-plan.json +1 -1
  26. package/pipeline/contract/fixtures/runs-awaiting-question.json +6 -1
  27. package/pipeline/contract/fixtures/runs-empty.json +1 -1
  28. package/pipeline/contract/fixtures/runs-failed.json +6 -1
  29. package/pipeline/contract/fixtures/runs-old-schema.json +6 -1
  30. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +5 -1
  31. package/pipeline/contract/fixtures/runs-pr-opened.json +6 -1
  32. package/pipeline/contract/fixtures/runs-running.json +6 -1
  33. package/pipeline/contract/manifest.json +153 -19
  34. package/pipeline/contract/types/index.d.ts +304 -6
  35. package/pipeline/lib/bg-launch.mjs +106 -0
  36. package/pipeline/lib/code-digest.mjs +49 -0
  37. package/pipeline/lib/credential-resolve.mjs +42 -2
  38. package/pipeline/multi-agent-refs/features/office-threat-model.md +24 -6
  39. package/pipeline/multi-agent-refs/features/unattended-security.md +1 -1
  40. package/pipeline/multi-agent-refs/help/en.md +2 -2
  41. package/pipeline/multi-agent-refs/help/tr.md +2 -2
  42. package/pipeline/multi-agent-refs/phases/modes.md +7 -7
  43. package/pipeline/multi-agent-refs/phases/phase-5-report.md +16 -10
  44. package/pipeline/multi-agent-refs/review-standalone-tracker.md +37 -0
  45. package/pipeline/multi-agent-refs/tracker-contract.md +8 -3
  46. package/pipeline/office/NOTICE.md +4 -1
  47. package/pipeline/office/assets/ARCHIVE_BOXES.png +0 -0
  48. package/pipeline/office/assets/COFFEE_MACHINE.png +0 -0
  49. package/pipeline/office/assets/COUNTER_SINK.png +0 -0
  50. package/pipeline/office/assets/DEVICE_STAND.png +0 -0
  51. package/pipeline/office/assets/FILING_CABINET.png +0 -0
  52. package/pipeline/office/assets/FRIDGE.png +0 -0
  53. package/pipeline/office/assets/MAILBOX.png +0 -0
  54. package/pipeline/office/assets/MOP_BUCKET.png +0 -0
  55. package/pipeline/office/assets/PRINTER.png +0 -0
  56. package/pipeline/office/assets/RECEPTION_DESK.png +0 -0
  57. package/pipeline/office/assets/SERVER_RACK.png +0 -0
  58. package/pipeline/office/assets/SERVER_RACK_2.png +0 -0
  59. package/pipeline/office/assets/TOILET_STALL.png +0 -0
  60. package/pipeline/office/assets/VENDING.png +0 -0
  61. package/pipeline/office/assets/WASHBASIN.png +0 -0
  62. package/pipeline/office/assets/WATER_COOLER.png +0 -0
  63. package/pipeline/office/index.html +3996 -884
  64. package/pipeline/office/toolkit.json +3 -0
  65. package/pipeline/schemas/activity.schema.json +188 -4
  66. package/pipeline/schemas/agent-state.schema.json +493 -115
  67. package/pipeline/schemas/contract-error.schema.json +12 -1
  68. package/pipeline/schemas/job-change.schema.json +72 -0
  69. package/pipeline/schemas/job-request.schema.json +38 -0
  70. package/pipeline/schemas/launch.json +4 -4
  71. package/pipeline/schemas/office-credentials.schema.json +71 -0
  72. package/pipeline/schemas/office-jobs.json +253 -0
  73. package/pipeline/schemas/office-jobs.schema.json +62 -0
  74. package/pipeline/schemas/office-memory.schema.json +105 -0
  75. package/pipeline/schemas/office-settings-request.schema.json +30 -0
  76. package/pipeline/schemas/office-settings.schema.json +67 -0
  77. package/pipeline/schemas/phases.json +10 -2
  78. package/pipeline/schemas/phases.schema.json +86 -19
  79. package/pipeline/schemas/prs.schema.json +5 -0
  80. package/pipeline/schemas/prune-logs-request.schema.json +26 -0
  81. package/pipeline/schemas/prune-logs.schema.json +52 -0
  82. package/pipeline/schemas/repo-change.schema.json +54 -0
  83. package/pipeline/schemas/repo-request.schema.json +29 -0
  84. package/pipeline/schemas/repos.schema.json +49 -1
  85. package/pipeline/schemas/runs-index.schema.json +257 -46
  86. package/pipeline/schemas/system-status.schema.json +111 -0
  87. package/pipeline/schemas/tools.schema.json +5 -0
  88. package/pipeline/schemas/unattended-profile.json +7 -2
  89. package/pipeline/scripts/_active-run.mjs +2 -1
  90. package/pipeline/scripts/_spawn-async.mjs +9 -5
  91. package/pipeline/scripts/activity-snapshot.mjs +219 -23
  92. package/pipeline/scripts/autopilot-runner.mjs +7 -5
  93. package/pipeline/scripts/contract-server.mjs +551 -25
  94. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -1
  95. package/pipeline/scripts/job-launch.mjs +477 -0
  96. package/pipeline/scripts/launch-request.mjs +94 -9
  97. package/pipeline/scripts/office-build.mjs +148 -11
  98. package/pipeline/scripts/office-control.mjs +34 -7
  99. package/pipeline/scripts/office-credentials.mjs +106 -0
  100. package/pipeline/scripts/office-memory.mjs +200 -0
  101. package/pipeline/scripts/office-prune.mjs +125 -0
  102. package/pipeline/scripts/office-settings.mjs +145 -0
  103. package/pipeline/scripts/phase-tracker.sh +12 -5
  104. package/pipeline/scripts/prune-logs.sh +53 -2
  105. package/pipeline/scripts/runs-index.mjs +62 -2
  106. package/pipeline/scripts/system-status.mjs +196 -0
  107. package/pipeline/scripts/task-mirror.mjs +150 -0
  108. package/pipeline/scripts/task-mirror.sh +20 -0
  109. package/pipeline/scripts/toolkit-tools.mjs +33 -7
  110. package/pipeline/scripts/transcript-index.mjs +4 -1
  111. package/pipeline/scripts/work-items.mjs +191 -22
  112. package/pipeline/skills/.skill-manifest.json +6 -6
  113. package/pipeline/skills/.skills-index.json +1 -1
  114. package/pipeline/skills/shared/README.md +1 -1
  115. package/pipeline/skills/shared/core/multi-agent-office-on/SKILL.md +3 -4
  116. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +4 -1
  117. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +19 -0
  118. package/pipeline/skills/shared/core/multi-agent-scenario-audit/SKILL.md +4 -2
  119. package/pipeline/skills/shared/core/multi-agent-test-gen/SKILL.md +26 -3
  120. package/pipeline/skills/skills-index.md +1 -1
@@ -62,7 +62,18 @@
62
62
  "busy",
63
63
  "review-incomplete",
64
64
  "host-not-allowed",
65
- "internal"
65
+ "internal",
66
+ "unknown-job",
67
+ "command-not-installed",
68
+ "invalid-repo",
69
+ "invalid-args",
70
+ "room-busy",
71
+ "sandbox-unavailable",
72
+ "launch-failed",
73
+ "guard-missing",
74
+ "name-taken",
75
+ "already-registered",
76
+ "not-registered"
66
77
  ],
67
78
  "x-sensitivity": "none"
68
79
  },
@@ -0,0 +1,72 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/job-change.schema.json",
4
+ "title": "Office job start",
5
+ "description": "What POST /v1/jobs returns. Without a token: preview (the job, the role that does it, team or solo, the repository by name, the exact prompt the session receives and what it writes outside the machine) with confirmToken and expiresAt. With it: started, the session the server began.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "preview": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "required": ["jobId", "role", "team", "repo", "prompt", "writes"],
19
+ "properties": {
20
+ "jobId": {
21
+ "type": "string"
22
+ },
23
+ "role": {
24
+ "type": "string"
25
+ },
26
+ "team": {
27
+ "type": "boolean"
28
+ },
29
+ "repo": {
30
+ "type": "string"
31
+ },
32
+ "prompt": {
33
+ "type": "string"
34
+ },
35
+ "writes": {
36
+ "enum": ["none", "branch", "branch-pr", "pr-comments", "issue-comment"]
37
+ }
38
+ }
39
+ },
40
+ "confirmToken": {
41
+ "type": "string",
42
+ "pattern": "^[A-Za-z0-9_-]{16,128}$"
43
+ },
44
+ "expiresAt": {
45
+ "type": "string",
46
+ "format": "date-time"
47
+ },
48
+ "started": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "required": ["sessionId", "jobId", "role", "team", "repo"],
52
+ "properties": {
53
+ "sessionId": {
54
+ "type": "string",
55
+ "pattern": "^[0-9a-f-]{36}$"
56
+ },
57
+ "jobId": {
58
+ "type": "string"
59
+ },
60
+ "role": {
61
+ "type": "string"
62
+ },
63
+ "team": {
64
+ "type": "boolean"
65
+ },
66
+ "repo": {
67
+ "type": "string"
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/job-request.schema.json",
4
+ "title": "Office job request",
5
+ "description": "The body of POST /v1/jobs. The first request names jobId (from GET /v1/jobs), repo (a name from GET /v1/repos or its path) and args (by parameter name), plus answers for a pipeline run; the second sends only confirmToken.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "jobId": {
16
+ "type": "string",
17
+ "pattern": "^[a-z][a-z0-9-]{1,40}$"
18
+ },
19
+ "repo": {
20
+ "type": "string",
21
+ "maxLength": 4096
22
+ },
23
+ "args": {
24
+ "type": "object",
25
+ "additionalProperties": {
26
+ "type": "string",
27
+ "maxLength": 4000
28
+ }
29
+ },
30
+ "answers": {
31
+ "type": "object"
32
+ },
33
+ "confirmToken": {
34
+ "type": "string",
35
+ "pattern": "^[A-Za-z0-9_-]{16,128}$"
36
+ }
37
+ }
38
+ }
@@ -41,7 +41,7 @@
41
41
  "MULTI_AGENT_UNATTENDED": "1",
42
42
  "MULTI_AGENT_SESSION_ID": "{sessionId}",
43
43
  "MCP_TOOLKIT_URL_POLICY": "strict",
44
- "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains",
44
+ "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains,~/.claude/logs/multi-agent/contract-server,~/.claude/logs/multi-agent/office",
45
45
  "LOGS_ROOT": "{runLogsRoot}",
46
46
  "MA_LAUNCH_REQUEST": "{requestFile}"
47
47
  }
@@ -64,7 +64,7 @@
64
64
  "MULTI_AGENT_UNATTENDED": "1",
65
65
  "MULTI_AGENT_SESSION_ID": "{sessionId}",
66
66
  "MCP_TOOLKIT_URL_POLICY": "strict",
67
- "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains",
67
+ "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains,~/.claude/logs/multi-agent/contract-server,~/.claude/logs/multi-agent/office",
68
68
  "LOGS_ROOT": "{runLogsRoot}",
69
69
  "MA_LAUNCH_REQUEST": "{requestFile}"
70
70
  }
@@ -84,7 +84,7 @@
84
84
  "MULTI_AGENT_UNATTENDED": "1",
85
85
  "MULTI_AGENT_SESSION_ID": "{sessionId}",
86
86
  "MCP_TOOLKIT_URL_POLICY": "strict",
87
- "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains",
87
+ "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains,~/.claude/logs/multi-agent/contract-server,~/.claude/logs/multi-agent/office",
88
88
  "LOGS_ROOT": "{runLogsRoot}",
89
89
  "MA_LAUNCH_REQUEST": "{requestFile}"
90
90
  }
@@ -105,7 +105,7 @@
105
105
  "MULTI_AGENT_UNATTENDED": "1",
106
106
  "MULTI_AGENT_SESSION_ID": "{sessionId}",
107
107
  "MCP_TOOLKIT_URL_POLICY": "strict",
108
- "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains",
108
+ "MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains,~/.claude/logs/multi-agent/contract-server,~/.claude/logs/multi-agent/office",
109
109
  "LOGS_ROOT": "{runLogsRoot}"
110
110
  }
111
111
  }
@@ -0,0 +1,71 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/office-credentials.schema.json",
4
+ "title": "Key cabinet",
5
+ "description": "What GET /v1/credentials returns and `office-credentials.mjs --json` prints: for each credential the pipeline knows by logical name, whether the store holds it and, with probe, whether its service accepted it. Never a value: lib/credential-inventory.sh reads each through the store with stdout discarded. Renewal stays in the terminal (/multi-agent:setup).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion", "generatedAt", "probed", "available", "credentials"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "generatedAt": {
16
+ "type": "string",
17
+ "format": "date-time",
18
+ "x-sensitivity": "none"
19
+ },
20
+ "probed": {
21
+ "type": "boolean",
22
+ "x-sensitivity": "none"
23
+ },
24
+ "available": {
25
+ "type": "boolean",
26
+ "x-sensitivity": "none",
27
+ "description": "False when the inventory could not run on this host."
28
+ },
29
+ "credentials": {
30
+ "type": "array",
31
+ "x-sensitivity": "local",
32
+ "items": {
33
+ "type": "object",
34
+ "additionalProperties": false,
35
+ "required": ["logical", "state", "reachability", "capability"],
36
+ "properties": {
37
+ "logical": {
38
+ "type": "string",
39
+ "pattern": "^[a-z][a-z0-9_]{0,60}$"
40
+ },
41
+ "state": {
42
+ "enum": ["present", "mapped-but-missing", "unmapped"]
43
+ },
44
+ "reachability": {
45
+ "enum": [
46
+ "not-probed",
47
+ "reachable",
48
+ "auth-rejected",
49
+ "unreachable",
50
+ "no-host-configured",
51
+ "well-formed",
52
+ "not-probeable",
53
+ "malformed",
54
+ "no-credential",
55
+ "probe-error",
56
+ "server-error",
57
+ "tier-1-ready",
58
+ "tier-2-ready",
59
+ "tier-1-no-grant",
60
+ "unknown"
61
+ ]
62
+ },
63
+ "capability": {
64
+ "type": ["string", "null"],
65
+ "maxLength": 160
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,253 @@
1
+ {
2
+ "$schema": "./office-jobs.schema.json",
3
+ "contractVersion": "1.0.0",
4
+ "description": "The jobs a person can hand to someone in the office. A solo job is one command one agent does at a desk; a team job is a pipeline run that meets in a room. Each parameter has a kind that job-launch.mjs checks before anything starts, so no job takes free text, and `writes` names what the job changes outside this machine, shown in the confirmation. Commands not listed here stay terminal commands.",
5
+ "jobs": [
6
+ {
7
+ "id": "pipeline",
8
+ "command": "multi-agent",
9
+ "role": "Orchestrator",
10
+ "team": true,
11
+ "launch": "development",
12
+ "params": [
13
+ {
14
+ "name": "input",
15
+ "kind": "work-item",
16
+ "required": true
17
+ }
18
+ ],
19
+ "writes": "branch-pr"
20
+ },
21
+ {
22
+ "id": "autopilot-run",
23
+ "command": "multi-agent",
24
+ "role": "Orchestrator",
25
+ "team": true,
26
+ "launch": "autopilot",
27
+ "params": [
28
+ {
29
+ "name": "input",
30
+ "kind": "work-item",
31
+ "required": true
32
+ }
33
+ ],
34
+ "writes": "branch-pr"
35
+ },
36
+ {
37
+ "id": "analysis",
38
+ "command": "analysis",
39
+ "role": "Planner",
40
+ "team": true,
41
+ "launch": "analysis",
42
+ "params": [
43
+ {
44
+ "name": "input",
45
+ "kind": "work-item",
46
+ "required": true
47
+ }
48
+ ],
49
+ "writes": "none"
50
+ },
51
+ {
52
+ "id": "review",
53
+ "command": "review",
54
+ "role": "Reviewer",
55
+ "team": false,
56
+ "params": [
57
+ {
58
+ "name": "target",
59
+ "kind": "pull-request",
60
+ "required": true
61
+ }
62
+ ],
63
+ "writes": "none"
64
+ },
65
+ {
66
+ "id": "security-review",
67
+ "command": "security-review",
68
+ "role": "Security Auditor",
69
+ "team": false,
70
+ "params": [
71
+ {
72
+ "name": "target",
73
+ "kind": "branch",
74
+ "required": false
75
+ }
76
+ ],
77
+ "writes": "none"
78
+ },
79
+ {
80
+ "id": "diff-explain",
81
+ "command": "diff-explain",
82
+ "role": "Reviewer",
83
+ "team": false,
84
+ "params": [
85
+ {
86
+ "name": "task",
87
+ "kind": "run-id",
88
+ "required": true
89
+ }
90
+ ],
91
+ "writes": "none"
92
+ },
93
+ {
94
+ "id": "review-jira",
95
+ "command": "review-jira",
96
+ "role": "Clarifier",
97
+ "team": false,
98
+ "params": [
99
+ {
100
+ "name": "issue",
101
+ "kind": "jira-key",
102
+ "required": true
103
+ }
104
+ ],
105
+ "writes": "none"
106
+ },
107
+ {
108
+ "id": "review-issue",
109
+ "command": "review-issue",
110
+ "role": "Clarifier",
111
+ "team": false,
112
+ "params": [
113
+ {
114
+ "name": "issue",
115
+ "kind": "github-issue",
116
+ "required": true
117
+ }
118
+ ],
119
+ "writes": "none"
120
+ },
121
+ {
122
+ "id": "estimate",
123
+ "command": "estimate",
124
+ "role": "Planner",
125
+ "team": false,
126
+ "params": [
127
+ {
128
+ "name": "input",
129
+ "kind": "jira-key",
130
+ "required": true
131
+ }
132
+ ],
133
+ "writes": "none"
134
+ },
135
+ {
136
+ "id": "research",
137
+ "command": "research",
138
+ "role": "Explorer",
139
+ "team": false,
140
+ "params": [
141
+ {
142
+ "name": "item",
143
+ "kind": "jira-key",
144
+ "required": true
145
+ }
146
+ ],
147
+ "writes": "none"
148
+ },
149
+ {
150
+ "id": "postmortem",
151
+ "command": "postmortem",
152
+ "role": "Reader",
153
+ "team": false,
154
+ "params": [
155
+ {
156
+ "name": "target",
157
+ "kind": "run-id",
158
+ "required": true
159
+ }
160
+ ],
161
+ "writes": "none"
162
+ },
163
+ {
164
+ "id": "graph",
165
+ "command": "graph",
166
+ "role": "Explorer",
167
+ "team": false,
168
+ "params": [
169
+ {
170
+ "name": "action",
171
+ "kind": "enum",
172
+ "values": ["build", "refresh", "report", "status"],
173
+ "required": true
174
+ }
175
+ ],
176
+ "writes": "none"
177
+ },
178
+ {
179
+ "id": "ios-coding-standard",
180
+ "command": "ios-coding-standard",
181
+ "role": "iOS Architect",
182
+ "team": false,
183
+ "params": [
184
+ {
185
+ "name": "target",
186
+ "kind": "repo-path",
187
+ "required": true
188
+ }
189
+ ],
190
+ "writes": "none"
191
+ },
192
+ {
193
+ "id": "test-gen",
194
+ "command": "test-gen",
195
+ "role": "Test Gap Analyst",
196
+ "team": true,
197
+ "params": [],
198
+ "writes": "branch"
199
+ },
200
+ {
201
+ "id": "doctor",
202
+ "command": "doctor",
203
+ "role": "Sysadmin",
204
+ "team": false,
205
+ "params": [],
206
+ "writes": "none"
207
+ },
208
+ {
209
+ "id": "route-status",
210
+ "command": "route-status",
211
+ "role": "Sysadmin",
212
+ "team": false,
213
+ "params": [],
214
+ "writes": "none"
215
+ },
216
+ {
217
+ "id": "scan",
218
+ "command": "scan",
219
+ "role": "Librarian",
220
+ "team": false,
221
+ "params": [],
222
+ "writes": "none"
223
+ },
224
+ {
225
+ "id": "scenario-audit",
226
+ "command": "scenario-audit",
227
+ "role": "Test Gap Analyst",
228
+ "team": false,
229
+ "params": [
230
+ {
231
+ "name": "scenarios",
232
+ "kind": "repo-path",
233
+ "required": true
234
+ }
235
+ ],
236
+ "writes": "none"
237
+ },
238
+ {
239
+ "id": "review-analysis",
240
+ "command": "review-analysis",
241
+ "role": "Clarifier",
242
+ "team": false,
243
+ "params": [
244
+ {
245
+ "name": "target",
246
+ "kind": "jira-key",
247
+ "required": true
248
+ }
249
+ ],
250
+ "writes": "none"
251
+ }
252
+ ]
253
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/office-jobs.schema.json",
4
+ "title": "Office jobs",
5
+ "description": "The catalog of jobs the office can start (office-jobs.json), read by job-launch.mjs and served by GET /v1/jobs.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion", "jobs"],
9
+ "properties": {
10
+ "$schema": { "type": "string" },
11
+ "contractVersion": {
12
+ "type": "string",
13
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
14
+ "x-sensitivity": "none"
15
+ },
16
+ "description": { "type": "string" },
17
+ "jobs": {
18
+ "type": "array",
19
+ "x-sensitivity": "none",
20
+ "items": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": ["id", "command", "role", "team", "params", "writes"],
24
+ "properties": {
25
+ "id": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,40}$" },
26
+ "command": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,40}$" },
27
+ "role": { "type": "string", "minLength": 1 },
28
+ "team": { "type": "boolean" },
29
+ "launch": { "enum": ["development", "analysis", "autopilot"] },
30
+ "available": { "type": "boolean" },
31
+ "reason": { "type": ["string", "null"] },
32
+ "params": {
33
+ "type": "array",
34
+ "items": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": ["name", "kind", "required"],
38
+ "properties": {
39
+ "name": { "type": "string", "pattern": "^[a-z][a-z0-9-]{0,30}$" },
40
+ "kind": {
41
+ "enum": [
42
+ "work-item",
43
+ "pull-request",
44
+ "branch",
45
+ "run-id",
46
+ "jira-key",
47
+ "github-issue",
48
+ "enum",
49
+ "repo-path"
50
+ ]
51
+ },
52
+ "values": { "type": "array", "items": { "type": "string" } },
53
+ "required": { "type": "boolean" }
54
+ }
55
+ }
56
+ },
57
+ "writes": { "enum": ["none", "branch", "branch-pr", "pr-comments", "issue-comment"] }
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/office-memory.schema.json",
4
+ "title": "Institutional memory",
5
+ "description": "What GET /v1/memory returns and `office-memory.mjs --json` prints: per repository, the code graph's age and size and how many learnings, past review findings and session notes the learning loop holds, with the newest learnings redacted and cut short. An empty shelf is reported, never left out.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion", "generatedAt", "shelves"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "generatedAt": {
16
+ "type": "string",
17
+ "format": "date-time",
18
+ "x-sensitivity": "none"
19
+ },
20
+ "shelves": {
21
+ "type": "array",
22
+ "maxItems": 60,
23
+ "x-sensitivity": "local",
24
+ "items": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": [
28
+ "repo",
29
+ "graph",
30
+ "learnings",
31
+ "findings",
32
+ "sessionNotes",
33
+ "recent",
34
+ "lastWrite"
35
+ ],
36
+ "properties": {
37
+ "repo": {
38
+ "type": "string"
39
+ },
40
+ "graph": {
41
+ "oneOf": [
42
+ {
43
+ "type": "null"
44
+ },
45
+ {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": ["builtAt", "ageDays", "sizeKb"],
49
+ "properties": {
50
+ "builtAt": {
51
+ "type": ["string", "null"]
52
+ },
53
+ "ageDays": {
54
+ "type": "integer",
55
+ "minimum": 0
56
+ },
57
+ "sizeKb": {
58
+ "type": "integer",
59
+ "minimum": 0
60
+ }
61
+ }
62
+ }
63
+ ]
64
+ },
65
+ "learnings": {
66
+ "type": "integer",
67
+ "minimum": 0
68
+ },
69
+ "findings": {
70
+ "type": "integer",
71
+ "minimum": 0
72
+ },
73
+ "sessionNotes": {
74
+ "type": "integer",
75
+ "minimum": 0
76
+ },
77
+ "recent": {
78
+ "type": "array",
79
+ "maxItems": 5,
80
+ "items": {
81
+ "type": "object",
82
+ "additionalProperties": false,
83
+ "required": ["kind", "statement", "at"],
84
+ "properties": {
85
+ "kind": {
86
+ "type": ["string", "null"]
87
+ },
88
+ "statement": {
89
+ "type": "string",
90
+ "maxLength": 120
91
+ },
92
+ "at": {
93
+ "type": ["string", "null"]
94
+ }
95
+ }
96
+ }
97
+ },
98
+ "lastWrite": {
99
+ "type": ["string", "null"]
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }