{"name":"polaris-control","description":"Owner control plane for the Polaris router: rules, replays, freeze, audit, rollback. Every /a2a call needs the admin bearer token. Message text is one JSON command: {\"skill\": \"<id>\", \"arguments\": {...}}.","version":"0.1.0","supportedInterfaces":[{"url":"http://polaris.jeal.ca/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"capabilities":{"streaming":false,"pushNotifications":false},"defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"skills":[{"id":"rule_list","name":"List rule ids and versions","description":"Arguments {\"role\": \"task\"}. Returns [{\"id\", \"version\"}].","tags":["control"],"examples":["{\"skill\": \"rule_list\", \"arguments\": {}}"]},{"id":"rule_get","name":"Fetch one rule definition","description":"Arguments {\"role\": \"task\", \"id\": \"r1\"}. Returns the rule JSON.","tags":["control"],"examples":["{\"skill\": \"rule_get\", \"arguments\": {}}"]},{"id":"rule_create","name":"Stage a rule create","description":"Arguments {\"role\", \"def\" (full rule JSON), \"source\": \"human\" (default) | \"llm\", \"now_ms\"}. Validated pending row; live file untouched. Frozen roles block llm.","tags":["control"],"examples":["{\"skill\": \"rule_create\", \"arguments\": {}}"]},{"id":"rule_update","name":"Stage a rule update","description":"Arguments Same shape as rule_create; def carries the full updated rule.","tags":["control"],"examples":["{\"skill\": \"rule_update\", \"arguments\": {}}"]},{"id":"rule_delete","name":"Stage a rule delete","description":"Arguments {\"role\", \"id\", \"source\", \"now_ms\"}. Validated pending row.","tags":["control"],"examples":["{\"skill\": \"rule_delete\", \"arguments\": {}}"]},{"id":"freeze","name":"Freeze a pending proposal","description":"Arguments {\"proposal_id\", \"now_ms\"}. Manual human freeze, skips the replay predicate.","tags":["control"],"examples":["{\"skill\": \"freeze\", \"arguments\": {}}"]},{"id":"link_approve","name":"Approve a staged family link","description":"Arguments {\"proposal_id\", \"note\", \"now_ms\"}. Pins the pair's alias row approved; resolves at next startup refresh.","tags":["control"],"examples":["{\"skill\": \"link_approve\", \"arguments\": {}}"]},{"id":"link_reject","name":"Reject a staged family link","description":"Arguments {\"proposal_id\", \"reason\", \"now_ms\"}. Pins a negative alias row so the pair never re-proposes.","tags":["control"],"examples":["{\"skill\": \"link_reject\", \"arguments\": {}}"]},{"id":"dry_run","name":"Replay a proposal without applying","description":"Arguments {\"role\", \"kind\": \"rule_change\" | \"config_change\", \"payload\", \"traces\": [...], \"clock_ms\"}. Returns baseline/candidate/delta.","tags":["control"],"examples":["{\"skill\": \"dry_run\", \"arguments\": {}}"]},{"id":"eval_run","name":"Replay live config over traces","description":"Arguments {\"role\", \"traces\": [{\"request_id\", \"input_tokens\"}], \"clock_ms\"}. Returns the eval report.","tags":["control"],"examples":["{\"skill\": \"eval_run\", \"arguments\": {}}"]},{"id":"explain","name":"Route one synthetic trace","description":"Arguments {\"role\", \"input_tokens\", \"clock_ms\"}. Returns the decision record.","tags":["control"],"examples":["{\"skill\": \"explain\", \"arguments\": {}}"]},{"id":"audit","name":"Fetch a proposal row","description":"Arguments {\"proposal_id\"}. Links without echoing the payload body.","tags":["control"],"examples":["{\"skill\": \"audit\", \"arguments\": {}}"]},{"id":"verify","name":"Re-run a frozen replay and compare digests","description":"Arguments {\"proposal_id\", \"role\", \"traces\", \"clock_ms\"}. Returns matches plus both digests.","tags":["control"],"examples":["{\"skill\": \"verify\", \"arguments\": {}}"]},{"id":"rollback","name":"Restore an applied proposal","description":"Arguments {\"proposal_id\", \"now_ms\"}. Submits the restore through the apply path.","tags":["control"],"examples":["{\"skill\": \"rollback\", \"arguments\": {}}"]}]}