AS

assets-ext-regression

Performs byte-for-byte regression tests for CIP-26 and CIP-68 wire-shapes against Cardano mainnet APIs.

Install

mkdir -p .claude/skills/assets-ext-regression && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/12044" && unzip -o skill.zip -d .claude/skills/assets-ext-regression && rm skill.zip

Installs to .claude/skills/assets-ext-regression

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Run CIP-26 and CIP-68 wire-shape regression tests for the assets-ext extension against the cf-token-metadata-registry V2 API on mainnet. Use when a user wants to verify yaci-store's API output is byte-equivalent to CF, after a code change to assets-ext, or when investigating reported metadata divergences.
306 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Intermediate

Key capabilities

  • Compare yaci-store's CIP-26 API responses against CF-token-metadata-registry V2 API
  • Compare yaci-store's CIP-68 FT API responses against CF-token-metadata-registry V2 API
  • Confirm yaci-store is reachable via its API endpoint
  • Confirm the CF source is reachable via its V2 API endpoint
  • Run full sweeps using Python scripts for regression testing

How it works

The skill verifies reachability of yaci-store and the CF source, then executes Python scripts to compare their CIP-26 and CIP-68 API responses byte-for-byte.

Inputs & outputs

You give it
Yaci-store URL, CF source URL, and optional SSH/Postgres access details
You get back
Regression test results indicating agreement or divergence between yaci-store and CF API responses

When to use assets-ext-regression

  • Verify metadata API output
  • Regression test assets-ext changes
  • Debug token metadata divergences

About this skill

assets-ext regression skill

End-to-end regression for extensions/assets-ext. Compares yaci-store's CIP-26 and CIP-68 FT API responses against the cf-token-metadata-registry V2 API on Cardano mainnet, byte-for-byte.

CF V1 endpoints are intentionally not exercised — yaci-store does not persist off-chain signatures, so a faithful V1 comparison is impossible.

When to invoke

  • After a code change in extensions/assets-ext/ that could touch the read path (AssetsReader, Cip26StorageReader, Cip68StorageReader, TokenQueryService, any repository or DTO under cip26/ or cip68/).
  • When a user reports a metadata divergence ("token X looks wrong on yaci vs tokens.cardano.org").
  • As a pre-release smoke check before tagging an assets-ext build.

Inputs you need from the user

Ask only if not already obvious from the conversation context:

  1. Where yaci-store is running — local port 8081 by default. If it's remote, ask for either an SSH host (so you can suggest a tunnel) or a direct URL.
  2. Which CF source to compare against:
    • Public https://tokens.cardano.org — works for anyone with internet, but rate-limited (~1 request per 1.5 s; HTTP 429 above that).
    • Internal CF mirror — fast, no rate limit; needs an SSH tunnel. Ask if they have access.
  3. Do they have SSH+Postgres access to the yaci-store host? Determines which scripts you can run:
    • Yes → use the fast DB-enumerated sweep_cip26_full.py + sweep_cip68_ft_full.py (a few minutes total).
    • No → use verify_against_cf_registry.py (slower, no DB needed).

Default assumptions if the user just says "run the regression" with no extra context: yaci at http://127.0.0.1:8081, internal mirror at http://127.0.0.1:8082, DB host mczeladka (matches the developer's existing setup).

Step-by-step

All commands run from the repository root.

Step 1 — Confirm yaci is reachable

curl -s --max-time 5 http://127.0.0.1:8081/actuator/health | head -c 300

Expect "status":"UP" with assetStoreOffchainSync present. If the response is empty or 404, ask the user how to reach their yaci-store and adjust --yaci-url on subsequent commands.

Step 2 — Confirm the CF source is reachable

The cLBC FT subject is a stable mainnet token used throughout these scripts: 376efee6953a6af08c41903b781a316553ad279387b8ff1bf5d7c94d0014df10634c4243.

curl -s -w " HTTP %{http_code}\n" -o /dev/null \
  "${CF_URL}/api/v2/subjects/376efee6953a6af08c41903b781a316553ad279387b8ff1bf5d7c94d0014df10634c4243"

HTTP 200 means the V2 endpoint is up. 204 means the CF source doesn't have that subject (wrong host or non-mainnet). 429 means you're being rate-limited.

Step 3 — Run the sweeps

Preferred (DB access + CF mirror — fastest):

cd extensions/assets-ext/scripts

python3 sweep_cip26_full.py \
    --yaci-url http://127.0.0.1:8081 \
    --cf-url   http://127.0.0.1:8082 \
    --workers  16

python3 sweep_cip68_ft_full.py \
    --yaci-url http://127.0.0.1:8081 \
    --cf-url   http://127.0.0.1:8082 \
    --workers  16

Each script prints a one-line summary at the end and exits 0 if all subjects agree, 1 if any diverged. Mainnet baseline: 7,932 CIP-26 + 7,647 CIP-68 FT, all agreeing.

Fallback (no DB access):

cd extensions/assets-ext/scripts
python3 verify_against_cf_registry.py --network mainnet \
    --yaci-url http://127.0.0.1:8081

Enumerates from the CF GitHub registry (clones it once, fast-forwards on subsequent runs). Use this when the QA engineer cannot reach the yaci-store DB.

