People
Use this skill as a private local identity layer. It answers who a named person
or handle refers to; it does not decide workflow ownership by itself.
Core Boundary
people owns identity, aliases, bot aliases, handles, contact surfaces,
company/team/title, actor trust/posture hints, relationship hints, and optional
private profile notes.
- Workflow skills own their workflows. For example,
github-plan decides which
manager owns a planning item, while people can resolve that manager's local
person id or GitHub handle.
- Repo metadata remains public-safe repo behavior: docs paths, quality gates,
health checks, cleanup policy, and conceptual product ownership.
Local Data
The private index is optional and gitignored. Durable identity context should be
global/user-scoped by default:
$CODE_HOME/skills/.local/people.yaml
$CODE_HOME/skills/.local/people/<person-id>.md
When CODE_HOME is unset, helpers fall back to $CODEX_HOME and then
~/.code. On a machine with none of those, such as one that installs the
catalog only through another host, they use .local/ inside the catalog the
helper ships in. Repo-local people data is an overlay for project-specific contacts,
client-only context, or intentional overrides:
.local/people.yaml
.local/people/<person-id>.md
The resolver loads global/user people first and repo-local people second. A
repo-local entry with the same id replaces the global entry for that repo;
repo-local entries with new ids supplement the global index. If all people
indexes are absent, continue normally without local identity context. Do not
treat missing people data as a failure.
Use references/people.local.example.yaml as the public-safe template. Real
names, handles, emails, phone numbers, company notes, and relationship details
belong only in ignored local files.
Use the writer helper for updates so agents do not accidentally save durable
identity context in the active repository:
uv run people/scripts/people_index.py upsert \
--id example-person \
--display-name "Example Person" \
--github example-user
The writer defaults to global/user storage. Use --scope repo only for
repo-specific people, overrides, or supplements.
People entries may include lightweight trust hints for GitHub actors and other
collaborators. Treat trust as private operational posture: how much to verify,
how cautious to be with code or instructions, and whether the actor is known.
Never publish trust notes or use them to skip live verification.
Resolution Workflow
When identity context may matter:
- Resolve each named human reference with the helper from this skill directory,
then branch on the returned status:
uv run people/scripts/resolve_person.py "<name-or-handle>"
- If
status is matched, use only the resolved person's task-relevant fields.
- If
status is ambiguous, ask a short clarification before relying on
person-specific context.
- If
status is not_found or no_index, proceed without enrichment.
- Load a linked detail file only after one person resolves and only when richer
context is needed for the current task.
Prefer exact configured aliases and handles over fuzzy guessing. Never use fuzzy
or ambiguous resolution for write actions such as assigning, mentioning, routing,
or commenting. Treat only status: matched results with confidence of id,
contact, name, or compact as write-safe identity context; fuzzy matches,
ambiguous results, and unknown confidence values are lookup-only.
Artifact Review Workflow
When memory-distillation or rollout-friction creates ignored local artifacts
such as .local/rollout-memory/<run-id>/, .local/scan-output/<run-id>/,
apply plans, reducer inputs, prompts, or reviewed batch results, use this skill
to review those artifacts for person facts before closeout if any artifact has
people_updates, people_resolver_smoke_checks, or visible person names,
handles, aliases, reviewer/assignee/manager fields, or contact/routing notes.
- Load the small global/user and repo-local people indexes when available, and
build search terms from each known person's id, display name, preferred
reference, aliases, handles, bot aliases, and compact forms.
- Search the new local artifacts for every known form, not just the name that
appeared in the final reducer plan. For example, searching only
Rob Burnett
can miss evidence that says Burnett, and searching only a handle can miss a
full-name correction.
- Also inspect any artifact-level smoke-check lists such as
people_resolver_smoke_checks; unresolved natural names or handles should be
treated as apply-review blockers until manually classified.
- Discount matches that appear only inside encoded blobs, screenshots, binary
payloads, tool command echoes, or the current review conversation. Those are
search artifacts, not person evidence.
- Promote only verified durable identity/contact/role/routing facts with
people/scripts/people_index.py upsert, which defaults to global/user
storage. Keep transient issue status, CI results, one-off reviews, and stale
operational state out of the people index.
- If an artifact mentions a person but evidence is incomplete, add only a
minimal known-person entry after user approval, or leave a private TODO in
the artifact review notes. Do not invent handles, roles, or relationships.
Matching Model
The resolver normalizes input by trimming whitespace, stripping a leading @,
case-folding, normalizing Unicode, collapsing whitespace, and comparing compact
forms that ignore spaces, dots, hyphens, and underscores.
Matching order:
- Exact normalized person id or
person:<id> reference.
- Exact normalized configured contact handle, including GitHub, Slack, Discord,
email, and other contact keys.
- Exact normalized display name, preferred reference, alias, or known
misspelling.
- Compact normalized exact match.
- Optional conservative fuzzy match only when explicitly requested and exactly
one candidate is obvious.
If more than one person matches at the winning tier, the resolver returns
ambiguous and omits detail files and notes.
If an issue, comment, PR, review, or commit actor does not resolve to a known
person or configured bot alias, treat the actor as unknown: verify claims from
live evidence, avoid assuming intent or authority, and call out the uncertainty
when it affects the work.
Refresh the private index when artifact review or live evidence shows a durable
rename, new handle, role/relationship correction, or repeated unresolved natural
name that should resolve. Do not treat old aliases as stale unless the user or a
maintained source confirms the replacement; keep useful former spellings as
aliases when they still appear in history.
Privacy Rules
- Never copy private mappings, contact details, notes, or profile files into
public GitHub issues, PRs, comments, committed docs, examples, or logs unless
the user explicitly asks for a sanitized public summary.
- Do not dump the whole people index. Surface only the fields relevant to the
current task.
- Contact details are private but not secrets: they may live in ignored local
people config when useful for routing, but must not be published or treated as
credentials. Tokens, passwords, API keys, credentials, private messages, and
sensitive personal data do not belong in the people index.
- Trust hints, actor posture, and bot ownership are private local context. Do not
quote them into public GitHub artifacts; summarize only the operational effect
when needed, such as “unknown actor; verified independently.”
- Verify live/current GitHub activity before making claims about recent work,
comments, PRs, or reviews. Local notes are context, not live evidence.
Optional Consumers
Other skills may reference this local data contract, but must remain portable:
- Use people context only when a people index or the resolver is available.
- Continue normally when it is absent.
- Do not add hard dependencies on this skill until the skill system has an
explicit dependency mechanism.
Useful soft consumers include:
github-plan: resolve manager, assignee, reviewer, or handle values while
keeping planning workflow authority in GitHub planning config.
memory-distillation: move durable person identity/contact facts out of
memory and into private local people config.
rollout-friction: classify repeated wrong-person, stale-handle,
wrong-manager, or unclear-contact failures as identity friction.
- GitHub work rollups: resolve report subjects and handles before collecting
live activity.
1---2name: people3description: Resolve named humans, collaborators, users, reviewers, assignees, managers, clients, contacts, GitHub handles, nicknames, aliases, or likely misspellings into private local identity and contact context when identity may affect communication, routing, memory cleanup, rollout friction, GitHub planning, reviews, summaries, or follow-up. Use the optional global people index under Code home plus repo-local `.local/people.yaml` overlays when available, and continue normally when no local people context is configured.4---56# People78Use this skill as a private local identity layer. It answers who a named person9or handle refers to; it does not decide workflow ownership by itself.1011## Core Boundary1213- `people` owns identity, aliases, bot aliases, handles, contact surfaces,14 company/team/title, actor trust/posture hints, relationship hints, and optional15 private profile notes.16- Workflow skills own their workflows. For example, `github-plan` decides which17 manager owns a planning item, while `people` can resolve that manager's local18 person id or GitHub handle.19- Repo metadata remains public-safe repo behavior: docs paths, quality gates,20 health checks, cleanup policy, and conceptual product ownership.2122## Local Data2324The private index is optional and gitignored. Durable identity context should be25global/user-scoped by default:2627```text28$CODE_HOME/skills/.local/people.yaml29$CODE_HOME/skills/.local/people/<person-id>.md30```3132When `CODE_HOME` is unset, helpers fall back to `$CODEX_HOME` and then33`~/.code`. On a machine with none of those, such as one that installs the34catalog only through another host, they use `.local/` inside the catalog the35helper ships in. Repo-local people data is an overlay for project-specific contacts,36client-only context, or intentional overrides:3738```text39.local/people.yaml40.local/people/<person-id>.md41```4243The resolver loads global/user people first and repo-local people second. A44repo-local entry with the same `id` replaces the global entry for that repo;45repo-local entries with new ids supplement the global index. If all people46indexes are absent, continue normally without local identity context. Do not47treat missing people data as a failure.4849Use `references/people.local.example.yaml` as the public-safe template. Real50names, handles, emails, phone numbers, company notes, and relationship details51belong only in ignored local files.5253Use the writer helper for updates so agents do not accidentally save durable54identity context in the active repository:5556```sh57uv run people/scripts/people_index.py upsert \58 --id example-person \59 --display-name "Example Person" \60 --github example-user61```6263The writer defaults to global/user storage. Use `--scope repo` only for64repo-specific people, overrides, or supplements.6566People entries may include lightweight `trust` hints for GitHub actors and other67collaborators. Treat trust as private operational posture: how much to verify,68how cautious to be with code or instructions, and whether the actor is known.69Never publish trust notes or use them to skip live verification.7071## Resolution Workflow7273When identity context may matter:74751. Resolve each named human reference with the helper from this skill directory,76 then branch on the returned status:7778```sh79uv run people/scripts/resolve_person.py "<name-or-handle>"80```8182- If `status` is `matched`, use only the resolved person's task-relevant fields.83- If `status` is `ambiguous`, ask a short clarification before relying on84 person-specific context.85- If `status` is `not_found` or `no_index`, proceed without enrichment.86- Load a linked detail file only after one person resolves and only when richer87 context is needed for the current task.8889Prefer exact configured aliases and handles over fuzzy guessing. Never use fuzzy90or ambiguous resolution for write actions such as assigning, mentioning, routing,91or commenting. Treat only `status: matched` results with `confidence` of `id`,92`contact`, `name`, or `compact` as write-safe identity context; fuzzy matches,93ambiguous results, and unknown confidence values are lookup-only.9495## Artifact Review Workflow9697When `memory-distillation` or `rollout-friction` creates ignored local artifacts98such as `.local/rollout-memory/<run-id>/`, `.local/scan-output/<run-id>/`,99apply plans, reducer inputs, prompts, or reviewed batch results, use this skill100to review those artifacts for person facts before closeout if any artifact has101`people_updates`, `people_resolver_smoke_checks`, or visible person names,102handles, aliases, reviewer/assignee/manager fields, or contact/routing notes.1031041. Load the small global/user and repo-local people indexes when available, and105 build search terms from each known person's id, display name, preferred106 reference, aliases, handles, bot aliases, and compact forms.1072. Search the new local artifacts for every known form, not just the name that108 appeared in the final reducer plan. For example, searching only `Rob Burnett`109 can miss evidence that says `Burnett`, and searching only a handle can miss a110 full-name correction.1113. Also inspect any artifact-level smoke-check lists such as112 `people_resolver_smoke_checks`; unresolved natural names or handles should be113 treated as apply-review blockers until manually classified.1144. Discount matches that appear only inside encoded blobs, screenshots, binary115 payloads, tool command echoes, or the current review conversation. Those are116 search artifacts, not person evidence.1175. Promote only verified durable identity/contact/role/routing facts with118 `people/scripts/people_index.py upsert`, which defaults to global/user119 storage. Keep transient issue status, CI results, one-off reviews, and stale120 operational state out of the people index.1216. If an artifact mentions a person but evidence is incomplete, add only a122 minimal known-person entry after user approval, or leave a private TODO in123 the artifact review notes. Do not invent handles, roles, or relationships.124125## Matching Model126127The resolver normalizes input by trimming whitespace, stripping a leading `@`,128case-folding, normalizing Unicode, collapsing whitespace, and comparing compact129forms that ignore spaces, dots, hyphens, and underscores.130131Matching order:1321331. Exact normalized person id or `person:<id>` reference.1342. Exact normalized configured contact handle, including GitHub, Slack, Discord,135 email, and other contact keys.1363. Exact normalized display name, preferred reference, alias, or known137 misspelling.1384. Compact normalized exact match.1395. Optional conservative fuzzy match only when explicitly requested and exactly140 one candidate is obvious.141142If more than one person matches at the winning tier, the resolver returns143`ambiguous` and omits detail files and notes.144145If an issue, comment, PR, review, or commit actor does not resolve to a known146person or configured bot alias, treat the actor as unknown: verify claims from147live evidence, avoid assuming intent or authority, and call out the uncertainty148when it affects the work.149150Refresh the private index when artifact review or live evidence shows a durable151rename, new handle, role/relationship correction, or repeated unresolved natural152name that should resolve. Do not treat old aliases as stale unless the user or a153maintained source confirms the replacement; keep useful former spellings as154aliases when they still appear in history.155156## Privacy Rules157158- Never copy private mappings, contact details, notes, or profile files into159 public GitHub issues, PRs, comments, committed docs, examples, or logs unless160 the user explicitly asks for a sanitized public summary.161- Do not dump the whole people index. Surface only the fields relevant to the162 current task.163- Contact details are private but not secrets: they may live in ignored local164 people config when useful for routing, but must not be published or treated as165 credentials. Tokens, passwords, API keys, credentials, private messages, and166 sensitive personal data do not belong in the people index.167- Trust hints, actor posture, and bot ownership are private local context. Do not168 quote them into public GitHub artifacts; summarize only the operational effect169 when needed, such as “unknown actor; verified independently.”170- Verify live/current GitHub activity before making claims about recent work,171 comments, PRs, or reviews. Local notes are context, not live evidence.172173## Optional Consumers174175Other skills may reference this local data contract, but must remain portable:176177- Use people context only when a people index or the resolver is available.178- Continue normally when it is absent.179- Do not add hard dependencies on this skill until the skill system has an180 explicit dependency mechanism.181182Useful soft consumers include:183184- `github-plan`: resolve manager, assignee, reviewer, or handle values while185 keeping planning workflow authority in GitHub planning config.186- `memory-distillation`: move durable person identity/contact facts out of187 memory and into private local people config.188- `rollout-friction`: classify repeated wrong-person, stale-handle,189 wrong-manager, or unclear-contact failures as identity friction.190- GitHub work rollups: resolve report subjects and handles before collecting191 live activity.