@@ -267,6 +267,10 @@ function buildLifecycleVisibleReplyUtils(ctx) {
267267 state . visible . artifactMissingItems = [ 'visible-payload-unobserved' , 'semantic-artifact-items' ]
268268 state . visible . finalValidationSummaryStatus = 'unverified'
269269 state . visible . finalValidationSummaryMissingItems = [ 'visible-payload-unobserved' , 'final-validation-summary' ]
270+ state . visible . dialogueNarrativeStatus = 'unverified'
271+ state . visible . dialogueNarrativeMissingItems = [ 'visible-payload-unobserved' , 'dialogue-narrative' ]
272+ state . visible . analysisDeliveryStatus = 'unverified'
273+ state . visible . analysisDeliveryMissingItems = [ 'visible-payload-unobserved' , 'analysis-delivery' ]
270274 state . visible . stopProbe = {
271275 schemaVersion : 'StopPayloadProbeV1' ,
272276 observed : false ,
@@ -319,6 +323,52 @@ function buildLifecycleVisibleReplyUtils(ctx) {
319323 state . visible . finalValidationSummaryStatus = 'unverified'
320324 state . visible . finalValidationSummaryMissingItems = [ 'classifier-unavailable' , 'final-validation-summary' ]
321325 }
326+ // DPC B2: dialogue-primary narrative + analysis delivery (link-only-thin) when payload observed
327+ try {
328+ const { analyzeDialogueNarrativeSample } = require ( './visible-output-contract.cjs' )
329+ const narrativeEvidence = analyzeDialogueNarrativeSample ( text )
330+ state . visible . dialogueNarrative = narrativeEvidence
331+ if ( narrativeEvidence . classification === 'not-claimed' ) {
332+ state . visible . dialogueNarrativeStatus = 'not-claimed'
333+ state . visible . dialogueNarrativeMissingItems = [ ]
334+ } else if ( narrativeEvidence . classification === 'narrative-missing' ) {
335+ state . visible . dialogueNarrativeStatus = 'verified-missing'
336+ state . visible . dialogueNarrativeMissingItems = [ 'dialogue-narrative' ]
337+ } else {
338+ // present | waived
339+ state . visible . dialogueNarrativeStatus = 'verified-present'
340+ state . visible . dialogueNarrativeMissingItems = [ ]
341+ }
342+ } catch {
343+ state . visible . dialogueNarrativeStatus = 'unverified'
344+ state . visible . dialogueNarrativeMissingItems = [ 'classifier-unavailable' , 'dialogue-narrative' ]
345+ }
346+ try {
347+ const {
348+ classifyAnalysisArtifactDeliverySample
349+ } = require ( '../../scripts/lib/optimization-backlog-evidence.js' )
350+ const analysisClass = classifyAnalysisArtifactDeliverySample ( text )
351+ state . visible . analysisDeliveryClass = analysisClass
352+ if ( analysisClass === 'not-analysis-delivery' ) {
353+ state . visible . analysisDeliveryStatus = 'not-claimed'
354+ state . visible . analysisDeliveryMissingItems = [ ]
355+ } else if ( analysisClass === 'ready' ) {
356+ state . visible . analysisDeliveryStatus = 'verified-present'
357+ state . visible . analysisDeliveryMissingItems = [ ]
358+ } else if ( analysisClass === 'link-only-thin' ) {
359+ state . visible . analysisDeliveryStatus = 'verified-missing'
360+ state . visible . analysisDeliveryMissingItems = [ 'analysis-link-only-thin' ]
361+ } else if ( analysisClass === 'chat-only' ) {
362+ state . visible . analysisDeliveryStatus = 'verified-missing'
363+ state . visible . analysisDeliveryMissingItems = [ 'analysis-chat-only' ]
364+ } else {
365+ state . visible . analysisDeliveryStatus = 'verified-missing'
366+ state . visible . analysisDeliveryMissingItems = [ `analysis-delivery:${ analysisClass } ` ]
367+ }
368+ } catch {
369+ state . visible . analysisDeliveryStatus = 'unverified'
370+ state . visible . analysisDeliveryMissingItems = [ 'classifier-unavailable' , 'analysis-delivery' ]
371+ }
322372 const artifactEvidence = analyzeArtifactDelivery ( text )
323373 state . visible . artifactStatus = artifactEvidence . status
324374 state . visible . artifactMissingItems = artifactEvidence . missingItems
@@ -407,6 +457,19 @@ function buildLifecycleVisibleReplyUtils(ctx) {
407457 items . push ( `无法验证最终验证摘要(DevModeCompletionCheckDetailGate:status=unverified;missingItems=${ missing } )` )
408458 }
409459 }
460+ // DPC B2: dialogue narrative + analysis delivery closeout reminders (payload observed only)
461+ if ( eventName === 'Stop' && state . mode === 'dev' && state . reportTouched ) {
462+ const narrativeStatus = state . visible ?. dialogueNarrativeStatus
463+ if ( narrativeStatus === 'verified-missing' ) {
464+ const missing = ( state . visible . dialogueNarrativeMissingItems || [ ] ) . join ( ', ' ) || 'dialogue-narrative'
465+ items . push ( `对话内可读收口不完整(Dialogue-Primary:missingItems=${ missing } ;须结果句+要点,禁止仅详见报告)` )
466+ }
467+ const analysisStatus = state . visible ?. analysisDeliveryStatus
468+ if ( analysisStatus === 'verified-missing' ) {
469+ const missing = ( state . visible . analysisDeliveryMissingItems || [ ] ) . join ( ', ' ) || 'analysis-delivery'
470+ items . push ( `分析交付不完整(AnalysisArtifactDelivery:missingItems=${ missing } ;class=${ state . visible . analysisDeliveryClass || 'unknown' } )` )
471+ }
472+ }
410473 const artifactStatus = state . visible ?. artifactStatus || ( state . visible ?. artifactPaths ? 'verified-present' : 'unverified' )
411474 if ( eventName === 'Stop' && state . mode === 'dev' && state . reportTouched && artifactStatus === 'verified-missing' ) {
412475 const missing = ( state . visible . artifactMissingItems || [ ] ) . join ( ', ' ) || 'artifact-delivery-manifest'
0 commit comments