Agentpedia

Certification

Agentpedia publishes a certificate for every skill and agent that passes the lint gate. The certificate names a tier, one source commit, and a date. It is a public record of those checks. It is not a security audit.

Tiers

A higher tier includes the checks below it. A badge shows the tier that is current today. When the files change, or a date passes, the badge says re-check pending or expired instead of the claimed tier.

Listed

A skill is Listed when skill-lint scores 100. The score starts at 100. An error subtracts 25, a warning subtracts 8, and an info finding subtracts 2, so 100 means zero of each. That is the same gate the directory already uses. The rule list is How we lint.

An agent is Listed when its manifest is accepted and every bundled skill scores 100. Agents are not passed through skill-lint. AGENT.md is not a SKILL.md.

Listed does not install the entry and does not run it. It does not review the advice in the article. It expires 365 days after the issue date, and earlier if the entry's file digest changes.

Verified

Verified is Listed plus a recorded run of tools/verify_checks.py. The harness copies the entry to a temporary directory and checks that SKILL.md or AGENT.md is non-empty. It then runs each declared eval as a subprocess: no shell, a timeout, and an environment limited to PATH, locale, and Python isolation flags. Home and temp point at a fresh directory. Secrets from the parent process are dropped.

The result file lives in certs/results/. The build refuses a Verified or Certified claim that has no passing result, or whose result digest and commit do not match the certificate record. This volume does not invent those results.

Verified does not scan the entry for malware. The sandbox is a scrubbed subprocess, not a virtual machine. A passing eval shows that the declared command printed what the manifest required. It does not show that every other command the skill describes is correct. A run stays current for 90 days. Editing the entry, the harness, or the check manifest sets the certificate to re-check pending.

Certified

Certified is a current Verified run plus a human review stored in the certificate record: a GitHub login, a date, and notes. There is no Certified entry in this repository until a person writes that review. The publisher does not fill one in.

A review is a reading of the entry and the recorded run. It is not a security audit unless the notes say that, and these notes do not. Certified expires on the earlier of the 90-day run window and 365 days after the review date.

Status

Active means the claim still matches the files and the dates. Re-check pending means the entry digest, the harness, or the declared checks changed after the record was written. Expired means a revalidation date has passed. Withheld means the lint score is no longer 100. Re-check pending takes priority over expiry: a changed tree is pending even when the old date would also have expired.

The certificate names one git commit and one sha256 digest of the entry directory. A different digest sets the status to re-check pending.

Listed stays current for 365 days after issuedAt. A verification run stays current for 90 days after ranAt. A human review stays current for 365 days after its date. Certified requires both the run and the review to be current.

Signing

Each certificate JSON carries a canonical payload: object keys sorted, no insignificant whitespace, UTF-8. When AGENTPEDIA_SIGNING_KEY is set at build time, tools/cert_sign.mjs signs those bytes with Ed25519 and writes the signature beside the payload. The private key is a PKCS#8 PEM. It is not in this repository. *.pem is gitignored.

This build left every record unsigned. The signature field is null, and signed is false. That is the honest state until a key is configured. The public key, when one is pinned, is published at https://agentpedia.sh/.well-known/agentpedia-signing-key.json.

To verify one record:

node tools/verify_cert.mjs https://agentpedia.sh/cert/skill-csv-profile.json

Exit 0 means the signature matches. Exit 2 means the record is unsigned. Exit 1 means the signature is missing or does not match.

To start signing production builds:

  1. Run node tools/gen_signing_key.mjs. That writes a PEM with mode 600 and certs/public-key.json. Commit only the public JSON.
  2. Set AGENTPEDIA_SIGNING_KEY to the PEM contents on Vercel, for Production and Preview, and as a GitHub Actions secret if a workflow should sign.
  3. Redeploy. The build fails if the secret's public key does not match the pinned file.
  4. Confirm with the verify command above. Until that secret exists, badges and pages still publish, and they say the record is unsigned.

This build

94 certificates. 89 listed, 2 verified, 0 certified. 3 re-check pending. Founders add an entry through the submission path.