Public-CF variant (slow but no internal access needed) — swap --cf-url to https://tokens.cardano.org and add --cf-throttle-ms 1500 --workers 1. A mainnet full sweep that way takes hours.

Step 4 — Interpret the result

A passing run looks like:

[setup] yaci=http://127.0.0.1:8081  cf=http://127.0.0.1:8082  workers=16
[setup] subjects=7932

total=7932  agree=7932  diverged=0  skip=0  elapsed=137.4s

If there are divergences, the script prints up to 20 of them with per-field diffs (field: yaci=… cf=…). Tell the user:

  1. The total and pass rate.
  2. Whether any divergence appears in CIP-26 vs CIP-68 (different bug classes).
  3. Whether the divergence is in a known-acceptable category before flagging it as a regression (see "Acceptable divergences" below).
  4. The first few non-acceptable diffs verbatim.

Step 5 (only if regressions found) — Triage

Common root causes when something fails:

  • All divergences are logo field — almost certainly the spec-vs-CF encoding difference. Not a regression; document and move on.
  • All divergences point to a single field across many subjects — likely a serializer or wire-shape bug. Look at Cip26TokenMetadata.from / the V2 DTO builders.
  • Divergences are CIP-68 only, with stale metadata — historically caused by the findFirstByPolicyIdAndAssetNameAndLabelOrderBySlotDesc label filter (fixed). If it resurfaces, check Cip68MetadataRepository for a reintroduced label = :label clause.
  • Many skip results with yaci=200,cf=204 — CF mirror doesn't have the subject. Often means the mirror is on a different network (preprod vs mainnet) or behind on indexing.

Acceptable divergences

Both scripts surface these by design — they are not regressions:

  1. logo.value encoding — CIP-26 spec says base64; CF V2 returns hex. yaci-store passes the spec base64 through unchanged. If a divergence list contains only logo fields, this is expected.
  2. Multiple registry files claiming the same subject — affects 3 testnet subjects (BCoin, wUSDT, one other); 0 on mainnet. yaci picks deterministically by filename matching the subject; CF picks via File.listFiles() order.

Notes for the agent

  • Always report scripts' exit codes back to the user — they're the authoritative pass/fail signal.
  • Do not throttle internal-mirror requests; the mirror is local, throttling just wastes time.
  • The two sweep_* scripts use ssh ... psql to enumerate from the DB. Pass the right --db-host if it's not the default (mczeladka).
  • If the user wants to investigate one specific subject, fall back to a direct side-by-side curl:
    curl -s "${YACI_URL}/api/v1/tokens/subject/${SUBJ}?show_cips_details=true" | python3 -m json.tool
    curl -s "${CF_URL}/api/v2/subjects/${SUBJ}?show_cips_details=true"      | python3 -m json.tool
    
  • Scripts and README live at extensions/assets-ext/scripts/. The README is the authoritative reference for flag details and is intentionally consistent with this skill — keep them in sync if either changes.

When not to use it

  • When comparing against CF V1 endpoints
  • When the user wants to investigate a single specific subject without running a full sweep

Prerequisites

Python 3Network access to yaci-storeNetwork access to cf-token-metadata-registry V2 API

Limitations

  • Does not compare against CF V1 endpoints
  • Requires Python 3 and network access
  • Full sweeps against public CF can be very slow due to rate limits

How it compares

This skill automates byte-for-byte regression testing of specific API outputs against a known external source, providing a precise comparison that differs from manual inspection or general API testing.

Compared to similar skills

assets-ext-regression side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
assets-ext-regression (this skill)01moReviewIntermediate
swapper-integration65moCautionIntermediate
run-api-e2e-tests76moReviewBeginner
langfuse-ci-integration227dReviewAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

swapper-integration

shapeshift

Integrate new DEX aggregators, swappers, or bridge protocols (like Bebop, Portals, Jupiter, 0x, 1inch, etc.) into ShapeShift Web. Activates when user wants to add, integrate, or implement support for a new swapper. Guides through research, implementation, and testing following established patterns.

696

run-api-e2e-tests

novuhq

Run e2e tests for the API service. Use when the user wants to run API E2E tests.

711

langfuse-ci-integration

jeremylongshore

Configure Langfuse CI/CD integration with GitHub Actions and automated testing. Use when setting up automated testing, configuring CI pipelines, or integrating Langfuse tests into your build process. Trigger with phrases like "langfuse CI", "langfuse GitHub Actions", "langfuse automated tests", "CI langfuse", "langfuse pipeline".

212

api-test-generator

mikopbx

Генерация полных Python pytest тестов для REST API эндпоинтов с валидацией схемы. Использовать при создании тестов для новых эндпоинтов, добавлении покрытия для CRUD операций или валидации соответствия API с OpenAPI схемами.

16

http-generate

spring-ai-alibaba

Generates HTTP request examples for Spring Boot Web interfaces according to task specification and saves them as .http files in module-generate.md directories

16

openapi-analyzer

mikopbx

Извлечение и анализ OpenAPI 3.1.0 спецификации из MikoPBX для валидации эндпоинтов. Использовать при проверке соответствия API, генерации тестов, проверке схем эндпоинтов или интеграции с навыками endpoint-validator и api-test-generator.

25

Search skills

Search the agent skills registry