Skip to content

Rename the actor vocabulary: Staff / Agent / System / Participant #191

Description

@zaridan

The change

Helpthread's fixed vocabulary rule is reversed (maintainer decision, July 2026). The current rule — "Agents are human support staff, Assistants are AI actors" (CLAUDE.md) — is superseded by a four-kind actor model:

Actor kind Meaning Persistence / API value
Staff A human acting for the operator — worker, reviewer, or supervisor staff_members; 'staff'
Agent A native or external AI / autonomous actor agents; 'agent'
System Deterministic, non-AI automation proposed; does not exist yet
Participant An external human in a conversation replaces 'customer'
  • Actor is the umbrella concept — architecture, schema, and protocol. Not heavy UI copy.
  • The product surface becomes Helpthread Inbox (from "Agent Inbox"); the contract agent-inbox-v1 becomes inbox-v1.
  • Agent Exchange keeps its name, with its scope narrowed to agents only. Relay spans all actor kinds; the Exchange is the agent directory. What changes is Define Agent Exchange as a Relay-based control plane #155's definition of the registry, not the name.

Why now, and why it is not a charter change. The charter's actor-model invariant is that the kinds are never silently conflated — the words themselves are not the invariant, so changing them is ordinary vocabulary work plus an amendment. The motivating argument: a future in which AI agents do the primary work and humans supervise reads backwards under the current names.

Two hazards that make this more than a find-and-replace

1. The polarity swap. agentsstaff_members and assistantsagents trade names within the same namespace. A half-applied migration silently mis-attributes authorship, which is the provenance invariant. Never rename in place. Migrate through fresh names in a single transaction, with a fixture proving every existing row keeps its true author across the swap.

2. Design-system coupling. MessageBand and Avatar (and their .d.ts files) under web/src/components/ds/ carry these words and are byte-verbatim copies from the design project. The rename goes upstream in the design project first and comes down via DesignSync — hand-editing them breaks the byte-comparison drift detector that makes the two sides verifiable.

Ground truth in the schema

Verified in src/db/migrate.ts; do not re-derive:

  1. role text NOT NULL DEFAULT 'agent' CHECK (role IN ('admin','agent')) is a second, unrelated meaning of "agent" — a permission role, not an actor kind. Under the swap it would read as "this human is an AI." It must be renamed, and it is easy to miss.
  2. author_kind IN ('customer','agent','assistant') — only three kinds exist today. There is no system kind, so adding one is new schema, not part of the rename.
  3. 'customer' as the external-human kind already contradicts the charter's non-goal rejecting "the word 'customer' as the only name for a person being served." Renaming it to participant resolves a pre-existing contradiction rather than creating work.

Scope

Roughly 5,250 "agent" and 1,125 "assistant" occurrences across 149 files, mostly prose. Estimated 2–3 days, plus a design pass and a charter amendment.

The count grows with every merge — it was ~5,129 / ~1,173 across 131 files when the decision was made, and 18 more files have since acquired the terms. Work merged after this issue is opened will need the same treatment.

Ride-along fix

specs/modules/marketplace-v1.md (around lines 160 and 420) still refers to Helpthread/marketplace and Helpthread/module-draft-assistant. Those repositories now live in the ResonantIQ organization, so the paths are stale. That file carries 48 agent/assistant occurrences this rename rewrites anyway, so the correction belongs here rather than in its own PR.

Definition of done

  • Schema migrated through fresh names in one transaction, with an author-provenance fixture proving no row changes authorship
  • The role column's 'agent' value renamed — it is a permission role, not an actor kind
  • 'customer''participant' in author_kind
  • agent-inbox-v1inbox-v1, spec file renamed and all cross-references updated
  • Design project updated first; web/src/components/ds/ re-pulled via DesignSync, not hand-edited
  • CLAUDE.md vocabulary rule replaced
  • Charter amended to name the four kinds
  • Define Agent Exchange as a Relay-based control plane #155's registry definition updated to the agents-only scope
  • specs/modules/marketplace-v1.md repository paths corrected
  • A system actor kind is out of scope — it is new schema, tracked separately if wanted

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:apiPublic API contracts and API behaviordocumentationImprovements or additions to documentationpriority:p1Important near-term worktype:foundationFoundational platform work

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions