"""HTML views for final-report audit paste (#431).""" from __future__ import annotations import html from final_report_validator import FINAL_REPORT_TASK_KINDS from webui.audit_validator import audit_report from webui.layout import render_page _TASK_KIND_OPTIONS = sorted(FINAL_REPORT_TASK_KINDS) def _escape(text: str) -> str: return html.escape(text, quote=True) def _render_findings(result: dict) -> str: findings = result.get("findings") or [] if not findings: return '

No validator findings — report structure looks complete for the selected task kind.

' rows = [] for finding in findings: rows.append( "" f"{_escape(str(finding.get('rule_id', '')))}" f"{_escape(str(finding.get('severity', '')))}" f"{_escape(str(finding.get('field', '')))}" f"{_escape(str(finding.get('reason', '')))}" f"{_escape(str(finding.get('safe_next_action', '')))}" "" ) return ( '' "" "" f"{''.join(rows)}
RuleSeverityFieldReasonSafe next action
" ) def _render_task_kind_select(selected: str | None) -> str: options = [''] for kind in _TASK_KIND_OPTIONS: sel = ' selected' if selected == kind else "" options.append(f'') return f'' def render_audit_page( *, report_text: str = "", task_kind: str | None = None, result: dict | None = None, ) -> str: result_html = "" if result is not None: grade = _escape(str(result.get("grade", ""))) inferred = _escape(str(result.get("inferred_task_kind", ""))) safe_next = _escape(str(result.get("safe_next_action", ""))) suggested_prompt = result.get("suggested_next_prompt") or "" suggested_comment = result.get("suggested_issue_comment") or "" result_html = ( '
' f"

Validator preview

" f'

Task kind: {inferred} · ' f'Grade: {grade} · ' f"Blocked: {result.get('blocked')} · " f"Downgraded: {result.get('downgraded')}

" f"

Safe next action: {safe_next}

" f"{_render_findings(result)}" ) if suggested_prompt: result_html += ( "

Suggested next prompt

" f'
{_escape(suggested_prompt)}
' ) if suggested_comment: result_html += ( "

Suggested issue/PR comment

" f'
{_escape(suggested_comment)}
' ) result_html += "
" body = ( "

Report audit

" "

Paste an LLM final report for local validator preview. " "Uses final_report_validator and review schema checks — " "does not post to Gitea or store reports server-side.

" '
' "" f"{_render_task_kind_select(task_kind)}" '' f'' '' "
" f"{result_html}" "

JSON API (POST report_text, " "optional task_kind)

" ) return render_page(title="Audit", body_html=body, extra_head=AUDIT_PAGE_STYLES) AUDIT_PAGE_STYLES = """ """