Skill: theshadowrose/imprint (version 1.0.1)

--- name: imprint description: "Adaptive operator modeling for AI agents. Your agent learns who you are by watching — not by being told. Builds a predictive model of your preferences, patterns, and decision style across sessions. Gets smarter about YOU over time." version: "1.0.0" author: "Shadow Rose" tags: [agent-intelligence, operator-modeling, personalization, learning, adaptive, next-gen] --- # Imprint — Your Agent Learns You ## What It Does Imprint gives your OpenClaw agent the ability to learn who you are through observation. Not through a config file. Not through a personality quiz. By watching how you work, what you choose, how you communicate — and building a predictive model that improves over time. After Imprint, your agent: - Anticipates what you'll want before you ask - Matches your communication style naturally - Knows which decisions you'll make and pre-loads relevant context - Recognizes your patterns (work rhythms, decision style, attention shifts) - Self-corrects when it gets you wrong ## Why This Exists Current AI agents are generic. They respond the same way to everyone. Personalizing them means writing long system prompts describing yourself — and even then, the agent doesn't *learn*. It just follows instructions. Humans don't learn each other that way. You learn someone by spending time with them. You notice what they care about, how they react, what frustrates them. You build an internal model and update it constantly. Imprint gives your agent that capability. ## How It Works ### The Three Layers ``` OBSERVE → MODEL → ANTICIPATE ↑ | └──── CORRECT ←────────┘ ``` **OBSERVE:** Track operator signals passively. No interrogation. No surveys. - Decision patterns (what they choose when given options) - Communication style (length, formality, humor, directness) - Attention patterns (what they engage with vs ignore) - Correction patterns (what they fix in your output) - Timing patterns (when they're active, when they go quiet) - Rejection patterns (what they shut down and how fast) **MODEL:** Build a lightweight operator profile from observations. - Stored in `imprint/operator-model.json` - Updated after every meaningful interaction - Confidence scores on every trait (low confidence = don't act on it yet) - Decay function: old observations lose weight unless reinforced **ANTICIPATE:** Use the model to predict and pre-empt. - Pre-load workspace files the operator is likely to need (local only — no network/API calls) - Match communication style without being told - Flag things the operator would want to know about - Skip things the operator consistently ignores - Adjust depth and detail to operator preference **CORRECT:** Learn from prediction failures. - When the operator corrects you, that's high-signal data - When the operator ignores your output, that's signal too - Explicit corrections weight 5x implicit signals - Track prediction accuracy over time — if it's dropping, the model is stale ### Observation Categories | Category | What to Track | Example Signal | |----------|--------------|----------------| | **Decisions** | Choices between options, speed of decision | "Always picks the faster option over the thorough one" | | **Communication** | Message length, tone, vocabulary | "Uses short direct messages, no pleasantries" | | **Attention** | What gets engagement vs silence | "Ignores status updates, engages with problems" | | **Corrections** | What they change in your output | "Always removes hedging language" | | **Timing** | Activity patterns, response latency | "Active 6-10 AM, quiet afternoons" | | **Rejection** | What gets shut down | "Kills any suggestion involving social media" | | **Depth** | Preferred detail level | "Wants bullet points, not paragraphs" | | **Autonomy** | What they want done vs asked about | "Do file operations silently, ask before sending messages" | ### The Operator Model ```json { "version": 1, "updated": "2026-03-20T19:00:00Z", "observations": 47, "traits": { "communication_style": { "value": "direct-minimal", "confidence": 0.85, "observations": 23, "last_updated": "2026-03-20T18:00:00Z" }, "decision_speed": { "value": "fast-intuitive", "confidence": 0.72, "observations": 11, "last_updated": "2026-03-20T17:00:00Z" }, "detail_preference": { "value": "sparse", "confidence": 0.68, "observations": 15, "last_updated": "2026-03-20T16:00:00Z" }, "autonomy_preference": { "value": "high-auto-low-ask", "confidence": 0.55, "observations": 8, "last_updated": "2026-03-20T15:00:00Z" } }, "predictions": { "total": 34, "correct": 27, "accuracy": 0.79 }, "corrections_log": [ { "date": "2026-03-20", "what": "removed_hedging", "signal": "operator prefers absolute statements over hedged ones", "weight": 5 } ] } ``` ### Confidence Thresholds | Confidence | Agent Behavior | |-----------|----------------| | < 0.3 | Don't act on this trait. Keep observing. | | 0.3 - 0.6 | Use as soft preference. Can be overridden easily. | | 0.6 - 0.8 | Use as default behavior. Mention if deviating. | | > 0.8 | Use as strong default. Only deviate if explicitly asked. | ### Decay Function Observations lose weight over time unless reinforced: ``` weight(t) = initial_weight × e^(-λt) ``` Where `λ` is the decay rate (default: 0.05/day) and `t` is days since observation. Recent behavior matters more than old behavior. People change. The model should too. ### Cold Start New operator, no data. Imprint handles this gracefully: 1. **Session 1-3:** Pure observation mode. Don't anticipate. Just watch and record. 2. **Session 4-10:** Low-confidence predictions. Soft suggestions. Easy to override. 3. **Session 10+:** Model stabilizes. Agent starts genuinely anticipating. The agent should be transparent about this: "I'm still learning how you work. I'll get better." ## Integration ### Per-Session Startup At session start, load `imprint/operator-model.json` and apply traits with confidence above threshold to your response style. Don't announce it — just do it. ### During Session After each meaningful interaction: 1. Extract observation signals (decisions, corrections, engagement) 2. Update relevant traits in the model 3. Adjust current session behavior if confidence shifted ### End of Session Write updated model to `imprint/operator-model.json`. Log significant observations to `imprint/observations/YYYY-MM-DD.md`. ### Privacy The operator model is local. It never leaves the workspace. It contains behavioral patterns, not personal data. The operator can read, edit, or delete it at any time. ## What This Is NOT - **Not a personality test.** No Myers-Briggs, no OCEAN, no categorization. The model is continuous and specific, not categorical. - **Not a surveillance system.** Tracks behavioral patterns for better assistance. Never logs raw message content, secrets, or private information. Observations store derived signals only (e.g., "prefers short responses" not the actual message). - **Not mind reading.** It's pattern matching with confidence scores. It will be wrong sometimes. That's what the correction loop is for. - **Not a replacement for explicit instructions.** If the operator says "do X," do X. Imprint handles the spaces between instructions — the things the operator doesn't say because they expect you to know. ## Files - `SKILL.md` — this file - `imprint.md` — implementation guide with code examples - `operator-model-schema.json` — JSON schema for the operator model - `example-model.json` — example operator model showing all trait types ## The Pitch NemoClaw gave agents security. Imprint gives agents intelligence. Your agent doesn't just execute tasks — it learns who you are and gets better at serving you specifically. Every session, every interaction, every correction makes it sharper. The best assistant isn't the smartest one. It's the one that knows you.

