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.zipInstalls 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.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
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 undercip26/orcip68/). - 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:
- 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.
- 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.
- Public
- 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).
- Yes → use the fast DB-enumerated
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:
- The total and pass rate.
- Whether any divergence appears in CIP-26 vs CIP-68 (different bug classes).
- Whether the divergence is in a known-acceptable category before flagging it as a regression (see "Acceptable divergences" below).
- The first few non-acceptable diffs verbatim.
Step 5 (only if regressions found) — Triage
Common root causes when something fails:
- All divergences are
logofield — 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
findFirstByPolicyIdAndAssetNameAndLabelOrderBySlotDesclabel filter (fixed). If it resurfaces, checkCip68MetadataRepositoryfor a reintroducedlabel = :labelclause. - Many
skipresults withyaci=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:
logo.valueencoding — 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.- 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 usessh ... psqlto enumerate from the DB. Pass the right--db-hostif 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
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.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| assets-ext-regression (this skill) | 0 | 1mo | Review | Intermediate |
| swapper-integration | 6 | 5mo | Caution | Intermediate |
| run-api-e2e-tests | 7 | 6mo | Review | Beginner |
| langfuse-ci-integration | 2 | 27d | Review | Advanced |
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.
run-api-e2e-tests
novuhq
Run e2e tests for the API service. Use when the user wants to run API E2E tests.
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".
api-test-generator
mikopbx
Генерация полных Python pytest тестов для REST API эндпоинтов с валидацией схемы. Использовать при создании тестов для новых эндпоинтов, добавлении покрытия для CRUD операций или валидации соответствия API с OpenAPI схемами.
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
openapi-analyzer
mikopbx
Извлечение и анализ OpenAPI 3.1.0 спецификации из MikoPBX для валидации эндпоинтов. Использовать при проверке соответствия API, генерации тестов, проверке схем эндпоинтов или интеграции с навыками endpoint-validator и api-test-generator.