Skip to content

[bot] Fix Layout/LineEndStringConcatenationIndentation#869

Closed
6[bot] wants to merge 1 commit intomainfrom
fix/layout-line_end_string_concatenation_indentation-23729223545
Closed

[bot] Fix Layout/LineEndStringConcatenationIndentation#869
6[bot] wants to merge 1 commit intomainfrom
fix/layout-line_end_string_concatenation_indentation-23729223545

Conversation

@6
Copy link
Copy Markdown
Contributor

@6 6 bot commented Mar 30, 2026

Status: Agent is working on this fix...

Cop: Layout/LineEndStringConcatenationIndentation | Backend: codex / hard | Model: gpt-5.4 (xhigh) | Mode: fix
Code bugs: 5 | Run: https://github.com/6/nitrocop/actions/runs/23729223545

Task prompt (6273 tokens)

Fix Layout/LineEndStringConcatenationIndentation — 1 FP, 193 FN

Instructions

You are fixing ONE cop in nitrocop, a Rust Ruby linter that uses Prism for parsing.

Current state: 5,821 matches, 1 false positives, 193 false negatives.
Focus on: FN (RuboCop flags code nitrocop misses).

⚠ 5,821 existing matches must not regress. Validate with check_cop.py before committing.

Workflow

  1. Read the Pre-diagnostic Results and Corpus FP/FN Examples sections below first
  2. Verify with RuboCop first (for FP fixes): before writing any code, confirm RuboCop's
    behavior on BOTH the specific FP case AND the general pattern:
    echo '<specific FP case>' > /tmp/test.rb && rubocop --only Layout/LineEndStringConcatenationIndentation /tmp/test.rb
    echo '<general pattern>' > /tmp/test.rb && rubocop --only Layout/LineEndStringConcatenationIndentation /tmp/test.rb
    If RuboCop flags the general pattern, your fix must be narrow enough to not suppress it.
  3. Add a test case FIRST:
    • FN fix: add the missed pattern to tests/fixtures/cops/layout/line_end_string_concatenation_indentation/offense.rb with ^ annotation
    • FP fix: add the false-positive pattern to tests/fixtures/cops/layout/line_end_string_concatenation_indentation/no_offense.rb
  4. Verify test fails: cargo test --lib -- cop::layout::line_end_string_concatenation_indentation
  5. Fix src/cop/layout/line_end_string_concatenation_indentation.rs
  6. Verify test passes: cargo test --lib -- cop::layout::line_end_string_concatenation_indentation
  7. Validate against corpus (REQUIRED before committing):
    python3 scripts/check_cop.py Layout/LineEndStringConcatenationIndentation --rerun --clone --sample 15
    If this reports FP or FN regression, your fix is too broad — narrow it down.
  8. Add a /// doc comment on the cop struct documenting what you found and fixed
  9. Commit only your cop's files

Fixture Format

Mark offenses with ^ markers on the line AFTER the offending source line.
The ^ characters must align with the offending columns. The message format is Layout/LineEndStringConcatenationIndentation: <message text>.
See the Current Fixture sections below for real examples from this cop.

Mixed issues: some code bugs, some config issues

Pre-diagnostic shows SOME patterns are correctly detected in isolation (config issues)
and SOME are genuinely missed (code bugs). See the per-example diagnosis below.

  • For examples marked CODE BUG: follow the standard TDD workflow
  • For examples marked CONFIG/CONTEXT: investigate config resolution, not detection logic

If your test passes immediately

If you add a test case and it passes without code changes, the corpus mismatch is
caused by config/context differences, not a detection bug.
Do NOT loop trying to make the test fail. Instead:

  1. Investigate config resolution (Include/Exclude, cop enablement, disable comments)
  2. The fix is likely in src/config/ or the cop's config handling, not detection logic
  3. If you cannot determine the root cause within 5 minutes, document your findings as
    a /// comment on the cop struct and commit

CRITICAL: Avoid regressions in the opposite direction

