This file is the narrative companion to the entities under
context/team-members/, context/roles/, model-spec artifacts under
context/artifacts/, and context/bindings/. Load it at session start
whenever a task needs routing.
Governing decisions:
DEC-20260422_0233-SpryTulip— TeamMember model + file-based tiered memory + A2A Agent Cards + team-manager skill (replaces actor-profile).DEC-20260422_0234-BraveFalcon— 51-role curated catalog with pure-ordinal seniority ladder.DEC-20260422_0234-LoyalComet— T-shirt capacity tiers, named efforts,model-assignmentbindings, 8-layer resolution precedence.DEC-20260503_1424-ShinyBear— model descriptions areArtifact(kind=model-spec)entities, not a separate Model primitive.DEC-20260503_1424-WiseBird— bindings connect addressable processkit entities; model-assignment concrete targets are model-spec artifacts.DEC-20260503_1829-LoyalComet— Role and TeamMember defaults route through provider-neutralArtifact(kind=model-profile)artifacts; concrete models are selected after runtime access gates.
Earlier roster decisions
(DEC-20260414_0900-TeamRoster-permanent-ai-team-composition,
DEC-20260417_1800-CapabilityProfileRouting-three-layer-model-selection)
are superseded by the v0.19.0 trio above.
The team is now a thin overlay on three primitives:
- Roles (
context/roles/) — 51 curated organisational labels, grouped by function. Roles are descriptive routing labels, not restrictive access control. No seniority in slugs. - Seniority — pure ordinal attribute, ladder
junior → specialist → expert → senior → principal. Carried by TeamMembers (default) or per-dispatch. - Model specs
(
context/artifacts/ART-YYYYMMDD_HHMM-ModelSpec-*.md) — model descriptions as timestampedArtifact(kind=model-spec)entities, one per(provider, family)with versions nested. Each model spec declares anequivalent_tierin the T-shirt ladder (xs / s / m / l / xl / xxl). - Model profiles
(
context/artifacts/ART-YYYYMMDD_HHMM-ModelProfile-*.md) — provider-neutral capability profiles such ascode-balancedorresearch-deep. Profile filenames must not encode provider or model names; concrete provider/model candidates live inside the artifact. - Bindings (
context/bindings/) —model-assignmentbindings wire(role, seniority)or TeamMember identity to(model-profile artifact, effort). The default binding pack ships seeds atcontext/skills/processkit/model-recommender/default-bindings/MANIFEST.yaml.
Routing is a single MCP call: model-recommender.resolve_model(role, seniority, team_member?, scope?, task_hints?) runs the 8-layer
precedence ladder and returns ranked candidates with rationale.
Persistent participants live as directory trees under
context/team-members/<slug>/:
context/team-members/<slug>/
team-member.md # entity (frontmatter + spec)
persona.md # static identity prompt
card.json # A2A v0.3 Agent Card (signature placeholder until crypto wired)
knowledge/ # semantic — promoted facts
journal/ # episodic — append-only daily log
skills/ # procedural — recurring workflows
relations/ # per-counterpart interaction notes
lessons/ # A-MemGuard dual memory — distilled corrections
private/ # developer-local; gitignored
Memory file frontmatter convention: tier, source, sensitivity,
confidence, importance, created, last_reinforced, scope.
Default consolidation cadence: per-task + daily journal + weekly
importance-triggered promotion.
| Slug | Type | Display name | Default role | Default seniority | Notes |
|---|---|---|---|---|---|
thrifty-otter |
human | Bernhard | ROLE-ceo |
principal | Project owner. Migrated from ACTOR-20260421_0144-ThriftyOtter-owner. |
Add additional TeamMembers via
team-manager.create_team_member(name, type, slug, default_role, default_seniority, …).
For type=ai-agent, the name must be drawn from the international
name pool at
context/skills/processkit/team-manager/data/name-pool.yaml
(team-manager enforces this with the team.name.off_pool warning).
Ad-hoc worker invocations are not persisted. Dispatch via
(role, seniority) directly; the resolver picks the model. No
team-member entity is created for one-off work.
| Group | Count | Examples |
|---|---|---|
| engineering-software | 2 | software-engineer, embedded-engineer |
| platform-infra | 5 | devops-engineer, site-reliability-engineer, cloud-engineer, database-engineer, observability-engineer |
| data-ml | 3 | data-scientist, machine-learning-engineer, ai-research-scientist |
| research-rnd | 1 | research-scientist |
| security | 2 | security-operations-engineer, security-architect |
| qa | 1 | qa-engineer |
| architecture | 4 | solutions-architect, enterprise-architect, cloud-architect, data-architect |
| devrel-docs | 2 | technical-writer, community-manager |
| product-program | 5 | product-manager, product-owner, program-manager, scrum-master, chief-of-staff |
| design-ux | 2 | product-designer, ux-designer |
| marketing | 5 | product-marketing-manager, seo-specialist, brand-manager, pr-manager, content-marketer |
| sales-customer | 3 | account-executive, sales-engineer, customer-success-manager |
| people-hr | 2 | recruiter, learning-development-manager |
| finance | 3 | financial-analyst, controller, treasury-analyst |
| legal-compliance | 3 | general-counsel, compliance-officer, data-protection-officer |
| operations | 2 | business-operations-analyst, coo |
| executive | 5 | ceo, cto, cpo, cfo, cmo |
| support | 1 | assistant |
Full role definitions live one-per-file under context/roles/.
Provider-neutral T-shirt ladder, extensible in both directions:
| Tier | Typical use | Example models (current roster) |
|---|---|---|
xs |
(reserved for ultra-light future models) | — |
s |
minimal cost / reflexive responses | mistral-small |
m |
routine cheap work | claude-haiku, gemini-2-5-flash, phi, llama-3-70b |
l |
mid-capacity utility | gemini-3-flash, mistral-large |
xl |
strong day-to-day flagship | gpt-4o, o4-mini, codestral, qwen2-5-coder-32b |
xxl |
frontier / deep-reasoning | claude-opus, claude-sonnet, gpt-5, gpt-5-pro, o3, gemini-2-5-pro, grok-4, deepseek-r, qwen3-235b |
Each model-spec artifact's equivalent_tier is used by the resolver for
abstract matching.
[none, low, medium, high, extra-high, max]. Anthropic's xhigh
corresponds to processkit extra-high (aliased at the provider-adapter
boundary). max resolves to the model's max_thinking_budget field.
model-recommender.resolve_model(
role="ROLE-software-engineer",
seniority="senior",
team_member="TEAMMEMBER-thrifty-otter", # optional
scope="processkit", # optional
task_hints={"requires_tool_use": True}, # optional
)
→ {candidates: [{model_id, version_id, effort, rank, source_layer, rationale}, ...]}
/pk-explain-routing software-engineer senior
Renders the 8-layer trace, dropped candidates, final ranking, and warnings.
- Task-pinned override (
task_hints.model_pin). - TeamMember preference bindings.
- Project veto bindings (hard filter).
- Capability filter (modalities vs
task_hints.requires_*). - Role + seniority bindings.
- Role default bindings (no seniority).
- Project bias bindings (
cost_bias,provider_preference) — reorder, don't filter. - Shim fallback (
role.spec.default_model_profile, then deprecatedrole.spec.default_model); emits warning.
Tie-breakers within a layer: project-preferred provider, lower cost, more recent GA version, higher reliability.
Driven by the project owner's subscription mix. Orientation targets (not hard limits), expressed against the new tier ladder rather than provider-specific names:
| Tier | Target share of session effort |
|---|---|
xxl (Opus / GPT-5 / Gemini 2.5 Pro / Grok 4 / o3) |
≈ 5 % |
xl + l (Sonnet / GPT-4o / Mistral Large / etc.) |
≈ 85 % |
m + s (Haiku / Flash / Phi / Llama / etc.) |
≈ 10 % |
When session share deviates more than ±10 pp from a target, surface to the owner with the driving task mix. Owner decides whether to rebalance.
| Task | MCP tool / command |
|---|---|
| Add a persistent team-member | team-manager.create_team_member |
| Reserve a name from the pool | team-manager.reserve_name |
| Check team consistency | team-manager.check_all_consistency (or pk-doctor --category=team_consistency) |
| Export a team-member | team-manager.export_team_member |
| Import a team-member from another project | team-manager.import_team_member |
Per-project overrides for routing:
binding-management.create_binding(
type="model-assignment",
subject="ROLE-product-manager",
target="ART-20260503_1832-ModelProfile-general-deep",
target_kind="Artifact",
conditions={
"seniority": "senior",
"rank": 1,
"effort_floor": "medium",
"effort_ceiling": "extra-high",
"rationale": "Project-specific: PM does deep planning here"
}
)
Lower-numbered ranks win; layer 5 (role+seniority) overrides layer 6 (role default) overrides layer 8 (shim).
Use direct Artifact(kind=model-spec) targets only for explicit pins,
project vetoes, or temporary compatibility. Role and TeamMember defaults
must use model profiles so Cora, roles, and exported team members remain
portable across Codex, Claude Code, Gemini CLI, Aider, Continue, Cursor,
Copilot, OpenCode, Hermes, and future harnesses.
When a new model version ships:
/pk-model-refreshupdates the catalog.- Edit the timestamped model-spec artifact under
context/artifacts/ART-YYYYMMDD_HHMM-ModelSpec-<provider>-<family>.mdto add a newversions[]entry; bumpequivalent_tierif capacity shifted. - If a new family unlocks rerankings, add it to the relevant
ModelProfilecandidate list. Update the default binding pack only when a role/seniority should point to a different neutral profile. - Record a DecisionRecord (
/pk-dec) only if the change is cross-cutting.