@loomfsm/bundle-code 0.1.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 (81) hide show
  1. package/LICENSE +201 -0
  2. package/agents/acceptance.md +141 -0
  3. package/agents/api-contract.md +89 -0
  4. package/agents/architect.md +52 -0
  5. package/agents/challenger-reviewer.md +104 -0
  6. package/agents/classifier.md +74 -0
  7. package/agents/code-analyzer.md +43 -0
  8. package/agents/context-doc-verifier.md +94 -0
  9. package/agents/dependency-auditor.md +42 -0
  10. package/agents/implementer.md +135 -0
  11. package/agents/logic-reviewer.md +132 -0
  12. package/agents/migration.md +55 -0
  13. package/agents/performance.md +95 -0
  14. package/agents/plan-conformance.md +127 -0
  15. package/agents/plan-grounding-check.md +106 -0
  16. package/agents/planner.md +143 -0
  17. package/agents/playwright.md +68 -0
  18. package/agents/research.md +52 -0
  19. package/agents/security.md +88 -0
  20. package/agents/style-reviewer.md +85 -0
  21. package/agents/test.md +206 -0
  22. package/agents/ui-consistency.md +75 -0
  23. package/dist/manifest.d.ts +2 -0
  24. package/dist/manifest.js +34 -0
  25. package/dist/manifest.js.map +1 -0
  26. package/dist/src/bundle.d.ts +2 -0
  27. package/dist/src/bundle.js +424 -0
  28. package/dist/src/bundle.js.map +1 -0
  29. package/dist/src/index.d.ts +5 -0
  30. package/dist/src/index.js +14 -0
  31. package/dist/src/index.js.map +1 -0
  32. package/dist/src/invariants.d.ts +10 -0
  33. package/dist/src/invariants.js +208 -0
  34. package/dist/src/invariants.js.map +1 -0
  35. package/dist/src/policy-resolver.d.ts +2 -0
  36. package/dist/src/policy-resolver.js +65 -0
  37. package/dist/src/policy-resolver.js.map +1 -0
  38. package/dist/src/sandbox-rules.d.ts +2 -0
  39. package/dist/src/sandbox-rules.js +40 -0
  40. package/dist/src/sandbox-rules.js.map +1 -0
  41. package/dist/test/bundle.test.d.ts +1 -0
  42. package/dist/test/bundle.test.js +289 -0
  43. package/dist/test/bundle.test.js.map +1 -0
  44. package/dist/test/sandbox-rules.test.d.ts +1 -0
  45. package/dist/test/sandbox-rules.test.js +73 -0
  46. package/dist/test/sandbox-rules.test.js.map +1 -0
  47. package/knowledge/references/api-design.md +188 -0
  48. package/knowledge/references/arch-patterns.md +106 -0
  49. package/knowledge/references/caching.md +190 -0
  50. package/knowledge/references/concurrency.md +195 -0
  51. package/knowledge/references/db-postgres.md +153 -0
  52. package/knowledge/references/e2e-flutter.md +56 -0
  53. package/knowledge/references/e2e-playwright.md +53 -0
  54. package/knowledge/references/error-handling.md +208 -0
  55. package/knowledge/references/next-app-router.md +231 -0
  56. package/knowledge/references/observability.md +169 -0
  57. package/knowledge/references/optimization-strategy.md +197 -0
  58. package/knowledge/references/perf-flutter.md +62 -0
  59. package/knowledge/references/perf-nestjs.md +59 -0
  60. package/knowledge/references/perf-python.md +50 -0
  61. package/knowledge/references/perf-react.md +52 -0
  62. package/knowledge/references/react19.md +176 -0
  63. package/knowledge/references/redis.md +175 -0
  64. package/knowledge/references/security-backend.md +219 -0
  65. package/knowledge/references/test-flutter.md +65 -0
  66. package/knowledge/references/test-nestjs.md +82 -0
  67. package/knowledge/references/test-python.md +76 -0
  68. package/knowledge/references/test-react.md +66 -0
  69. package/knowledge/references/test-strategy.md +175 -0
  70. package/knowledge/references/ui-flutter.md +56 -0
  71. package/knowledge/references/ui-web.md +51 -0
  72. package/package.json +34 -0
  73. package/schemas/agent-feedback.schema.json +80 -0
  74. package/schemas/category-vocab.json +170 -0
  75. package/schemas/classifier-output.schema.json +53 -0
  76. package/schemas/finding.schema.json +92 -0
  77. package/schemas/pipeline-state.schema.json +238 -0
  78. package/schemas/reviewer-output.schema.json +62 -0
  79. package/schemas/state-extension.schema.json +53 -0
  80. package/schemas/validator-output.schema.json +48 -0
  81. package/stack-candidates.yaml +248 -0
