Skip to content

feat(j5): library definitions are personas, not agents - #185

Merged
bryantderosier merged 9 commits into
crews/09-custom-seatsfrom
crews/10-personas-vocabulary
Sep 21, 2026
Merged

bryantderosier merged 9 commits into
crews/09-custom-seatsfrom
crews/10-personas-vocabulary

Conversation

@bryantderosier

@bryantderosier bryantderosier commented Sep 17, 2026 •

Copy link
Copy Markdown
Collaborator

One word was doing two jobs. "Agent" meant both a running participant (a thread, a Crew seat, a subagent) and a saved definition in the library, and Jackson's review kept reaching for "persona" where the descriptions said "agent". A library entry is now a persona everywhere a person or a model reads the word, and "agent" is reserved for something running.

  • UI. Settings → Personas at /settings/personas (the search entry still answers "agents"; the four current users re-find the page), the library panel, create and edit dialogs, the draft picker, the assignment control, the identity chip, the composer picker's badge and empty state, and the crew roster card. A seat with no persona is a custom seat. Mobile matches: settings row, screen title and deep link, library screen, create modal, composer popover.
  • Mentions. @persona:id is what the picker inserts and the docs teach; @agent:id still parses so old drafts and habits keep working.
  • MCP surface. list_agents is list_personas with a personas[] result. The agent parameter on spawn_agent, delegate_task, crew seats, and request_crew_member is persona, with agent accepted as a deprecated alias for one release. Crew results carry persona_id, gate notices and seat briefs write persona=, and the standing orchestration instructions, tool descriptions, allowlists, and server error messages say persona.
  • Docs. The user guide is docs/user/personas.md; the persona contract, operations guide, crews definition, glossary (new persona row), tools reference, FORK.md rows, and the design record follow.

Left alone on purpose: code identifiers, file names, atoms, RPC names, agent-personas.json, and every place "agent" means a running participant, including the right panel's live Agents tab.

Stacked on #183. Design record: docs/j5/worklog/2026-09-16-crew-command-decoupling.md, "personas, not agents".

Evidence

Before, the same page and picker read "Agents" and "Agent"; the rename is one word, so no separate before shot. After:

Settings → Personas.

Settings Personas

Composer picker badge.

Persona badge in the composer picker

🤖 Generated with Claude Code

Closes #210.

@bryantderosier
bryantderosier added this pull request to stack #153 September 17, 2026 14:50
@github-actions github-actions Bot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Sep 17, 2026
@github-actions github-actions Bot added the size:XL 500-999 effective changed lines (test files excluded in mixed PRs). label Sep 17, 2026
@bryantderosier
bryantderosier force-pushed the crews/10-personas-vocabulary branch from 7094fb9 to 164cbb0 Compare September 17, 2026 15:01
@bryantderosier bryantderosier self-assigned this Sep 17, 2026

@Jacksondr5 Jacksondr5 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The rename itself is clean: every non-J5 edit is a label change inside an already-recorded FORK.md case, the allowlists and registration tests agree on list_personas, the writer, brief, and parser agree on persona= for new notices, and the mention picker inserts @persona: on web and mobile.

Requesting changes on the compatibility code. The agent parameter is accepted as a deprecated alias on four verbs (spawn_agent, delegate_task, crew seats, request_crew_member), decoded separately in each with persona silently winning on conflict, @agent:id still parses on web and mobile, and three notes say "accepted for one release". docs/j5/process/working-in-the-repo.md records the rule as written: "Pre-dogfood, no legacy-compatibility code, ever (Jackson, 2026-09-01). Accommodations for data or states that cannot exist yet (no users, no legacy drafts) are YAGNI and get deleted; invariants stay and fail closed, loudly." Jackson reaffirmed it today for this case. There is also no version-skew argument for it: the callers are models that read the tool schema from the same server process at session start, and a server restart ends every provider session, so nothing can keep sending the old name. Remove the alias, the per-verb decode, the LEGACY_AGENT_MENTION_PREFIX parse and its token exclusion, and the three deprecation notes (tools.ts, FORK.md, agent-tools.md). With one field left, give persona a schema description so the model sees what it is.

Also requesting (inline on crewNotices.logic.ts): the gate parser drops unrecognized roster lines silently.

Comments:

  • No redirect for /settings/agents on web or the mobile deep link. Accepted in the body; a one-file J5 route that redirects would cost nothing.
  • Leftover "agent" strings where a person reads them: the mobile library screen's "Use Settings → Agents in the web app", "Edit agent", "Replace existing agents?", and the shared "agent definition" copy in client-runtime and the server's library errors.
  • FORK.md rows now stale: one cites docs/user/agents.md (renamed), two name the pre-rename identifiers as current, and the Stack.tsx / SettingsRouteScreen row was not updated for the personas link path.

Reviewed by Claude Fable 5.1 in Claude Code, with an independent pass by GPT-6-Astra in Codex.

Comment thread apps/web/src/j5/crew/crewNotices.logic.ts Outdated
@bryantderosier

Copy link
Copy Markdown
Collaborator Author

