System trace
How skills hand off without leaking state
Eight skills in the pipeline. None of them share memory. Every handoff is a file. Every contract is a SKILL.md. This is what makes the system debuggable, versionable, and replaceable.
The problem with shared-memory agents
Most multi-step AI workflows fail the same way: one agent passes context to the next via a growing conversation thread. After three steps, the model is navigating a wall of accumulated context — earlier instructions contradict later ones, the original constraints blur, and the output drifts.
The Next Move Engine uses a different model: files as the interface between agents. Each skill reads from a well-defined input location and writes to a well-defined output location. No skill knows what the previous one did except by reading the file it left behind.
What a SKILL.md contract looks like
Every skill has a SKILL.md — a frozen spec checked into the repo. Not a system prompt in code. A first-class artefact with a history.
# SKILL: vacancy-intel
## Trigger
User provides a path to a vacancy file (inputs/vacancies/*.md)
or pastes vacancy text into the conversation.
## Inputs
- Vacancy file or text
- market-state/companies/*.md (existing company profile, if any)
- market-state/people/*.md (existing person profile, if any)
## Outputs
1. market-state/signals/<company>-<type>-<date>.md
Fields: id, company, signal_type, strength, source, date, linked_person
2. market-state/intels/<company>-<role>.md
Sections: company profile, role analysis, hidden agenda,
entry point (consulting lens), entry point (hiring lens)
## Constraints
- Every sentence in the intel must trace back to a line in the source.
No speculation beyond what the input contains.
- signal_type must be from the fixed vocabulary:
hiring-surge | leadership-change | public-complaint |
budget-signal | tool-search | leadership-gap
- Do not write outreach actions. That is action-planner's job.
## Quality criteria
- Intel file is self-contained: readable without the source vacancy.
- Signal strength is justified in the signal card body.
- Company profile section reusable for future signals.
The handoff model
vacancy-intel → market-analyst → action-planner — three skills that together produce an outreach action. None of them call each other directly.
Reads
inputs/vacancies/ve##ra-hoe.md
Writes
market-state/signals/ve##ra-leadership-gap.md
market-state/intels/ve##ra-hoe.md
Skill exits. Does not call market-analyst. Does not pass anything in memory. State is in the filesystem.
Reads (all of market-state/)
market-state/signals/*.md
market-state/intels/*.md
market-state/hypotheses/*.md
market-state/companies/*.md
Writes
market-state/hypotheses/ve##ra-delivery-pressure.md
It sees the new Ve##ra files because they exist in the filesystem — not because it was told. The Ve##ra signal is one input among many. Cross-reference with existing state determines confidence.
Reads
market-state/hypotheses/ve##ra-delivery-pressure.md
products/ai-driven-head-of-engineering.md
cases/askona-digital-transformation.md
linkedin/profile-summary.md
Writes
market-state/actions/AI-28.md
who · channel · message draft · CTA · KPI · stop condition
What isolation buys you
Debuggability
If AI-28 contains a wrong angle, you trace back: was the hypothesis wrong? Was the intel wrong? Was the signal classification wrong?
Each artefact is independently readable. You don't replay the conversation — you read the file.
Replaceability
If linkedin-post-writer produces flat output, you swap the skill. The input it receives doesn't change. The expected output doesn't change.
Everything else in the pipeline continues to work. No cascade of changes.
Temporal reconstruction
Every file write is a git commit. If you want to know what the system believed about Ax##ra on February 15th — git show the hypothesis at that date.
The market-state at any past point is fully recoverable. Time is a built-in dimension.
The full skill map
Each arrow is a file. Each box is a skill with a SKILL.md.
Input layer
vacancy file or inbound text
↓
Signals + Intelligence (one skill per entry point type)
vacancy-intel → market-state/signals/, market-state/intels/
lead-intel → market-state/signals/, market-state/intels/
↓
Synthesis
market-analyst → market-state/hypotheses/
↓
Actions
action-planner → market-state/actions/
↓
Content pipeline
evidence-finder → outputs/evidence/
linkedin-post-writer, humanizer, expert-voice → [final text]
chronographer → outputs/linkedin/
Architecture decisions
Why not one large agent?
A single agent with full repo access navigates growing context on every invocation. Instructions from step one start conflicting with step five. Isolated skills with file interfaces keep each invocation small and deterministic.
Why SKILL.md, not system prompts in code?
System prompts in code change when code changes. They're not versioned independently. They're not readable without the codebase. SKILL.md is a first-class artefact. It's in the repo, it's auditable, it has a history.
Why human-in-the-loop at the action step?
Not a trust problem. An accountability model. Sending a message carries context the system doesn't have: relationship history, timing, parallel conversations. The system handles research, synthesis, and the draft. The human keeps the send button.