Issue Schema
Canonical schema for deep-review findings.
json
{
"title": "short issue title",
"quote": "exact quote from paper",
"explanation": "reasoned explanation",
"comment_type": "methodology|claim_accuracy|presentation|missing_information",
"severity": "major|moderate|minor",
"confidence": "high|medium|low|unverified",
"source_kind": "script|llm",
"source_section": "methods",
"related_sections": ["results", "appendix"],
"root_cause_key": "normalized-shared-key",
"review_lane": "claims_vs_evidence",
"evidence_anchor": [
{"type": "citation|figure_or_table|metric|section|analysis_artifact", "text": "visible anchor"}
],
"claim_strength": "unsupported|observed|supported|strong",
"missing_evidence": ["specific support that is absent or unverified"],
"allowed_wording": "bounded wording that stays within the evidence",
"forbidden_wording": ["unbounded wording that would require stronger evidence"],
"gate_blocker": false,
"quote_verified": true
}Required fields
titlequoteexplanationcomment_typeseveritysource_kind
Guidance
root_cause_keyshould stay stable across re-audits when the same issue persists.gate_blockeris only for issues that should fail a submission gate.quote_verifiedshould be added after runningverify_quotes.py.evidence_anchor,claim_strength,missing_evidence,allowed_wording, andforbidden_wordingare optional claim-evidence fields. Add them when the issue is about claim accuracy, citation support, figure/table evidence, or data availability. Do not make them required until downstream consumers explicitly version the schema.confidencefollows an ordered ladderhigh > medium > low > unverified.unverifiedis reserved for findings whose anchor quote could not be located in the source. Runningverify_quotes.py --write-backwill demote any issue withquote_verified=falsetoconfidence: unverifiedso downstream consolidation and reporting can treat it as evidence-deficient rather than silently keeping the original confidence label.
Optional Bundle Wrapping
final_issues.json is normally a top-level list of the records above (legacy schema, still the default produced by consolidate_review_findings.py). For re-audit score tracking it MAY instead be a dict that wraps the same list together with optional round-level metadata:
json
{
"issues": [ /* records as defined above */ ],
"round_scores": {
"quality": 78,
"clarity": 73,
"significance": 70,
"originality": 75
}
}issuesis required when the dict form is used; consumers fall back to an empty list if absent.round_scoresis optional. Keys are free-form dimension names (the 4-dimension summary or the 9-dimension ScholarEval layer both work). Values must be numeric.scripts/diff_review_issues.pyandscripts/render_revision_trajectory.pydetect the dict form automatically. When neither bundle exposesround_scores, trajectory rendering is silently skipped instead of erroring.