@@ -888,6 +888,16 @@ test('validate-artifact sidecar contract preserves legacy calls and rejects part
888888 assert . deepEqual ( JSON . parse ( result . stdout ) , [ false , true , 'static_site_importer_sidecar_contract_partial' ] ) ;
889889} ) ;
890890
891+ test ( 'pending sidecar messages preserve bounded actionable JSON-safe text' , ( ) => {
892+ const plugin = readFileSync ( path . join ( packageRoot , 'static-site-importer.php' ) , 'utf8' ) ;
893+ const start = plugin . indexOf ( 'function static_site_importer_cli_sidecar_message_value' ) ;
894+ const helper = plugin . slice ( start ) ;
895+ const code = `function wp_check_invalid_utf8($value, $strip) { return $value; } ${ helper } $message = static_site_importer_cli_sidecar_message_value("Resume after\tcompanion\x01 initialization", 240); $bounded = static_site_importer_cli_sidecar_message_value(str_repeat('x', 300), 240); echo json_encode(array($message, strlen($bounded)));` ;
896+ const result = spawnSync ( 'php' , [ '-r' , code ] , { encoding : 'utf8' } ) ;
897+ assert . equal ( result . status , 0 , result . stderr ) ;
898+ assert . deepEqual ( JSON . parse ( result . stdout ) , [ 'Resume after companion initialization' , 240 ] ) ;
899+ } ) ;
900+
891901test ( 'gates visual capture on complete generated SVG font evidence after import' , ( ) => {
892902 const matrix = createFixtureMatrix ( { fixture_root : fixtureRoot , id : 'svg-font-evidence-recipe-test' } ) ;
893903 const recipe = buildFixtureMatrixRecipe ( {
@@ -1456,6 +1466,55 @@ test('failed sidecars retain the bounded terminal import result and front-page o
14561466 assert . equal ( result . fixtures [ 0 ] . matrix_evidence . materialization_receipt . status , 'failed' ) ;
14571467} ) ;
14581468
1469+ test ( 'legacy failed sidecars without command results remain failed' , ( ) => {
1470+ const outputDirectory = mkdtempSync ( path . join ( tmpdir ( ) , 'ssi-sidecar-legacy-failed-' ) ) ;
1471+ const matrix = createFixtureMatrix ( { fixture_root : fixtureRoot , id : 'legacy-failed-sidecar' } ) ;
1472+ const directory = path . join ( outputDirectory , 'simple-site' ) ;
1473+ mkdirSync ( directory , { recursive : true } ) ;
1474+ writeFileSync ( path . join ( directory , 'artifact.json' ) , JSON . stringify ( { fixture : 'simple-site' } ) ) ;
1475+ writeMaterializationSidecar ( {
1476+ directory,
1477+ fixtureId : 'simple-site' ,
1478+ runId : matrix . id ,
1479+ providerStatus : 'failed' ,
1480+ receipt : { schema : 'static-site-importer/materialization-receipt/v1' , status : 'failed' , page_count : 0 , file_count : 0 , operation_count : 0 , loss_count : 1 , failure_code : 'import_failed' } ,
1481+ } ) ;
1482+
1483+ const result = collectFixtureMatrixRunResults ( { matrix, outputDirectory } ) ;
1484+ assert . equal ( result . fixtures [ 0 ] . status , 'failed' ) ;
1485+ assert . equal ( result . summary . failed , 1 ) ;
1486+ assert . equal ( result . summary . succeeded , 0 ) ;
1487+ } ) ;
1488+
1489+ test ( 'materialization sidecars reject contradictory terminal status provenance' , ( ) => {
1490+ for ( const [ name , providerStatus , receiptStatus , commandStatus ] of [
1491+ [ 'provenance-receipt' , 'completed' , 'failed' , undefined ] ,
1492+ [ 'receipt-command' , 'failed' , 'failed' , 'completed' ] ,
1493+ [ 'pending-command' , 'pending_runtime' , 'pending_runtime' , 'failed' ] ,
1494+ ] ) {
1495+ const outputDirectory = mkdtempSync ( path . join ( tmpdir ( ) , `ssi-sidecar-contradictory-${ name } -` ) ) ;
1496+ const matrix = createFixtureMatrix ( { fixture_root : fixtureRoot , id : `contradictory-${ name } ` } ) ;
1497+ const directory = path . join ( outputDirectory , 'simple-site' ) ;
1498+ mkdirSync ( directory , { recursive : true } ) ;
1499+ writeFileSync ( path . join ( directory , 'artifact.json' ) , JSON . stringify ( { fixture : 'simple-site' } ) ) ;
1500+ const receipt = receiptStatus === 'pending_runtime'
1501+ ? { schema : 'static-site-importer/materialization-receipt/v1' , status : receiptStatus , reason_code : 'runtime_resume_required' , message : 'Resume after runtime initialization.' }
1502+ : receiptStatus === 'failed'
1503+ ? { schema : 'static-site-importer/materialization-receipt/v1' , status : receiptStatus , page_count : 0 , file_count : 0 , operation_count : 0 , loss_count : 1 , failure_code : 'import_failed' }
1504+ : boundedSidecarReceipt ( ) ;
1505+ writeMaterializationSidecar ( {
1506+ directory,
1507+ fixtureId : 'simple-site' ,
1508+ runId : matrix . id ,
1509+ providerStatus,
1510+ receipt,
1511+ commandResult : commandStatus === undefined ? undefined : { status : commandStatus , success : commandStatus === 'completed' , error_code : commandStatus === 'failed' ? 'import_failed' : '' , error_hash : 'a' . repeat ( 64 ) } ,
1512+ } ) ;
1513+ const result = collectFixtureMatrixRunResults ( { matrix, outputDirectory } ) ;
1514+ assert . equal ( result . fixtures [ 0 ] . matrix_evidence . materialization_sidecar . status , 'malformed' , name ) ;
1515+ }
1516+ } ) ;
1517+
14591518test ( 'pending runtime sidecars preserve resumable validation without materialization claims' , ( ) => {
14601519 const outputDirectory = mkdtempSync ( path . join ( tmpdir ( ) , 'ssi-sidecar-pending-runtime-' ) ) ;
14611520 const matrix = createFixtureMatrix ( { fixture_root : fixtureRoot , id : 'pending-runtime-evidence' } ) ;
@@ -1505,6 +1564,36 @@ test('pending runtime sidecars preserve resumable validation without materializa
15051564 assert . equal ( Object . hasOwn ( fixture . artifacts , 'generated_theme' ) , false ) ;
15061565 assert . ok ( fixture . diagnostics . some ( ( diagnostic ) => diagnostic . kind === 'runtime_resume_required' && diagnostic . reason_code === 'companion_plugin_init_pending' ) ) ;
15071566 assert . ok ( result . findings . some ( ( finding ) => finding . kind === 'runtime_resume_required' && finding . reason_code === 'companion_plugin_init_pending' ) ) ;
1567+ const finding = result . findings . find ( ( candidate ) => candidate . kind === 'runtime_resume_required' ) ;
1568+ assert . equal ( finding . loss_class , 'runtime_resume_required' ) ;
1569+ assert . equal ( finding . repair_bucket , 'runtime_resume_required' ) ;
1570+ assert . equal ( finding . candidate_repo , 'static-site-importer' ) ;
1571+ } ) ;
1572+
1573+ test ( 'pending runtime counts remain in every aggregate projection' , ( ) => {
1574+ const root = mkdtempSync ( path . join ( tmpdir ( ) , 'ssi-pending-runtime-rollups-' ) ) ;
1575+ for ( const [ id , fixture ] of Object . entries ( {
1576+ pending : { fixture_class : 'marketing/static' , capabilities : [ 'hero' ] , risk_profile : 'medium' } ,
1577+ passed : { fixture_class : 'marketing/static' , capabilities : [ 'hero' ] , risk_profile : 'medium' } ,
1578+ } ) ) {
1579+ const directory = path . join ( root , id ) ;
1580+ mkdirSync ( directory , { recursive : true } ) ;
1581+ writeFileSync ( path . join ( directory , 'index.html' ) , `<main>${ id } </main>` ) ;
1582+ writeFileSync ( path . join ( directory , 'fixture.json' ) , JSON . stringify ( fixture ) ) ;
1583+ }
1584+ const matrix = createFixtureMatrix ( { fixture_root : root , id : 'pending-runtime-rollups' } ) ;
1585+ const result = normalizeFixtureMatrixResult ( {
1586+ matrix,
1587+ results : [
1588+ { fixture_id : 'pending' , status : 'pending_runtime' } ,
1589+ { fixture_id : 'passed' , status : 'passed' } ,
1590+ ] ,
1591+ } ) ;
1592+ assert . equal ( result . summary . pending_runtime , 1 ) ;
1593+ assert . equal ( result . summary . classes [ 'marketing/static' ] . pending_runtime , 1 ) ;
1594+ assert . equal ( result . summary . quality_budgets [ 'marketing/static' ] . pending_runtime , 1 ) ;
1595+ assert . equal ( result . summary . capabilities . hero . pending_runtime , 1 ) ;
1596+ assert . equal ( result . summary . risk_profiles . medium . pending_runtime , 1 ) ;
15081597} ) ;
15091598
15101599test ( 'materialization sidecars reject malformed, stale, cross-fixture, and hash-mismatched evidence' , ( ) => {
0 commit comments