Skip to content

Model Persona emergence and Agent-work drift as bounded attributed signals #97

Description

@Flare576

Summary

While investigating a rapidly filling Persona-linked Person record, we found that the current extraction path intentionally treats those records as an append-only “living identity log.” That preserves potentially meaningful emergence evidence, but it also turns a small number of conversations into a large, unstructured narrative that is difficult to review, cannot distinguish witnesses, and uses character count as a proxy for drift.

We need an attributed, bounded signal model for Persona emergence and Agent-work drift.

This issue is deliberately PG. The investigation involved personal conversation data, but no such content is needed to understand or implement the design.

Context and constraints

  • People records remain the canonical extraction and disambiguation surface for both humans and Personas. The pipeline correctly discovers Personas as people because that is how users naturally discuss them.
  • A Persona-linked Person record must remain the shared relationship/graph node. Do not replace it with an unrelated Persona-only registry.
  • Cross-persona observations are intentional witness evidence. “Alison observed Lena” is not contamination merely because the observer and subject differ.
  • Ordinary human People records may legitimately contain important narrative-shaped relationship detail. This work must not force all narrative into Topics or change ordinary-Person semantics.
  • Persona identity (“who they are”) and Agent operating contract (“how they work in a harness”) are separate durable targets. Evidence may support either, both, or neither.

Problem

For a matched Person with an Ei Persona identifier, buildPersonUpdatePrompt() takes a special append-only branch that says, among other things:

  • “living identity log”
  • “add, never truncate”
  • “Never remove or summarize away existing content”
  • “brevity is wrong here”

handlePersonUpdate() then accepts the model’s returned full description and replaces the record by ID. The resulting text simultaneously acts as:

  1. relationship/disambiguation profile;
  2. raw field-notes/transcript surrogate;
  3. cross-observer evidence store;
  4. reflection input;
  5. prompt-cost accumulator.

One string cannot safely hold all five roles. Size-triggered reflection sees narrative volume, not necessarily novel or recurring drift. The current record also cannot retain claim-level provenance: who observed a behavior, whether it was self-report or cross-persona testimony, which source message supports it, whether it was repeated, or how a human reviewed it.

Agent evidence adds another gap. Coding-harness transcripts may show operating-contract drift, but they must not be treated as Agent evidence unless the active agent definition and execution context are verified for that source message.

Direction

Branch after the first-stage People scan resolves a candidate to an existing Person linked to an Ei Persona—not only inside the generic Person-update prompt.

conversation block
  → People/Topic scan
  → resolve candidate to Person
  → linked Ei Persona?
      ├─ no  → ordinary Person flow
      └─ yes → Persona observation flow
                → signal-target classification
                → Persona and/or Agent signal reducers
                → optional bounded Person profile update

Preserve the existing graph

Keep the linked Person record as the subject/relationship/disambiguation node. Keep normal identifiers, relationship semantics, search, and deduplication on that record.

Store derived signal state alongside the Persona runtime state rather than inside PersonaEntity itself, so normal full-record Persona corrections cannot accidentally overwrite it:

state.personas[personaId] = {
  entity: PersonaEntity,
  messages: Message[],
  signals: {
    persona: PersonaSignal[],
    agent: AgentSignal[],
  },
}

The exact persisted shape is an ADR decision, not settled by this issue.

Observation versus signal

An observation is compact, attributed testimony with source pointers. A signal is a bounded, reviewable grouping of corroborating or contradictory observations.

interface PersonaObservation {
  subject_person_id: string
  subject_persona_id: string
  observer_kind: "human" | "subject_self" | "other_persona"
  observer_persona_id?: string
  message_id: string
  quote_id?: string
  observed_at: string
  dimension: "behavior" | "voice" | "values" | "relationship" | "identity"
  direction: "novel" | "confirms" | "challenges"
  claim: string
  extraction_confidence: number
}

interface EmergentSignal {
  subject_persona_id: string
  claim: string
  dimension: "behavior" | "voice" | "values" | "relationship" | "identity"
  status: "candidate" | "recurring" | "reviewed" | "dismissed" | "superseded"
  evidence_ids: string[]
  first_observed_at: string
  last_observed_at: string
  observer_kinds: string[]
  recurrence_count: number
}

The final schema may use existing Quote records as evidence pointers, but Quotes alone do not currently preserve all required observer, claim, review, and historical-association semantics.

Target lenses

The classifier must produce separately phrased claims for each applicable target:

Target Question Durable destination
Persona Who is this Persona? Persona identity (long_description, traits, topics)
Agent How does the active agent work in this harness? Verified agent definition / harness instructions / skills

An Agent signal requires verified execution provenance captured at ingestion time:

{
  harness: string,
  agent_id: string,
  agent_definition_ref: string,
  definition_revision: string,
  mode: "primary" | "delegated",
}

If provenance is unavailable, do not silently create Agent-contract evidence. It may remain Persona evidence or become a visible needs_agent_provenance review item.

Signal rules

  • A single observation may create a candidate but does not automatically prove identity drift.
  • Repetition, independent observers, contradiction with current identity/contract, or explicit human importance can promote a signal.
  • Subject self-report is meaningful testimony but does not self-confirm a change.
  • Cross-persona testimony must retain observer identity; it is not automatically weighted as truth or contamination.
  • A definition revision creates a new Agent-contract baseline. Intentional redesign is not drift.
  • Character count is only a cost/readiness metric, never a drift oracle.
  • Raw message history remains the source of truth. Do not copy scene-level narrative merely to preserve evidence.
  • Dismissed/superseded signals retain compact audit disposition and source pointers but do not remain in ordinary prompt context.
  • No prompt-only novelty gate is sufficient; no-op / no-profile-change semantics must be enforced at the write boundary and tested.

Existing mechanisms to reuse

  • Source messages and stable Quote/message IDs.
  • Persona pending_update, reflection-progress locking, apply/dismiss/drain lifecycle.
  • external_reflection_only protections for evidence that must survive until all applicable lenses finish.
  • Soft-alert/ambiguity approach from invalid-link and ghost-record work.
  • Existing dual-lens separation: Persona evidence and Agent operating-contract evidence must not be folded into one identity update.

Non-goals

  • Removing Persona-linked People records.
  • Treating cross-persona testimony as contamination by default.
  • Forcing ordinary human narrative into Topics.
  • Automatically changing Persona identity or Agent instructions based on a signal.
  • Using a character threshold as evidence that drift occurred.

Acceptance criteria

  • ADR: An ADR documents the chosen ownership/schema for Persona observations and signals, the retained role of Persona-linked People records, subject-versus-witness semantics, evidence retention/compaction, Agent-provenance requirements, and the contrary alternative of storing everything only in Persona identity fields. The ADR must explain why that alternative was rejected.
  • The extraction path branches after canonical Person resolution when the matched record has an Ei Persona identifier; ordinary-Person behavior remains unchanged.
  • The Persona branch produces bounded, attributed observations rather than append-only Person-description prose.
  • Signals preserve subject, witness kind, source message, timestamps, recurrence, and lifecycle state; cross-persona observations remain distinguishable from self-report and human observation.
  • Persona and Agent signals are classified separately and cannot silently write into each other’s durable targets.
  • Agent signals are produced only with verified active-agent execution provenance; missing provenance produces no Agent-contract mutation.
  • Reflection consumes active signals plus identity/contract baselines, not an unbounded narrative string. It preserves evidence until every applicable lens reaches a terminal reviewed state.
  • The existing generic Person update path keeps its bounded profile semantics and is not regressed.
  • Tests cover: reinforcing evidence → no signal/profile change; repeated independent evidence → recurring signal; self-report alone; cross-persona witness evidence; contradictory evidence; missing Agent provenance; intentional Agent definition revision; dismissed signal retention; and ordinary-Person regression behavior.
  • Retrieval/UI surfaces can show a signal’s claim, state, witnesses, and source evidence without dumping raw transcripts into routine prompt context.

Open decisions for ADR/design review

  1. Are observations first-class entities, or are they compact associations layered on existing Quotes/messages?
  2. Does a dismissed signal remain indefinitely, expire, or become an archival record?
  3. What recurrence, independence, and time-window policy promotes a candidate to recurring?
  4. How are conflicts between human observation, subject self-report, and peer-Persona observation surfaced without forcing consensus?
  5. Where and how is active-agent provenance captured for each harness?
  6. How do valid composite/one-to-many historical records coexist with current link-multiplicity policy without first-match resolution?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions