The AI Coding Memory kit, mapped
Every entity type, relation, status, property and guideline in AI Coding Memory 1.5.0, the schema the author's team runs. Drawn from the kit definition on 2026-11-03. Emails and repository names in the examples are placeholders.
Shared, durable memory for software teams that work with AI coding assistants (Claude Code, Codex, Cursor, ...). Tasks, features, decisions, proposals/hypotheses/questions, errors, PR/deploy events, AI sessions and addressed teammate messages with read state, keyed deterministically so every person and tool lands on the same record, plus a relation graph and the guidelines assistants follow to recall, record and hand off work.
The map
Hover a line for its relation names. A loop on a box means the type links to itself (for example a task that is a subtask of another task).
Relations (35)
Rows are where an edge starts, columns where it ends. All 35 are declared relations: the assistant writes them when it saves a record.
| From ↓ / To → | Person | Project | Feature | Task | Decision | Inquiry | Event | Error | AI Session | Message |
|---|---|---|---|---|---|---|---|---|---|---|
| Person | has_manager | contributes_to | ||||||||
| Project | owned_by | |||||||||
| Feature | owned_bycreated_by_person | in_project | blocked_bydepends_onrelated_to | blocked_byrelated_to | blocked_by | blocked_by | ||||
| Task | owned_bycreated_by_person | in_project | part_ofblocked_byrelated_to | subtask_ofblocked_byduplicate_offollows_uprelated_to | follows_up | blocked_byduplicate_ofresolves | part_of | blocked_byduplicate_offollows_up | ||
| Decision | created_by_persondecided_by | in_projectapplies_to | applies_to | applies_to | supersedes | resolves | ||||
| Inquiry | owned_bycreated_by_persondirected_to | in_project | concerns | duplicate_ofconcerns | concerns | duplicate_of | concerns | duplicate_ofconcerns | ||
| Event | performed_byreviewed_by | in_project | part_ofimplementsships | implementsships | resolves | part_ofincludesrolls_back | fixes | |||
| Error | owned_bycreated_by_person | in_project | seen_in | duplicate_ofseen_intracked_by | duplicate_of | seen_inintroduced_by | duplicate_of | seen_in | ||
| AI Session | driven_by | in_project | worked_on | worked_on | worked_on | worked_on | worked_on | worked_on | continues | worked_on |
| Message | sent_bysent_to | in_project | regarding | regarding | regarding | regarding | regarding | regarding | replies_to |
Relation catalog
| Relation | Category | From → To | Targets | Meaning |
|---|---|---|---|---|
| in_project | generic | Feature, Task, Decision, Inquiry, Error, Event, AI Session, Message → Project | one | The record belongs to this project. |
| part_of | generic | Task, Event → Feature, Event | one | Task -> its feature; commit event -> its PR event. |
| subtask_of | generic | Task → Task | one | Task -> parent task. |
| owned_by | role | Task, Feature, Error, Inquiry, Project → Person | one | Current owner. Single-valued: reassignment ends the previous edge (history kept). |
| created_by_person | role | Task, Feature, Decision, Inquiry, Error → Person | one | Human who raised or created the record. |
| decided_by | role | Decision → Person | many | Person(s) who made or approved the decision. |
| directed_to | role | Inquiry → Person | many | Person(s) who should answer or decide. |
| performed_by | role | Event → Person | one | PR/commit author or deploy/release triggerer. |
| reviewed_by | role | Event → Person | many | PR reviewer(s). |
| driven_by | role | AI Session → Person | one | The human driving the AI session. |
| has_manager | role | Person → Person | one | Reporting line (person -> manager). |
| contributes_to | role | Person → Project | many | Person works on this project. |
| blocked_by | generic | Task, Feature → Task, Feature, Inquiry, Error | many | Cannot proceed until the target is resolved. |
| depends_on | generic | Feature → Feature | many | Feature needs another feature first. |
| duplicate_of | generic | Task, Error, Inquiry → Task, Error, Inquiry | one | Same-type duplicate merged into the target (same type only). |
| follows_up | generic | Task → Task, Error, Decision | many | Follow-up work that came out of the target. |
| related_to | generic | Task, Feature → Task, Feature | many | Overlapping work: the two records touch the same scope but neither contains the other. Write it on both records (one edge each way) so either side shows the other. |
| implements | activity | Event → Task, Feature | many | PR/commit implements the work. |
| fixes | activity | Event → Error | many | PR/commit fixes the error. |
| includes | activity | Event → Event | many | Deploy/release includes a PR or commit. |
| ships | activity | Event → Task, Feature | many | Deploy/release delivers the task or feature. |
| rolls_back | activity | Event → Event | one | Deploy that reverted an earlier deploy. |
| seen_in | activity | Error → Task, Feature, Event, AI Session | many | Where the error occurred. |
| introduced_by | activity | Error → Event | one | Change or deploy that introduced the error. |
| tracked_by | generic | Error → Task | many | Task opened to fix the error. |
| supersedes | generic | Decision → Decision | many | New decision replaces an old one. |
| applies_to | generic | Decision → Feature, Task, Project | many | Scope the decision governs. |
| resolves | generic | Decision, Task, Event → Inquiry | many | Closes a proposal/question or tests a hypothesis. |
| concerns | generic | Inquiry → Task, Feature, Error, Decision, Event | one | What the proposal/hypothesis/question is about. |
| worked_on | activity | AI Session → Task, Feature, Error, Decision, Inquiry, Event, Message | many | What the session touched. |
| continues | activity | AI Session → AI Session | one | Session picked up from a previous session (handoff chain). |
| sent_by | role | Message → Person | one | Person who sent the message. |
| sent_to | generic | Message → Person | one | The one person the message is addressed to. |
| replies_to | generic | Message → Message | one | Message -> the message it answers. |
| regarding | generic | Message → Task, Feature, Error, Decision, Inquiry, Event | many | What the message is about (the name about is a platform built-in and is not used). |
Lifecycles
The status values each record moves through. The Work Lifecycle Standard says which transitions are allowed and what evidence each one needs.
| Entity | Property | Values |
|---|---|---|
| Person | status | activeinactive |
| Project | status | activepausedarchived |
| Feature | status | ideaproposedapprovedin_progressblockedin_reviewshippedabandoned |
| Task | status | proposedbacklogin_progressblockedin_reviewdonecancelled |
| Task | work_kind | coderoutine |
| Task | autonomy | read_onlydraftact_limited |
| Task | department | opsproduct_successai_devgtm |
| Decision | status | proposedacceptedsupersededrejected |
| Inquiry | kind | proposalhypothesisquestion |
| Inquiry | status | opentestingacceptedrejectedwithdrawnconfirmedrefutedinconclusiveanswereddropped |
| Error | status | openinvestigatingfix_attemptedresolvedwont_fix |
| Event | kind | prcommitdeployreleaseci_runroutine_run |
| Event | status | openmergedclosedstartedsucceededfailedrolled_backpublishedwithdrawnpassedrecordedokno_findingsproposedcappedskipped_pausedskipped_lease |
| AI Session | status | activeendedinterrupted |
| Message | status | unreadreadarchived |
| Message | priority | normalurgent |
Entity types and their properties
Each entity type has one collection. Open a card to see every property.
Person · People
A team member. Records exist for everyone who owns, decides, reviews or authors work, Personize users or not. Keyed by work email.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Emailemail | text | Work email, lowercased. The record key (standard email identifier). Git author emails map here. | identity |
Display Namedisplay_name | text | Full name as the team uses it. | |
Handleshandles | text | Other handles, comma-separated: 'github:<login>, slack:<id>'. | |
Rolerole | text | Role or function (e.g. backend engineer, engineering manager). | |
Teamteam | text | Team name. | |
Statusstatus | options | active = currently on the team; inactive = left or paused. activeinactive | lifecycle |
Is Personize Useris_personize_user | boolean | true if this person has their own Personize login. | |
Timezonetimezone | text | IANA timezone, e.g. America/Toronto. | |
Expertiseexpertise | text | Areas and project keys this person knows deeply; used to route questions. |
Project · Scope
A repository or product and its current focus.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Project Keyproject_keythis record's key | text | The record key: '<owner>/<repo>' from `git remote get-url origin`, lowercased; a kebab slug for projects without a repo. | identity |
Titletitle | text | Project name. | |
Repo URLrepo_url | text | Repository URL. | |
Default Branchdefault_branch | text | e.g. main, master. | |
Statusstatus | options | Project lifecycle. activepausedarchived | lifecycle |
Owner Emailowner_emailkey link → Person (by email) | text | Accountable person (a Person email). | ownership |
Descriptiondescription | text | What the project is and is not. | |
Current Focuscurrent_focus | text | 2-5 lines on what the team is focused on now. Replaced by whoever changes the focus. | |
Environmentsenvironments | text | Deploy environments, comma-separated (e.g. 'dev, staging, production'). | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Human who registered the project. | attribution |
Created At (ms)created_at_ms | number | Epoch milliseconds. | time |
Updated Byupdated_by | text | '<email> via <tool> <session_key>' of the last structured write. | attribution |
Feature · Plan
The living state of a feature: status, owner, goal and the start-here summary. Its tasks, decisions and errors point to it via feature_key / applies_to_keys.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Feature Keyfeature_keythis record's key | text | Formula: '<project_key>/f/<kebab-slug>', slug matching the branch feat/<slug>. The record's stable identity (customKeyValue for customKeyName='feature_key'). Lowercase. Never changes, even if the title does. Build it exactly as the Identifier Standard guideline says. | identity |
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Statusstatus | options | idea -> proposed -> approved -> in_progress <-> blocked -> in_review -> shipped | abandoned. approved requires explicit human acceptance; shipped requires a ships edge from a deploy/release event. ideaproposedapprovedin_progressblockedin_reviewshippedabandoned | lifecycle |
Owner Emailowner_emailkey link → Person (by email) | text | Accountable person (Person email). | ownership |
Prioritypriority | options | p0 now, p1 this week, p2 this cycle, p3 later. p0p1p2p3 | |
Goalgoal | text | What success looks like and why it matters. | |
Acceptanceacceptance | text | Observable criteria for shipped. | |
Current Statecurrent_state | text | The 'start here' paragraph for anyone picking this up: done, next, risks. Replaced, not appended. | |
Branchbranch | text | Main working branch. | |
Depends On Keysdepends_on_keyskey link → Feature | text | Comma-separated feature keys this feature depends on. | |
Related Keysrelated_keyskey link → any record | text | Comma-separated task / feature keys whose scope overlaps this feature but neither contains the other (mirrors related_to). Replace the whole value; never append. | |
Status Changed At (ms)status_changed_at_ms | number | When status last changed. | time |
Task · Plan
One unit of work. Complete task lists come from filtering this collection by project_key + status.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Task Keytask_keythis record's key | text | Formula: tracker id when one exists ('<project_key>/gh#<n>' or '<project_key>/jira:<key-n>'), else '<project_key>/t/<yymmdd>-<4 random [a-z2-7]>'. The record's stable identity (customKeyValue for customKeyName='task_key'). Lowercase. Never changes, even if the title does. Build it exactly as the Identifier Standard guideline says. | identity |
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Statusstatus | options | proposed (human said note it, not accepted) -> backlog (accepted) -> in_progress (claimed; owner required) <-> blocked (reason required) -> in_review (PR open) -> done (resolution + verification required) | cancelled (reason). Reopen: done -> backlog/in_progress with a reason note. proposedbacklogin_progressblockedin_reviewdonecancelled | lifecycle |
Owner Emailowner_emailkey link → Person (by email) | text | Person email of the owner, or 'unassigned'. Set together with in_progress to claim. | ownership |
Prioritypriority | options | p0 now, p1 this week, p2 this cycle, p3 later. p0p1p2p3 | |
Feature Keyfeature_keykey link → Feature | text | Parent feature key, if any. | scope |
Parent Task Keyparent_task_keykey link → Task | text | Parent task key for subtasks. | scope |
Acceptanceacceptance | text | Definition of done. | |
Summarysummary | text | 2-4 sentences: what the work changes and where (modules, endpoints, files). Compared by the overlap check before any new task is created, so write it on creation. | |
Next Stepnext_step | text | The single next concrete action. | |
Blocked Reasonblocked_reason | text | Required when status=blocked: what is needed and from whom. | |
Blocked By Keysblocked_by_keyskey link → any record | text | Comma-separated task / inquiry / error keys blocking this task. | |
Related Keysrelated_keyskey link → any record | text | Comma-separated task / feature keys whose scope overlaps this task but neither contains the other (mirrors related_to). Replace the whole value; never append. | |
Resolutionresolution | text | Required for done/cancelled: outcome plus evidence (PR/commit ref). | |
Verificationverification | text | Required for done: the command/test run and its result. | |
Tracker Reftracker_ref | text | External tracker id, e.g. 'gh#123' or 'jira:PROJ-45'. | |
Status Changed At (ms)status_changed_at_ms | number | When status last changed. | time |
Work Kindwork_kind | options | What kind of work this task is: 'code' (a normal engineering task) or 'routine' (a recurring job run by the routines engine). coderoutine | lifecycle |
Recurrencerecurrence | text | Single cadence field for a routine, for example a cron string or `every:<n><unit>` such as `every:1d`. Set only on routines. | lifecycle |
Next Run At (ms)next_run_at_ms | number | When the routine is next due, as epoch milliseconds. | time |
Last Run At (ms)last_run_at_ms | number | When the routine last ran, as epoch milliseconds. | time |
Autonomyautonomy | options | How far a routine run may act on its own: read_only (observe and report), draft (prepare output for a human to send), act_limited (act within its caps). read_onlydraftact_limited | lifecycle |
Departmentdepartment | options | Which department owns the routine. opsproduct_successai_devgtm | lifecycle |
Run Cap (USD)run_cap_usd | number | Maximum spend in US dollars for a single run of the routine. | |
Month Cap (USD)month_cap_usd | number | Maximum spend in US dollars for the routine per calendar month. | |
Pausedpaused | boolean | True while the routine is paused and must not be picked up. | lifecycle |
Lease Until (ms)lease_until_ms | number | Epoch milliseconds until which the current lease holder owns this run. Expired leases may be taken over. | time |
Lease Ownerlease_owner | text | Opaque dispatcher id holding the lease; no personal data. | attribution |
Playbook Refplaybook_ref | text | Guideline slug of the routine's playbook. | refs |
Decision · Plan
A decision and its rationale. Accepted decisions are never edited in substance; a change of mind is a new decision that supersedes the old one.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Decision Keydecision_keythis record's key | text | Formula: '<project_key>/d/<kebab slug of the question>'. The record's stable identity (customKeyValue for customKeyName='decision_key'). Lowercase. Never changes, even if the title does. Build it exactly as the Identifier Standard guideline says. | identity |
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Statusstatus | options | proposed -> accepted | rejected; accepted -> superseded (only via a new decision with supersedes_key). proposedacceptedsupersededrejected | lifecycle |
Questionquestion | text | The decision framed as the question it answers. | |
Decisiondecision | text | The choice, stated plainly. | |
Rationalerationale | text | Why: reasoning, constraints, evidence. The most valuable field. | |
Alternativesalternatives | text | Options considered and why each was rejected. | |
Applies To Keysapplies_to_keyskey link → any record | text | Comma-separated feature / task / project keys this decision governs. | scope |
Decided By Emailsdecided_by_emailskey link → Person (by email) | text | Comma-separated Person emails who made or approved it. Required when accepted. | ownership |
Decided At (ms)decided_at_ms | number | When accepted. | time |
Supersedes Keysupersedes_keykey link → Decision | text | Decision key this one replaces. | |
Superseded By Keysuperseded_by_keykey link → Decision | text | Decision key that replaced this one. | |
Resolves Inquiry Keyresolves_inquiry_keykey link → Inquiry | text | Inquiry key (proposal/question) this decision closes. |
Inquiry · Plan
A proposal, hypothesis or open question with an outcome. Status values allowed depend on kind (see Work Lifecycle Standard).
| Property | Type | What it holds | Tags |
|---|---|---|---|
Inquiry Keyinquiry_keythis record's key | text | Formula: '<project_key>/<p|h|q>/<yymmdd>-<4 random [a-z2-7]>' (p=proposal, h=hypothesis, q=question). The record's stable identity (customKeyValue for customKeyName='inquiry_key'). Lowercase. Never changes, even if the title does. Build it exactly as the Identifier Standard guideline says. | identity |
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Kindkind | options | proposal = suggested change needing a decision; hypothesis = testable explanation; question = needs an answer. proposalhypothesisquestion | lifecycle |
Statusstatus | options | proposal: open -> accepted | rejected | withdrawn. hypothesis: open -> testing -> confirmed | refuted | inconclusive. question: open -> answered | dropped. opentestingacceptedrejectedwithdrawnconfirmedrefutedinconclusiveanswereddropped | lifecycle |
Concerns Keyconcerns_keykey link → any record | text | Key of the task / feature / error / decision / event this inquiry is about. | scope |
Statementstatement | text | The proposal, hypothesis or question itself. | |
Raised By Emailraised_by_emailkey link → Person (by email) | text | Person email who raised it. | ownership |
Directed To Emaildirected_to_emailkey link → Person (by email) | text | Person email who should answer or decide (comma-separated if several). | ownership |
Outcomeoutcome | text | Required when closed: the answer, evidence, or reason. | |
Outcome Keyoutcome_keykey link → any record | text | Decision / task / event key that resolved it. | |
Status Changed At (ms)status_changed_at_ms | number | When status last changed. | time |
Error · Deliver
A distinct failure signature: attempts live as memories, the verified fix and root cause as properties. Recurrence reopens the same record.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Error Keyerror_keythis record's key | text | Formula: '<project_key>/e/<first 12 hex of sha1(normalized signature)>', see the Identifier Standard fingerprint algorithm. The record's stable identity (customKeyValue for customKeyName='error_key'). Lowercase. Never changes, even if the title does. Build it exactly as the Identifier Standard guideline says. | identity |
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Signaturesignature | text | The normalized signature that was fingerprinted: error class + message with volatile parts replaced, plus ' @ <file>:<function>' of the top in-repo frame. Searchable with CONTAINS. | |
Statusstatus | options | open -> investigating -> fix_attempted (applied, not proven) -> resolved (verification required) | wont_fix. Recurrence: resolved -> open with a regression note. openinvestigatingfix_attemptedresolvedwont_fix | lifecycle |
Severityseverity | options | Impact. lowmediumhighcritical | |
Componentcomponent | text | Area, module or file where it occurs. | |
Environmentenvironment | options | Where it was seen. localcidevstagingproduction | |
Owner Emailowner_emailkey link → Person (by email) | text | Person email investigating it. | ownership |
Root Causeroot_cause | text | The underlying mechanism, not the symptom. | |
Root Cause Confidenceroot_cause_confidence | options | unknown / hypothesis (unproven) / confirmed (reproduced or proven). unknownhypothesisconfirmed | |
Fix Summaryfix_summary | text | What was changed to fix it. | |
Verificationverification | text | Required for resolved: the reproduction or test that now passes, with its result. | |
Introduced By Keyintroduced_by_keykey link → Event | text | Event key (pr/commit/deploy) that introduced it, if known. | |
Fixed By Keysfixed_by_keyskey link → any record | text | Comma-separated event keys that fixed it. | |
First Seen (ms)first_seen_ms | number | First occurrence. | time |
Last Seen (ms)last_seen_ms | number | Latest occurrence. | time |
Event · Deliver
An externally identifiable happening (PR, commit, deploy, release, CI run) linking work to delivery.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Event Keyevent_keythis record's key | text | Formula by kind: '<project_key>/pr/<n>', '<project_key>/commit/<sha12>', '<project_key>/deploy/<env>/<ci-run-id or yymmddThhmm>', '<project_key>/release/<tag>', '<project_key>/ci/<run-id>'. The record's stable identity (customKeyValue for customKeyName='event_key'). Lowercase. Never changes, even if the title does. Build it exactly as the Identifier Standard guideline says. | identity |
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Kindkind | options | Type of event. prcommitdeployreleaseci_runroutine_run | lifecycle |
Statusstatus | options | pr: open|merged|closed. deploy: started|succeeded|failed|rolled_back. release: published|withdrawn. ci_run: passed|failed. commit: recorded. routine_run: ok|no_findings|proposed|failed|capped|skipped_paused|skipped_lease. openmergedclosedstartedsucceededfailedrolled_backpublishedwithdrawnpassedrecordedokno_findingsproposedcappedskipped_pausedskipped_lease | lifecycle |
URLurl | text | Link to the PR / run / release. | |
Actor Emailactor_emailkey link → Person (by email) | text | Person email who authored / triggered it. | ownership |
Occurred At (ms)occurred_at_ms | number | When it happened (merge time, deploy completion, ...). | time |
Environmentenvironment | options | Deploy target (deploy/release only). devstagingproductiontestother | |
Commit SHAcommit_sha | text | Commit or merge SHA. | |
Branchbranch | text | Source branch. | |
Related Keysrelated_keyskey link → any record | text | Comma-separated task / feature / error keys this event touches. | scope |
Summarysummary | text | What it contained or changed. |
AI Session · Coordinate
One assistant session: who, which tool, what it worked on, and the handoff (summary, next steps, open questions).
| Property | Type | What it holds | Tags |
|---|---|---|---|
Session Keysession_keythis record's key | text | Formula: '<tool>:<native session id>'; if the assistant cannot read its id, '<tool>:<yymmdd-hhmm>-<email local part>-<4 random [a-z2-7]>'. The record's stable identity (customKeyValue for customKeyName='session_key'). Lowercase. Never changes, even if the title does. Build it exactly as the Identifier Standard guideline says. | identity |
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Tooltool | options | Assistant used. claude-codecodexcursorcopilotother | |
Modelmodel | text | Model id, if known. | |
Person Emailperson_emailkey link → Person (by email) | text | The human driving the session. | ownership |
Statusstatus | options | active (running) -> ended (wrap-up saved) | interrupted (set by a later session when last_checkpoint_ms is 8h+ old). activeendedinterrupted | lifecycle |
Started At (ms)started_at_ms | number | Session start. | time |
Ended At (ms)ended_at_ms | number | Session end (wrap-up). | time |
Last Checkpoint (ms)last_checkpoint_ms | number | Last checkpoint write. | time |
Goalgoal | text | What the session set out to do. | |
Summarysummary | text | What was done so far. Replaced at each checkpoint. | |
Next Stepsnext_steps | text | Concrete next actions for whoever continues. | |
Open Questionsopen_questions | text | Inquiry keys and short text of unresolved questions. | |
Branchbranch | text | Working branch. | |
Worked On Keysworked_on_keyskey link → any record | text | Comma-separated keys touched this session. Replaced whole at each checkpoint. | |
Continues Session Keycontinues_session_keykey link → AI Session | text | session_key this session picked up from. |
Message · Coordinate
A message from one teammate to one recipient with read state (unread, read, archived). One record per recipient; recipients mark their own messages read.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Message Keymessage_keythis record's key | text | Formula: '<project_key>/m/<yymmdd>-<4 random [a-z2-7]>' (m=message). project_key is the project the message is about (never 'acme/team'-style team scopes). The record's stable identity (customKeyValue for customKeyName='message_key'). Lowercase. Never changes. One record per recipient: a message to several people is several records sharing a thread_key. Build it exactly as the Identifier Standard guideline says. | identity |
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | The subject line. Short, human-readable. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Sender Emailsender_emailkey link → Person (by email) | text | Email of the HUMAN sending the message (not the assistant), lowercased. | ownership |
Recipient Emailrecipient_emailkey link → Person (by email) | text | Email of the ONE recipient, lowercased. Exactly one address, never a list, so 'my unread' is an exact EQ filter with no substring false positives. | ownership |
Bodybody | text | The message, 2-20 lines of markdown. No secrets, credentials or PII. | |
Statusstatus | options | unread -> read -> archived, or unread -> archived. Created as unread. Only the RECIPIENT changes status (explicit exception to Write Safety 'Other people's work'). unreadreadarchived | lifecycle |
Read At (ms)read_at_ms | number | When the recipient first marked the message read (epoch ms). Unset while unread. | time |
Status Changed At (ms)status_changed_at_ms | number | When status last changed. | time |
Prioritypriority | options | normal by default; urgent when the recipient should see it before starting other work. normalurgent | lifecycle |
Thread Keythread_keykey link → Message | text | message_key of the first message in the thread (its own key for a thread starter). Shared by the per-recipient copies of one message and by replies. | scope |
Reply To Keyreply_to_keykey link → Message | text | message_key of the message this one replies to. Empty for a thread starter. | scope |
About Keysabout_keyskey link → any record | text | Comma-separated keys of the task / feature / error / decision / inquiry / event this message is about (mirrors the 'regarding' edges). | scope |
Customer Account · Scope
Refreshable cache of customer account facts for routines. Not the source of truth. Left empty until customer-level intelligence is enabled for your organization.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Account Keyaccount_key | text | The account's stable identity (customKeyValue for customKeyName='account_key'). Lowercase. Never changes. | identity |
Company Namecompany_name | text | Company name as last refreshed from the source. | |
Tier (cache)tier_cache | text | Cached customer tier. Refreshable; the source of truth lives elsewhere. | |
Cadence (cache)cadence_cache | text | Cached contact cadence for this account. Refreshable; not the source of truth. | |
Health Cache Refhealth_cache_ref | text | Pointer to the latest Metric Snapshot (its snapshot_key) for this account. | refs |
Cache Refreshed At (ms)cache_refreshed_at_ms | number | When these cached values were last refreshed, as epoch milliseconds. | time |
Metric Snapshot · Deliver
One captured value of a metric for a routine and period. No thresholds are stored here.
| Property | Type | What it holds | Tags |
|---|---|---|---|
Project Keyproject_keykey link → Project | text | Key of the owning project: '<owner>/<repo>' from `git remote get-url origin`, lowercased (e.g. 'acme/app'). Every filter is scoped by this. | identity scope |
Titletitle | text | Short human-readable name. May change; never used for identity. | |
Created By (Email)created_by_emailkey link → Person (by email) | text | Email of the HUMAN who created or asked for this record (not the assistant). | attribution |
Created At (ms)created_at_ms | number | Creation time as epoch milliseconds (numbers are range-filterable; ISO strings are not). | time |
Updated Byupdated_by | text | Last structured write, as '<email> via <tool> <session_key>' (e.g. 'dev@example.com via claude-code claude-code:510c7129-...'). | attribution |
Last Session Keylast_session_keykey link → AI Session | text | session_key of the AI session that last changed this record. | attribution |
Refsrefs | text | Comma-separated external references: PR / commit / tracker ids / URLs (e.g. 'pr/821, commit/3b981225ab12'). Replace the whole value; never append. | refs |
Snapshot Keysnapshot_key | text | <routine key>:<metric>:<period> | identity |
Routine Keyroutine_key | text | task_key of the routine that captured this snapshot. | scope |
Metricmetric | text | Name of the metric captured. | |
Periodperiod | text | Period the value covers (e.g. '2026-10' or '2026-W43'). | |
Value (number)value_number | number | The captured metric value. | |
Value Unitvalue_unit | text | Unit of value_number (e.g. 'usd', 'count', 'percent'). | |
Source Refsource_ref | text | The file:line or API name the value was read from. | refs |
Captured At (ms)captured_at_ms | number | When the value was captured, as epoch milliseconds. | time |
Account Keyaccount_key | text | account_key of the customer account this snapshot is about, when it is account-level. Empty otherwise. | scope |
Guidelines
Standards every session follows
Installed into Personize with the kit. Assistants fetch them with context_retrieve. Revisions = earlier versions the kit knows about and can upgrade from.
| Guideline | Kind | Tags | What it settles | Revisions |
|---|---|---|---|---|
| AI Coding Memory Protocol | guideline | protocol | The session loop for AI coding assistants: start, recall, when to write (including messages to teammates), checkpoints, handoff, exclusions, failure honesty. | 9 |
| Identifier Standard | guideline | identifiers | Exact key formulas per entity type (including messages) and the error fingerprint algorithm, so every assistant reaches the same record. | 2 |
| Work Lifecycle Standard | guideline | lifecycle | Allowed statuses, transitions and required evidence for tasks, features, decisions, inquiries, errors, events, sessions and messages. | 4 |
| Graph Linking Standard | guideline | graph | Relation catalog (including message edges), edge direction rule, how to write edges, and which edges are required. | 5 |
| Write Safety and Concurrency | guideline | protocol | Create-then-update, no upsert, read-before-write, claim-then-verify, message creation fields and recipient-only status changes, and honest failure reporting. | 4 |
| Retrieval Playbook | playbook | retrieval | Query recipes for remaining tasks, decisions, teammate changes, repeated errors, handoffs, deploys and unread messages. | 7 |
| AI Coding Memory Setup Guide | guideline | protocol | How to install, refresh, check and undo the session hook and assistant instructions; manual install and other tools. | 3 |
| Routine Playbook Customization | guideline | routine | How an assistant turns a kit playbook template into the team's own routine playbook, keeps it current after kit upgrades, and adds new ones. | 0 |
Routine playbook templates (16)
Draft templates for recurring routines. Each one has a purpose, the data it can see, an output format, safety rules and judgment questions.
Document tags
| Tag | Label | Used for | Guidelines |
|---|---|---|---|
ai-coding-memory | AI Coding Memory | All docs of the AI Coding Memory kit. Fetch with context_retrieve(tags:["ai-coding-memory"]) at session start. | 24 |
protocol | Protocol | How assistants read and write team memory. | 3 |
identifiers | Identifiers | Record key formulas and fingerprints. | 1 |
lifecycle | Lifecycle | Statuses, transitions and evidence rules. | 1 |
graph | Graph | Relation types and linking rules. | 1 |
retrieval | Retrieval | Query recipes for team-memory questions. | 1 |
Notes from the kit
- No graph rules: Personize creates no edge automatically from a property. Every edge on the map is written by the assistant on save, as the Graph Linking Standard says. The key properties in each card hold the same link as plain text, so a record is still findable when an edge is missing.
- Guidelines use tags that the kit does not declare as document tags:
playbook,routine(17 guidelines). - No record-level document types: records carry properties and memories only. Long text (session handoffs, error attempts) lives as memories on the record.
- Entity types with no relation: Customer Account, Metric Snapshot.