@@ -541,7 +541,6 @@ function validateIssue(issue) {
541541 const reasons = [ ] ;
542542 const guidance = [ ] ;
543543 let softPass = false ;
544- const titleLower = title . toLowerCase ( ) ;
545544
546545 if ( ! kind ) {
547546 const failure = untemplatedIssueFailure ( issue ) ;
@@ -578,9 +577,11 @@ function validateIssue(issue) {
578577 goal !== null || blocker !== null || behaviour !== null || example !== null ;
579578
580579 if ( emptyCore . length > 0 ) {
580+ // Soft-pass rich non-template bodies once kind is already feature (title
581+ // prefix, enhancement label, or stored kind). Do not require the title to
582+ // keep a `[Feature]:` prefix — maintainer retitles must not re-arm closure.
581583 const canSoftPass =
582584 ! mappedHeadingPresent &&
583- titleLower . startsWith ( "[feature]:" ) &&
584585 hasSubstantialStructuredContent ( body ) ;
585586 if ( canSoftPass ) {
586587 softPass = true ;
@@ -625,10 +626,14 @@ function validateIssue(issue) {
625626 const os = extractSection ( body , "Operating system" ) ?? extractSection ( body , "OS" ) ;
626627
627628 if ( isEmpty ( summary ) && isEmpty ( repro ) ) {
629+ // Soft-pass substantial non-English / freeform structured reports once
630+ // kind is already bug (label, stored kind, or prior `[Bug]:` detection).
631+ // Requiring the title to keep a `[Bug]:` prefix caused #545: a maintainer
632+ // retitle of an already detailed report was treated as empty Summary/
633+ // Reproduction and auto-closed.
628634 const canSoftPass =
629635 summary === null &&
630636 repro === null &&
631- titleLower . startsWith ( "[bug]:" ) &&
632637 hasSubstantialStructuredContent ( body ) ;
633638 if ( canSoftPass ) {
634639 softPass = true ;
@@ -687,27 +692,38 @@ function validateIssue(issue) {
687692 if ( version !== null && isRawPlaceholder ( version ) === false && isEmpty ( version ) ) emptyCore . push ( "OpenCodex version" ) ;
688693 if ( endpoint !== null && isEmpty ( endpoint ) ) emptyCore . push ( "endpoint or capability" ) ;
689694 if ( emptyCore . length > 0 ) {
690- reasons . push ( `Required sections are missing or empty: ${ emptyCore . join ( ", " ) } .` ) ;
691- guidance . push ( "Describe both the current and expected behaviour." ) ;
695+ // Same soft-pass as bug/feature: label- or maintainer-scoped provider
696+ // reports often use non-English structured headings after a retitle.
697+ const mappedHeadingPresent =
698+ current !== null || expected !== null || repro !== null || response !== null || docs !== null ;
699+ const canSoftPass =
700+ ! mappedHeadingPresent &&
701+ hasSubstantialStructuredContent ( body ) ;
702+ if ( canSoftPass ) {
703+ softPass = true ;
704+ } else {
705+ reasons . push ( `Required sections are missing or empty: ${ emptyCore . join ( ", " ) } .` ) ;
706+ guidance . push ( "Describe both the current and expected behaviour." ) ;
707+ }
692708 }
693709
694- if ( ! isEmpty ( current ) && ! isEmpty ( expected ) && canonicalise ( current ) === canonicalise ( expected ) ) {
710+ if ( ! softPass && ! isEmpty ( current ) && ! isEmpty ( expected ) && canonicalise ( current ) === canonicalise ( expected ) ) {
695711 reasons . push ( "Current and expected behaviour are effectively identical." ) ;
696712 guidance . push ( "Explain the difference between what happens now and what should happen." ) ;
697713 }
698714
699715 const allSections = [ current , expected , repro , response ] . filter ( ( s ) => ! isEmpty ( s ) ) ;
700- if ( allSections . length >= 2 && allRepeatTitle ( allSections , title ) ) {
716+ if ( ! softPass && allSections . length >= 2 && allRepeatTitle ( allSections , title ) ) {
701717 reasons . push ( "All sections merely repeat the issue title." ) ;
702718 guidance . push ( "Add specific detail in each section." ) ;
703719 }
704720
705- if ( isEmpty ( repro ) && isEmpty ( response ) ) {
721+ if ( ! softPass && isEmpty ( repro ) && isEmpty ( response ) ) {
706722 reasons . push ( "Both the request/reproduction and the actual response/error are absent." ) ;
707723 guidance . push ( "Include at least a minimal redacted request or the actual error output." ) ;
708724 }
709725
710- if ( isEmpty ( docs ) ) {
726+ if ( ! softPass && isEmpty ( docs ) ) {
711727 reasons . push ( "Upstream documentation is empty without stating that no public specification exists." ) ;
712728 guidance . push ( "Add a URL to the provider specification, or state that no public spec exists." ) ;
713729 }
0 commit comments