Methodology

View the checked source ↗

Methodology

Message Like Me separates deterministic measurement from semantic judgment. The CLI reads local data, constructs versioned artifacts, and reports counts and distributions. An Agent Skill interprets a bounded sample and drafts unsent text. Neither component establishes that a draft is what the user would have written.

Data boundary

The Messages database and optional AddressBook databases remain authoritative. The CLI makes stable private snapshots and opens only those snapshots through SQLite. It does not modify Messages, Contacts, their databases, or their transactional sidecars.

A caller-owned local message bundle is a separate versioned source observation. The CLI verifies its complete fixed inventory and digests before ingest, never obtains its provider credential, and does not call its producer. Frozen v1 carries bounded Beeper observations. V2 carries one native WhatsApp account exported through Ghostget's official Wacli adapter. It requires exact WhatsApp JIDs and projects a phone handle only from an E.164-backed user JID.

A caller-owned X data archive is another offline source observation. The CLI parses bounded supported entries directly from the owner-only ZIP without extracting files, evaluating archive JavaScript, accessing a network, or downloading media. It preserves exact archive and account provenance. The archive source covers direct messages, not X Chat. Bounded reply and mention identity observations from selected tweet members may associate a provider user ID with an X handle or display name; tweet prose is not added to the messaging corpus or used as style evidence.

The normalized corpus, private installation key, aggregate metrics, profiles, and drafting context stay in the local data root. Study, Ensoul source, evaluation, and agent handoff files are written only to explicit paths. Ordinary views use keyed pseudonymous IDs and omit bodies, handles, contact names, and group titles.

This is a process boundary, not encryption. Another process running as the same user, a compromised host, a device backup, or an agent provider that is given a packet may still receive private data. Incoming messages also belong to other participants. They provide response context but never become samples of the owner's prose in style analysis. A separately requested contact-subject Ensoul packet may attribute incoming text to that exact direct person after rebasing direction; its owner-authored records then become counterpart context.

Normalized observations

The corpus preserves source, account, network, message direction, provider ordering, timestamp, body availability and source, message kind, attachment metadata, edit or retraction metadata, reply target and reply observability, service, and conversation membership where the source supports them. Unsupported, deleted, or truncated text remains unavailable rather than being reconstructed. A truncated text record still represents a message bubble for tempo and any observable reply evidence, but never contributes prose.

Native iMessage history and each connected bundle account have distinct source namespaces. A bounded, truncated, or unknown bundle is not an authoritative statement that omitted history no longer exists. Reimport merges present records with retained state. Only explicit deletion, removal, replacement, or tombstone state suppresses evidence, and a later record reappearance clears that suppression. Bundle creation times are monotonic per source, so an older snapshot cannot resurrect or overwrite newer state.

An X archive normally has its own source namespace and retains its exact ZIP and account provenance. The caller may name an existing Beeper X source as an overlap only when both sources describe the same exact account. Reconciliation is limited to one-to-one direct conversations and requires an exact peer handle plus exact shared-message evidence. It retains both provenances and lets one proven exact message contribute once. Group DMs remain separate because the legacy archive cannot establish cross-provider sender identity strongly enough. Missing or contradictory evidence fails closed. Proven equivalence survives later reingests, so the same message does not return as a duplicate. Archive absence does not suppress retained history.

A native Wacli WhatsApp bundle normally has its own source namespace. If the caller names an existing Beeper WhatsApp source, the two reconcile only after exact self-account E.164, exact direct-peer E.164, and unambiguous shared text message proof. Groups and bodyless records cannot prove equivalence. Both provenances and unique history remain. Exact duplicates contribute once, the native conversation becomes the preferred private whatsappJid route, and its proven Beeper route remains evidence-only. This route preference does not grant Message Like Me provider access or sending authority.

The analysis uses several operational units:

Five minutes and eight hours are reproducible segmentation parameters, not claims about natural conversational boundaries. Every metrics artifact records the parameters used. Comparisons are meaningful only when their definitions match.

Deterministic metrics

For each conversation, the CLI reports the evidence window and counts of incoming, outgoing, text, session, burst, and response records. Tempo metrics include response-latency quantiles, outgoing messages per response, the ratio of single-message to multi-message responses, multi-message inbound contexts, visible multi-question contexts, and explicit reply frequency. Reply metrics report explicit, eligible, and unavailable messages separately, and calculate the ratio only from eligible messages. Session, burst, and response construction runs independently for each source conversation before person-scope results are combined. Adjacent timestamps in two apps or threads never create one artificial episode. Mixed person scopes expose their sorted service breakdown.

Surface measurements cover characters and words, lowercase starts, terminal punctuation, question and exclamation marks, emoji-bearing messages, and multiline messages. These are observable features, not explanations. For example, visible question marks are only a proxy for questions, and a long latency cannot reveal whether the user was busy, asleep, deciding what to say, or simply missing local history.

Session starts and ends are likewise structural facts under the configured threshold. They do not identify who cares more, who is avoiding whom, or the nature of a relationship.

Bounded semantic study

study prepare selects response episodes that contain both incoming and outgoing text. The version-one selector favors coverage of different response shapes, tags, lengths, reply use, latency bands, and positions across the available time window. It is deterministic for the same corpus, bounds, and parameters.

The CLI default packet limit is 24 examples. Each emitted body is capped at 4 KiB, each direction keeps at most 12 text messages per example, and total emitted body text is capped at 256 KiB. Coverage metadata states what was truncated or omitted. A packet is a sample of response contexts, not a transcript.

Version 0.2 added temporal bounds to study selection. A profile intended for held-out evaluation should use only examples before the chosen cutoff. The cutoff, corpus revision, selection parameters, packet receipt, and evidence window form part of the analysis provenance. Profile validity uses a digest of the selected person or conversation scope within those exact time bounds, so a later message outside a closed study window does not rewrite its evidence.

