{"id":"semver-sort","card_id":"card_semver_sort_v0_1_0","name":"semver-sort","description":"Sorts supplied version tags ('v1.9.0' or '1.9.0') in numeric part-by-part order instead of lexical order. TypeScript port of a sha-pinned Yeongsu (영수) reference delivery; malformed tags return a teaching 400, never a crash.","stage":1,"safety_level":"data_only_read_only","auth":{"type":"hmac-sha256","required_headers":["x-apex-tool-timestamp","x-apex-tool-nonce","x-apex-tool-content-sha256","x-apex-tool-signature"],"canonical_payload":"APEX-TOOL-V1\\n{tool_id}\\n{timestamp}\\n{nonce}\\n{sha256(canonical_json(body))}"},"permissionless":{"enabled":true,"tier":"bounded_public","rate_limit":"Shared 20 calls per IP per hour across permissionless bounded tools plus global agent-write protection","review_required":false,"note":"Anonymous bounded execution is allowed because this is a deterministic DATA ONLY sort over caller-supplied version tag strings. It never releases source, keys, orders, wallets, private balances, or raw datasets."},"input_schema":{"type":"object","required":["tags"],"properties":{"tags":{"type":"array","items":{"type":"string","maxLength":200},"minItems":0,"maxItems":500,"description":"Version tags like 'v1.9.0' or '1.9.0'. One leading lowercase 'v' is tolerated; every dot-separated part must parse as an integer. Malformed tags return a teaching 400 (tool_input_invalid), never a crash."}}},"output_schema":{"type":"object","properties":{"schema":{"type":"string"},"count":{"type":"number"},"sorted":{"type":"array","items":{"type":"string"}},"conventions":{"type":"object"}}},"sample_input":{"tags":["v1.9.0","v1.70.0","v1.10.0"]},"test_vectors":[{"input":{"tags":["v1.9.0","v1.70.0","v1.10.0"]},"expected":{"result":{"sorted":["v1.9.0","v1.10.0","v1.70.0"]}},"match":"subset","verified_at":"2026-07-19T00:00:00.000Z"},{"input":{"tags":["v2.0.0","1.9.9","v1.10"]},"expected":{"result":{"sorted":["1.9.9","v1.10","v2.0.0"]}},"match":"subset","verified_at":"2026-07-19T00:00:00.000Z"},{"input":{"tags":["1.0","1.0.0","0.9"]},"expected":{"result":{"sorted":["0.9","1.0","1.0.0"]}},"match":"subset","verified_at":"2026-07-19T00:00:00.000Z"},{"input":{"tags":["3","v2","10"]},"expected":{"result":{"sorted":["v2","3","10"]}},"match":"subset","verified_at":"2026-07-19T00:00:00.000Z"},{"input":{"tags":["v1.0.0","v1.0.0","1.0.0"]},"expected":{"result":{"sorted":["v1.0.0","v1.0.0","1.0.0"]}},"match":"subset","verified_at":"2026-07-19T00:00:00.000Z"}]}