When fixing FPs, your change MUST NOT suppress legitimate detections. When fixing FNs,
your change MUST NOT flag code that RuboCop accepts. A fix that eliminates a few issues
in one direction but introduces hundreds in the other is a catastrophic regression.

Before exempting a category of patterns, verify with RuboCop that the general case
is still an offense:

rubocop --only Layout/LineEndStringConcatenationIndentation /tmp/test.rb

If RuboCop flags the general pattern but not your specific case, the difference is in
a narrow context (e.g., enclosing structure, receiver type, argument count) — your fix
must target that specific context, not the broad category.

Rule of thumb: if your fix adds an early return or continue that skips a whole
node type, operator class, or naming pattern, it's probably too broad. Prefer adding a
condition that matches the SPECIFIC differentiating context.

Rules

  • Only modify src/cop/layout/line_end_string_concatenation_indentation.rs and tests/fixtures/cops/layout/line_end_string_concatenation_indentation/
  • Run cargo test --lib -- cop::layout::line_end_string_concatenation_indentation to verify your fix (do NOT run the full test suite)
  • Run python3 scripts/check_cop.py Layout/LineEndStringConcatenationIndentation --rerun --clone --sample 15 before committing to catch regressions
  • Do NOT touch unrelated files
  • Do NOT use git stash
  • Do NOT push — you do not have push permission; the workflow handles pushing after you exit

Current Fixture: offense.rb

tests/fixtures/cops/layout/line_end_string_concatenation_indentation/offense.rb

text = 'hello' \
    'world'
    ^^^^^^^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.

result = "one" \
           "two"
           ^^^^^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.

# In always-indented context (def body), second line should be indented
def some_method
  'x' \
  'y' \
  ^^^ Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.
  'z'
end

# In always-indented context (block body), second line should be indented
foo do
  "hello" \
  "world"
  ^^^^^^^ Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.
end

# In always-indented context (lambda body), second line should be indented
x = ->(obj) {
  "line one" \
  "line two"
  ^^^^^^^^^^ Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.
}

# Operator assignment inside def - NOT always-indented, parent is op_asgn
def update_record
  msg = "initial"
  msg +=
    "first part " \
      "second part"
      ^^^^^^^^^^^^^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.
end

# Index operator assignment inside def - NOT always-indented
def process_errors
  errors[:detail] +=
    "a valid item has a single " \
      "root directory"
      ^^^^^^^^^^^^^^^^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.
end

# Call operator write (x.y +=) inside def
def handle_response
  response.body +=
    "extra content " \
      "appended here"
      ^^^^^^^^^^^^^^^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.
end

# Or-assignment inside def
def set_default
  @value ||=
    "default " \
      "value"
      ^^^^^^^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.
end

# In always-indented context (if branch), aligned dstr should be indented
# (previously a false negative)
def show_message
  str = ""
  str << if condition
           "The first part of a long " \
           "message that spans multiple lines."
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.
         else
           "A different " \
           "message here."
           ^^^^^^^^^^^^^^^ Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.
         end
end

# In parenthesized expression (Parser :begin, always-indented), aligned dstr should be indented
def build_message
  result << (
    'fail validation if '\
    ":#{name} is unset; "\
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.
    'should have been defined'
  )
end

# In explicit begin...end (Parser :kwbegin, NOT always-indented), aligned check
def cache_key_prefix
  @prefix ||= begin
    indicator = unique ? "" : "s"
    "attr#{indicator}" \
      ":#{model_name}" \
      ^^^^^^^^^^^^^^^^^^^^^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.
      ":#{attribute}"
  end
end

Current Fixture: no_offense.rb

tests/fixtures/cops/layout/line_end_string_concatenation_indentation/no_offense.rb

# Properly aligned string concatenation
msg = "foo" \
      "bar"

text = 'hello' \
       'world'

result = "one" \
         "two"

simple = "no continuation"

# Backslash inside heredoc should not be flagged
x = <<~SQL
  SELECT * FROM users \
  WHERE id = 1
SQL

y = <<~SHELL
  echo "hello" \
    "world"
SHELL

# Properly indented in def body (always_indented context)
def some_method
  'x' \
    'y' \
    'z'
end

# Properly indented in block body (always_indented context)
foo do
  "hello" \
    "world"
end

# Aligned inside method call argument (non-indented context)
describe "should not send a notification if a notification service is not" \
         "configured" do
end

# Aligned in case/when branch (when is NOT always-indented parent)
def message
  case style
  when :first_column_after_left_parenthesis
    'Indent the right bracket the same as the first position ' \
    'after the preceding left parenthesis.'
  end
end

# Properly indented in lambda body (always_indented context, like block)
x = ->(obj) {
  "line one" \
    "line two" \
    "line three"
}

# Aligned operator assignment inside def (not always-indented)
def update_record
  msg = "initial"
  msg +=
    "first part " \
    "second part"
end

# Aligned index operator write inside def
def process_errors
  errors[:detail] +=
    "a valid item " \
    "description"
end

# Properly indented dstr inside if branch within a + concatenation in a def
# (previously a false positive — StatementsNode pass-through bug)
def library_name
  "update " +
    if items.one?
      "#{items.first} requirement " \
        "#{old_version}" \
        "to #{new_version}"
    else
      names = items.map(&:name).uniq
      if names.one?
        "requirements for #{names.first}"
      else
        "#{names[0..-2].join(', ')} and #{names[-1]}"
      end
    end
end

# Indented dstr inside if/else branch assigned with += (always-indented: parent is :if)
def build_intro
  msg = "Updates dependency"
  msg += if items.count > 2
           " #{links[0..-2].join(', ')} " \
             "and #{links[-1]}. "
         else
           " ancestor dependency #{links[1]}. "
         end
  msg
end

# Indented dstr inside elsif branch (if is always-indented parent)
def application_name
  "bump " +
    if items.one?
      record = items.first
      "#{record.name} " \
        "#{from_msg(record.version)}" \
        "to #{record.new_version}"
    elsif updating_property?
      record = items.first
      "#{prop_name} " \
        "#{from_msg(record.version)}" \
        "to #{record.new_version}"
    else
      names = items.map(&:name).uniq
      names.first
    end
end

# Indented dstr inside block within if branch
def metadata_info
  items.map do |dep|
    msg = if dep.removed?
            "\nRemoves `#{dep.name}`\n"
          else
            "\nUpdates `#{dep.name}` " \
              "#{from_msg(dep.version)}" \
              "to #{dep.new_version}"
          end
    msg
  end
end

# Indented dstr inside conditional assignment after if/else
def render_message
  msg = ""
  msg +=
    if records.count > 10
      "- Additional items viewable in " \
        "[compare view](#{url})\n"
    else
      "- See full diff in [compare view](#{url})\n"
    end
  msg
end

# Aligned dstr inside case/when branch (when is NOT always-indented parent)
def check_visibility
  case role
  when 'default'
    user_ids = 'test'
    "(private = false " \
      "OR author = user " \
      "OR assigned_to IN (ids))"
  when 'own'
    "(author = user OR " \
    "assigned_to IN (ids))"
  end
end

# Aligned dstr inside else of case (case else is NOT always-indented parent)
def bracket_message
  case style
  when :first_column
    'Indent the right bracket the same as the first position ' \
    'after the preceding left parenthesis.'
  else
    'Indent the right bracket the same as the start of the line ' \
    'where the left bracket is.'
  end
end

# Aligned dstr inside else of if within a def body
def enqueue_message
  if success
    "Enqueued all jobs"
  else
    "Failed enqueuing jobs " \
      "to adapter"
  end
end

# Aligned dstr inside rescue clause (rescue is NOT always-indented parent)
def inspect_value
  obj.inspect
rescue StandardError
  "<span class='error'>(Object too large. " \
  "Adjust the maximum size.)</span>"
