diff --git a/README.md b/README.md index b3c85bb..443ddb6 100644 --- a/README.md +++ b/README.md @@ -518,6 +518,12 @@ AIGuard evidence in the same Lab-owned report. The summary is a reviewer navigation surface: it makes runtime risk evidence easy to find, while Lab remains the final deployment decision owner. +The report starts with a `Reviewer Focus` table using +`Focus / Quick signal / First read` columns so reviewers can quickly scan the +Decision owner, EdgeEnv regression gate, Telemetry/replay quality, +Operation context, and AIGuard warnings before reading the detailed evidence +rows. + | Reviewer question | Where to look | Meaning | |---|---|---| | Did AIGuard preserve EdgeEnv/Orchestrator producer lineage? | `producer_lineage_evidence_type=edgeenv_orchestrator_producer_lineage` and `runtime_history_seed_run_config_traceability` | Confirms the expected deterministic AIGuard evidence reached the Lab-owned report. | diff --git a/docs/ci/runtime_intelligence_gitlab_artifacts.md b/docs/ci/runtime_intelligence_gitlab_artifacts.md index 5ed6272..158f5ad 100644 --- a/docs/ci/runtime_intelligence_gitlab_artifacts.md +++ b/docs/ci/runtime_intelligence_gitlab_artifacts.md @@ -186,7 +186,7 @@ EdgeEnv handoff summary and AIGuard deterministic evidence agree on producer-lineage guard-alignment run IDs. This keeps the cross-repo marker check file-based and does not make AIGuard a deployment decision owner. -The artifact gate is implemented by `scripts/check_runtime_intelligence_artifact_bundle.py`. It checks the generated Markdown / HTML report for the required Runtime Intelligence rows, including Lab ownership, EdgeEnv comparability, telemetry coverage-gap markers, Runtime replay duration scope with `source=entrypoint_requested_frames` traceability, Orchestrator operation feed context, compact queue/deadline/fallback operation markers with `max_total_queue_depth`, AIGuard max queue raw-context traceability, Orchestrator task event rollup, Lab EdgeEnv preservation context, Jetson/device-local preservation identity and detail labels, Orchestrator `operation_risk_summary` navigation context, AIGuard runtime operation anomalies, AIGuard `edgeenv_orchestrator_operation_risk_summary` evidence, AIGuard `edgeenv_orchestrator_task_event_rollup` evidence, remote dispatch starter event summary, `Remote fallback starter evidence`, `edgeenv_orchestrator_producer_lineage`, `runtime_history_seed_run_config_traceability`, `remote_execution_recovered_by_fallback`, and triggered deployment review rules. +The artifact gate is implemented by `scripts/check_runtime_intelligence_artifact_bundle.py`. It checks the generated Markdown / HTML report for the required Runtime Intelligence rows, including the `Reviewer Focus` quick-scan table, Lab ownership, EdgeEnv comparability, telemetry coverage-gap markers, Runtime replay duration scope with `source=entrypoint_requested_frames` traceability, Orchestrator operation feed context, compact queue/deadline/fallback operation markers with `max_total_queue_depth`, AIGuard max queue raw-context traceability, Orchestrator task event rollup, Lab EdgeEnv preservation context, Jetson/device-local preservation identity and detail labels, Orchestrator `operation_risk_summary` navigation context, AIGuard runtime operation anomalies, AIGuard `edgeenv_orchestrator_operation_risk_summary` evidence, AIGuard `edgeenv_orchestrator_task_event_rollup` evidence, remote dispatch starter event summary, `Remote fallback starter evidence`, `edgeenv_orchestrator_producer_lineage`, `runtime_history_seed_run_config_traceability`, `remote_execution_recovered_by_fallback`, and triggered deployment review rules. The bundle manifest gate also checks the external AIGuard artifact before the rendered report stage. In particular, `runtime_queue_overload` must preserve diff --git a/inferedgelab/report/html_generator.py b/inferedgelab/report/html_generator.py index 52b8e61..f59442b 100644 --- a/inferedgelab/report/html_generator.py +++ b/inferedgelab/report/html_generator.py @@ -3,7 +3,10 @@ from html import escape from typing import Any, Dict, Optional -from inferedgelab.report.runtime_intelligence import build_runtime_intelligence_risk_rows +from inferedgelab.report.runtime_intelligence import ( + build_runtime_intelligence_reviewer_focus_rows, + build_runtime_intelligence_risk_rows, +) from inferedgelab.services.guard_analysis import guard_primary_reason, guard_status, guard_verdict @@ -594,6 +597,23 @@ def _runtime_intelligence_risk_summary_to_html( if not rows: return "" + focus_rows = build_runtime_intelligence_reviewer_focus_rows( + guard_analysis=guard_analysis, + deployment_decision=deployment_decision, + edgeenv_regression=edgeenv_regression, + ) + focus_html = [] + for focus, value, first_read in focus_rows: + focus_html.append( + f""" +