Skip to content

feat(memory): give every person the family knows a file of their own - #191

Merged
arthware-dev merged 6 commits into
mainfrom
feat/household-members
Oct 10, 2026
Merged

arthware-dev merged 6 commits into
mainfrom
feat/household-members

Conversation

@arthware-dev

@arthware-dev arthware-dev commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Every person the family knows gets a file of their own, family/people/<id>.md (title, aliases, account), checked by the frontmatter validator. A person with an account is a member of the household. stack up memory adds a file for each account and never rewrites one, so a restart is the whole upgrade.
  • The wiki, the archivist, transcription and the diary read the files: any name a person goes by resolves to them, and a person without an account (a baby) is filed under and listened for. The wiki gives every person a page and lists the members on the home page.
  • A file that breaks the schema is named and left out, never guessed at: stack memory write refuses it, stack memory prompt lists it, and no page is retired while one is broken.

Rebase merge: each commit stands alone and is its own changelog line.

Closes: #154

Who the family is and who it knows was guessed in four places. The
design now names one model for it:

- A person is one entity with two sources. The family declares each
  person in a file of their own, `family/people/<id>.md`: the full
  name, the other names they go by, their chat account if they have
  one. The wiki's person page is the compiled projection of it.
- Membership is derived, not declared. In the first iteration a
  person with an account is a member; a later iteration suggests
  members from the records and asks the family first.
- Records gain `mentions`, the people outside the household they
  name, written by the same call that classifies them.
- A person registry is compiled from those mentions: names, aliases,
  the kind of relation, how present a person is, and the records it
  cites. The family's corrections are edits to the same declared
  files. The wiki's people tiers are a projection of the members plus
  the registry.
- A nightly plausibility pass (the dream cycle) is named as later work.
- ADR-011 gets an update: the agent may answer from compiled pages
  whose statements cite their records, reading the records filed since
  the last compile.
The wiki guessed who the family is from vault folders and the names in
documents, so a `media/` folder became a member page carrying the
baby's data, and a person without a chat account had no page at all.

Each person now has a file, `family/people/<id>.md`, in the vault's
frontmatter format: `type: person`, the full name as `title`, the
other names the family uses as `aliases`, and `account` for a person
with a chat account. A person with an account is a member of the
household. Every `stack up memory` adds a file for each account that
has none and never rewrites an existing one, so an existing install
switches over with a restart of the memory stacklet. Until a file
exists, the wiki keeps its old roster.

With the files, the wiki gives every declared person a page under the
names their file gives, also before anything names them, and its home
page lists the members. Names in documents resolve through the
aliases, generated person pages nobody declares are removed, and a
change to any file rebuilds every person page (`--members`).

A file that breaks the schema is never guessed at: the readers name it
and leave it out, no page is removed while one is broken, and
`stack memory write` refuses it with the reason. The schema sits with
the other types in the frontmatter validator, which now knows a
declared `person` and fields that must hold a single value.

An update reaches it with `./stack restart memory`; add anyone without
an account (a baby) as a file of their own in `family/people/`.
The archivist knew the family from the Paperless `Person:` tags, which
are seeded from the accounts' first names. A person without an account
had no tag and was never filed, and a document naming "Margaret" could
not be matched to Maggie.

With person files, the classifier and the capture prompt list every
declared person with every name the family gave them, accounts or not.
A returned name resolves through those names to the person's first
name, and a person without a `Person:` tag gets one the first time a
document names them, so no restart of the docs stacklet is needed.
`stack memory prompt` shows the block the classifier receives and names
any person file that was skipped, with the reason. Without person
files, nothing changes.

Refs: #154
Transcription and the diary cards took the family from `FAMILY_NAMES`,
the accounts' names, plus the wiki's person pages. A baby without an
account was missing from the transcription vocabulary, and a person
page the old wiki roster made for a folder counted as family.

With person files, the vocabulary, the transcript correction pass and
the card people are the declared people and every name they go by;
person pages count only for declared people and add the spellings
documents used. Cards list people by first name, as their `Person:`
tags do. Until the files exist, `FAMILY_NAMES` stands in as before.

Closes: #154
A member's names from the household page reached their page's
frontmatter, but nothing showed them. The page header now adds "Also
known as" with the other names next to the date: Bart's page says
"Also known as Bartholomew". A name made only of words in the title
("Maggie" under "Maggie Simpson") is left out. Sender pages show their
aliases the same way.
The base memories corpus covers four weeks and tests dating and
threading. `spec.people.en.yaml` spreads 47 memories from March 2024 to
September 2026 and names the people around the Simpsons the way a real
room does: grandparents rarely but for years, a best friend often, a
teacher for one school year, a doctor for one month, a bully often
without being close. Its `people` block is an answer key of who each
person is to the family, written independently of how often the corpus
names them, and every item lists who it mentions.

`generate.py --corpus` and `ingest.py --corpus` render and replay a
named spec next to the locale corpora.
@arthware-dev
arthware-dev force-pushed the feat/household-members branch from 41589a7 to 580c519 Compare October 9, 2026 12:36
@arthware-dev arthware-dev changed the title feat(memory): take the wiki's members from the household page feat(memory): give every person the family knows a file of their own Oct 9, 2026
@arthware-dev
arthware-dev merged commit f421e21 into main Oct 10, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Let the family list include people without a chat account

1 participant