maestro-v2-migration — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited maestro-v2-migration (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
maestroCLI went through a significant architectural shift in v2. Sessions that touch v2 code without understanding these changes waste time rediscovering what was renamed, what was removed, and what the new patterns look like. This guide prevents that.
Everything called "context" in v1 is now "memory" in v2.
| v1 (deprecated) | v2 (current) |
|---|---|
ContextPort | MemoryPort |
FsContextAdapter | FsMemoryAdapter |
contextAdapter | memoryAdapter |
context-write command | memory-write command (but context-write still works as CLI alias) |
src/adapters/fs/context.ts | src/adapters/fs/memory.ts |
src/ports/context.ts | src/ports/memory.ts |
.maestro/features/<name>/context/ | .maestro/features/<name>/memory/ (filesystem path unchanged for backward compat) |
If you see context in imports or variable names in core code, it is legacy. The filesystem directories under .maestro/features/ may still use context/ for backward compatibility -- that is intentional, not a bug.
v1 had an execution layer that managed worktrees, delegation, and worker lifecycle. v2 stripped this entirely. The orchestrator (Claude Code, Codex, or the user) now manages execution directly.
What was removed:
What replaced it:
task_claim, task_done, task_block, task_unblock directlyv1 had a complex task lifecycle. v2 uses exactly 4 states:
open --> claimed --> done
\-> blocked --> (unblock) --> open| State | Meaning | Transition |
|---|---|---|
open | Available for work | task_claim --> claimed |
claimed | An agent is working on it | task_done --> done, task_block --> blocked |
done | Work completed | Terminal |
blocked | Cannot proceed, needs decision | task_unblock --> open |
There are no other states. If you see pending, in_progress, failed, partial, or stale in task code, that is v1 legacy and should be migrated.
v1 used beads_rust (br) as the task backend. v2 defaults to a plain filesystem backend (FsTaskAdapter).
| Backend | Config value | Adapter | When to use |
|---|---|---|---|
| Plain files | "fs" (default) | FsTaskAdapter | Default for all new projects |
| beads_rust | "br" | BrTaskAdapter | Legacy projects, explicit opt-in |
The backend is selected via configAdapter.get().taskBackend in services.ts. Both backends implement the same TaskPort interface -- code above the adapter layer should not care which backend is active.
v2 added a pre-agent hook (hooks/pre-agent.mjs) that runs before a worker agent starts. It injects the task specification into the agent's context automatically.
This means worker prompts no longer need to manually include task specs -- the hook handles it. If you are adding new context that workers need, consider whether it belongs in:
v2 added a research phase that detects external tools available to the agent (MCP servers, CLI tools) and incorporates them into task planning. This runs during task_claim or early in the task lifecycle.
The research phase scans for:
When feature_complete is called, v2 suggests promoting valuable feature-scoped memories to project-level memories via memory_promote. This ensures learnings from a feature survive beyond the feature's lifecycle.
The suggestPromote logic runs automatically -- it scans feature memory files and suggests which ones contain decisions or constraints that apply project-wide.
When adding a new feature:
MemoryPort (not ContextPort)TaskPort interface (agnostic to backend)When encountering legacy code:
When debugging:
configAdapter.get().taskBackend)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.