path: example-model.json
content: {
  "version": 1,
  "updated": "2026-03-20T19:00:00Z",
  "observations": 47,
  "traits": {
    "communication_style": {
      "value": "direct-minimal",
      "confidence": 0.85,
      "observations": 23,
      "last_updated": "2026-03-20T18:00:00Z"
    },
    "decision_speed": {
      "value": "fast-intuitive",
      "confidence": 0.72,
      "observations": 11,
      "last_updated": "2026-03-20T17:00:00Z"
    },
    "detail_preference": {
      "value": "sparse-bullets-over-paragraphs",
      "confidence": 0.68,
      "observations": 15,
      "last_updated": "2026-03-20T16:00:00Z"
    },
    "autonomy_preference": {
      "value": "high-auto-low-ask",
      "confidence": 0.55,
      "observations": 8,
      "last_updated": "2026-03-20T15:00:00Z"
    },
    "correction_pattern": {
      "value": "removes-hedging-and-filler",
      "confidence": 0.78,
      "observations": 18,
      "last_updated": "2026-03-20T18:30:00Z"
    },
    "engagement_trigger": {
      "value": "problems-and-novelty",
      "confidence": 0.61,
      "observations": 9,
      "last_updated": "2026-03-20T14:00:00Z"
    },
    "disengagement_trigger": {
      "value": "status-updates-and-routine-reports",
      "confidence": 0.53,
      "observations": 7,
      "last_updated": "2026-03-20T12:00:00Z"
    },
    "work_rhythm": {
      "value": "sprint-builder-intense-bursts-then-detach",
      "confidence": 0.44,
      "observations": 5,
      "last_updated": "2026-03-19T20:00:00Z"
    },
    "active_hours": {
      "value": "0500-1000-primary-1800-2200-secondary",
      "confidence": 0.70,
      "observations": 14,
      "last_updated": "2026-03-20T10:00:00Z"
    },
    "rejection_pattern": {
      "value": "hard-fast-no-negotiation",
      "confidence": 0.38,
      "observations": 4,
      "last_updated": "2026-03-18T15:00:00Z"
    }
  },
  "predictions": {
    "total": 34,
    "correct": 27,
    "accuracy": 0.79
  },
  "corrections_log": [
    {
      "date": "2026-03-20",
      "what": "removed_hedging",
      "signal": "operator prefers absolute statements over hedged ones",
      "weight": 5
    },
    {
      "date": "2026-03-19",
      "what": "shortened_response",
      "signal": "operator wanted 2 sentences, agent gave 5",
      "weight": 5
    },
    {
      "date": "2026-03-18",
      "what": "ignored_status_update",
      "signal": "operator did not engage with routine progress report",
      "weight": 1
    }
  ],
  "decay_rate": 0.05
}


path: imprint.md
content: # Imprint — Implementation Guide

## Quick Start

1. Create `imprint/` directory in your workspace
2. Copy `operator-model-schema.json` for reference
3. Add to your agent's session startup: "Load `imprint/operator-model.json` if it exists"
4. Add to your agent's session end: "Update `imprint/operator-model.json` with new observations"

That's it. The rest is the agent doing its job — watching, learning, adapting.

## Observation Extraction

After each meaningful interaction, the agent should ask itself:

### Decision Signals
- Did the operator choose between options? Which did they pick? How fast?
- Did they override a suggestion? What did they prefer instead?
- Did they accept without comment? (Implicit confirmation)

### Communication Signals
- How long was their message? (Word count relative to topic complexity)
- Did they use formal or casual language?
- Did they use humor? Sarcasm? Directness?
- Did they include pleasantries or skip to the point?

### Attention Signals
- Did they respond to this message at all?
- How quickly did they respond? (Fast = engaged, slow = low priority)
- Did they engage with the substance or just acknowledge?
- Did they ask follow-ups? (High engagement signal)

### Correction Signals (Highest Value)
- Did they edit your output? What did they change?
- Did they say "no, I meant..." — what was the gap?
- Did they rephrase your answer to someone else? How did it differ?
- Did they explicitly tell you to do something differently next time?

### Recording Format

Append to `imprint/observations/YYYY-MM-DD.md`:

```markdown
## Observation: [timestamp]
- **Category:** correction | decision | communication | attention | timing
- **Signal:** [what happened — derived behavioral signal only, never raw message content]
- **Trait update:** [which trait this affects]
- **Confidence delta:** [+/- how much this changes confidence]
```

**Important:** Never log raw message content in observations. Store only the derived behavioral signal. "Operator preferred shorter response" not the actual message. This is a hard rule.

## Model Updates

### When to Update

- After explicit corrections (immediate, high weight)
- After decisions between options (immediate, medium weight)
- End of session (batch update from accumulated signals)
- After periods of silence (absence is signal too)

### How to Update

For each new observation affecting trait `T`:

```
new_confidence = (old_confidence × old_count + signal_weight × signal_value) / (old_count + signal_weight)
```

Where:
- `old_count` = existing observation count (with decay applied)
- `signal_weight` = 5 for explicit corrections, 1 for implicit signals
- `signal_value` = 1 if signal confirms current trait value, 0 if contradicts

If a signal contradicts the current trait value AND has enough weight to shift confidence below 0.3, consider resetting the trait to a new value.

### Decay Application

Before each update, apply decay to existing observations:

```
effective_count = observations × e^(-decay_rate × days_since_last_update)
```

This means 30 days without reinforcement roughly halves the observation weight (at default λ=0.05).

## Anticipation Engine

### Decision Anticipation

When the operator faces a decision:
1. Check `decision_speed` trait
2. If "fast-intuitive" with high confidence: present the option you predict they'll choose as the default, others as alternatives
3. If "deliberate-analytical": present all options with equal weight and analysis
4. Track whether your prediction was right

### Communication Matching

Before generating any response:
1. Check `communication_style` and `detail_preference`
2. Match length, formality, and structure to the model
3. If `correction_pattern` indicates they remove hedging: don't hedge
4. If `correction_pattern` indicates they want more detail: give more detail

### Proactive Flagging

Based on `engagement_trigger` and `disengagement_trigger`:
- Proactively surface things matching engagement triggers
- Minimize or batch things matching disengagement triggers
- If `autonomy_preference` is high: do things silently, report only exceptions

### Context Pre-Loading

Based on `work_rhythm` and `active_hours`:
- During predicted active periods: have relevant context ready
- Predict what they'll work on based on recent patterns
- Pre-load relevant **workspace files** they're likely to need

**Scope constraint:** Pre-loading means reading files already in the workspace. It does not mean fetching from the network, calling APIs, or accessing data outside the workspace. The agent reads local files it already has access to — nothing more.

## Prediction Tracking

Every time the agent acts on a prediction from the model:

```json
{
  "timestamp": "2026-03-20T18:00:00Z",
  "prediction": "operator will prefer bullet format",
  "trait_used": "detail_preference",
  "confidence": 0.68,
  "outcome": "confirmed",
  "evidence": "operator engaged with bullet response without reformatting"
}
```

Track `predictions.accuracy` over time. If accuracy drops below 0.6, the model is stale — increase observation weight, decrease anticipation confidence, and consider a soft reset on low-confidence traits.

## Edge Cases

### Multiple Operators
If the agent serves multiple people (group chats, shared workspace):
- Maintain separate models per operator
- Use speaker identification to route observations
- In group settings, default to the most conservative model (least assumption)

### Contradictory Signals
Operator behaves differently in different contexts (casual in DMs, formal in groups):
- Track context tags on observations: `context: dm | group | work | casual`
- Allow traits to have context-specific values
- Don't average across contexts — keep them separate

### Operator Says "Stop"
If the operator asks the agent to stop a learned behavior:
- Immediate override. No argument.
- Record as high-weight correction
- Reset the relevant trait confidence to 0.0
- Don't silently resume the behavior later

### Model Inspection
The operator should always be able to:
- Read the full model (`imprint/operator-model.json`)
- Edit any trait or delete any observation
- Reset the entire model
- Ask "what do you think you know about me?" and get an honest answer

Transparency is non-negotiable. The model exists to serve the operator. It's their data.

## Privacy Principles

1. **Local only.** The model never leaves the workspace.
2. **Behavioral, not personal.** Track patterns, not secrets.
3. **Operator-owned.** They can read, edit, or delete it anytime.
4. **No content logging.** Store "operator preferred shorter response" not the actual messages.
5. **Transparent on request.** If asked, explain exactly what you've observed and why.


path: operator-model-schema.json
content: {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Imprint Operator Model",
  "description": "Adaptive operator model built through observation. Updated by the agent, readable/editable by the operator.",
  "type": "object",
  "required": ["version", "updated", "observations", "traits", "predictions"],
  "properties": {
    "version": {
      "type": "integer",
      "description": "Schema version",
      "default": 1
    },
    "updated": {
      "type": "string",
      "format": "date-time",
      "description": "Last model update timestamp"
    },
    "observations": {
      "type": "integer",
      "description": "Total observation count across all traits",
      "minimum": 0
    },
    "traits": {
      "type": "object",
      "description": "Observed operator traits with confidence scores",
      "additionalProperties": {
        "type": "object",
        "required": ["value", "confidence", "observations", "last_updated"],
        "properties": {
          "value": {
            "type": "string",
            "description": "Current trait value (free-form, agent-determined)"
          },
          "confidence": {
            "type": "number",
            "minimum": 0.0,
            "maximum": 1.0,
            "description": "Confidence in this trait. <0.3 = don't act. 0.3-0.6 = soft. 0.6-0.8 = default. >0.8 = strong."
          },
          "observations": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of observations supporting this trait"
          },
          "last_updated": {
            "type": "string",
            "format": "date-time",
            "description": "When this trait was last updated"
          },
          "history": {
            "type": "array",
            "description": "Optional: previous values for drift detection",
            "items": {
              "type": "object",
              "properties": {
                "value": { "type": "string" },
                "date": { "type": "string", "format": "date-time" },
                "confidence": { "type": "number" }
              }
            }
          }
        }
      }
    },
    "predictions": {
      "type": "object",
      "required": ["total", "correct", "accuracy"],
      "properties": {
        "total": {
          "type": "integer",
          "minimum": 0,
          "description": "Total predictions made"
        },
        "correct": {
          "type": "integer",
          "minimum": 0,
          "description": "Predictions the operator confirmed or didn't correct"
        },
        "accuracy": {
          "type": "number",
          "minimum": 0.0,
          "maximum": 1.0,
          "description": "correct / total"
        }
      }
    },
    "corrections_log": {
      "type": "array",
      "description": "Recent operator corrections (high-signal learning events)",
      "items": {
        "type": "object",
        "required": ["date", "what", "signal"],
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "what": {
            "type": "string",
            "description": "What was corrected"
          },
          "signal": {
            "type": "string",
            "description": "What this correction teaches about the operator"
          },
          "weight": {
            "type": "number",
            "default": 5,
            "description": "Signal weight (explicit corrections default 5x)"
          }
        }
      }
    },
    "decay_rate": {
      "type": "number",
      "default": 0.05,
      "description": "Observation decay rate per day (lambda in exponential decay)"
    }
  }
}


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)