Resource / profile hygiene

Profile Separation and Cross-Contamination Checklist

A practical checklist for keeping profiles, memories, skills, secrets, scheduled jobs, gateways, project roots, and proof logs from quietly contaminating each other.

Eight auditable layersFictional examples onlyNo lead captureNot security certification

Public safety status

This public resource follows the risk-review verdict: PASS_WITH_REQUIRED_FIXES. Required fix F-01 was applied before publication: the named-person preference example now uses a generic operator reference. Recommended editorial fix R-01 was also applied by replacing the internal voice-direction prefix.

This is a static owned-site public resource. It is not a service offer, lead-capture flow, pricing page, client commitment, legal advice, security certification, or platform endorsement.

Who this is for

Audience: builders and operators running multiple agent profiles, projects, or clients on one machine.

Use: run the diagnostic, check the eight layers, then use the pre-flight and audit sections before adding another agent or profile.

Profile Separation and Cross-Contamination Checklist

Status: public resource, live on the owned Ana site.

Audience: builders and operators running multiple agent profiles, projects, or clients on one machine — and discovering that their agents keep leaking context, skills, secrets, or instructions across lanes they thought were separate.

Promise: a practical checklist for keeping profiles, memories, skills, secrets, cron jobs, gateways, project roots, and proof logs from quietly contaminating each other — so your music-tutoring agent does not start writing marketing copy for your consulting side project, and your client work does not accidentally read your personal preferences.

This guide's approach: sharp, useful, allergic to "just use different folders" hand-waving. Profile separation is not a directory. It is a boundary discipline with proof.


The blunt premise

Running two agents on one machine without profile separation is like running two restaurants from one kitchen with one fridge, one prep station, and one menu board that everyone assumes is correct.

Eventually, the vegan place serves oysters.

The contamination is rarely dramatic. It is quiet. A memory from Project A shows up in Project B's session. A cron job fires with the wrong working directory. A skill written for one client's API gets loaded into another client's workflow. A secret file meant for one profile is readable by another.

By the time you notice, the wrong context has already shaped several outputs and nobody can prove which agent wrote what.

This checklist treats profile separation as eight auditable layers, not one folder convention.


Quick diagnostic: are you already contaminated?

Answer these before reading further. If more than two are "no," you have a problem.

# Question Yes/No
1 Can you name every profile on this machine without looking at a config file?
2 Does each profile have its own memory store that other profiles cannot read?
3 Are skills scoped per-profile, or do all profiles share one skill directory?
4 Can you prove which profile ran a specific cron job last Tuesday?
5 Are secrets stored so that Profile A cannot accidentally load Profile B's API keys?
6 Does each profile have its own project root, and do agents refuse to write outside it?
7 Can you tell which gateway/bot token belongs to which profile without guessing?
8 Do your proof logs record which profile produced the artifact?

Layer 1: Profiles

A profile is the identity boundary. Everything inside it — memory, skills, secrets, cron jobs, project state — belongs to that profile and that profile's work.

What to check

Pass/fail test

PASS: You can run one command and get a list like:

profile-a  content-strategist   active
profile-b  client-ops           active
profile-c  research-analyst     paused

FAIL: You have to remember profiles from memory, grep through config files, or open three different dashboards.

Toy example

Good profile names: content-strategist, client-ops, research-analyst, media-producer.

Bad profile names: default, agent2, temp, the-other-one, or anything containing a real client name or API key fragment.


Layer 2: Memories

Memory contamination is the quietest failure. A durable fact saved under Profile A gets injected into Profile B's session next week, and Profile B starts making decisions based on preferences it was never told.

What to check

Pass/fail test

PASS: You can dump Profile A's memories and confirm zero overlap with Profile B's. Each entry is compact, declarative, and relevant only to that profile's work.

FAIL: Profile A's memory says "User prefers short audio summaries when driving" and Profile B's memory says the same thing — because someone saved it in the wrong profile, or the memory system shares a store across profiles without namespacing.

Contamination pattern

The classic failure: a personal preference ("the operator likes concise replies") gets saved into a client-facing profile's memory, and the client-facing agent starts being terse with customers who need thoroughness.

Fix: Memory writes should always target a specific profile. If your system allows writing to "the current profile's memory," confirm which profile is current before saving anything durable.


Layer 3: Skills

Skills are reusable procedures. They should be portable across profiles by design — but a skill written for one profile's workflow can silently carry assumptions that break another profile's work.

What to check

Pass/fail test

PASS: You can list skills per profile and see which are shared vs. profile-specific. Shared skills have no profile-private assumptions baked in.

FAIL: Profile B loads a skill called deploy-static-site that was written for Profile A's project structure, and the skill tries to write to Profile A's deploy directory.

Contamination pattern

A skill says "read the charter before publishing." Profile A's charter exists at <project-root>/CHARTER.md. Profile B has no charter. The skill fails silently or reads the wrong file.

Fix: Skills should use relative paths or explicit parameters, never assume a specific project layout.


Layer 4: Secrets

This is the layer where contamination becomes a security incident.

What to check

Pass/fail test

PASS: ls -la <secrets-dir> shows 0600 permissions, each file is owned by the correct user, and git status shows no tracked secret files.

FAIL: Secrets live in a shared ~/.env that every profile sources, or a secret file has 0644 permissions, or a profile's memory contains the line "API key is stored at..."

Contamination pattern

Profile A's deployment script reads ~/.env for credentials. Profile B also reads ~/.env. Someone adds a new key for Profile B, and Profile A's script picks it up as an environment variable, then sends it to the wrong API endpoint.

Fix: Each profile should source its own secret file from its own directory, never a shared environment file.


Layer 5: Cron Jobs and Scheduled Tasks

Scheduled tasks are contamination time bombs because they run without a human watching. A cron job that was set up for Profile A can quietly execute in Profile B's context if the working directory, environment, or delivery target is wrong.

What to check

Pass/fail test

PASS: You can list jobs by profile and see:

Profile: content-strategist
  job-daily-briefing    every 24h   last_run: 2026-06-27T09:00Z   status: ok
  job-weekly-report     every 7d    last_run: 2026-06-25T08:00Z   status: ok

Profile: client-ops
  job-invoice-scan      every 6h    last_run: 2026-06-27T06:00Z   status: ok

FAIL: You have seven jobs running and no idea which profile owns which, or a job's output lands in a chat that belongs to a different project.

Contamination pattern

A weekly report job was created under Profile A. Profile B gets the delivery because the job's target was set to "default chat" rather than a specific channel. Profile B's operator sees confidential Project A metrics in their feed.

Fix: Every scheduled job must have explicit profile, working directory, and delivery target. Never rely on defaults.


Layer 6: Gateways and Channel Routing

A gateway connects an agent to a messaging platform (Discord, Telegram, Slack, etc.). Each gateway has a bot identity, a token, subscribed channels, and routing rules. If two profiles share a gateway or a token, messages from one project can land in another project's chat.

What to check

Pass/fail test

PASS: You can map every active gateway connection to exactly one profile and one channel. No token is shared. No channel receives messages from two profiles unless explicitly designed that way.

FAIL: Two profiles use the same bot token, or a gateway log shows messages routed to a channel that belongs to a different project.

Contamination pattern

Profile A's Telegram bot and Profile B's Telegram bot share a token. A user messages Profile A's bot, but the response comes from Profile B's context, including Profile B's memory and project state.

Fix: Separate tokens per profile, per platform. No exceptions.


Layer 7: Project Roots and Working Directories

Project root contamination means an agent from Profile A writes files into Profile B's directory tree, or reads files from the wrong project because the working directory was not locked.

What to check

Pass/fail test

PASS: pwd at the start of any agent session returns that profile's project root. git remote -v returns the correct repository. No agent session can cd into another profile's project root without explicit authorization.

FAIL: An agent's session starts in ~/projects/ and writes a deploy package that contains files from two different projects because both were in subdirectories.

Contamination pattern

Profile A's agent is asked to create a deploy package. The working directory is ~/projects/ which contains both project-a/ and project-b/. The deploy script globs **/*.html and packages files from both projects.

Fix: Every agent session must start in its profile's project root. Build scripts must use explicit paths, not recursive globs from a parent directory.


Layer 8: Proof Logs and Audit Trails

If you cannot prove which profile did what, you cannot prove that separation is working.

What to check

Pass/fail test

PASS: Given any artifact, you can trace it back to a specific profile, a specific run, and confirm the correct context was loaded.

FAIL: An artifact exists but the proof log says "agent produced this" with no profile name, no run ID, and no way to confirm which context was active.

Contamination pattern

Profile A produces a public-facing report. The proof log is stored in a shared directory. Profile B's verifier reads the proof log and attributes the report to Profile B, then publishes it under Profile B's identity.

Fix: Proof logs are per-profile and include the profile name as a required field.


Pre-flight checklist: before running parallel agents

Run this every time you start a new profile or add a new agent to an existing machine.

# Check Pass?
1 Profile name is unique, descriptive, and free of secrets
2 Profile has its own memory store, confirmed empty of other profiles' data
3 Profile has its own skill directory, with shared skills explicitly listed
4 Profile has its own secrets directory with 0600 permissions
5 Profile has its own project root with correct version control
6 All cron jobs for this profile have explicit working directory and delivery target
7 Gateway tokens (if any) are unique to this profile
8 Proof log format includes profile name as a required field
9 No shared .env or environment file that crosses profile boundaries
10 File sync and backup tools are scoped per-profile

If any check fails, do not start the agent. Fix the boundary first.


Cross-contamination audit: how to check an existing setup

If you already have multiple profiles running and want to check for existing contamination:

Step 1: Memory audit

Dump each profile's memory store. Diff them. Any overlap is contamination unless it is a genuinely universal fact (e.g., "the server timezone is UTC").

Step 2: Skill audit

List skills per profile. Any skill present in multiple profiles should be checked for hardcoded paths, tokens, or profile-specific assumptions.

Step 3: Secret audit

List all secret files across all profiles. Check permissions (ls -la). Check for shared files. Check for secret values that appear in memory, skills, or state files.

Step 4: Cron job audit

List all active cron jobs. For each, confirm: which profile owns it, which directory it runs in, where its output goes, and whether the owning profile is still active.

Step 5: Gateway audit

List all active gateway connections. For each, confirm: which profile owns the token, which channels it subscribes to, and whether any channel receives messages from multiple profiles.

Step 6: Project root audit

For each profile, confirm the project root exists, has the correct version control remote, and contains no files from other profiles.

Step 7: Proof log audit

Sample five recent artifacts per profile. Confirm each has a proof log that names the correct profile, and that the proof log does not reference files or paths from other profiles.


Common failure modes

Symptom Likely cause First fix
Agent mentions a preference it was never told Memory contamination from another profile Dump and diff memory stores; scope writes to specific profiles
Cron job output lands in wrong chat Delivery target set to default, not explicit Set explicit channel/chat ID per job
Deploy package contains files from two projects Working directory is a shared parent Lock working directory to project root
Agent uses wrong API key Shared .env or secret directory Separate secret files per profile with 0600
Agent loads a skill with wrong assumptions Shared skill with hardcoded paths Parameterize skills; declare required context
Cannot prove which agent wrote an artifact Proof log missing profile name Add profile name as required proof-log field
Two bots respond in same channel Shared gateway token or overlapping subscriptions Separate tokens; audit channel subscriptions
Agent writes outside project root No working directory lock Set and enforce project root per session

Cleanup rhythm

Profile separation is maintenance, not a one-time setup.

Weekly

Monthly

After any new profile or major workflow change


What this resource is not

This is not a security certification, a multi-tenancy architecture guide, a vendor comparison, or legal advice about data isolation requirements.

Profile separation tools and platforms vary. This checklist works with any system that supports per-profile configuration, memory, skills, secrets, and scheduling. If you turn it into a platform-specific tutorial, verify current official docs before naming commands, flags, APIs, or configuration syntax.


Suggested CTA for later public use

Before you add a second agent to your machine, run this checklist.

Profile separation is not a folder. It is eight layers of boundary discipline with proof.

If your agents are already contaminating each other, the audit section will find it. Fix the boundary before the next run.


Next production owners

Boundary note

This page uses fictional profile names and placeholder paths. It does not include private filesystem paths, secrets, account details, customer data, real profile contents, pricing, forms, or service commitments.

Back to resource index Read the build journal

Public-safety note: this static public page performs no account, credential, payment, outreach, provider, gateway, DNS, service, upload, tracking-script, or spend actions. Spend: zero.