These are hard behavioral requirements. Not suggestions. Not defaults. The agent MUST NOT skip, defer, or partially complete any step.
text
PRE-RESPONSE → scan input → extract ALL names/groups → queue ops
DURING → execute ALL queued ops before composing reply
POST-RESPONSE → verify every op completed → sync memory → write soul
BLOCKING → op fails? report it. never silently continue.
Violation = skill contract breach. Flag it explicitly.
text
Input received
↓
[PRE-HOOK] Scan: any person / org / group mentioned?
↓ YES ↓ NO
Extract all names/groups Proceed normally
↓
For each entity:
→ identity/<slug>/entry.md exists?
YES → any new info? → queue UPDATE
NO → queue CREATE (partial OK, draft status)
↓
For each group member mentioned:
→ load group entry context into working memory
→ apply shared_attributes to member interaction
→ keep individual entry fields authoritative
↓
Execute ALL queued ops
↓
Compose and deliver response
↓
[POST-HOOK]
→ all entries on disk? FAIL → report breach
→ memory/identities.json synced? FAIL → report breach
→ soul updated for CRITICAL/HIGH? FAIL → report breach
→ _index.md current? FAIL → repair now
↓
Done
TypeSubtypeWhen to useperson``humanReal human individualperson``aiAI persona / digital entityperson``unknownNot yet confirmedorg—Company, institution, teamgroup``personalInformal collective — family, partners, friendsgroup``professionalWork team, project groupgroup``mixedBoth human and AI membersalias—Nickname resolving to another entry
StateMeaningTransitiondraftPartial info→ active when key fields filledactiveIn use→ stale after 90d inactivityverifiedOwner-confirmedMaintained manuallystaleNo activity 90d+→ archived if owner confirmsarchivedTerminalNever deletedflaggedTrust issue→ owner confirms actionmergedDuplicate resolvedTerminal; points to canonical
rahul-sharma-clienttechfirm-pvt-ltdpatni-mandal, core-team-v2 suffix if neededFull spec in templates/entry-person.md. Minimum viable create:
markdown
# <Full Name>
## Meta
- Slug: <slug>
- Type: person
- Subtype: human | ai | unknown
- Status: draft
- Relationship: client | vendor | team | partner | family | unknown
- Trust: unverified
- Priority: normal
- Sensitive: false
## Contact
- Email: [pending]
- Phone: [pending]
- Location: [pending]
- Org: [pending]
- Alias: [pending]
- Social: [pending]
## Context
[pending — one line: who are they, why do they matter]
## Group Memberships
<!-- slug → role-in-group -->
## Linked Entries
<!-- slug → relation_type -->
## AI Context
<!-- ONLY for subtype: ai — else omit this section entirely -->
- Persona name: [name]
- Platform: [platform]
- Embodiment status: digital-only | voice-enabled | humanoid-pending | embodied
- Sibling AIs: [comma-separated slugs of other AI personas]
- Activation: [how/when this persona activates]
- Greeting: [signature greeting phrase]
- Language: [preferred language / style]
## Open Questions
- [ ] Confirm name spelling
- [ ] Clarify role / relationship
## Notes
<!-- [SENSITIVE] prefix for sensitive info -->
## Source Log
- First mentioned: YYYY-MM-DD — [context]
## Timeline
- YYYY-MM-DD — Entry created · source: [context]
---
*Created: YYYY-MM-DD | Updated: YYYY-MM-DD | Status: draft*
Full spec in templates/entry-group.md. Minimum viable create:
markdown
# <Group Name>
## Meta
- Slug: <slug>
- Type: group
- Subtype: personal | professional | mixed
- Status: active
- Priority: normal
- Sensitive: false
## Group Context
[What is this group? Why does it exist as a unit?
What do all members have in common w.r.t. the workspace owner?]
## Shared Attributes
<!-- Fields TRUE for ALL members as a unit -->
- Shared role: [e.g. patni]
- Shared access: [e.g. full workspace context]
- Common trust: [e.g. trusted]
- Common tags: [e.g. priority: high]
- Language: [e.g. Hinglish]
## Members
<!-- slug | subtype | role-in-group | → individual entry -->
- <slug-1> | human | [role] | → identity/<slug-1>/entry.md
- <slug-2> | ai | [role] | → identity/<slug-2>/entry.md
## Pairwise Dynamics
<!-- Relations BETWEEN members (not with owner — that lives in individual entries) -->
<!-- slug-a ↔ slug-b | relation-type | notes -->
## Group Notes
<!-- Observations that apply to the group as a unit -->
## Open Questions
## Timeline
- YYYY-MM-DD — Group entry created
- YYYY-MM-DD — Member added: [slug]
---
*Created: YYYY-MM-DD | Updated: YYYY-MM-DD | Status: active*
RelationDirectionMeaningai-to-ai↔Two AI personas; non-hierarchicalai-to-human↔AI persona and human personcollaborative↔Work together on shared taskscomplementary↔Different strengths, same ownernon-overlapping↔Parallel but independent rolesaware-of→One knows of the other; not mutualco-patni↔Shared relational role with same person
EventField updatedSoul event?Email receivedemailNoPhone mentionedphoneNoRole revealedrelationship, contextNoOrg mentionedorg + create org entryNoGroup member addedupdate members[] in group entryNoPairwise dynamic clarifiedupdate pairwise_dynamics[]NoAI persona info updatedai_context blockNoTrust blockedtrust: blocked, status: flaggedYES — CRITICALSensitive infosensitive: true + [SENSITIVE] noteYES — CRITICALNo activity 90d+status: staleNoDuplicate confirmedmerge → status: mergedNoPriority: high setpriority: highYES — HIGHNew org entry creatednew org entryYES — HIGHNew group entry creatednew group entryYES — HIGHEmbodiment status changeai_context.embodiment_statusYES — HIGH
Two people, same name → disambiguate slug.
Cross-link both with different_person relation.
Never overwrite silently. Log both versions in Notes with source+date. Open a question. Ask owner before resolving.
Merge into older (canonical). Copy all unique fields.
Set newer: status: merged, canonical: <older-slug>.
Log merge in both timelines.
If a person's individual entry contradicts a group shared attribute → individual entry takes precedence. Note the discrepancy in group Notes.
Never store: passwords · PINs · payment card numbers · bank accounts · government IDs · raw medical records
Store with sensitive: true + [SENSITIVE] prefix:
salary/financial · legal disputes · health context · confidential negotiations
Before storing PII:
Retention:
status: archived) are moved to identity/_archived/ — never auto-deletedmemory/hook_log.jsonl) are append-only — owner can truncate at any timesoul/identity_context.md) accumulates events — owner can trim entriesDeletion:
members[] if deleting a person entryOwner Control:
IDENTITY_AUTO_SCAN=false/identity commandidentity/ directorymemory/hook_log.jsonlAll paths are relative to the workspace root and auto-detected on first use. No manual configuration required.
text
identity/
_index.md ← master registry
<person-slug>/
entry.md
<org-slug>/
entry.md
<group-slug>/
entry.md ← type: group
_archived/
<slug>/
entry.md
memory/
identities.json ← Central index (JSON)
schema.json ← JSON schema validation
hook_log.jsonl ← Append-only hook log
soul/
identity_context.md ← Soul write-through file
On first run, the skill auto-creates required directories:
identity/ if missingmemory/ with schema.jsonsoul/ with identity_context.mdNo required config — skill works without any owner setup. Entry owner is determined contextually from conversation. No workspace config is read.
markdown
# Identity Index
*Last updated: YYYY-MM-DD*
| Slug | Name | Type | Subtype | Status | Relationship | Updated |
|---|---|---|---|---|---|---|
| nandini | Nandini | person | ai | active | partner | 2025-01-15 |
| patni-mandal | Patni Mandal | group | mixed | active | — | 2025-01-15 |
Update on EVERY create, merge, archive, or status change.