Disciplines · Decisions (ADRs)

ADR-0082: Eve canonical skill reconciliation

Eve currently has three skill-shaped layers with different jobs:

4sections8 minread

On this page
  • Status: accepted for Phase 7 Task 7.6
  • Date: 2026-09-09
  • Owners: Eve runtime, @oshun/skill-system, Security, Evaluation, Product
  • Scope: ownership and admission contract; no product rollout

Context#

Eve currently has three skill-shaped layers with different jobs:

  1. SMX owns seven static, model-facing task-family playbooks in apps/oshun/bff/src/assistant/skills. Its router chooses a family, its allowlist narrows the already-built toolset, its registry requires versioned ids/changelogs/deck-case traceability, and the complete served prompt bytes are protected by the SMX prompt hash and evaluation process.
  2. Hermes/Voyager owns mutable reusable recipes in libs/oshun/assistant/src/skills. It can save, retrieve, interpolate, and re-feed a recipe, and it has process-local and Postgres stores. These records use mutable ids rather than immutable semantic versions and are not part of the SMX prompt-hash or task-family evaluation path.
  3. @oshun/skill-system already describes itself as the canonical cross-domain registry and contains semantic versions, immutable version snapshots, discovery, governance, sandbox, quality, migration, and execution primitives. Eve runtime does not currently consume it. One generic Agentic Studio page imports its static pipeline templates and graph helper, but does not consume SMX skills, Voyager recipes, or the reconciliation contract; its fixture marketplace/quality presentation is not evidence that Eve's Skills story is wired.

Calling all three things “skills” does not make them interchangeable. Replacing the measured SMX serving bytes with mutable Voyager recipes would bypass the SMX ratchet. Treating the Voyager store as a second canonical registry would leave version, provenance, quarantine, and rollback policy split. Treating a retrieved recipe as authority would allow untrusted content to grant itself tools.

Task 7.6 requires one ownership and user story before semantic recall or further Eve skill wiring proceeds.

Decision#

One control plane, two source projections#

@oshun/skill-system owns the canonical control plane for Eve skills:

  • canonical identity and immutable version snapshots;
  • exact active-version pins;
  • source provenance and content hashes;
  • security and governance admission;
  • quarantine, feedback, and rollback state;
  • the final privilege-clamp and exact execution-grant contract; and
  • metadata returned by product-facing skill discovery.

SMX and Voyager remain source/serving adapters, not competing authorities.

Layer Owns Must not own
SMX BFF skills evaluated task-family routing, stable prompt projection, deck references, model-facing hash, family tool projection canonical lifecycle, mutable user recipes, authority grants
Hermes/Voyager skills capture, seeding, lexical/embedding candidate retrieval, recipe interpolation during migration publication, activation, quarantine override, privilege grants
@oshun/skill-system canonical pin, scope, provenance, admission, active pointer, quarantine, feedback, rollback, final clamp BFF task-family classification, product UI, channel credentials
Product adapters authenticated subject/channel context, display, confirmation where required, activity/evidence links inventing versions, trusting skill prose, widening tools

The reconciliation contract is libs/oshun/skill-system/src/eve-reconciliation.ts. It deliberately represents SMX prompt projections and Voyager recipes as different closed modes. A mode cannot be relabelled as the other.

Version and pinning#

Every runnable projection has an exact (canonical skill id, SemVer, SHA-256 content hash) pin. The hash binds the operational instructions, scope, declared tools, retrieval terms, source system/id/version/revision, importing actor/time, source evidence, and—when the source is SMX—the global prompt hash and eval case ids.

SMX's skill.<family>.v<n> source id and v<n> must agree. A canonical SemVer is assigned without changing or concealing that source version. A Voyager record's mutable id/update revision is provenance for a new canonical candidate; updating that source never overwrites an existing canonical version. Reusing a canonical id/version with different content is rejected.

Retrieval never means “execute latest.” Discovery returns metadata and the exact active pin. The same pin is carried through activation and execution; hash, version, or identity drift refuses instead of silently resolving a newer snapshot.

Retrieval and the SMX measurement boundary#

Until Task 7.2 establishes the required runtime skill-selection evaluation families and floors, SMX's deterministic task-family router remains the serving selector for its measured playbooks. Reconciliation does not dynamically replace those prompt bytes or restamp the SMX ratchet.

Canonical discovery searches only active records visible to the exact product, tenant, or user scope. It returns name, description, source label, declared tools, score, and exact pin—not instructions. Instructions become available only after exact execution authorization. Semantic retrieval may later rank this metadata through an approved route, but it cannot bypass lifecycle, subject filtering, or exact pinning.

Voyager lexical/embedding results are candidate-retrieval evidence only. A saved or seeded recipe is not runnable through the canonical path until its immutable projection passes admission and is activated.

Privilege clamp#

Skill prose is untrusted data, never authority. The effective tool set is the ordered intersection of four explicit sets:

  1. tools declared by the exact skill version;
  2. tools allowed by the current authenticated execution grant;
  3. tools allowed on the current channel/turn; and
  4. tools actually registered by the runtime.

An absent or empty set widens nothing. Unknown declared tools block admission. The execution grant must exactly match tenant, user, purpose, channel, skill id, version, and content hash, must be authenticated by the caller's authority boundary, and is rechecked for issuance time, expiry, and revocation when the instructions are resolved. The contract returns a resolution; it does not execute a handler.

Provenance, poisoning, and quarantine#

Admission requires all of the following to bind the same exact content hash:

  • a source revision on the current trusted-source allowlist;
  • a security receipt whose full normalized verification key was authenticated, whose scanner version is trusted, whose age is bounded, and whose verdict is clean with no findings;
  • a governance receipt whose full normalized verification key was authenticated, whose reviewer is trusted, whose age is bounded, and whose decision is approval; and
  • only registered declared tools.

Receipt identity strings are not signatures. The surrounding authority boundary must authenticate the complete normalized receipt before placing its kind:id:SHA-256 verification key in the verified set. Reusing an authenticated id with altered receipt fields therefore fails. Self-asserted receipts do not pass. Execution grants use the same full-receipt binding.

Finding codes are closed and include prompt injection, secret references, undeclared tools, path traversal, untrusted provenance, hash mismatch, eval gaps, and unknown. Any failed admission is retained as quarantined rather than quietly disappearing. A later poisoning or integrity finding can quarantine an active version immediately; that removes its active pointer. Quarantine is terminal for that immutable version. Recovery requires a new reviewed version or a governed rollback to a different previously active version.

Feedback#

Feedback binds an exact pin, exact tenant/user, execution id, categorical outcome, time, evidence reference, and optional bounded quality score. The registry accepts it only when that id, subject, and pin match a retained successful authorization receipt. That receipt contains the grant id, authorization time, purpose, channel, and effective tool names, but no skill instructions, prompt, reply, or tool payload. The canonical feedback record also retains none of those payloads. Duplicate feedback ids are idempotent only when their complete normalized content matches; conflicting reuse rejects.

Feedback never edits, publishes, activates, or unquarantines a skill. Unsafe or corrected outcomes, or a sufficiently adverse bounded sample, recommend human review. SMX prompt edits still require its prompt-hash and measurement process; Voyager-derived edits create a new candidate version.

Rollback and restart#

Activating a new approved version retires the prior active pin without deleting it. Rollback targets only a previously active, now-retired exact pin. It requires a fresh authenticated security receipt, a fresh authenticated rollback governance receipt, a still-trusted source revision, and a still-valid tool declaration. A quarantined or never-active candidate cannot be selected as a rollback shortcut.

The process-local reference registry exports records, active pins, minimized execution authorization receipts, feedback, and control events. Restart validates all content hashes, review bindings, status/active-pointer consistency, activation history, execution and feedback scopes, event pins, and the current admission policy before restoring anything runnable. It retains the review that most recently made a pin runnable, including a rollback review. A malformed or newly untrusted runnable snapshot fails closed.

Durable storage must preserve the same invariants transactionally. This ADR does not claim that the existing generic Postgres registry already stores the Eve reconciliation overlay.

One user-visible story#

The product uses one noun: Skills. A person does not choose “SMX” or “Voyager.” They see a name, purpose, source label (Built-in, Organization skill, or My skill), version, status, permitted capabilities, and evidence or activity link.

  • Built-in skills are measured Eve playbooks sourced from SMX.
  • Saved or imported recipes appear as pending candidates until review; an approved user-scoped recipe appears as My skill.
  • Running a skill uses the displayed exact version under current permissions.
  • A revoked grant, quarantine, or version mismatch produces a visible refusal, not a fallback to an unreviewed recipe.
  • Feedback can request review. Operators can quarantine or roll back, and the activity record names the exact pin and decision evidence.

This is the canonical vocabulary and interaction contract for later product work. The existing generic Agentic Studio skill-system page must either adopt this provenance/version/status vocabulary when real Eve records are admitted or remain explicitly separate as a pipeline-design surface. No UI is added by Task 7.6.

Migration sequence#

  1. Project the seven current SMX skills into exact canonical records without changing their served bytes; bind each to its source id, prompt hash, and eval cases.
  2. Add an audited Voyager import adapter that converts saved recipes into scoped candidates with explicit canonical SemVer. Do not execute legacy mutable rows through the canonical path.
  3. Persist the reconciliation overlay transactionally and bind authenticated security/governance/authority receipt verification.
  4. After Task 7.2's selection and long-horizon gates pass, resolve SMX routes through their exact active canonical pins while retaining the same prompt hash/eval discipline.
  5. Add the single Skills product story only through the applicable product, privacy, and security admission gates. Retire direct legacy mutation/run entrypoints after migration and rollback evidence passes.

Consequences and honest boundary#

The repository now has a single testable decision for ownership, layering, pinning, retrieval, privilege clamping, provenance, poisoning/quarantine, feedback, rollback, and user vocabulary. It does not yet have a production consumer of the reconciliation registry, a Voyager import adapter, durable overlay storage, authenticated receipt verifier, live scanner, product Skills surface backed by Eve records, or live rollback exercise. The existing Studio page consumes only canonical pipeline templates. This task does not change the seven SMX prompt skills or their model-facing bytes.

Task 7.6 closes the reconciliation decision and reference contract only. Task 7.2 still owns runtime selection measurement; later admission work owns product wiring; Tasks 13 and 14 retain security and privacy gates. Phase 7 and G3/G11-G18 remain open.