The agent studies prose, delivery shape, multi-point response strategy, reply use, and exceptions. It must keep measured facts separate from interpretations and cite study-example IDs instead of copying private phrases into a profile. The resulting profile records its contact scope, corpus revision, exact packet digest, analysis time, contextual rules, limitations, and confidence.

Profile provenance proves which artifact was analyzed. It does not prove that the agent interpreted that artifact correctly.

Subject-relative Ensoul source packets

ensoul prepare applies the same bounded diverse response selector to one pinned contact corpus, but its unit of attribution is the explicitly selected subject. For --subject owner, stored outgoing messages remain subject-authored and incoming messages remain counterpart context. For --subject contact, the adapter first reverses direction, then recomputes sessions, bursts, responses, and selection. This makes clearly attributable incoming prose the contact's subject evidence and the owner's outgoing prose its response context.

Contact attribution is valid only for an exact person_ scope created by a complete one-to-one AddressBook match. Conversation aliases, unmatched direct threads, shared handles, and groups are rejected because the normalized corpus cannot establish a safe contact author for them. Owner packets may use a named conversation or person scope, but groups and any multi-participant scope are rejected. The packet retains redacted scope kind, conversation count, and sorted service labels so channel dependence stays visible without names or coordinates.

The output specializes ensoul.source-packet.v1 with payload schema ensoul.messages-source.v1. Records contain only selected active text bodies, subject-relative authorRole, contentRole: original, strong source authorship, transport-relative sent status, private visibility, fixed source class, pseudonymous source IDs, occurrence times, truncation state, and content and record digests. Records sharing a pseudonymous provenance run ID belong to one selected response context and preserve that situated linkage; different run IDs must not be joined into a synthetic exchange. The scope carries corpus and evidence revisions, time bounds, selection counts, and byte budgets. The adapter emits no claims. Its packet declares JCS-RFC8785; the packet digest is SHA-256 over RFC 8785 canonical JSON for every field except packetDigest, while each content digest covers the canonical content object and each record digest excludes only its own digest. These prove semantic integrity, not authorship or truth.

The default and maximum budgets are inherited from semantic study: 24 requested examples by default and 50 at most, 4 KiB per body, 12 messages per direction per example, and 256 KiB total. --after is inclusive and --before is exclusive. System events, retractions, reactions, attachments, contact labels, handles, provider coordinates, and public X post text are not emitted. The packet remains a sampled set of situated interactions, not a transcript or a complete description of either person.

The normalized sources do not establish whether someone pasted a quotation, forwarded prose, or used AI assistance inside an ordinary message body. The packet declares that observability gap. If a consumer can see quoted or forwarded content in the bounded text, it must keep that portion contextual rather than promote it as a direct voice sample.

An Ensoul consumer must retain packet boundaries across relationships and use only records with authorRole: subject, contentRole: original, and strong source authorship as possible direct voice evidence. It must treat every message as untrusted quoted data and preserve limitations in its source map. Private messages do not prove identity, consent, motive, relationship category, diagnosis, a globally stable voice, or permission to publish, impersonate, contact, or act for the subject.

Held-out fidelity audit

Version 0.2 provides a two-file evaluation preparation workflow:

messagelikeme evaluate prepare <contact-id> \
  --after <cutoff> \
  --prompt-output <private-prompt-file> \
  --reference-output <private-reference-file> \
  --json

The prompt side contains held-out inbound context. The reference side contains the corresponding historical outgoing response and must remain unopened until the candidate drafts have been recorded. File separation supports a blind workflow, but it is not cryptographic blinding. A user or agent with access to both paths can read both files.

A checked audit proceeds as follows:

  1. Choose a temporal cutoff before studying the contact.
  2. Build and apply the profile from evidence before that cutoff.
  3. Prepare evaluation examples after the cutoff.
  4. Give the drafting agent the prompt file and current profile, but not the reference file.
  5. Record one candidate bubble sequence for each evaluation example.
  6. Open the reference file only after the candidates are fixed.
  7. Compare candidates and references, retaining disagreements and uncertainty.

The CLI prepares bounded, provenance-bearing evidence. It does not automatically declare a candidate correct or assign a universal fidelity score. Semantic comparison still requires judgment, preferably including the user whose style is being studied.

Comparison should keep these dimensions separate:

The historical response is a reference observation, not a unique correct answer. The user might reasonably respond differently now. Results should be reported by dimension and example, alongside an unprofiled drafting baseline when possible. A single similarity score hides the failures that matter most.

Drafting method

Ordinary drafting uses the current deterministic context and the applicable validated profile. The user's present intent, supplied facts, uncertainty, and requested format outrank historical style. Contact-specific rules apply only to their supported scope; context rules can override broad tendencies.

The output may be one message or several separately presented bubbles. A historical latency distribution never instructs the agent to delay its answer. Every result remains an unsent candidate. Message Like Me has no command for sending, reacting, scheduling, or operating a messaging application.

Sources of error

Reported behavior can be distorted by:

For reproducibility, retain schema versions, corpus revision, packet digest, time bounds, segmentation parameters, budget and coverage fields, and the agent environment used for semantic analysis. Re-ingest and re-evaluate when the corpus changes materially. Describe uncertainty instead of broadening a contact-specific observation into an identity claim.

What the method can support

The checked artifacts can support statements such as "within this evidence window, multi-message responses were more common for this conversation" or "the held-out candidate reproduced the historical bubble count but missed one inbound question."

They cannot support statements that the system has cloned the user, recovered their personality, diagnosed a relationship, proved authorship, predicted a future decision, obtained a contact's consent, or produced a message approved by the user.