comments: prune the new ones to the convention that landed
Rebased onto a rule I'd already broken twice on the way in:
cite the plan, don't argue it, and let a test name speak for itself.
The signature said which two things the block is handed, so the comment
above it stopped repeating them, and three sentences became three tests.

Assisted-by: Claude Opus 5 via Claude Code

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015WjrPJFvetad8vvCHqjujh
change
commit 596d3ae0dad464e16ecb4fc9e55f6bd36be7e6a1
author Claude <noreply@anthropic.com>
date
parent 565d2642
diff --git a/lib/pro_tacts/contact.rb b/lib/pro_tacts/contact.rb
index 1c90f4a..37144f2 100644
--- a/lib/pro_tacts/contact.rb
+++ b/lib/pro_tacts/contact.rb
@@ -342,8 +342,8 @@ module ProTacts
     end
 
     # The rows a repeatable property reads as: each line naming it
-    # folded by the block, which takes the property and the line it
-    # came from and answers nil for a row with nothing to show.
+    # folded by the block, which answers nil for a row with nothing
+    # to show.
     #: [T] (String name) { (VCard::Parser::Property, VCard::Parser::Line) -> T? } -> Array[T]
     def rows(name)
       of_line(name).filter_map { |line|
@@ -393,8 +393,8 @@ module ProTacts
       Address.new(po_box:, extended:, street:, locality:, region:, postal_code:, country:, type: type_of(property), line:)
     end
 
-    # The first of a row's TYPE parameters (RFC 2426 section 3.3.1),
-    # downcased: the spelling is the card's, and a screen shows one.
+    # RFC 2426 section 3.3.1. Downcased: the spelling is the card's,
+    # and a screen shows one.
     #: (VCard::Parser::Property property) -> String?
     def type_of(property)
       property.parameter("TYPE")&.downcase
diff --git a/lib/pro_tacts/vcard/parser.rb b/lib/pro_tacts/vcard/parser.rb
index 9932bff..0fb4165 100644
--- a/lib/pro_tacts/vcard/parser.rb
+++ b/lib/pro_tacts/vcard/parser.rb
@@ -90,10 +90,9 @@ module ProTacts
         #: () -> Array[String]
         def components = VCard.split_components(value)
 
-        # The named parameter's first value, or nil for a property
-        # carrying none. Names match without case (RFC 2426 section
-        # 4); the first value, because a repeat arrives as two pairs
-        # (see above) and a caller wanting both reads `parameters`.
+        # Names match without case (RFC 2426 section 4), and a
+        # repeat arrives as two pairs (see above) — so this is the
+        # first of them, and a caller wanting both reads `parameters`.
         #: (String name) -> String?
         def parameter(name)
           parameters.find { |parameter, _| parameter.casecmp?(name) }&.last
diff --git a/test/pro_tacts/vcard/test_parser.rb b/test/pro_tacts/vcard/test_parser.rb
index 3fb7962..620728a 100644
--- a/test/pro_tacts/vcard/test_parser.rb
+++ b/test/pro_tacts/vcard/test_parser.rb
@@ -370,14 +370,22 @@ class VCardParserTest < Minitest::Test
 
   ## Parameters
 
-  # A name matches without case (RFC 2426 section 4), and a parameter
-  # listing several values answers with the first of them.
   def test_a_parameter_reads_by_name_without_case
-    property = properties(card("TEL;type=WORK,voice:+1-555-1234")).fetch(0)
+    property = properties(card("TEL;type=work:+1-555-1234")).fetch(0)
 
-    assert_equal "WORK", property.parameter("TYPE")
-    assert_equal "WORK", property.parameter("type")
-    assert_equal ["WORK", "voice"], property.parameters.map(&:last)
+    assert_equal "work", property.parameter("TYPE")
+  end
+
+  def test_a_parameter_listing_several_values_reads_the_first
+    property = properties(card("TEL;TYPE=work,voice:+1-555-1234")).fetch(0)
+
+    assert_equal "work", property.parameter("TYPE")
+  end
+
+  def test_a_parameter_the_repeated_spelling_lists_reads_the_same
+    property = properties(card("TEL;TYPE=work;TYPE=voice:+1-555-1234")).fetch(0)
+
+    assert_equal "work", property.parameter("TYPE")
   end
 
   def test_a_parameter_the_property_does_not_carry_reads_as_nil