docs: list groups and books among what cannot be rebuilt
Assisted-by: GLM-5.3 via pi
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.
#