@@ -27,6 +27,23 @@ function asBoolean(value: JsonValue | undefined): boolean {
2727 return value === true ;
2828}
2929
30+ function observationSignalCards ( ) {
31+ return [
32+ { label : "Compare report" , value : "Missing" } ,
33+ { label : "Evidence posture" , value : "Unavailable" } ,
34+ { label : "Next move" , value : "Replay compare" } ,
35+ ] ;
36+ }
37+
38+ function observationDeltaRows ( ) {
39+ return [
40+ { label : "Compare posture" , value : "Awaiting report" } ,
41+ { label : "Evidence chain" , value : "Unavailable" } ,
42+ { label : "LLM params" , value : "Unavailable" } ,
43+ { label : "LLM snapshot" , value : "Unavailable" } ,
44+ ] ;
45+ }
46+
3047export function RunComparePage ( { runId, onBack } : Props ) {
3148 const [ run , setRun ] = useState < RunDetailPayload | null > ( null ) ;
3249 const [ reports , setReports ] = useState < ReportRecord [ ] > ( [ ] ) ;
@@ -101,6 +118,25 @@ export function RunComparePage({ runId, onBack }: Props) {
101118 const evidenceStatus = hasCompareReport ? ( evidenceOk ? "OK" : "Needs review" ) : "Unavailable" ;
102119 const llmParamsStatus = hasCompareReport ? ( llmParamsOk ? "OK" : "Changed" ) : "Unavailable" ;
103120 const llmSnapshotStatus = hasCompareReport ? ( llmSnapshotOk ? "OK" : "Changed" ) : "Unavailable" ;
121+ const signalCards = hasCompareReport
122+ ? [
123+ { label : "Mismatched hashes" , value : String ( mismatchedCount ) } ,
124+ { label : "Missing artifacts" , value : String ( missingCount ) } ,
125+ { label : "Failed report checks" , value : String ( failedChecksCount ) } ,
126+ ]
127+ : observationSignalCards ( ) ;
128+ const deltaRows = hasCompareReport
129+ ? [
130+ { label : "Mismatched" , value : String ( mismatchedCount ) } ,
131+ { label : "Missing" , value : String ( missingCount ) } ,
132+ { label : "Extra" , value : String ( extraCount ) } ,
133+ { label : "Missing reports" , value : String ( missingReportsCount ) } ,
134+ { label : "Failed checks" , value : String ( failedChecksCount ) } ,
135+ { label : "Evidence chain" , value : evidenceStatus } ,
136+ { label : "LLM params" , value : llmParamsStatus } ,
137+ { label : "LLM snapshot" , value : llmSnapshotStatus } ,
138+ ]
139+ : observationDeltaRows ( ) ;
104140
105141 if ( loading ) {
106142 return < div className = "content" > < div className = "skeleton-stack-lg" > < div className = "skeleton skeleton-row" /> </ div > </ div > ;
@@ -153,18 +189,12 @@ export function RunComparePage({ runId, onBack }: Props) {
153189 < p > { displaySummary } </ p >
154190 < p className = "muted" > { displayNextAction } </ p >
155191 < div className = "compare-signal-grid" >
156- < div className = "compare-signal-card" >
157- < span className = "cell-sub mono muted" > Mismatched hashes</ span >
158- < strong > { mismatchedCount } </ strong >
159- </ div >
160- < div className = "compare-signal-card" >
161- < span className = "cell-sub mono muted" > Missing artifacts</ span >
162- < strong > { missingCount } </ strong >
163- </ div >
164- < div className = "compare-signal-card" >
165- < span className = "cell-sub mono muted" > Failed report checks</ span >
166- < strong > { failedChecksCount } </ strong >
167- </ div >
192+ { signalCards . map ( ( item ) => (
193+ < div key = { item . label } className = "compare-signal-card" >
194+ < span className = "cell-sub mono muted" > { item . label } </ span >
195+ < strong > { item . value } </ strong >
196+ </ div >
197+ ) ) }
168198 </ div >
169199 </ div >
170200 </ CardBody >
@@ -173,14 +203,12 @@ export function RunComparePage({ runId, onBack }: Props) {
173203 < CardHeader > < CardTitle > Key deltas</ CardTitle > </ CardHeader >
174204 < CardBody >
175205 < div className = "data-list" >
176- < div className = "data-list-row" > < span className = "data-list-label" > Mismatched</ span > < span className = "data-list-value mono" > { mismatchedCount } </ span > </ div >
177- < div className = "data-list-row" > < span className = "data-list-label" > Missing</ span > < span className = "data-list-value mono" > { missingCount } </ span > </ div >
178- < div className = "data-list-row" > < span className = "data-list-label" > Extra</ span > < span className = "data-list-value mono" > { extraCount } </ span > </ div >
179- < div className = "data-list-row" > < span className = "data-list-label" > Missing reports</ span > < span className = "data-list-value mono" > { missingReportsCount } </ span > </ div >
180- < div className = "data-list-row" > < span className = "data-list-label" > Failed checks</ span > < span className = "data-list-value mono" > { failedChecksCount } </ span > </ div >
181- < div className = "data-list-row" > < span className = "data-list-label" > Evidence chain</ span > < span className = "data-list-value mono" > { evidenceStatus } </ span > </ div >
182- < div className = "data-list-row" > < span className = "data-list-label" > LLM params</ span > < span className = "data-list-value mono" > { llmParamsStatus } </ span > </ div >
183- < div className = "data-list-row" > < span className = "data-list-label" > LLM snapshot</ span > < span className = "data-list-value mono" > { llmSnapshotStatus } </ span > </ div >
206+ { deltaRows . map ( ( item ) => (
207+ < div key = { item . label } className = "data-list-row" >
208+ < span className = "data-list-label" > { item . label } </ span >
209+ < span className = "data-list-value mono" > { item . value } </ span >
210+ </ div >
211+ ) ) }
184212 </ div >
185213 { incidentPack . summary ? < p className = "muted mt-2" > Incident: { String ( incidentPack . summary ) } </ p > : null }
186214 { proofPack . summary ? < p className = "muted" > Proof: { String ( proofPack . summary ) } </ p > : null }
0 commit comments