Skip to main content

What you will learn

  • How the 6-step registration validation pipeline works
  • The SkillManifest v1 schema and how to create a signed manifest
  • Static scanner rules and what they detect
  • API endpoints for registration, listing, and revocation
  • A complete worked example of end-to-end registration

Overview

The Skill Registry manages the full lifecycle of skill manifests — from creation through registration, validation, and revocation. It ensures that only verified, integrity-checked, and statically scanned skills can execute against ISCL Core. Every skill that wants to interact with the ISCL API must first be registered. Registration runs a 6-step validation pipeline that checks schema conformance, cryptographic signature, file integrity, and static analysis before persisting the skill in a SQLite database.
Revoked skills are soft-deleted and excluded from active listings but preserved for audit purposes.
Key source files:

SkillManifest v1 schema

Every skill package includes a SkillManifest JSON document describing its identity, permissions, sandbox constraints, and content-addressed files.
The JSON Schema uses additionalProperties: false on all objects. No undocumented fields are accepted. AJV runs in strict mode with all errors reported.

Creating a manifest

1

Define skill metadata

Choose a unique name (lowercase alphanumeric with hyphens), declare the publisher identity, and specify the permissions your skill requires:
2

Hash all skill files

Compute the SHA-256 hash of every source file in your skill package. Hashes must be lowercase hex strings (64 characters, no 0x prefix):
3

Add file entries to manifest

Add each file with its relative path and computed hash:
4

Sign the manifest

Signing uses three operations in sequence:
  1. Remove the signature field from the manifest object
  2. JCS canonicalize the remaining object (RFC 8785 — deterministic JSON serialization)
  3. keccak256 hash the canonical JSON bytes
  4. ECDSA sign the hash with the publisher’s private key
The signManifest() function handles the full pipeline: it strips the signature field, JCS-canonicalizes the rest, computes keccak256, and signs using viem/accounts.

Registration pipeline

When you submit a manifest to POST /v1/skills/register, the SkillRegistryService runs a 6-step validation pipeline. Every step must pass for registration to succeed. Failure at any step short-circuits the pipeline and returns an error response.
1

Schema validation

Validates the manifest against SkillManifestSchema using AJV in strict mode with allErrors: true. Checks required fields, types, patterns, value ranges, and rejects any additionalProperties.On failure: Returns schema_validation_failed with an array of validationErrors (each containing path and message).
2

Signature verification

Verifies the ECDSA signature matches the declared publisher address:
  1. Remove the signature field from the manifest
  2. JCS-canonicalize the remaining object
  3. Compute keccak256 of the canonical JSON
  4. Recover the signer address from the signature using viem.recoverAddress()
  5. Compare recovered address to manifest.publisher.address (case-insensitive)
On failure: Returns signature_verification_failed. This means the manifest was either tampered with after signing or signed with a different key.
3

File hash verification

Reads each file from disk (resolved relative to basePath), computes its SHA-256 hash, and compares against the hash declared in the manifest. Files that cannot be read are also treated as mismatches.On failure: Returns file_hash_mismatch with a hashMismatches array listing the paths that failed verification.
4

Static analysis

Scans every file listed in the manifest for suspicious patterns. Each source file is read line-by-line and tested against 5 scan rules. The scan fails if any finding has error severity. Warnings are reported but do not block registration.On failure: Returns static_scan_failed with a scanFindings array containing each finding’s file, line number, rule ID, severity, and message.
5

Duplicate check

Checks if a skill with the same name is already registered and active in the database. A previously revoked skill with the same name does not block re-registration (the check queries status = 'active' only).On failure: Returns duplicate_skill with HTTP 409 Conflict.
6

Database insert

If all checks pass, the skill is persisted to SQLite:
The manifest_hash is the keccak256 of the JCS-canonicalized manifest (without the signature field). An audit event skill_registered is logged with the skill name, manifest hash, and publisher address.

Static scanner rules

The static scanner runs 5 pattern-based rules against every source file. Each rule has one or more regex patterns and a severity level.
The scan passes if there are zero error-severity findings. Warning-severity findings are included in the response but do not prevent registration. Only the first matching pattern per rule per line is reported.

Registration errors

All registration failures are audit-logged as skill_registration_failed events with the skill name and error reason.

API endpoints

POST /v1/skills/register

Register a new skill manifest. Runs the full 6-step validation pipeline. Request body:

GET /v1/skills

List all active (non-revoked) skills ordered by registration time.

GET /v1/skills/:name

Get a single skill by name. Returns the full RegisteredSkill record including the stored manifest and registration metadata. Returns 404 with { "error": "skill_not_found" } if the skill does not exist.

DELETE /v1/skills/:name

Revoke a skill (soft delete). Sets status to "revoked" and records the revoked_at timestamp. The skill is excluded from GET /v1/skills listings but remains in the database for audit purposes.
Returns 404 if the skill does not exist or is already revoked. An audit event skill_revoked is logged with the skill name.

Skill lifecycle

  • Created: A signed manifest JSON exists but has not been submitted to the registry.
  • Active: The manifest passed all 6 validation steps and is stored in the database. Active skills appear in GET /v1/skills and can be executed by the sandbox runner.
  • Revoked: The skill was soft-deleted via DELETE /v1/skills/:name. It no longer appears in active listings but its record persists in the database. A new skill with the same name can be registered after revocation.

Worked example

A complete end-to-end registration flow.
1

Create the skill source

2

Hash the source files

3

Build and sign the manifest

4

Register the skill

Expected output on success:
5

Verify registration

6

Revoke (when needed)

Security considerations

The Skill Registry sits at the boundary between Domain A (untrusted agent skills) and Domain B (trusted core). Four mechanisms provide defense in depth:

Signature Binding

The ECDSA signature ties the manifest to a specific publisher Ethereum address. Tampering with any field (including file hashes) invalidates the signature at Step 2.

Content Addressing

SHA-256 file hashes ensure that the exact code reviewed during registration is the code that runs in the sandbox. Any modification after registration is detectable.

Static Scanning

The 5-rule scanner catches common sandbox escape patterns (eval, process spawning, direct network access). This is a defense-in-depth measure — the sandbox itself also enforces isolation.

Audit Trail

All registration successes, failures, and revocations are logged to the append-only audit trace, correlated by skill name and manifest hash.

Next steps