Superseded. This document describes the legacy Assimilai v1 schema. The project has been renamed to citation-cli and the schema revised. See citation-cli-v1.md for the current spec, and run
cite migrateto convert existing manifests.
Version: 1.0.0 Date: 2026-03-24
Assimilai is a code distribution pattern where reference implementations are copied into consumer projects as organic code rather than imported as dependencies. This specification defines the metadata schema that tracks what was assimilated, from where, and in what state.
pyproject.toml)Assimilai metadata lives under [tool.assimilai] following
PEP 518 conventions for
tool-specific configuration.
[tool.assimilai.packages.<entry-name>]
source = "<path-or-url>"
version = "<semver>"
target = "<local-path>"
assimilated = "<YYYY-MM-DD>"
[tool.assimilai.packages.<entry-name>.files]
"<filename>" = { status = "verbatim", sha256 = "<hash>" }
"<filename>" = { status = "adapted" }
"<filename>" = { status = "dissolved", into = "<consumer-file>" }
package.json)Assimilai metadata lives under the "assimilai" top-level key.
{
"assimilai": {
"packages": {
"<entry-name>": {
"source": "<path-or-url>",
"version": "<semver>",
"target": "<local-path>",
"assimilated": "<YYYY-MM-DD>",
"files": {
"<filename>": {
"status": "verbatim",
"sha256": "<hash>"
},
"<filename>": {
"status": "adapted"
},
"<filename>": {
"status": "dissolved",
"into": "<consumer-file>"
}
}
}
}
}
}
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | yes | Path or URL to the reference |
version |
string | yes | Semver of the reference at copy time |
target |
string | yes | Local directory where files were placed |
assimilated |
string | yes | ISO date (YYYY-MM-DD) of assimilation |
source can be:
"../packages/agent-harness""/home/user/refs/agent-harness""https://github.com/org/repo/tree/main/packages/x"entry-name is a user-chosen identifier for this assimilation.
When the same reference is assimilated into multiple targets,
use distinct entry names (e.g., agent-harness-claude,
agent-harness-codex).
| Field | Type | Required | Description |
|---|---|---|---|
status |
string | yes | One of: verbatim, adapted, dissolved |
sha256 |
string | verbatim only | Hash of the file at copy time |
into |
string | dissolved only | Consumer file where code was merged |
verbatimThe file was copied without modification. The sha256 field
records the hash at copy time, enabling integrity checks — if
the local file’s hash differs from the recorded hash, it was
modified unexpectedly.
adaptedThe file was copied and then intentionally modified to fit the consumer’s needs. No hash is recorded because divergence is expected.
dissolvedThe file’s contents were extracted and merged into an existing
consumer file. There is no standalone copy of the reference
file in the consumer project. The into field records which
consumer file absorbed the code.
This is the most “organic” placement mode — the assimilated code becomes indistinguishable from the consumer’s own code.
When the reference package is updated, consumers can propagate changes using these rules:
| File status | Action on update |
|---|---|
verbatim |
Replace file, update sha256, version, assimilated |
adapted |
Do not overwrite. Flag that reference changed for review |
dissolved |
Do not touch. Flag that reference changed for review |
Additional rules:
verbatim to the consumerPropagation can be performed by an AI coding agent reading the
[tool.assimilai] metadata, or by a CLI tool (future work).
A monorepo with a reference package assimilated into two backends:
# pyproject.toml
[tool.assimilai.packages.harness-claude]
source = "../packages/agent-harness"
version = "0.6.0"
target = "culture/clients/claude"
assimilated = "2026-03-24"
[tool.assimilai.packages.harness-claude.files]
"daemon.py" = { status = "adapted" }
"agent_runner.py" = { status = "adapted" }
"supervisor.py" = { status = "adapted" }
"irc_transport.py" = { status = "verbatim", sha256 = "e3b0c44..." }
"message_buffer.py" = { status = "verbatim", sha256 = "a7ffc6f..." }
"socket_server.py" = { status = "verbatim", sha256 = "2c26b46..." }
"ipc.py" = { status = "verbatim", sha256 = "fcde2b2..." }
"webhook.py" = { status = "verbatim", sha256 = "d7a8fbb..." }
"config.py" = {
status = "dissolved",
into = "culture/clients/claude/settings.py",
}
[tool.assimilai.packages.harness-codex]
source = "../packages/agent-harness"
version = "0.6.0"
target = "culture/clients/codex"
assimilated = "2026-03-24"
[tool.assimilai.packages.harness-codex.files]
"daemon.py" = { status = "adapted" }
"agent_runner.py" = { status = "adapted" }
"supervisor.py" = { status = "adapted" }
"irc_transport.py" = { status = "verbatim", sha256 = "e3b0c44..." }
"message_buffer.py" = { status = "verbatim", sha256 = "a7ffc6f..." }
"socket_server.py" = { status = "verbatim", sha256 = "2c26b46..." }
"ipc.py" = { status = "verbatim", sha256 = "fcde2b2..." }
"webhook.py" = { status = "verbatim", sha256 = "d7a8fbb..." }
"config.py" = { status = "verbatim", sha256 = "b5bb9d8..." }
Note how the same reference package is assimilated differently:
Claude’s backend dissolved config.py into its own settings.py,
while Codex kept it verbatim.
When you encounter [tool.assimilai] in a pyproject.toml or
"assimilai" in a package.json: