SEED: Always use build metadata titles in index table

Removes duplicate numbers from the titles in the table, while keeping
them in the sidebar where they're desired. SEED authors already have to
provide a title before their SEED is merged; now they no longer have to
remove it.

Change-Id: I36c1bb98d6f8dc9d27e28a39a12173499192d3ea
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/183750
Reviewed-by: Taylor Cramer <cramertj@google.com>
Presubmit-Verified: CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
Pigweed-Auto-Submit: Alexei Frolov <frolv@google.com>
diff --git a/pw_docgen/py/pw_docgen/seed.py b/pw_docgen/py/pw_docgen/seed.py
index 063f2d6..0b1b5ee 100644
--- a/pw_docgen/py/pw_docgen/seed.py
+++ b/pw_docgen/py/pw_docgen/seed.py
@@ -78,17 +78,17 @@
 
             if 'changelist' in meta:
                 # The SEED has not yet been merged and points to an active CL.
-                change_url = (
+                change_link = (
                     'https://pigweed-review.googlesource.com'
                     f'/c/pigweed/pigweed/+/{meta["changelist"]}'
                 )
-                title = f'`{meta["title"]} <{change_url}>`__'
+                title = f'`{meta["title"]} <{change_link}>`__'
                 seed_toctree.append(
-                    f'{meta["number"]}: {meta["title"]}<{change_url}>',
+                    f'{meta["number"]}: {meta["title"]}<{change_link}>',
                 )
             else:
                 # The SEED document is in the source tree.
-                title = f':ref:`seed-{meta["number"]}`'
+                title = f':ref:`{meta["title"]} <seed-{meta["number"]}>`'
                 seed_toctree.append(Path(meta["rst_file"]).stem)
 
             seed_table.extend(
diff --git a/seed/0001-the-seed-process.rst b/seed/0001-the-seed-process.rst
index 0cde0e5..c99fbee 100644
--- a/seed/0001-the-seed-process.rst
+++ b/seed/0001-the-seed-process.rst
@@ -183,6 +183,7 @@
 
       pw_seed("5309") {
         sources = [ "5309-pw_rpc-over-smoke-signals.rst" ]
+        title = "pw_rpc Over Smoke Signals"
         status = "Accepted"
         author = "Your Name"
       }
diff --git a/seed/BUILD.gn b/seed/BUILD.gn
index b9e72de..7347f5e 100644
--- a/seed/BUILD.gn
+++ b/seed/BUILD.gn
@@ -19,24 +19,28 @@
 pw_seed("0001") {
   sources = [ "0001-the-seed-process.rst" ]
   inputs = [ "0001-the-seed-process/seed-index-gerrit.png" ]
+  title = "The SEED Process"
   status = "Meta"
   author = "The Pigweed Authors"
 }
 
 pw_seed("0002") {
   sources = [ "0002-template.rst" ]
+  title = "SEED Template"
   status = "Meta"
   author = "The Pigweed Authors"
 }
 
 pw_seed("0101") {
   sources = [ "0101-pigweed.json.rst" ]
+  title = "pigweed.json"
   status = "Accepted"
   author = "Rob Mohr"
 }
 
 pw_seed("0102") {
   sources = [ "0102-module-docs.rst" ]
+  title = "Consistent Module Documentation"
   status = "Accepted"
   author = "Chad Norvell"
 }
@@ -50,12 +54,14 @@
 
 pw_seed("0104") {
   sources = [ "0104-display-support.rst" ]
+  title = "Display Support"
   status = "Accepted"
   author = "Chris Mumford"
 }
 
 pw_seed("0105") {
   sources = [ "0105-pw_tokenizer-pw_log-nested-tokens.rst" ]
+  title = "Nested Tokens and Tokenized Log Arguments"
   status = "Accepted"
   author = "Gwyneth Chen"
 }
@@ -69,48 +75,56 @@
 
 pw_seed("0107") {
   sources = [ "0107-communications.rst" ]
+  title = "Pigweed Communications"
   status = "Accepted"
   author = "Wyatt Hepler"
 }
 
 pw_seed("0108") {
   sources = [ "0108-pw_emu-emulators-frontend.rst" ]
+  title = "Emulators Frontend"
   status = "Accepted"
   author = "Octavian Purdila"
 }
 
 pw_seed("0109") {
   sources = [ "0109-comms-buffers.rst" ]
+  title = "Communication Buffers"
   status = "Accepted"
   author = "Taylor Cramer"
 }
 
 pw_seed("0110") {
-  status = "Accepted"
   sources = [ "0110-memory-allocation-interfaces.rst" ]
+  title = "Memory Allocation Interfaces"
+  status = "Accepted"
   author = "Alexei Frolov"
 }
 
 pw_seed("0111") {
   sources = [ "0111-build-systems.rst" ]
+  title = "Make Bazel Pigweed's Primary Build System"
   status = "Accepted"
   author = "Ted Pudlik"
 }
 
 pw_seed("0112") {
   sources = [ "0112-async-poll.rst" ]
+  title = "Async Poll Model"
   status = "Accepted"
   author = "Taylor Cramer"
 }
 
 pw_seed("0113") {
   sources = [ "0113-bazel-cc-toolchain-api.rst" ]
+  title = "Add modular Bazel C/C++ toolchain API"
   status = "Accepted"
   author = "Armando Montanez"
 }
 
 pw_seed("0114") {
   sources = [ "0114-channels.rst" ]
+  title = "Channels"
   status = "Accepted"
   author = "Wyatt Hepler"
 }
diff --git a/seed/seed.gni b/seed/seed.gni
index cbbfc04..134dacf 100644
--- a/seed/seed.gni
+++ b/seed/seed.gni
@@ -74,7 +74,7 @@
 #  changelist (optional): If the SEED has not yet been merged, the number of the
 #      CL on Gerrit where the SEED is being reviewed.
 #
-#  title (optional): If `changelist` is provided, the title of the SEED.
+#  title (required): The title of the SEED.
 #
 #  authors (required): Comma-separated list of SEED authors.
 #
@@ -87,6 +87,7 @@
   _has_sources = defined(invoker.sources) && invoker.sources != []
   assert(_has_sources || defined(invoker.changelist),
          "A SEED must either have in-tree sources or an active CL")
+  assert(defined(invoker.title), "SEEDs must have a title")
   assert(defined(invoker.status), "SEEDs must list their status")
   assert(defined(invoker.author), "SEEDs must list their author(s)")
 
@@ -95,6 +96,7 @@
 
   _metadata = {
     number = target_name
+    title = invoker.title
     status = invoker.status
     author = invoker.author
   }
@@ -103,10 +105,7 @@
     _sources = invoker.sources
     _metadata.rst_file = _sources[0]
   } else {
-    assert(defined(invoker.title),
-           "SEEDs pointing to a CL must provide a title")
     _metadata.changelist = invoker.changelist
-    _metadata.title = invoker.title
   }
 
   generated_file(_metadata_target) {