* fix(skills): move version into metadata and normalize to semver 29 skills declared `version` at the top level of their frontmatter. The schema reads it from `metadata`, so tooling that follows the schema either misses it or has to special-case the top level. Three motion skills also declared `version: 1.0`, which is not a valid semantic version; normalized to `1.0.0`. No behavioral change — frontmatter metadata only. * fix(skills): state activation triggers in skill descriptions 148 skills described what they cover but never named the situation that should trigger them. Since the description is what Claude matches against to decide whether to load a skill, a description without a trigger makes activation guesswork — the skill is either missed or loaded at the wrong time. Added a "Use when ..." clause to each, derived from the skill's own body (most already stated the trigger under "## When to Use" or in the opening line; that intent is now reflected in the frontmatter where it is actually read from). Descriptions were only appended to; no existing wording was removed. * fix(skills): sync activation triggers into the Codex skill mirror 10 of the skills whose descriptions changed are also mirrored under `.agents/skills/`, where the description was previously a verbatim copy. Left alone, the two surfaces would disagree about when the skill applies. Only the description line is synced; the Codex copies keep their reduced frontmatter, since that validator accepts only name, description, metadata, license, and allowed-tools. * fix(skills): correct three activation clauses from review - autonomous-loops: the clause pulled new loop work into a skill that its own body marks as a compatibility shim retained for one release. It now points at the canonical continuous-agent-loop instead. - continuous-learning: the description carried the v1 routing directive twice; collapsed to one. - homelab-pihole-dns: the clause fired on any broken home DNS. Narrowed to tasks that actually involve Pi-hole. * chore: retain current main lockfile --------- Co-authored-by: Çağrı Solakoğlu <cagri.solakoglu@vtcenerji.com> Co-authored-by: haelyra <49814733+haelyra@users.noreply.github.com>
12 KiB
name, description, metadata
| name | description | metadata | ||
|---|---|---|---|---|
| ito-basket-compare | Compare Itô prediction-market baskets against a user's knowledge base, portfolio notes, financial context, watchlist, or research thesis. Use for read-only basket comparison and gap analysis without investment advice or live trading. Use when comparing an Itô prediction-market basket against a knowledge base, portfolio notes, or research thesis. |
|
Itô Basket Compare
Use this skill for requests such as “compare this basket with my research,” “basket vs watchlist,” “run a gap analysis,” or “find conflicts and stale assumptions.” It compares a basket, theme, or market set with user-provided or explicitly selected context. It is read-only and never recommends or executes a trade.
Non-negotiable boundaries
- Do not advise the user to buy, sell, hold, hedge, lever, allocate, or size.
- Do not prepare or submit an order, trade, purchase, reservation, or RFQ.
- Do not run
ecc ito find: despite its name, it submits an authenticated RFQ. - Do not claim that
ecc ito statusreturns basket data; it reads RFQ and procurement status. Do not useecc ito evalsfor basket comparison. - Do not use private documents, financial context, memory, or account data unless the user explicitly identifies the source for this comparison.
- Never print, echo, log, persist, or expose an API key, device token, session token, or secret. Never put credentials in arguments, files, or chat.
- If an operation could change external state, stop with
UNSUPPORTED_OPERATION. A later confirmation cannot turn this read-only skill into an execution skill.
Inputs and access
Accept either a pasted basket or an explicitly authorized read-only source. The
minimum basket input is a stable basket_id or basket label plus one or more
underliers. Each underlier should contain underlier_id, label, event or claim,
and any weight/probability supplied by the source. The comparison target must be
user-provided or explicitly selected; request missing material instead of
searching private stores broadly.
Record provenance for every input:
source_type:user_provided,public, orito_authenticatedsource_uri: a non-secret URL/identifier, ornullfor pasted materialretrieved_at: UTC RFC 3339 time at retrievalas_of: source observation/publication time, ornullwhen unknownfreshness_status:fresh,stale, orunknown
Never label anonymous product data ito_authenticated; use public. ECC's real
CLI/MCP surface does not expose a
basket-read command: the CLI supports login, validation-only auth, find,
status, and evals; MCP exposes ito_auth, ito_find, and ito_status.
Therefore authentication success proves identity only, not basket-data
availability. Prefer the documented public product-data routes when they satisfy
the comparison; otherwise ask the user to paste/export the basket or use a
documented keyed read with the minimum scope.
The canonical product-data surfaces are:
- Anonymous, rate-limited GET routes at
https://itomarkets.com, including/api/baskets/bootstrap,/api/baskets/{basket_id}/bootstrap, and/api/markets/hot. These are valid live product reads without a private key. - The keyed developer API at
https://itomarkets.com/api/v1. Send a configured public API key only asAuthorization: Bearer <key>to that exact HTTPS origin. Basket reads useGET /baskets,GET /baskets/{basket_id}, and their documented GET-only child routes and requirebaskets:read. Market lookup usesGET /markets/search,GET /markets/{market_id}, and documented GET-only market-data child routes and requiresmarkets:read. Never use a write scope, dashboard automation key, cookie, or compute device credential as a substitute. - The official Python SDK package
ito-markets, imported asito, for typed basket and market reads. Before using it, record the installed version and verify the requested method, response type, origin, and required scope. Do not install or upgrade it without confirmation.
Use an anonymous route when it supplies the basket, underliers, and current
quote fields needed by the comparison. Use the SDK or keyed API only for a
documented field absent from public data. Validate the response contract before
comparison and record the endpoint, response Date, source observation
timestamp, access mode, SDK version when applicable, and cache headers.
The verified anonymous catalog source is the GET-only endpoint
https://itomarkets.com/api/baskets/bootstrap?stream=1. Basket detail uses
https://itomarkets.com/api/baskets/{basket_id}/bootstrap?stream=1. Require
HTTP 200, contractVersion: ito.public_basket_read.v1, and a parseable
generated_at. Require a baskets array for catalog responses; require
basket, underlyers, charts, metrics, and commentary objects for detail
responses. Record the URL, response Date, generated_at, Cache-Control,
Age, Last-Modified, and any x-ito-edge-cache value. Treat an edge stale
marker as stale provenance even when generated_at is recent. Do not send
credentials to this public endpoint, follow cross-origin redirects, or silently
accept a changed contract version.
First-run authentication handoff
Resolve a concrete basket-read source and its authentication contract before requesting authentication. The public catalog/detail endpoints require no login and are sufficient for comparisons whose required fields they contain. If no authenticated basket-read source/tool is configured, use public or pasted input and do not request compute credentials.
ecc ito auth --json is an optional, validation-only compute identity probe. It
does not start login and cannot unlock basket reads. Use it only when the user
explicitly requests compute-account identity validation in addition to the
basket comparison; never present it as basket-source authentication.
For a concrete authenticated basket source whose documented contract explicitly
uses the canonical Itô device credential (the public /api/v1 does not):
- Run
ecc ito auth --jsononly if that source contract requires the same identity. This is validation-only and never starts login. - On missing, expired, or confirmed revoked credentials, pause and return
AUTH_REQUIREDorAUTH_REVOKED. Tell the user to runecc ito login; it performs device authorization, opens the verification page by default, and stores the device token in macOS Keychain.ecc ito login --no-browsersuppresses the browser handoff. ECC itself performs no browser automation. - Preserve a secret-free resume summary containing the originating task/agent, user request, selected input identifiers, and completed read-only steps.
- After the user reports completion, return to the originating agent and run
ecc ito auth --jsononce more. Resume only the original read-only request; never broaden scope because login succeeded.
ITO_API_KEY may be forwarded by compute auth only when already configured. Do not
read or display its value. The canonical Itô client is a separately installed,
currently unpublished dependency configured by an explicit absolute
ECC_ITO_CLI_EXECUTABLE; ECC does not discover it through PATH. If absent,
return AUTH_REQUIRED with installation guidance from ito-compute, without
inventing a successful auth result.
Deterministic normalization and comparison
For the same normalized input and the same explicit comparison time, produce the same output.
- Copy inputs; never mutate source objects. Normalize text with Unicode NFKC, trim it, collapse internal whitespace, and use case-folded text only for matching. Preserve display text.
- Convert timestamps to UTC RFC 3339. Treat missing/unparseable
as_ofasnullwithfreshness_status: unknown; never substitute the current time. Reject non-finite numbers and probabilities outside[0,1]. Do not infer missing weights. - Deduplicate only exact normalized
underlier_idvalues. If duplicate records disagree, retain the first record after provenance ordering and add a conflict; do not silently merge facts. Sort underliers by normalizedunderlier_id, then label. Sort sources bysource_type,source_uri,as_of, andretrieved_at, withnulllast. - Use the user's freshness threshold when supplied. Otherwise use 24 hours for
market/basket observations and 30 days for notes/research. Compare
as_ofwith the explicit comparison time: older isstale, within threshold isfresh, and absent/unparseable isunknown. State the freshness threshold. - Match by exact stable ID first, then exact normalized claim/event text. Do
not use fuzzy similarity as proof. Classify an item as:
match: same claim/direction and compatible horizon;conflict: opposing claim, incompatible horizon, or duplicate ID with inconsistent facts;missing: no target evidence for that underlier;stale: otherwise relevant target evidence outside its threshold.
- Keep mixed-source disagreement visible. Sort every result array by
underlier_id, then evidencesource_uri. Use explicitnullfor unknown scalar fields and empty arrays for no findings.
Recovery and safe failure
- Missing/invalid fields:
INVALID_INPUT; identify fields without echoing sensitive content. - Missing/expired credentials required by a concrete basket source:
AUTH_REQUIRED; provide that source's documented handoff. UseAUTH_REVOKEDonly when the source confirms revocation. A generic 401 is not proof of revocation. A 403/insufficient read scope isAUTH_FORBIDDEN; do not retry or broaden scope. - Timeout/network/5xx/malformed response:
SOURCE_TIMEOUT; make at most one read-only retry when the user-specified deadline permits. Never replace a failed live read with mock or stale data while calling it live. - 429: honor a valid
Retry-Afterwithin the user deadline; otherwise stop asSOURCE_TIMEOUT. Do not loop indefinitely. - Required stale data: return
STALE_SOURCEas blocked unless the user explicitly accepts the displayed timestamps for informational comparison. Even then, preservefreshness_status: stale. - Unsupported CLI/tool or any state-changing request:
UNSUPPORTED_OPERATION.
Partial results use status: blocked, retain only source-backed partial arrays,
and include incomplete: true plus the applicable error. They must never be
presented as a successful complete comparison.
Output contract
Default to concise Markdown in this order: basket summary, comparison target, provenance/freshness, matches, conflicts or stale assumptions, missing context, and a user-action checklist containing research questions only. When structured output is requested, emit JSON with stable key order and no extra keys:
{
"schema_version": "1.0",
"status": "ok",
"comparison_time": "2026-01-01T00:00:00Z",
"basket": {"basket_id": "example", "label": "Example", "underliers": []},
"target": {"label": "Research notes", "source_type": "user_provided"},
"sources": [],
"freshness_thresholds": {"market_hours": 24, "research_days": 30},
"matches": [],
"conflicts": [],
"stale_assumptions": [],
"missing_context": [],
"checklist": [],
"disclaimer": "This comparison is informational and not investment or trading advice."
}
Blocked output uses the same leading key order and contains no fabricated data:
{
"schema_version": "1.0",
"status": "blocked",
"incomplete": true,
"error": {"code": "AUTH_REQUIRED", "message": "Read-only Itô authentication is required.", "retryable": true},
"resume": {"originating_agent": "current", "completed_steps": []},
"disclaimer": "This comparison is informational and not investment or trading advice."
}
Allowed error codes are AUTH_REQUIRED, AUTH_REVOKED, AUTH_FORBIDDEN,
SOURCE_TIMEOUT, STALE_SOURCE, INVALID_INPUT, and
UNSUPPORTED_OPERATION.
Always end human-readable output with exactly:
This comparison is informational and not investment or trading advice.