docs: list groups and books among what cannot be rebuilt
Assisted-by: GLM-5.3 via pi
change pxxrztspzyuzvrrotyrtyxtqvtnpznnr
commit f05bfb92c6534f6e3645f9a4749a140f42bff7df
author Alpha Chen <alpha@kejadlen.dev>
date
parent ymzpsmts
diff --git a/AGENTS.md b/AGENTS.md
index 577c78f..02cf823 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -206,14 +206,19 @@ not a fixture; edit a `.vcf` to change what the replay serves.
   configuration as it loads, since the exchange log is given its path at
   class-definition time. Set it afterwards and the failed exchanges land
   in `log/` instead of a tmpdir.
-- Only three things in the database cannot be rebuilt: the cards, the
-  change log, and the birthdays — a partial date has no vCard 3.0
-  spelling, so it lives beside its card rather than in it (see
-  docs/plans/2026-08-31-partial-birthdays.md). Everything else is a
-  projection of the cards that `rake index:rebuild` will make again,
-  so no repair is ever needed for it. A write that touches a card must
-  land its change-log entry in the same transaction, because a client's
-  sync token silently skips whatever the log missed.
+- Only five things in the database cannot be rebuilt: the cards, the
+  change log, the birthdays, the groups, and the books — a partial
+  date has no vCard 3.0 spelling, so the birthday lives beside its
+  card rather than in it (docs/plans/2026-08-31-partial-birthdays.md);
+  a group's membership and the lines it lends are facts no stored card
+  carries (docs/plans/2026-08-24-vcard-storage-and-groups.md); and
+  only the `books` row says whose book a name is for
+  (docs/plans/2026-09-19-books-in-the-dump.md). Everything else
+  is a projection of the cards that `rake index:rebuild` will make
+  again, so no repair is ever needed for it. A write that touches a
+  card must land its change-log entry in the same transaction,
+  because a client's sync token silently skips whatever the log
+  missed.
 - A read whose filter is meant to identify one row uses `sole`, not
   `first` — `first` answers with one of several rather than saying the
   filter was too loose. `sole` raises either way it is wrong:
diff --git a/README.md b/README.md
index ef8b63f..3934fe3 100644
--- a/README.md
+++ b/README.md
@@ -33,11 +33,12 @@ END:VCARD
 Storing the card rather than a parse of it is what lets the server keep
 properties it does not model, which RFC 6352 section 6.3.2.2 requires of
 anything accepting writes; `docs/plans/2026-08-24-vcard-storage-and-groups.md`
-makes the case at length. The same database holds the change log and
-the birthdays — the two things in it that cannot be rebuilt, the
-birthdays because a partial date has no vCard 3.0 spelling — and an
-index of parsed properties, which can: `rake index:rebuild` derives
-that again from the stored cards alone. `rake db:dump` writes the
+makes the case at length. The same database holds the change log, the
+birthdays, the groups, and the books — the four things in it besides
+the cards that cannot be rebuilt, the birthdays because a partial
+date has no vCard 3.0 spelling — and an index of parsed properties,
+which can: `rake index:rebuild` derives that again from the stored
+cards alone. `rake db:dump` writes the
 cards, birthdays, groups, and books out as plain files, into
 `data/dump` unless `DUMP` names another directory, and commits them to
 that directory's own repository, so a snapshot is something to revert
diff --git a/lib/pro_tacts/store.rb b/lib/pro_tacts/store.rb
index 58b050f..005ac82 100644
--- a/lib/pro_tacts/store.rb
+++ b/lib/pro_tacts/store.rb
@@ -17,13 +17,14 @@ module ProTacts
   # The transactional store: one SQLite database holding each contact's
   # card exactly as it was submitted.
   #
-  # Four kinds of state live here and they are not equally precious.
-  # Only the cards, the change log, the birthdays, and the groups
-  # cannot be rebuilt, and each is argued where it was decided: the
-  # first two in docs/plans/2026-08-25-sqlite-schema.md, "What the
-  # tables are for", the birthdays in
+  # Five kinds of state live here and they are not equally precious.
+  # Only the cards, the change log, the birthdays, the groups, and
+  # the books cannot be rebuilt, and each is argued where it was
+  # decided: the first two in docs/plans/2026-08-25-sqlite-schema.md,
+  # "What the tables are for", the birthdays in
   # docs/plans/2026-08-31-partial-birthdays.md, the groups in
-  # docs/plans/2026-08-24-vcard-storage-and-groups.md. Everything else
+  # docs/plans/2026-08-24-vcard-storage-and-groups.md, the books in
+  # docs/plans/2026-09-19-books-in-the-dump.md. Everything else
   # is an index derived from the cards, and #rebuild_index will make
   # it again from nothing.
   #