b2feffd42 removes the compatibility code: the agent alias and its per-verb decode, the @agent: parse and its token exclusion, and the deprecation notes in tools.ts, FORK.md, and agent-tools.md; persona carries a schema description in their place, and the worklog records the reversal under the pre-dogfood rule. The gate parser fails closed on any roster line it does not understand. The redirect, the leftover strings, and the stale FORK.md rows are tracked in #187.

@Jacksondr5 Jacksondr5 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The compatibility code is gone as ruled: no agent alias or per-verb decode, no old mention parse or token exclusion, no deprecation notes, persona carries a schema description, and the worklog records the reversal under the pre-dogfood rule. The gate parser fails closed on any roster line it does not understand, verified against the old-format fixture. Approving.

One sentence to fix in this PR since the file is already in the diff (inline on docs/user/personas.md): it still teaches the removed mention spelling.

Reviewed by Claude Fable 5.1 in Claude Code, with an independent pass by GPT-6-Astra in Codex.

Comment thread docs/user/personas.md Outdated
@bryantderosier
bryantderosier force-pushed the crews/10-personas-vocabulary branch from b2feffd to 447b333 Compare September 18, 2026 11:49
@bryantderosier
bryantderosier force-pushed the crews/10-personas-vocabulary branch from 447b333 to 37a6cc7 Compare September 18, 2026 14:15
@bryantderosier

Copy link
Copy Markdown
Collaborator Author

The stack is restacked and pushed through 37a6cc709. Remaining mobile/import/validation wording and FORK references now say persona. The custom-seat empty-value fixtures follow the persona wire vocabulary. Server, web, mobile, and client-runtime typechecks pass. The old settings redirect remains deliberately separate, alongside #182 and Fleet command-palette work; see #187.

@Jacksondr5 Jacksondr5 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round five. The mobile, import, and validation strings say persona, the user guide teaches only @persona:, and the FORK.md rows for the user guide and the tool names are correct. Two residuals.

  • inline on FORK.md: the mobile row now cites a file that does not exist.
  • apps/server/src/j5/agents/agentPersonaLibrary.ts still says "Agent definition exceeds 64 KiB." in two validation messages a person can see.

Reviewed by Claude Fable 5.1 in Claude Code, with an independent pass by GPT-6-Astra in Codex.

Comment thread FORK.md Outdated
@bryantderosier
bryantderosier force-pushed the crews/10-personas-vocabulary branch from 5e80dfa to c6fdc47 Compare September 21, 2026 11:56
@bryantderosier

Copy link
Copy Markdown
Collaborator Author

Both residuals from the round-five review are fixed: the mobile file reference is restored and both size-limit validation messages say “Persona definition.”

@Jacksondr5 Jacksondr5 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FORK.md names the mobile file that exists, and both size-limit messages say persona. With the alias removal, the fail-closed parser, and the persona copy verified across three rounds, approving.

Reviewed by Claude Fable 5.1 in Claude Code, with an independent pass by GPT-6-Astra in Codex.

bryantderosier and others added 9 commits September 21, 2026 11:07
One word was doing two jobs: a running participant and a saved definition in the library. A library entry is now a persona everywhere a person or a model reads the word. Settings → Personas at /settings/personas (the search entry still answers "agents"), the library panel, dialogs, composer pickers and badges, and the crew card say persona; a seat with no persona is a custom seat; the mention is @persona:id with @agent:id still parsing. The MCP surface follows: list_agents is list_personas, the agent parameter on spawn_agent, delegate_task, and crew seats is persona with the old spelling accepted for one release, crew results carry persona_id, and the orchestration instructions and server messages say persona. Docs move with it, including docs/user/personas.md. Code identifiers, file names, RPC names, and agent-personas.json are unchanged on purpose.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The mention tests expect the @persona: replacement (a trigger typed as @agent: still upgrades to it), and the persona launch, assignment, and library tests pin the renamed error messages.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The Settings → Personas page still offered a "Create agent" button and the
mobile editor was titled "Edit agent"; both were missed by the vocabulary
rename. The operations guide names the dialog the same way.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e parser fails closed

The rename kept agent as a deprecated parameter on four verbs and let
@agent: mentions parse for one release. Pre-dogfood, the repository
keeps no legacy-compatibility code, and there is no version-skew case
for it: models read the tool schema from the same server process at
session start. The alias, its per-verb decode, the legacy mention prefix
and its token exclusion, and the deprecation notes are gone, and persona
carries a schema description in their place. The gate card parser now
leaves a message raw when any roster line fails to parse, instead of
rendering an approved card with seats silently missing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@bryantderosier
bryantderosier force-pushed the crews/10-personas-vocabulary branch from 4d5cce7 to 997af2f Compare September 21, 2026 15:07
@bryantderosier
bryantderosier merged commit 011d3ae into j5/main Sep 21, 2026
20 checks passed
@bryantderosier
bryantderosier deleted the crews/10-personas-vocabulary branch September 21, 2026 15:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 effective changed lines (test files excluded in mixed PRs). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Library definitions are personas, not agents

2 participants