@@ -814,6 +814,38 @@ function classifyImpact(prAnalysis) {
814814 return { verdict : 'maybe' , reason : 'Code changes detected; possible docs impact.' } ;
815815}
816816
817+ // Detect micro UI-only changes likely not worth docs
818+ function isMicroUiChange ( prAnalysis ) {
819+ const title = ( prAnalysis . title || '' ) . toLowerCase ( ) ;
820+ const body = ( prAnalysis . body || '' ) . toLowerCase ( ) ;
821+ const files = prAnalysis . files || [ ] ;
822+
823+ const cosmeticKeywords = [
824+ 'tooltip' , 'tooltips' , 'spacing' , 'margin' , 'padding' , 'align' , 'alignment' ,
825+ 'border' , 'borders' , 'icon' , 'icons' , 'label' , 'labels' , 'translation' , 'translations' ,
826+ 'typo' , 'color' , 'colors' , 'popover' , 'menu' , 'dropdown' , 'ui' , 'layout' , 'scroll' , 'overflow'
827+ ] ;
828+ const frontendOnly = files . length > 0 && files . every ( f => {
829+ const name = f . filename . toLowerCase ( ) ;
830+ const isStyle = / \. ( c s s | s c s s | l e s s | s a s s ) $ / i. test ( name ) || name . includes ( '/styles' ) || name . includes ( '/style' ) ;
831+ const isAdmin = name . includes ( '/admin' ) || name . includes ( 'packages/strapi-admin' ) || name . includes ( 'packages/core/admin' ) ;
832+ const isDocsArea = / ( a p i | s e r v e r | c o n f i g | r o u t e s | c o n t r o l l e r s | s e r v i c e s ) / . test ( name ) ;
833+ return ( isStyle || isAdmin ) && ! isDocsArea ;
834+ } ) ;
835+
836+ const text = `${ title } ${ body } ` ;
837+ const hasCosmetic = cosmeticKeywords . some ( k => text . includes ( k ) ) ;
838+ return hasCosmetic && frontendOnly ;
839+ }
840+
841+ // Detect regression/restore-to-expected behavior changes
842+ function isRegressionRestore ( prAnalysis ) {
843+ const t = ( prAnalysis . title || '' ) . toLowerCase ( ) ;
844+ const b = ( prAnalysis . body || '' ) . toLowerCase ( ) ;
845+ const text = `${ t } ${ b } ` ;
846+ return / r e g r e s s i o n | r e s t o r e | r e s t o r e d | r e v e r t | r e v e r t e d | a l i g n w i t h | p a r i t y w i t h | b a c k t o e x p e c t e d / . test ( text ) ;
847+ }
848+
817849async function main ( ) {
818850 const rawArgs = process . argv . slice ( 2 ) ;
819851 const { releaseUrl } = parseArgs ( rawArgs ) ;
@@ -875,7 +907,7 @@ async function main() {
875907 const candidates = suggestCandidateDocs ( llmsIndex , prAnalysis , 5 ) ;
876908 // Optional cap: apply limit only to LLM calls
877909 const runLLM = impact . verdict !== 'no' && ( ! OPTIONS . limit || analyses . filter ( a => a . claudeSuggestions ) . length < OPTIONS . limit ) ;
878- const claudeSuggestions = runLLM
910+ let claudeSuggestions = runLLM
879911 ? await generateDocSuggestionsWithClaude ( {
880912 ...prAnalysis ,
881913 _summary : summary ,
@@ -884,6 +916,13 @@ async function main() {
884916 } )
885917 : null ;
886918
919+ // Apply strictness downgrade in conservative mode for micro UI or regression restores
920+ if ( OPTIONS . strict === 'conservative' && claudeSuggestions && claudeSuggestions . needsDocs === 'yes' ) {
921+ if ( isMicroUiChange ( prAnalysis ) || isRegressionRestore ( prAnalysis ) ) {
922+ claudeSuggestions = { ...claudeSuggestions , needsDocs : 'no' } ;
923+ }
924+ }
925+
887926 analyses . push ( {
888927 ...prAnalysis ,
889928 summary,
0 commit comments