end

# Indented dstr inside else of if (if is always-indented parent)
# Multi-statement if body with block, single-statement else body
def update_message(items, version, adapter)
  if items.any?
    messages = items.map do |dep|
      "  #{dep['explanation']}"
    end.join("\n")

    pluralized =
      items.count > 1 ? "dependencies" : "dependency"

    "The latest possible version that can be installed is " \
      "#{version} because of the following " \
      "conflicting #{pluralized}:\n\n#{messages}"
  else
    "The latest possible version of #{adapter} that can " \
      "be installed is #{version}"
  end
end

Key Source Files

  • Rust implementation: src/cop/layout/line_end_string_concatenation_indentation.rs
  • RuboCop Ruby source (ground truth): vendor/rubocop/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb
  • RuboCop test excerpts: vendor/rubocop/spec/rubocop/cop/layout/line_end_string_concatenation_indentation_spec.rb

Read these files before making changes.

Start Here

Use the existing corpus data to focus on the most concentrated regressions first.

Helpful local commands:

  • python3 scripts/investigate_cop.py Layout/LineEndStringConcatenationIndentation --repos-only
  • python3 scripts/investigate_cop.py Layout/LineEndStringConcatenationIndentation --context
  • python3 scripts/verify_cop_locations.py Layout/LineEndStringConcatenationIndentation

Top FP repos:

  • skyborn-industries__ffxiv-collect__b25e5ac (1 FP) — example app/helpers/collections_helper.rb:529

Top FN repos:

  • felixbuenemann__xlsxtream__62e4836 (182 FN) — example test/xlsxtream/workbook_test.rb:54
  • ruby-ldap__ruby-net-ldap__de197ea (10 FN)
  • amahi__platform__38a1d1f (1 FN) — example app/models/server.rb:117

Representative FP examples:

  • skyborn-industries__ffxiv-collect__b25e5ac: app/helpers/collections_helper.rb:529 — Align parts of a string concatenated with backslash.

Representative FN examples:

  • amahi__platform__38a1d1f: app/models/server.rb:117 — Indent the first part of a string concatenated with backslash.
  • felixbuenemann__xlsxtream__62e4836: test/xlsxtream/workbook_test.rb:54 — Align parts of a string concatenated with backslash.
  • felixbuenemann__xlsxtream__62e4836: test/xlsxtream/workbook_test.rb:55 — Align parts of a string concatenated with backslash.

Pre-diagnostic Results

Diagnosis Summary

Each example was tested by running nitrocop on the extracted source in isolation
with --force-default-config to determine if the issue is a code bug or config issue.
Note: source context is truncated and may not parse perfectly. If a diagnosis
seems wrong (e.g., your test passes immediately for a 'CODE BUG'), treat it as
a config/context issue instead.

  • FN: 3 code bug(s)
  • FP: 1 context-dependent
  • Omitted 12 pre-diagnostic FN example(s) with no source context because diagnosed FN examples were available

FN #1: amahi__platform__38a1d1f: app/models/server.rb:117

NOT DETECTED — CODE BUG
The cop fails to detect this pattern. Fix the detection logic.

Full-file enclosing chain: method body (line 115: def cmd_file) > enclosing line 84: protected

Message: Indent the first part of a string concatenated with backslash.

Ready-made test snippet (add to offense.rb, adjust ^ count):

		"check process #{self.clean_name} with pidfile \"#{self.pid_file}\"\n"	\
^ Layout/LineEndStringConcatenationIndentation: Indent the first part of a string concatenated with backslash.