@@ -0,0 +1,92 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "finding.schema.json",
4
+ "title": "Finding",
5
+ "description": "A single issue surfaced by a reviewer or validator. Designed for clustering, metrics, and self-learning.",
6
+ "type": "object",
7
+ "required": ["schema_version", "id", "agent", "severity", "category", "summary"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "schema_version": {
11
+ "type": "string",
12
+ "const": "1.0",
13
+ "description": "Schema version. Bump on breaking field changes; orchestrator switches by version."
14
+ },
15
+ "id": {
16
+ "type": "string",
17
+ "description": "Stable id: f-<YYYY-MM-DD>-<random6>",
18
+ "pattern": "^f-\\d{4}-\\d{2}-\\d{2}-[a-z0-9]{6}$"
19
+ },
20
+ "agent": {
21
+ "type": "string",
22
+ "enum": [
23
+ "logic-reviewer",
24
+ "challenger-reviewer",
25
+ "style-reviewer",
26
+ "security",
27
+ "performance",
28
+ "acceptance",
29
+ "plan-conformance",
30
+ "plan-grounding-check",
31
+ "context-doc-verifier",
32
+ "ui-consistency",
33
+ "api-contract",
34
+ "playwright",
35
+ "test",
36
+ "implementer"
37
+ ]
38
+ },
39
+ "iteration": { "type": "integer", "minimum": 1 },
40
+ "task_id": {
41
+ "type": "string",
42
+ "description": "Links to pipeline-state.json task_id"
43
+ },
44
+ "file": {
45
+ "type": ["string", "null"],
46
+ "description": "Path relative to repo root, or null when finding is not file-bound (e.g. plan-level issue)"
47
+ },
48
+ "line_start": { "type": ["integer", "null"], "minimum": 1 },
49
+ "line_end": { "type": ["integer", "null"], "minimum": 1 },
50
+ "severity": {
51
+ "type": "string",
52
+ "enum": ["blocking", "warn", "info"]
53
+ },
54
+ "category": {
55
+ "type": "string",
56
+ "description": "Controlled vocab — must match an entry in templates/schemas/category-vocab.json for the finding's agent. If a new pattern is being recorded, use 'other' and populate proposed_new_category."
57
+ },
58
+ "proposed_new_category": {
59
+ "type": ["string", "null"],
60
+ "description": "When category='other', describe the proposed new vocab entry. Reviewed via /agent-feedback before being added to vocab.",
61
+ "maxLength": 60
62
+ },
63
+ "pattern_id": {
64
+ "type": ["string", "null"],
65
+ "description": "When this finding matches a known past-miss pattern: <agent>:<category>:<short-slug>. null if novel."
66
+ },
67
+ "summary": {
68
+ "type": "string",
69
+ "description": "One-line description of the issue. <=200 chars.",
70
+ "maxLength": 200
71
+ },
72
+ "evidence_excerpt": {
73
+ "type": ["string", "null"],
74
+ "description": "Short code excerpt anchoring the finding. Trim to <=400 chars.",
75
+ "maxLength": 400
76
+ },
77
+ "suggested_fix": {
78
+ "type": ["string", "null"],
79
+ "description": "Concrete proposed fix or pointer to an approach. <=300 chars.",
80
+ "maxLength": 300
81
+ },
82
+ "status": {
83
+ "type": "string",
84
+ "enum": ["open", "fixed", "accepted_by_human", "dismissed"],
85
+ "default": "open"
86
+ },
87
+ "ref_rule_id": {
88
+ "type": ["string", "null"],
89
+ "description": "When the finding cites a senior-pattern reference rule (e.g. 'redis.md#hot-keys'), include the anchor for traceability."
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,238 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "pipeline-state.schema.json",
4
+ "title": "Pipeline State",
5
+ "description": "Single source of truth for an in-flight task. Orchestrator updates after every agent completion. /done parses mechanically — no LLM needed.",
6
+ "type": "object",
7
+ "required": [
8
+ "schema_version",
9
+ "bundle",
10
+ "task_id",
11
+ "task",
12
+ "complexity",
13
+ "started_at",
14
+ "phases",
15
+ "gates",
16
+ "agents_count"
17
+ ],
18
+ "additionalProperties": false,
19
+ "properties": {
20
+ "schema_version": { "type": "string", "const": "1.1" },
21
+ "bundle": {
22
+ "type": "string",
23
+ "description": "Which bundle this state belongs to. Selects the matching bundle-extension schema in templates/schemas/bundle-extensions/<bundle>.schema.json."
24
+ },
25
+ "task_id": {
26
+ "type": "string",
27
+ "pattern": "^t-\\d{4}-\\d{2}-\\d{2}-[a-z0-9]{4,}(?:-[a-f0-9]{4})?$",
28
+ "description": "t-<YYYY-MM-DD>-<short-slug>"
29
+ },
30
+ "task": { "type": "string" },
31
+ "complexity": { "type": "string", "enum": ["simple", "medium", "complex"] },
32
+ "tests_mode": { "type": "string", "enum": ["tdd", "regression-only"] },
33
+ "stack": {
34
+ "type": "object",
35
+ "required": ["language"],
36
+ "properties": {
37
+ "language": { "type": "string" },
38
+ "package_manager": { "type": ["string", "null"] },
39
+ "test_command": { "type": ["string", "null"] },
40
+ "lint_command": { "type": ["string", "null"] },
41
+ "build_command": { "type": ["string", "null"] },
42
+ "project_type": { "type": ["string", "null"], "enum": [null, "frontend-app", "backend", "library", "monorepo"] }
43
+ },
44
+ "additionalProperties": true
45
+ },
46
+ "started_at": { "type": "string", "format": "date-time" },
47
+ "ended_at": {
48
+ "type": ["string", "null"],
49
+ "format": "date-time",
50
+ "description": "Item 11: set by pipeline_finish so the metrics row + post-hoc analysis can compute wall-clock duration."
51
+ },
52
+ "refs_loaded": {
53
+ "type": "array",
54
+ "items": { "type": "string" },
55
+ "description": "Senior-pattern reference paths resolved at STEP 1 (rule #24)."
56
+ },
57
+ "refs_dropped_due_to_cap": {
58
+ "type": "array",
59
+ "items": { "type": "string" }
60
+ },
61
+ "team_knowledge_refs": {
62
+ "type": "array",
63
+ "items": { "type": "string" },
64
+ "description": "Project-scoped shared knowledge files injected into every agent prompt (item 7 of v2.2.5). Populated by pipeline_init from <project>/.claude/pipeline.config.json.team_knowledge_refs[]."
65
+ },
66
+ "phases": {
67
+ "type": "object",
68
+ "additionalProperties": true,
69
+ "properties": {
70
+ "context": { "$ref": "#/$defs/phase_status" },
71
+ "planning": {
72
+ "allOf": [
73
+ { "$ref": "#/$defs/phase_status" },
74
+ {
75
+ "type": "object",
76
+ "properties": {
77
+ "gate1_revisions": { "type": "integer", "minimum": 0 },
78
+ "grounding_mismatches": { "type": "integer", "minimum": 0 }
79
+ }
80
+ }
81
+ ]
82
+ },
83
+ "test_first": {
84
+ "allOf": [
85
+ { "$ref": "#/$defs/phase_status" },
86
+ {
87
+ "type": "object",
88
+ "properties": {
89
+ "skipped_reason": {
90
+ "type": ["string", "null"],
91
+ "enum": [null, "regression-only", "no-test-framework-tdd-blocked", "user-override-no-tests"]
92
+ },
93
+ "test_spec_count_in_plan": { "type": ["integer", "null"], "minimum": 0 },
94
+ "tests_written_count": { "type": ["integer", "null"], "minimum": 0 },
95
+ "test_files_written": { "type": "array", "items": { "type": "string" } },
96
+ "test_files_hashes_post_red": {
97
+ "type": "object",
98
+ "description": "Map of test_file_path → sha256 hash, captured immediately after RED. Used by plan-conformance to detect implementer modification.",
99
+ "additionalProperties": { "type": "string" }
100
+ }
101
+ }
102
+ }
103
+ ]
104
+ },
105
+ "implementation": {
106
+ "allOf": [
107
+ { "$ref": "#/$defs/phase_status" },
108
+ {
109
+ "type": "object",
110
+ "properties": {
111
+ "antipattern_candidates_count": { "type": "integer", "minimum": 0 },
112
+ "caller_context_sites_count": { "type": "integer", "minimum": 0 },
113
+ "gate2_revisions": { "type": "integer", "minimum": 0 },
114
+ "logic_vs_challenger_disagreement": { "type": "boolean", "default": false },
115
+ "plan_conformance": {
116
+ "type": ["string", "null"],
117
+ "enum": [null, "CONFORMS", "DRIFT", "PARTIAL"]
118
+ },
119
+ "drift_files_count": { "type": "integer", "minimum": 0 },
120
+ "test_files_modified_by_implementer": {
121
+ "type": "array",
122
+ "items": { "type": "string" },
123
+ "description": "Files in test_files_written whose post-GREEN hash differs from test_files_hashes_post_red. MUST be empty unless human approved at a gate. Non-empty → blocking."
124
+ },
125
+ "checkpoint_results": {
126
+ "type": "array",
127
+ "description": "Mechanical checkpoint runs by Implementer; failing-count must be monotonically non-increasing.",
128
+ "items": {
129
+ "type": "object",
130
+ "properties": {
131
+ "step": { "type": "integer" },
132
+ "failing_before": { "type": "integer" },
133
+ "failing_after": { "type": "integer" },
134
+ "test_files_hashed_match": { "type": "boolean" }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ ]
141
+ },
142
+ "validation": { "$ref": "#/$defs/phase_status" },
143
+ "final": { "$ref": "#/$defs/phase_status" }
144
+ }
145
+ },
146
+ "reviewer_verdicts": {
147
+ "type": "array",
148
+ "description": "Append-only per agent run. One entry per spawn.",
149
+ "items": {
150
+ "type": "object",
151
+ "required": ["agent", "iteration", "verdict"],
152
+ "properties": {
153
+ "agent": { "type": "string" },
154
+ "phase": {
155
+ "type": "string",
156
+ "description": "Pipeline phase this verdict came from. String-typed at the schema layer — runtime validates against the active flow's declared phases[]. Lets the same agent appear in multiple phases without verdicts collapsing into an indistinguishable bag."
157
+ },
158
+ "iteration": { "type": "integer", "minimum": 1 },
159
+ "verdict": { "type": "string" },
160
+ "blocking_issues": { "type": "integer", "minimum": 0 },
161
+ "non_blocking": { "type": "integer", "minimum": 0 },
162
+ "past_misses_applied": { "type": "integer", "minimum": 0 },
163
+ "past_miss_matches": { "type": "integer", "minimum": 0 },
164
+ "categories_seen": { "type": "array", "items": { "type": "string" } }
165
+ },
166
+ "additionalProperties": false
167
+ }
168
+ },
169
+ "findings_path": {
170
+ "type": "string",
171
+ "description": "Pointer to .claude/findings.jsonl — append-only stream of all findings emitted across the run.",
172
+ "default": ".claude/findings.jsonl"
173
+ },
174
+ "files": {
175
+ "type": "object",
176
+ "properties": {
177
+ "created": { "type": "array", "items": { "type": "string" } },
178
+ "modified": { "type": "array", "items": { "type": "string" } }
179
+ }
180
+ },
181
+ "gates": {
182
+ "type": "object",
183
+ "properties": {
184
+ "gate0": { "type": "string", "enum": ["pending", "approved", "rejected", "skipped"], "default": "pending" },
185
+ "gate1": { "type": "string", "enum": ["pending", "approved", "rejected", "skipped"], "default": "pending" },
186
+ "gate2": { "type": "string", "enum": ["pending", "approved", "rejected", "skipped"], "default": "pending" },
187
+ "gate1_feedback": { "type": ["string", "null"] },
188
+ "gate2_feedback": { "type": ["string", "null"] }
189
+ }
190
+ },
191
+ "agents_count": { "type": "integer", "minimum": 0 },
192
+ "tests_written": {
193
+ "type": ["integer", "string", "null"],
194
+ "description": "Count of new test cases, 0, 'skip', or null if not yet known"
195
+ },
196
+ "blockers_found": { "type": "integer", "minimum": 0 },
197
+ "verdict": {
198
+ "type": ["string", "null"],
199
+ "enum": [null, "accepted", "rejected"]
200
+ },
201
+ "pipeline_violation": {
202
+ "type": ["string", "null"],
203
+ "description": "Set when pipeline integrity was breached (e.g. missing-state-file recovery)."
204
+ },
205
+ "owner_id": {
206
+ "type": ["string", "null"],
207
+ "description": "Opaque, platform-agnostic identifier of the entity that started this task. Populated at task start from the first non-empty owner/session env var the host transport supplies. Finalization paths compare against this to refuse cross-session completion. Transports (HTTP API, CLI, other providers) set their own owner_id via env vars; the substrate stays transport-agnostic."
208
+ }
209
+ },
210
+ "$defs": {
211
+ "phase_status": {
212
+ "type": "object",
213
+ "required": ["status"],
214
+ "properties": {
215
+ "status": { "type": "string", "enum": ["pending", "in_progress", "completed", "skipped"] },
216
+ "started_at": { "type": ["string", "null"], "format": "date-time" },
217
+ "completed_at": { "type": ["string", "null"], "format": "date-time" },
218
+ "agents": { "type": "array", "items": { "type": "string" } },
219
+ "open_spawns": {
220
+ "type": "array",
221
+ "description": "Spawns that have been begun (via pipeline_begin_agent) but not yet recorded. Must be empty before the phase can transition to 'completed' (INV_012).",
222
+ "items": {
223
+ "type": "object",
224
+ "required": ["id", "agent", "started_at"],
225
+ "properties": {
226
+ "id": { "type": "string", "pattern": "^ar-[0-9a-f-]+$" },
227
+ "agent": { "type": "string" },
228
+ "model": { "type": ["string", "null"] },
229
+ "started_at": { "type": "string", "format": "date-time" }
230
+ },
231
+ "additionalProperties": false
232
+ }
233
+ }
234
+ },
235
+ "additionalProperties": true
236
+ }
237
+ }
238
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "reviewer-output.schema.json",
4
+ "title": "Reviewer Output Header",
5
+ "description": "JSON block emitted at the top of every reviewer/validator agent output. Markdown narrative follows below the block; this header is the machine-parseable surface.",
6
+ "type": "object",
7
+ "required": [
8
+ "schema_version",
9
+ "agent",
10
+ "task_id",
11
+ "iteration",
12
+ "verdict",
13
+ "findings",
14
+ "summary_line"
15
+ ],
16
+ "additionalProperties": false,
17
+ "properties": {
18
+ "schema_version": { "type": "string", "const": "1.0" },
19
+ "agent": {
20
+ "type": "string",
21
+ "enum": [
22
+ "logic-reviewer",
23
+ "challenger-reviewer",
24
+ "style-reviewer",
25
+ "security",
26
+ "performance"
27
+ ]
28
+ },
29
+ "task_id": { "type": "string" },
30
+ "iteration": { "type": "integer", "minimum": 1 },
31
+ "verdict": {
32
+ "type": "string",
33
+ "enum": ["APPROVE", "REQUEST_CHANGES", "WARN"],
34
+ "description": "REQUEST_CHANGES iff at least one finding has severity=blocking. WARN allowed only for security/performance."
35
+ },
36
+ "summary_line": {
37
+ "type": "string",
38
+ "maxLength": 150,
39
+ "description": "Human-readable one-liner. Shown in pipeline-state and dashboards. The 150-char cap accommodates legitimate single-line summaries on complex tasks that exceed 100."
40
+ },
41
+ "findings": {
42
+ "type": "array",
43
+ "items": { "$ref": "finding.schema.json" },
44
+ "description": "All issues found, blocking AND non-blocking. Drives metrics, clustering, past-miss promotion."
45
+ },
46
+ "past_misses_applied": {
47
+ "type": "integer",
48
+ "minimum": 0,
49
+ "description": "Count of past-miss patterns the reviewer was given to check against this run."
50
+ },
51
+ "past_miss_matches": {
52
+ "type": "array",
53
+ "items": { "type": "string" },
54
+ "description": "pattern_ids of past-misses that matched this diff (subset of past_misses_applied)."
55
+ },
56
+ "ref_rules_consulted": {
57
+ "type": "array",
58
+ "items": { "type": "string" },
59
+ "description": "Senior-pattern reference anchors that contributed to findings (e.g. 'redis.md#hot-keys')."
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "state-extension.schema.json",
4
+ "title": "Code bundle — bundle_state extension",
5
+ "description": "Shape of the bundle_state JSON column for the code bundle. Every field is optional and populated as the flow progresses; the column is null before the first write.",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "properties": {
9
+ "diff_snapshot": {
10
+ "type": "object",
11
+ "description": "Snapshot of the substrate's file accounting at the pre-review step. Reviewers read this for a stable, replayable picture of the change surface.",
12
+ "properties": {
13
+ "files_modified": { "type": "array", "items": { "type": "string" } },
14
+ "files_created": { "type": "array", "items": { "type": "string" } },
15
+ "modified_count": { "type": "integer", "minimum": 0 },
16
+ "created_count": { "type": "integer", "minimum": 0 }
17
+ }
18
+ },
19
+ "test_files_modified_by_implementer": {
20
+ "type": "array",
21
+ "items": { "type": "string" },
22
+ "description": "Test/spec files the implementation run modified. Non-empty means the final gate must be human-approved (sacred-tests invariant)."
23
+ },
24
+ "test_files_written": {
25
+ "type": "array",
26
+ "items": { "type": "string" },
27
+ "description": "Test files authored during a test-first flow."
28
+ },
29
+ "lint_result": {
30
+ "$ref": "#/$defs/checkResult",
31
+ "description": "Deterministic lint result. Read by the safety floor when the final role's policy is auto; the writer is a deterministic lint shell-out the deployment supplies."
32
+ },
33
+ "test_run": {
34
+ "$ref": "#/$defs/checkResult",
35
+ "description": "Deterministic test-run result. Read by the safety floor under an auto final policy."
36
+ },
37
+ "typecheck": {
38
+ "$ref": "#/$defs/checkResult",
39
+ "description": "Deterministic typecheck result. Read by the safety floor under an auto final policy."
40
+ }
41
+ },
42
+ "$defs": {
43
+ "checkResult": {
44
+ "type": "object",
45
+ "properties": {
46
+ "status": { "type": "string", "enum": ["ok", "failed", "skipped"] },
47
+ "summary": { "type": "string" }
48
+ },
49
+ "required": ["status"],
50
+ "additionalProperties": true
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "validator-output.schema.json",
4
+ "title": "Validator Output Header",
5
+ "description": "JSON block for validator agents (Acceptance, Plan Conformance, Plan Grounding Check, Context-Doc Verifier). Verdict vocabulary differs from reviewers; agent-specific extensions live in 'details'.",
6
+ "type": "object",
7
+ "required": ["schema_version", "agent", "task_id", "verdict", "summary_line"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "schema_version": { "type": "string", "const": "1.0" },
11
+ "agent": {
12
+ "type": "string",
13
+ "enum": [
14
+ "acceptance",
15
+ "plan-conformance",
16
+ "plan-grounding-check",
17
+ "context-doc-verifier",
18
+ "ui-consistency",
19
+ "api-contract",
20
+ "playwright",
21
+ "test"
22
+ ]
23
+ },
24
+ "task_id": { "type": "string" },
25
+ "iteration": { "type": "integer", "minimum": 1 },
26
+ "verdict": {
27
+ "type": "string",
28
+ "enum": [
29
+ "PASS", "FAIL", "PASS_WITH_WARNINGS",
30
+ "CONFORMS", "DRIFT", "PARTIAL",
31
+ "GROUNDED", "NEEDS_REVISION", "NO_CITATIONS",
32
+ "VERIFIED", "NEEDS_RERUN", "WARN",
33
+ "APPROVE", "REQUEST_CHANGES",
34
+ "RED", "ERROR"
35
+ ]
36
+ },
37
+ "summary_line": { "type": "string", "maxLength": 150 },
38
+ "findings": {
39
+ "type": "array",
40
+ "items": { "$ref": "finding.schema.json" }
41
+ },
42
+ "details": {
43
+ "type": "object",
44
+ "description": "Agent-specific structured details. Examples: plan-conformance → drift_files/unfinished_steps/ac_coverage; grounding-check → mismatches; verifier → claim_check_count.",
45
+ "additionalProperties": true
46
+ }
47
+ }
48
+ }