Reporter — Operational Protocol
Protocol
1. DISCOVER
- Read inputs from the orchestrator dispatch context:
findings_path: path tofindings.jsonwritten by the analyzer.reviewer_verdict: verdict string from the reviewer (approved/approved_with_concerns/rejected), parsed by the orchestrator from the reviewer's terminal-output REVIEWER VERDICT block.reviewer_completeness_score: completeness score from the reviewer.reviewer_missing_categories: comma-separated missing categories from the reviewer (or "none").reviewer_notes: reviewer notes text (or "none").output_path: path where the final markdown report must be written (always{ROOT}/output/parity-test-f-review-report.md).state_path: path topipeline-state.jsonfor status updates.run_id: current run identifier.root: resolved scope root.
- Verify
findings_pathexists and is valid JSON. If the file does not exist: emitBLOCKEDwith message: "Analyzer findings not found at{findings_path}. The analyzer step may have failed." - Parse the findings JSON. If JSON is malformed: emit
BLOCKEDwith message: "Analyzer findings at{findings_path}are not valid JSON." - Confirm
reviewer_verdictis supplied and is one ofapproved/approved_with_concerns/rejected. If absent or unrecognized: emitBLOCKEDwith message: "Reviewer verdict not supplied in dispatch context. The reviewer step may have failed."
2. PROCESS
Render the markdown code review report using the following template (populated from parsed findings and verdict):
# Code Review Report — parity-test-f
> Generated by the parity-test-f pipeline (Tier 1d — Codex CLI)
> Source diff: `{findings.diff_path}`
> Total issues found: {findings.issue_count}
> Review verdict: {reviewer_verdict}
## Issues Found
{If findings.issues is non-empty, group by category and render:}
### Null Checks
{For each issue where category = "null_check":}
- **[{issue.severity}]** `{issue.location}` — {issue.description}
{If no null_check issues:}
- No null check issues detected.
### Error Handling
{For each issue where category = "error_handling":}
- **[{issue.severity}]** `{issue.location}` — {issue.description}
{If no error_handling issues:}
- No error handling issues detected.
### Naming
{For each issue where category = "naming":}
- **[{issue.severity}]** `{issue.location}` — {issue.description}
{If no naming issues:}
- No naming issues detected.
## Review Verdict
| Field | Value |
|---|---|
| Verdict | {reviewer_verdict} |
| Completeness Score | {reviewer_completeness_score} |
| Missing Categories | {reviewer_missing_categories} |
{If reviewer_notes is non-empty and not "none":}
**Reviewer Notes:** {reviewer_notes}
{If reviewer_notes is empty or "none":}
**Reviewer Notes:** No additional notes.
Ensure:
## Issues Foundsection is present and contains all three category subsections.## Review Verdictsection is present with the verdict table.- No section is left entirely blank or contains placeholder text.
- The header block accurately reflects
findings.diff_path,findings.issue_count, andreviewer_verdict.
3. DELIVER
- Create the
{root}/output/directory if it does not exist. - Write the rendered markdown to
output_pathusing the Write tool. - Update
pipeline-state.json:- Set
phases[2].status="completed". - Set
phases[2].outputs=[output_path]. - Set top-level
status="completed". - Set
completed_at= current ISO-8601 timestamp.
- Set
- Emit terminal status:
DONE— report written successfully; both required sections present; verdict is"approved".DONE_WITH_CONCERNS— report written but reviewer verdict is"approved_with_concerns"or"rejected"(surface the verdict and reviewer_notes to the orchestrator).BLOCKED— findings file missing/malformed orreviewer_verdictnot supplied; output not written.