Summary
The Transactability Index rides the 402 challenge, and selat run already holds that challenge at two points — but never surfaces the score:
- Ranking:
selat run --live-probe runs rank.mjs --pick --live-probe (lib/commands/run.mjs:314), which live-probes the endpoint.
- Pay time:
selat run spawns selat-pay (which fetches the live 402 to build the payment). selat-pay already prints the STI to stderr today — it's just a raw [selat-pay] extensions={…} line.
Make the score a natural part of the selat run flow — the command users actually reach for, and the one holding the 402 right before it signs.
Ask (display only — no gate)
-
Pre-sign confirmation. In the "about to pay X $Y — confirm?" step, show the index inline, e.g.:
About to pay Alchemy $0.001 · health 24h 100% (2 paid), last 200 — confirm?
Parse it from the selat-pay output the run already captures (same pattern lib/skill-registry.mjs:946 uses to read [selat-pay] error:), and render with the shared formatter from https://github.com/SELAT-AI/selat-pay/issues/63.
-
Dry-run preview. selat run --dry-run --live-probe should show the index in the pick output. This needs rank.mjs (@selat-ai/selat-discovery) to carry selatTransactabilityIndex through its --pick output — tracked as a dependency there.
Explicitly out of scope
No gate flag, no threshold, no payment-blocking behavior. The index is shown, never enforced — the decision stays with the user. (Consistent with the docs primer: "it reports what it observed — it does not recommend an action or point you to a different endpoint.")
Ranking-factor / quarantine on the discovery side is a separate, larger discussion and is not part of this issue.
Semantics to preserve
Single most-recent window (24h/7d/all, or {}) · absence = unknown, not bad · paidNum is a confidence weight · successRate is transport-level ("delivered 2xx") · lastPaid = {status, timestamp}.
Depends on
Ref: docs primer https://selat.ai/docs/primers/transactability-index
Summary
The Transactability Index rides the 402 challenge, and
selat runalready holds that challenge at two points — but never surfaces the score:selat run --live-proberunsrank.mjs --pick --live-probe(lib/commands/run.mjs:314), which live-probes the endpoint.selat runspawnsselat-pay(which fetches the live 402 to build the payment).selat-payalready prints the STI to stderr today — it's just a raw[selat-pay] extensions={…}line.Make the score a natural part of the
selat runflow — the command users actually reach for, and the one holding the 402 right before it signs.Ask (display only — no gate)
Pre-sign confirmation. In the "about to pay X $Y — confirm?" step, show the index inline, e.g.:
Parse it from the
selat-payoutput the run already captures (same patternlib/skill-registry.mjs:946uses to read[selat-pay] error:), and render with the shared formatter from https://github.com/SELAT-AI/selat-pay/issues/63.Dry-run preview.
selat run --dry-run --live-probeshould show the index in the pick output. This needsrank.mjs(@selat-ai/selat-discovery) to carryselatTransactabilityIndexthrough its--pickoutput — tracked as a dependency there.Explicitly out of scope
No gate flag, no threshold, no payment-blocking behavior. The index is shown, never enforced — the decision stays with the user. (Consistent with the docs primer: "it reports what it observed — it does not recommend an action or point you to a different endpoint.")
Ranking-factor / quarantine on the discovery side is a separate, larger discussion and is not part of this issue.
Semantics to preserve
Single most-recent window (
24h/7d/all, or{}) · absence = unknown, not bad ·paidNumis a confidence weight ·successRateis transport-level ("delivered 2xx") ·lastPaid={status, timestamp}.Depends on
Ref: docs primer https://selat.ai/docs/primers/transactability-index