Full file context (30 lines before offense):

       87: 		tmp = self.pidfile || (self.name + ".pid")
       88: 		(tmp =~ /^\//) ? tmp : File.join(PID_PATH, tmp)
       89: 	end
       90: 
       91: 	def start_cmd
       92: 		Platform.service_start_command(name)
       93: 	end
       94: 
       95: 	def stop_cmd
       96: 		Platform.service_stop_command(name)
       97: 	end
       98: 
       99: 	def enable_cmd
      100: 		Platform.service_enable_command(name)
      101: 	end
      102: 
      103: 	def disable_cmd
      104: 		Platform.service_disable_command(name)
      105: 	end
      106: 
      107: 	def destroy_hook
      108: 		c = Command.new("rm -f #{File.join(Platform.file_name(:monit_dir), Platform.service_name(name))}.conf")
      109: 		c.submit Platform.watchdog_restart_command
      110: 		c.submit disable_cmd
      111: 		c.submit stop_cmd
      112: 		c.execute
      113: 	end
      114: 
      115: 	def cmd_file
      116: 		"# WARNING - This file was automatically generated on #{Time.now}\n"	\
>>>   117: 		"check process #{self.clean_name} with pidfile \"#{self.pid_file}\"\n"	\
      118:         	"\tstart program = \"#{self.start_cmd}\"\n"				\
      119:         	"\tstop  program = \"#{self.stop_cmd}\"\n"
      120: 	end
      121: 
      122: 	def monit_file_add
      123: 		fname = TempCache.unique_filename "server-#{self.name}"
      124: 		open(fname, "w") { |f| f.write cmd_file }

FN #2: felixbuenemann__xlsxtream__62e4836: test/xlsxtream/workbook_test.rb:55

NOT DETECTED — CODE BUG
The cop fails to detect this pattern. Fix the detection logic.

Full-file enclosing chain: enclosing line 53: 'xl/workbook.xml' => > block ({..}) (line 52: expected = {) > method body (line 49: def test_empty_workbook) > class body (line 8: class WorksheetTest < Minitest::Test) > module body (line 7: module Xlsxtream)

Message: Align parts of a string concatenated with backslash.

Ready-made test snippet (add to offense.rb, adjust ^ count):

          '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" '\
^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.

Full file context (30 lines before offense):

       25:       def [](key)
       26:         @paths_to_file_contents.fetch(key)
       27:       end
       28: 
       29:       def close
       30:       end
       31:     end
       32: 
       33:     def test_workbook_from_path
       34:       tempfile = Tempfile.new('xlsxtream')
       35:       Workbook.open(tempfile.path) {}
       36:       refute_equal 0, tempfile.size
       37:     ensure
       38:       tempfile.close! if tempfile
       39:     end
       40: 
       41:     def test_workbook_from_io
       42:       tempfile = Tempfile.new('xlsxtream')
       43:       Workbook.open(tempfile) {}
       44:       refute_equal 0, tempfile.size
       45:     ensure
       46:       tempfile.close! if tempfile
       47:     end
       48: 
       49:     def test_empty_workbook
       50:       iow_spy = io_wrapper_spy
       51:       Workbook.open(iow_spy) {}
       52:       expected = {
       53:         'xl/workbook.xml' =>
       54:           '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'"\r\n" \
>>>    55:           '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" '\
       56:                     'xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">' \
       57:             '<workbookPr date1904="false"/>' \
       58:             '<sheets></sheets>' \
       59:           '</workbook>',
       60:         'xl/_rels/workbook.xml.rels' =>
       61:           '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'"\r\n" \
       62:           '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' \

FN #3: felixbuenemann__xlsxtream__62e4836: test/xlsxtream/workbook_test.rb:59

NOT DETECTED — CODE BUG
The cop fails to detect this pattern. Fix the detection logic.

Full-file enclosing chain: enclosing line 53: 'xl/workbook.xml' => > block ({..}) (line 52: expected = {) > method body (line 49: def test_empty_workbook) > class body (line 8: class WorksheetTest < Minitest::Test) > module body (line 7: module Xlsxtream)

Message: Align parts of a string concatenated with backslash.

Ready-made test snippet (add to offense.rb, adjust ^ count):

          '</workbook>',
^ Layout/LineEndStringConcatenationIndentation: Align parts of a string concatenated with backslash.

Full file context (30 lines before offense):

       29:       def close
       30:       end
       31:     end
       32: 
       33:     def test_workbook_from_path
       34:       tempfile = Tempfile.new('xlsxtream')
       35:       Workbook.open(tempfile.path) {}
       36:       refute_equal 0, tempfile.size
       37:     ensure
       38:       tempfile.close! if tempfile
       39:     end
       40: 
       41:     def test_workbook_from_io
       42:       tempfile = Tempfile.new('xlsxtream')
       43:       Workbook.open(tempfile) {}
       44:       refute_equal 0, tempfile.size
       45:     ensure
       46:       tempfile.close! if tempfile
       47:     end
       48: 
       49:     def test_empty_workbook
       50:       iow_spy = io_wrapper_spy
       51:       Workbook.open(iow_spy) {}
       52:       expected = {
       53:         'xl/workbook.xml' =>
       54:           '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'"\r\n" \
       55:           '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" '\
       56:                     'xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">' \
       57:             '<workbookPr date1904="false"/>' \
       58:             '<sheets></sheets>' \
>>>    59:           '</workbook>',
       60:         'xl/_rels/workbook.xml.rels' =>
       61:           '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'"\r\n" \
       62:           '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' \
       63:             '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>' \
       64:           '</Relationships>'
       65:       }
       66:       actual = iow_spy

FP #1: skyborn-industries__ffxiv-collect__b25e5ac: app/helpers/collections_helper.rb:529

NOT REPRODUCED — CONFIG/CONTEXT issue
nitrocop does not flag this in isolation or in the full file
(with default config). The FP is caused by the target repo's
config (e.g., different Max value, Include/Exclude patterns).

Source context:

        price = @prices[collectable.item_id]
      end

      # Do not render tooltips for items without listings
      return unless price['price'].present?

      "<b>#{t('prices.price')}:</b> #{number_with_delimiter(price['price'])} Gil<br>" \
        "<b>#{t('prices.world')}:</b> #{price['world']}<br>" \
        "<b>#{t('prices.updated')}:</b> #{price['last_updated']}"
    rescue
    end
  end
end

Message: Align parts of a string concatenated with backslash.

Full file context (30 lines before offense):

      499:     # Sort the patches in reverse chronological order
      500:     options.sort_by! { |patch| [-patch[1].to_f, patch[1].is_a?(Integer) ? 1 : 0] }
      501: 
      502:     # Add an All Patches option to the start of the list
      503:     if all
      504:       options.unshift([t('all.patches'), 'all'])
      505:     end
      506: 
      507:     options_for_select(options, selected)
      508:   end
      509: 
      510:   def location(location, x, y, inline: false)
      511:     "#{location.name}#{inline ? ' ' : '<br>'}(#{x}, #{y})".html_safe
      512:   end
      513: 
      514:   private
      515:   def price_tooltip(collectable, data = nil)
      516:     begin
      517:       if data.present?
      518:         # Use explicitly provided price data if available
      519:         price = JSON.parse(data)
      520:       else
      521:         # Otherwise, it should be available from a hash
      522:         price = @prices[collectable.item_id]
      523:       end
      524: 
      525:       # Do not render tooltips for items without listings
      526:       return unless price['price'].present?
      527: 
      528:       "<b>#{t('prices.price')}:</b> #{number_with_delimiter(price['price'])} Gil<br>" \
>>>   529:         "<b>#{t('prices.world')}:</b> #{price['world']}<br>" \
      530:         "<b>#{t('prices.updated')}:</b> #{price['last_updated']}"
      531:     rescue
      532:     end
      533:   end
      534: end

@6
Copy link
Copy Markdown
Contributor Author

6 bot commented Mar 30, 2026

Agent failed. See run: https://github.com/6/nitrocop/actions/runs/23729223545

@6 6 bot closed this Mar 30, 2026
@6 6 bot deleted the fix/layout-line_end_string_concatenation_indentation-23729223545 branch March 30, 2026 05:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants