COVENANT LABS · THE KERNEL · SECURITY MODEL

The security model

How NOD3, the execution engine, decides what may register and what may run.

V1.0 · MAY 2026 · NOD3

K.1

Two trust concerns

The engine runs a delegated signing model with two separate concerns: who may add an action to the registry, and who may call a registered action. Registration authority and invocation authenticity are handled by different keys with different exposure.

The current model is not full production isolation. It is a first layer that guarantees four things:

  • 01Only holders of the engine root key can register actions.
  • 02Only engine-signed requests can invoke actions.
  • 03Actions verify invocations with the engine public key alone.
  • 04The action surface never holds an engine private key.

K.2

Signed registration

The trust anchor is a single root private key. During early development the trusted SDK runtime holds it. From the root key and an action_id the SDK derives an action-specific private key, and that derived key signs the action's registration claim.

ENGINE_ROOT_PRIVATE_KEY + action_id
        ↓
derived action private key
        ↓
signed registration claim
        ↓
engine re-derives identity · verifies signature

The engine re-derives the expected identity from the same root key and action_id, then checks the signature over the claim. Derivation is deterministic: the same root and the same action_id always produce the same identity, and a different action_id produces a different one.

{
  "claim_version": "engine.action.registration.v1",
  "claim": { "...": "action metadata" },
  "signature": "...",
  "signature_algorithm": "ed25519",
  "action_identity_version": "v1"
}

The signed claim covers the action's full descriptor: action_id, name, service, version, protocol, base_url, path, method, schemas, timeouts. Change any field after signing and verification fails.

K.3

Signed invocation

Invocation runs the other direction. The engine builds the request and signs it with its own private key. The action holds only the matching public key, verifies the signature, and executes only if it holds.

ENGINE_PRIVATE_KEY signs invocation request
        ↓
action verifies with ENGINE_PUBLIC_KEY
        ↓
valid → execute · invalid → reject

The payload binds the signature to the exact request:

FIELDBINDS THE SIGNATURE TO
action_id / audienceThis action, no other.
method + pathThe exact endpoint.
body_hashThe exact payload, unmodified.
timestampA fresh request.
nonce / request_idA single use, no replay.

A verified request is known to come from the engine, to be unmodified, to be addressed to this action, and to be fresh.

K.4

The trust boundary

For registration, any holder of the root key is inside the authority domain. Anyone without it cannot produce a registration the engine will accept. For invocation, the engine's private key signs and the public key verifies. Actions hold verification material only, no signing authority.

The shape is shared-authority delegated registration with public-key verified invocation. The registration secret is powerful and centralized. The invocation path needs no secret at the edge at all.

K.5

What it covers, what it does not

PROTECTED

External registrationNo valid signature exists without the root key, so outside processes cannot write to the registry.
Metadata tamperingThe signature covers the whole claim. One edited field breaks verification.
Identity confusionDerivation is deterministic. One action_id maps to one identity.
Forged invocationActions reject any request the engine did not sign.
Secret theft at the edgeA compromised action runtime can verify requests but cannot sign new ones as the engine.

NOT PROTECTED

Compromised SDK hostA host holding the root key can mint any action identity and register arbitrary actions.
Per-action containmentWhile the root key sits in the runtime, derived keys give structure and attribution, not isolation.
ConfidentialitySignatures prove origin and integrity. They hide nothing. Transport security comes from TLS.
Replay, by signature aloneFreshness requires timestamp and nonce checks, and the receiver must enforce them.
Root key leakAn attacker mints valid identities and valid registrations. This key is the whole registration authority.
Invocation key leakAn attacker signs requests actions will accept. The key never leaves engine-controlled infrastructure.

K.6

The invariants

REGISTRATION

Only a holder of the engine root private key can produce an action registration the engine will accept.

INVOCATION

Only a holder of the engine invocation private key can produce a request an action should accept. The action needs only the public key to check it.

root key             proves registration authority
derived action key   proves action registration
engine private key   signs invocation
engine public key    verifies invocation

K.7

What the action runtime holds

MATERIALROLE
ACTION_IDIdentifies the action.
ACTION_PRIVATE_KEYSigns action-owned claims: registration now, result signing later.
ENGINE_PUBLIC_KEYVerifies invocations from the engine.

Never present at the edge:

ENGINE_ROOT_PRIVATE_KEY
ENGINE_PRIVATE_KEY

Both stay in engine-controlled or provisioning infrastructure.

K.8

The hardening path

The known weakness of the current stage is concentration: the SDK runtime holds the root key, so it holds the whole registration authority. That is acceptable only while that host is trusted. The next step moves the root key into provisioning infrastructure and hands each action only its own derived key. A compromised action then costs one identity, not the authority.

STAGESTATE
01 · NOWShared root key in the trusted SDK runtime. Signed registration, signed invocation, public-key verification at the action.
02Root key leaves the runtime. A provisioner mints per-action keys; the runtime receives only ACTION_ID, ACTION_PRIVATE_KEY, ENGINE_PUBLIC_KEY.
03Key IDs and rotation for both key families. Replay protection, audience binding, registry policy.
04KMS or HSM backed signing and short-lived credentials. Result signing and audit logs.
05A certificate or delegation model replaces deterministic derivation.

Two rules carry through every stage. Verification proves who sent a registration; policy decides whether to accept it: allowed services and domains, approval gates, restricted methods and paths. And enablement is registry state: an action signs its own descriptor, the engine decides whether it runs.