[{"data":1,"prerenderedAt":67},["ShallowReactive",2],{"doc-oracles":3},{"blocks":4,"markdown":66},[5,8,12,14,37,39,58,60,64],{"kind":6,"html":7},"html","\u003Cp>An oracle takes a request in plain language and returns an artifact that has passed\nits checks. It is the unit you buy, the unit you call and the unit you are\nbilled for. Today \u003Ccode>chart\u003C\u002Fcode>, \u003Ccode>vector-graphics\u003C\u002Fcode> and \u003Ccode>coverage-policy\u003C\u002Fcode> each cost \u003Cstrong>1 credit\u003C\u002Fstrong> per\nanswer, \u003Ccode class=\"chip chip--valid\">valid\u003C\u002Fcode> or \u003Ccode class=\"chip chip--invalid\">invalid\u003C\u002Fcode>; an \u003Ccode class=\"chip chip--error\">error\u003C\u002Fcode> is free.\u003C\u002Fp>\n\u003Ch2 id=\"available-to-you\">Available to you\u003C\u002Fh2>\n\u003Cp>The console lists the oracles your organisation can call, read from the\ndeployment rather than written here — so it cannot describe an oracle that is\nnot actually served.\u003C\u002Fp>\n",{"kind":9,"path":10,"label":11},"console","\u002Foracles","Browse the oracles",{"kind":6,"html":13},"\u003Cp>Real answers from \u003Ccode>chart\u003C\u002Fcode>, as they were returned:\u003C\u002Fp>\n",{"kind":15,"ids":16,"captures":19},"verdict",[17,18],"candlestick","heatmap",[20,31],{"oracle":21,"format":22,"status":23,"verified_by":24,"captured":25,"intent":26,"id":17,"title":27,"source":28,"image":29,"imageDark":30},"chart","vega-lite","valid","chart@6baf09f0","2026-09-28","A candlestick chart of a stock over 20 trading days: a thin rule from low to high and a bar from open to close for each day, green when close is above open and red when below. The price axis must not start at zero; scale it to the price range (about 95 to 125) so the candles are tall and readable.","20-Day Stock Candlestick Chart","{\n  \"$schema\": \"https:\u002F\u002Fvega.github.io\u002Fschema\u002Fvega-lite\u002Fv6.json\",\n  \"name\": \"stock_candlestick\",\n  \"data\": {\n    \"values\": [\n      {\n        \"day\": \"2026-01-05\",\n        \"low\": 98,\n        \"open\": 100,\n        \"close\": 104,\n        \"high\": 107,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-06\",\n        \"low\": 101,\n        \"open\": 104,\n        \"close\": 102,\n        \"high\": 106,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-07\",\n        \"low\": 99,\n        \"open\": 102,\n        \"close\": 106,\n        \"high\": 109,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-08\",\n        \"low\": 104,\n        \"open\": 106,\n        \"close\": 110,\n        \"high\": 112,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-09\",\n        \"low\": 107,\n        \"open\": 110,\n        \"close\": 108,\n        \"high\": 113,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-12\",\n        \"low\": 105,\n        \"open\": 108,\n        \"close\": 113,\n        \"high\": 116,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-13\",\n        \"low\": 110,\n        \"open\": 113,\n        \"close\": 111,\n        \"high\": 115,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-14\",\n        \"low\": 108,\n        \"open\": 111,\n        \"close\": 116,\n        \"high\": 119,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-15\",\n        \"low\": 113,\n        \"open\": 116,\n        \"close\": 118,\n        \"high\": 121,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-16\",\n        \"low\": 115,\n        \"open\": 118,\n        \"close\": 114,\n        \"high\": 120,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-19\",\n        \"low\": 111,\n        \"open\": 114,\n        \"close\": 117,\n        \"high\": 119,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-20\",\n        \"low\": 114,\n        \"open\": 117,\n        \"close\": 121,\n        \"high\": 124,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-21\",\n        \"low\": 118,\n        \"open\": 121,\n        \"close\": 119,\n        \"high\": 123,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-22\",\n        \"low\": 116,\n        \"open\": 119,\n        \"close\": 115,\n        \"high\": 122,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-23\",\n        \"low\": 112,\n        \"open\": 115,\n        \"close\": 118,\n        \"high\": 120,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-26\",\n        \"low\": 115,\n        \"open\": 118,\n        \"close\": 122,\n        \"high\": 125,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-27\",\n        \"low\": 119,\n        \"open\": 122,\n        \"close\": 120,\n        \"high\": 124,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-28\",\n        \"low\": 117,\n        \"open\": 120,\n        \"close\": 116,\n        \"high\": 121,\n        \"direction\": \"down\"\n      },\n      {\n        \"day\": \"2026-01-29\",\n        \"low\": 113,\n        \"open\": 116,\n        \"close\": 119,\n        \"high\": 121,\n        \"direction\": \"up\"\n      },\n      {\n        \"day\": \"2026-01-30\",\n        \"low\": 116,\n        \"open\": 119,\n        \"close\": 123,\n        \"high\": 125,\n        \"direction\": \"up\"\n      }\n    ]\n  },\n  \"title\": \"20-Day Stock Candlestick Chart\",\n  \"layer\": [\n    {\n      \"mark\": {\n        \"type\": \"rule\",\n        \"size\": 1\n      },\n      \"encoding\": {\n        \"x\": {\n          \"field\": \"day\",\n          \"type\": \"ordinal\"\n        },\n        \"y\": {\n          \"field\": \"low\",\n          \"type\": \"quantitative\",\n          \"scale\": {\n            \"zero\": false,\n            \"domain\": [\n              95,\n              125\n            ]\n          },\n          \"axis\": {\n            \"title\": \"Price\"\n          }\n        },\n        \"y2\": {\n          \"field\": \"high\",\n          \"type\": \"quantitative\"\n        }\n      }\n    },\n    {\n      \"mark\": \"bar\",\n      \"encoding\": {\n        \"x\": {\n          \"field\": \"day\",\n          \"type\": \"ordinal\"\n        },\n        \"y\": {\n          \"field\": \"open\",\n          \"type\": \"quantitative\",\n          \"scale\": {\n            \"zero\": false,\n            \"domain\": [\n              95,\n              125\n            ]\n          },\n          \"axis\": {\n            \"title\": \"Price\"\n          }\n        },\n        \"y2\": {\n          \"field\": \"close\",\n          \"type\": \"quantitative\"\n        },\n        \"color\": {\n          \"field\": \"direction\",\n          \"type\": \"nominal\",\n          \"scale\": {\n            \"domain\": [\n              \"up\",\n              \"down\"\n            ],\n            \"range\": [\n              \"green\",\n              \"red\"\n            ]\n          }\n        }\n      }\n    }\n  ]\n}","\u002Fimages\u002Fcaptures\u002Fcandlestick.svg","\u002Fimages\u002Fcaptures\u002Fcandlestick.dark.svg",{"oracle":21,"format":22,"status":23,"verified_by":24,"captured":25,"intent":32,"id":18,"title":33,"source":34,"image":35,"imageDark":36},"A heatmap of server request latency: day of week on y in calendar order Mon, Tue, Wed, Thu, Fri, Sat, Sun (not alphabetical), hour of day (0–23) on x, each cell coloured by median latency in ms. Use realistic values with a weekday business-hours peak.","Server Request Latency by Day and Hour","{\n  \"$schema\": \"https:\u002F\u002Fvega.github.io\u002Fschema\u002Fvega-lite\u002Fv6.json\",\n  \"name\": \"server_latency\",\n  \"data\": {\n    \"values\": [\n      {\n        \"day\": \"Mon\",\n        \"hour\": 0,\n        \"latency\": 24\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 1,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 2,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 3,\n        \"latency\": 20\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 4,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 5,\n        \"latency\": 23\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 6,\n        \"latency\": 28\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 7,\n        \"latency\": 42\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 8,\n        \"latency\": 78\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 9,\n        \"latency\": 112\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 10,\n        \"latency\": 126\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 11,\n        \"latency\": 132\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 12,\n        \"latency\": 121\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 13,\n        \"latency\": 138\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 14,\n        \"latency\": 145\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 15,\n        \"latency\": 136\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 16,\n        \"latency\": 124\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 17,\n        \"latency\": 94\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 18,\n        \"latency\": 61\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 19,\n        \"latency\": 43\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 20,\n        \"latency\": 34\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 21,\n        \"latency\": 30\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 22,\n        \"latency\": 27\n      },\n      {\n        \"day\": \"Mon\",\n        \"hour\": 23,\n        \"latency\": 25\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 0,\n        \"latency\": 23\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 1,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 2,\n        \"latency\": 20\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 3,\n        \"latency\": 19\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 4,\n        \"latency\": 20\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 5,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 6,\n        \"latency\": 29\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 7,\n        \"latency\": 45\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 8,\n        \"latency\": 83\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 9,\n        \"latency\": 118\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 10,\n        \"latency\": 134\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 11,\n        \"latency\": 142\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 12,\n        \"latency\": 130\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 13,\n        \"latency\": 147\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 14,\n        \"latency\": 151\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 15,\n        \"latency\": 143\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 16,\n        \"latency\": 131\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 17,\n        \"latency\": 99\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 18,\n        \"latency\": 64\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 19,\n        \"latency\": 44\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 20,\n        \"latency\": 35\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 21,\n        \"latency\": 29\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 22,\n        \"latency\": 26\n      },\n      {\n        \"day\": \"Tue\",\n        \"hour\": 23,\n        \"latency\": 24\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 0,\n        \"latency\": 24\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 1,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 2,\n        \"latency\": 20\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 3,\n        \"latency\": 20\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 4,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 5,\n        \"latency\": 24\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 6,\n        \"latency\": 31\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 7,\n        \"latency\": 48\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 8,\n        \"latency\": 88\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 9,\n        \"latency\": 126\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 10,\n        \"latency\": 141\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 11,\n        \"latency\": 149\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 12,\n        \"latency\": 137\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 13,\n        \"latency\": 153\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 14,\n        \"latency\": 158\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 15,\n        \"latency\": 149\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 16,\n        \"latency\": 137\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 17,\n        \"latency\": 103\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 18,\n        \"latency\": 67\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 19,\n        \"latency\": 46\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 20,\n        \"latency\": 36\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 21,\n        \"latency\": 31\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 22,\n        \"latency\": 27\n      },\n      {\n        \"day\": \"Wed\",\n        \"hour\": 23,\n        \"latency\": 25\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 0,\n        \"latency\": 25\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 1,\n        \"latency\": 23\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 2,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 3,\n        \"latency\": 20\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 4,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 5,\n        \"latency\": 25\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 6,\n        \"latency\": 33\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 7,\n        \"latency\": 51\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 8,\n        \"latency\": 92\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 9,\n        \"latency\": 132\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 10,\n        \"latency\": 148\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 11,\n        \"latency\": 156\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 12,\n        \"latency\": 144\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 13,\n        \"latency\": 161\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 14,\n        \"latency\": 166\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 15,\n        \"latency\": 157\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 16,\n        \"latency\": 143\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 17,\n        \"latency\": 108\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 18,\n        \"latency\": 70\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 19,\n        \"latency\": 48\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 20,\n        \"latency\": 38\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 21,\n        \"latency\": 32\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 22,\n        \"latency\": 28\n      },\n      {\n        \"day\": \"Thu\",\n        \"hour\": 23,\n        \"latency\": 26\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 0,\n        \"latency\": 26\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 1,\n        \"latency\": 24\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 2,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 3,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 4,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 5,\n        \"latency\": 25\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 6,\n        \"latency\": 32\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 7,\n        \"latency\": 49\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 8,\n        \"latency\": 86\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 9,\n        \"latency\": 121\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 10,\n        \"latency\": 139\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 11,\n        \"latency\": 146\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 12,\n        \"latency\": 134\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 13,\n        \"latency\": 151\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 14,\n        \"latency\": 155\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 15,\n        \"latency\": 147\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 16,\n        \"latency\": 135\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 17,\n        \"latency\": 105\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 18,\n        \"latency\": 72\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 19,\n        \"latency\": 53\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 20,\n        \"latency\": 42\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 21,\n        \"latency\": 36\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 22,\n        \"latency\": 31\n      },\n      {\n        \"day\": \"Fri\",\n        \"hour\": 23,\n        \"latency\": 28\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 0,\n        \"latency\": 27\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 1,\n        \"latency\": 25\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 2,\n        \"latency\": 23\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 3,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 4,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 5,\n        \"latency\": 23\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 6,\n        \"latency\": 25\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 7,\n        \"latency\": 28\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 8,\n        \"latency\": 32\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 9,\n        \"latency\": 36\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 10,\n        \"latency\": 39\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 11,\n        \"latency\": 42\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 12,\n        \"latency\": 40\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 13,\n        \"latency\": 44\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 14,\n        \"latency\": 47\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 15,\n        \"latency\": 43\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 16,\n        \"latency\": 39\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 17,\n        \"latency\": 36\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 18,\n        \"latency\": 34\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 19,\n        \"latency\": 32\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 20,\n        \"latency\": 31\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 21,\n        \"latency\": 30\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 22,\n        \"latency\": 29\n      },\n      {\n        \"day\": \"Sat\",\n        \"hour\": 23,\n        \"latency\": 28\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 0,\n        \"latency\": 26\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 1,\n        \"latency\": 24\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 2,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 3,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 4,\n        \"latency\": 21\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 5,\n        \"latency\": 22\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 6,\n        \"latency\": 24\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 7,\n        \"latency\": 27\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 8,\n        \"latency\": 30\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 9,\n        \"latency\": 34\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 10,\n        \"latency\": 37\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 11,\n        \"latency\": 39\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 12,\n        \"latency\": 38\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 13,\n        \"latency\": 42\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 14,\n        \"latency\": 45\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 15,\n        \"latency\": 42\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 16,\n        \"latency\": 38\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 17,\n        \"latency\": 35\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 18,\n        \"latency\": 33\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 19,\n        \"latency\": 31\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 20,\n        \"latency\": 30\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 21,\n        \"latency\": 29\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 22,\n        \"latency\": 28\n      },\n      {\n        \"day\": \"Sun\",\n        \"hour\": 23,\n        \"latency\": 27\n      }\n    ]\n  },\n  \"title\": \"Server Request Latency by Day and Hour\",\n  \"mark\": \"rect\",\n  \"encoding\": {\n    \"x\": {\n      \"field\": \"hour\",\n      \"type\": \"ordinal\",\n      \"axis\": {\n        \"title\": \"Hour of day\"\n      }\n    },\n    \"y\": {\n      \"field\": \"day\",\n      \"type\": \"ordinal\",\n      \"scale\": {\n        \"domain\": [\n          \"Mon\",\n          \"Tue\",\n          \"Wed\",\n          \"Thu\",\n          \"Fri\",\n          \"Sat\",\n          \"Sun\"\n        ]\n      },\n      \"axis\": {\n        \"title\": \"Day of week\"\n      }\n    },\n    \"color\": {\n      \"field\": \"latency\",\n      \"type\": \"quantitative\",\n      \"legend\": {\n        \"title\": \"Median latency (ms)\"\n      }\n    }\n  }\n}","\u002Fimages\u002Fcaptures\u002Fheatmap.svg","\u002Fimages\u002Fcaptures\u002Fheatmap.dark.svg",{"kind":6,"html":38},"\u003Cp>The same list over HTTP is \u003Ca href=\"\u002Flist-oracles\">\u003Ccode>GET \u002Fv1\u002Foracles\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"names-are-domain-words\">Names are domain words\u003C\u002Fh2>\n\u003Cp>You ask the \u003Ccode>chart\u003C\u002Fcode> oracle, the \u003Ccode>vector-graphics\u003C\u002Fcode> oracle or the \u003Ccode>coverage-policy\u003C\u002Fcode>\noracle — named for what you want, not for what produces it.\u003C\u002Fp>\n\u003Cp>That is a deliberate boundary. You are buying an answer about charts. What sits\nbehind the name is ours to change, and nothing about it appears in the name or\nin the response, so an integration of yours cannot come to depend on it and then\nbreak when we improve it.\u003C\u002Fp>\n\u003Ch2 id=\"formats\">Formats\u003C\u002Fh2>\n\u003Cp>An oracle declares the formats it can produce. Pass \u003Ccode>format\u003C\u002Fcode> to choose one; omit\nit for \u003Ccode>default_format\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Asking for a format an oracle cannot produce is refused \u003Cstrong>and the refusal names\nthe ones it can\u003C\u002Fstrong>. That is the one error an agent can act on without a human,\nwhich is why it is shaped that way rather than as a bare rejection.\u003C\u002Fp>\n\u003Ch3 id=\"a-format-is-not-always-a-superset-of-the-others\">A format is not always a superset of the others\u003C\u002Fh3>\n\u003Cp>Formats of the same oracle are not equally expressive. A request that succeeds for one can be refused for\nanother — the refusal is about what that format can express, never about whether\nyour request was reasonable.\u003C\u002Fp>\n\u003Cp>\u003Ccode>chart\u003C\u002Fcode> is the live example. \u003Ccode>vega-lite\u003C\u002Fcode> expresses the most; \u003Ccode>gnuplot\u003C\u002Fcode> expresses\nless, and refuses rather than quietly dropping what it cannot carry — time axes,\nvalues it would have to fetch rather than be given, and transformations that\nhappen before plotting rather than during it.\u003C\u002Fp>\n\u003Cp>\u003Ccode>plotly\u003C\u002Fcode>, \u003Ccode>echarts\u003C\u002Fcode> and \u003Ccode>chartjs\u003C\u002Fcode> return a document for that library — a Plotly\nfigure, an ECharts option, a Chart.js configuration — with every number already\ncomputed, so the same chart shows the same values in all of them. Because the numbers are computed\nbefore you receive them, all three need the data inline and refuse a chart whose\nvalues are at an address. Beyond that:\u003C\u002Fp>\n\u003Cdiv class=\"doc-table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Format\u003C\u002Fth>\n\u003Cth>Also refuses\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>plotly\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>trails, maps, images, small multiples (\u003Ccode>row\u003C\u002Fcode>, \u003Ccode>column\u003C\u002Fcode>) of anything but bars, lines, areas and points or split by dates or numbers, a radial value that is negative or falls outside the circle, an arc layered with another mark or with arcs on other scales, a \u003Ccode>shape\u003C\u002Fcode> on anything but a point or read from an ordered field, a \u003Ccode>size\u003C\u002Fcode> on anything but a point, an \u003Ccode>opacity\u003C\u002Fcode> on anything but a point or a bar, a \u003Ccode>size\u003C\u002Fcode> or \u003Ccode>opacity\u003C\u002Fcode> read from unordered categories, a \u003Ccode>range\u003C\u002Fcode> of colours on a numeric colour, colour on two channels at once, and a range between dates written with a time zone\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>echarts\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the same, axis \u003Ccode>format\u003C\u002Fcode> strings, a bar or band running between two dates, and a bar ranged along x unless y is a category\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>chartjs\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>the same as \u003Ccode>echarts\u003C\u002Fcode> (except bars ranged along x), and box plots, heatmaps, text labels, a colour scale, a line across the whole plot, a range along a date axis, a second view or a band beside a colour legend (except a layer of arcs), an \u003Ccode>rgb()\u003C\u002Fcode> or \u003Ccode>hsl()\u003C\u002Fcode> colour on anything drawn below full opacity, and small multiples\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Where a format cannot carry something without refusing the whole chart, the\nanswer says so as a warning: \u003Ccode>echarts\u003C\u002Fcode> and \u003Ccode>chartjs\u003C\u002Fcode> take their width and height\nfrom the page, and \u003Ccode>chartjs\u003C\u002Fcode> draws a time axis as categories.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>A refusal of this kind still costs a credit.\u003C\u002Fstrong> Deciding that something cannot\nbe rendered is the work — the same work as deciding it can. The table above is\nhere so that is a known limit rather than something you discover one credit at a\ntime.\u003C\u002Fp>\n\u003Cp>\u003Ccode>vector-graphics\u003C\u002Fcode> has the same shape across its three formats. \u003Ccode>tikz\u003C\u002Fcode> and \u003Ccode>metapost\u003C\u002Fcode>\nexpress the most; \u003Ccode>pictex\u003C\u002Fcode> expresses less and refuses rather than approximating\n— it has no arbitrary stroke colours, no fills, and no coloured text, and it\nnames which of those you asked for.\u003C\u002Fp>\n\u003Ch3 id=\"vector-graphics-computes-the-geometry\">\u003Ccode>vector-graphics\u003C\u002Fcode> computes the geometry\u003C\u002Fh3>\n\u003Cp>Describe a figure by what it is, not by where each mark goes: the midpoint of\ntwo points, where two lines meet, a point partway along a ray, a circle tangent\nto a line, a line perpendicular to another, a length equal to a distance. The\ncoordinates in the TikZ you get back are computed for you.\u003C\u002Fp>\n\u003Cp>Say in your intent what the figure must show — three points collinear, two\nlines perpendicular — and it is checked. A figure that cannot show it comes back\n\u003Ccode class=\"chip chip--invalid\">invalid\u003C\u002Fcode>, naming what failed and by how much, rather than looking right and\nbeing wrong.\u003C\u002Fp>\n\u003Cp>A returned figure is fitted to its canvas, with labels clear of the lines, trees\nand rows of boxes laid out from their text, and one consistent style:\nconstruction lines in grey, extensions dashed, the subject in a heavier line,\nfills tinted with matching outlines.\u003C\u002Fp>\n\u003Cp>Some figures need things \u003Ccode>vector-graphics\u003C\u002Fcode> does not draw: colour gradients, embedded\nimages, animation, fill patterns, transparency or shading. A request that cannot\nbe drawn without one is answered \u003Ccode class=\"chip chip--invalid\">invalid\u003C\u002Fcode> with \u003Ccode>detail\u003C\u002Fcode> naming the feature,\ninstead of an approximation. See \u003Ca href=\"\u002Fverdicts\">Verdicts\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"vector-graphics-returns-source-not-a-picture\">\u003Ccode>vector-graphics\u003C\u002Fcode> returns source, not a picture\u003C\u002Fh3>\n\u003Cp>The \u003Ccode>chart\u003C\u002Fcode> formats return a document something else can draw. The\n\u003Ccode>vector-graphics\u003C\u002Fcode>\nformats return \u003Cstrong>TeX-family source\u003C\u002Fstrong> — \u003Ccode>tikz\u003C\u002Fcode>, \u003Ccode>pictex\u003C\u002Fcode> and \u003Ccode>metapost\u003C\u002Fcode> are all\nthings you typeset. You get a fragment to place in a document, not an image. To\nsee it drawn, a \u003Ccode class=\"chip chip--valid\">valid\u003C\u002Fcode> answer carries a \u003Ccode>figure\u003C\u002Fcode> token — see\n\u003Ca href=\"\u002Ffigures\">Draw a figure\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>Two real answers from \u003Ccode>vector-graphics\u003C\u002Fcode>, with the TikZ each one returned:\u003C\u002Fp>\n",{"kind":15,"ids":40,"captures":43},[41,42],"triangle","angle",[44,53],{"oracle":45,"format":46,"status":23,"verified_by":47,"captured":48,"intent":49,"id":41,"title":50,"source":51,"image":52},"vector-graphics","tikz","vector-graphics@c738bf88","2026-09-30","A right triangle with legs 3 and 4 and hypotenuse 5, each side labelled with its length, and the right angle marked with a small square.","Right triangle, sides 3, 4 and 5","\\begin{tikzpicture}[x=1pt,y=1pt]\n  \\path[use as bounding box] (0,0) rectangle (294.56,234.83);\n  \\draw[draw=black!45,line width=0.4pt] (39.75,20.5) -- (39.75,43.25) -- (17,43.25);\n  \\draw[draw=black,line width=0.6pt,fill=none] (17,20.5) -- (277,20.5) -- (17,215.5) -- cycle;\n  \\draw[draw=black,line width=0.6pt] (17,20.5) -- (277,20.5);\n  \\draw[draw=black,line width=0.6pt] (17,20.5) -- (17,215.5);\n  \\draw[draw=black,line width=0.6pt] (277,20.5) -- (17,215.5);\n  \\filldraw[draw=none,line width=0.4pt,fill=black] (17,20.5) circle[radius=1.3pt];\n  \\filldraw[draw=none,line width=0.4pt,fill=black] (277,20.5) circle[radius=1.3pt];\n  \\filldraw[draw=none,line width=0.4pt,fill=black] (17,215.5) circle[radius=1.3pt];\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (11.67,13.42) {$a$};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (283.78,20.5) {$b$};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (11.95,222.58) {$c$};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (147,12.25) {4};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (10.5,118) {3};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (151.9,125.45) {5};\n\\end{tikzpicture}\n","\u002Fimages\u002Fcaptures\u002Ftriangle.svg",{"oracle":45,"format":46,"status":23,"verified_by":47,"captured":48,"intent":54,"id":42,"title":55,"source":56,"image":57},"An angle of 40 degrees on the unit circle: the circle, the x-axis, a radius at 40 degrees, the arc between the x-axis and the radius marked, and the angle labelled 40°.","A 40° angle on the unit circle","\\begin{tikzpicture}[x=1pt,y=1pt]\n  \\path[use as bounding box] (0,0) rectangle (276,274);\n  \\draw[draw=black!45,line width=0.4pt] (8,162) -- (268,162);\n  \\draw[draw=black,line width=0.6pt,fill=none] (132.8,162) circle[radius=104pt];\n  \\draw[draw=black,line width=0.6pt] (158.8,162) -- (158.77,163.3) -- (158.67,164.59) -- (158.51,165.88) -- (158.28,167.15) -- (158,168.42) -- (157.64,169.66) -- (157.23,170.89) -- (156.76,172.1) -- (156.23,173.28) -- (155.63,174.43) -- (154.99,175.56) -- (154.28,176.65) -- (153.53,177.7) -- (152.72,178.71);\n  \\draw[draw=red!75!black,line width=1.1pt] (132.8,162) -- (212.47,228.85);\n  \\filldraw[draw=none,line width=0.4pt,fill=black] (212.47,228.85) circle[radius=1.3pt];\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (218.7,235.93) {$P$};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont] at (168.46,176.6) {40\\ensuremath{^\\circ}};\n  \\node[text=black,anchor=center,font=\\fontsize{10pt}{12pt}\\selectfont,text width=260pt,align=center] at (138,26) {The circle has radius one. The marked arc measures 40 degrees from the positive x-axis to the radius. The radius endpoint lies on the unit circle.};\n\\end{tikzpicture}\n","\u002Fimages\u002Fcaptures\u002Fangle.svg",{"kind":6,"html":59},"\u003Ch3 id=\"coverage-policy-answers-questions-about-a-coverage-policy-as-json\">\u003Ccode>coverage-policy\u003C\u002Fcode> answers questions about a coverage policy, as JSON\u003C\u002Fh3>\n\u003Cp>\u003Ccode>coverage-policy\u003C\u002Fcode> takes a question about the Medicare Local Coverage\nDetermination for total knee arthroplasty (LCD L36575, version 21), such as\n&quot;Can I get a knee replacement if I'm under 65?&quot;, and returns the parts of that\npolicy that answer it: the rules, the named conditions and statements they rely\non, and the policy passage each part comes from. Every entry in an answer is\ntaken from the policy; nothing is written for the question. It records what the\npolicy says; it does not decide whether a patient qualifies.\u003C\u002Fp>\n\u003Cp>Its format, \u003Ccode>lookup\u003C\u002Fcode>, is a document: \u003Ccode>result\u003C\u002Fcode> is an object, and a \u003Ccode class=\"chip chip--valid\">valid\u003C\u002Fcode> answer\ncarries no \u003Ccode>figure\u003C\u002Fcode> block. The object's keys are \u003Ccode>policy\u003C\u002Fcode>, \u003Ccode>review\u003C\u002Fcode>, \u003Ccode>asked\u003C\u002Fcode>,\n\u003Ccode>not_found\u003C\u002Fcode>, \u003Ccode>scope\u003C\u002Fcode>, \u003Ccode>rules\u003C\u002Fcode>, \u003Ccode>conditions\u003C\u002Fcode>, \u003Ccode>statements\u003C\u002Fcode>, \u003Ccode>reason_topics\u003C\u002Fcode>,\n\u003Ccode>notes\u003C\u002Fcode>, \u003Ccode>passages\u003C\u002Fcode>, \u003Ccode>examples\u003C\u002Fcode>, \u003Ccode>open_questions\u003C\u002Fcode>, \u003Ccode>other_documents\u003C\u002Fcode> and\n\u003Ccode>source_passages\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>asked\u003C\u002Fcode> says, in words, which parts of the policy were looked up.\u003C\u002Fli>\n\u003Cli>\u003Ccode>not_found\u003C\u002Fcode> lists the searches that found no entry and the questions no rule\nanswers. Search matches exact words, so a search for &quot;X-rays&quot; finds nothing\nin a policy that says &quot;radiography&quot;. A question about something the policy is\nsilent on, such as an age limit, gets an entry here rather than a guess.\u003C\u002Fli>\n\u003Cli>An entry names the passages it cites under \u003Ccode>sources\u003C\u002Fcode>, by id, and\n\u003Ccode>source_passages\u003C\u002Fcode> holds each passage's pages, section and words.\u003C\u002Fli>\n\u003Cli>\u003Ccode>review\u003C\u002Fcode> says how far the policy's representation has been reviewed. Today it\nis a draft that has not had clinical review.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Send \u003Ccode>&quot;views&quot;: [&quot;summary&quot;]\u003C\u002Fcode> with the question to also get the answer as text\na person can read, in \u003Ccode>views.summary\u003C\u002Fcode>. It is built from \u003Ccode>result\u003C\u002Fcode> alone: each\nrule and condition by name with its pages, the lists of what must be true, the\npolicy's own wording quoted, what the policy does not mention, and the review\nnote. It never names an entry by its id. For &quot;Can I get a knee replacement if\nI'm under 65?&quot; it begins:\u003C\u002Fp>\n",{"kind":61,"lang":62,"code":63},"code","text","From Total Knee Arthroplasty (LCD L36575 version 21; revision effective 2025-11-06).\n\nThe policy does not mention \"age\" or \"65\".\n\nIndications for a first total replacement (indication, pages 7, 8)\nThe policy says: \"Noridian will consider total knee replacement surgery medically necessary in the following circumstances:\"\nFor a first total knee replacement.\nIt applies when any one of these is true:\n- The advanced joint disease pathway (explained below)\n- Failure of a previous osteotomy\n- Distal femur fracture",{"kind":6,"html":65},"\u003Cp>A question about another policy or another procedure is still answered from\nthis one policy: the answer is what LCD L36575 says, which may not be what was\nasked about.\u003C\u002Fp>\n\u003Cp>Callers that send \u003Ccode>format: &quot;json&quot;\u003C\u002Fcode> still get the earlier answer for a passage of\na policy (its scope, rules, conditions and statements). That format is no longer\nlisted and will be retired.\u003C\u002Fp>\n\u003Ch3 id=\"what-result-holds\">What \u003Ccode>result\u003C\u002Fcode> holds\u003C\u002Fh3>\n\u003Cp>A format that produces a document returns it decoded — \u003Ccode>result\u003C\u002Fcode> is an object.\nA format that produces a \u003Cstrong>script or plain text\u003C\u002Fstrong> returns it as a string. You\nalready know which, because you named the format and the response echoes it back\nbeside the result.\u003C\u002Fp>\n\u003Ch2 id=\"every-plan-every-oracle\">Every plan, every oracle\u003C\u002Fh2>\n\u003Cp>Nothing is gated by tier. An agent that cannot rely on a tool being there stops\nreaching for it, so what a plan buys is \u003Ca href=\"\u002Flimits\">volume\u003C\u002Fa>, never access.\u003C\u002Fp>\n\u003Ch2 id=\"new-oracles\">New oracles\u003C\u002Fh2>\n\u003Cp>They appear in \u003Ccode>GET \u002Fv1\u002Foracles\u003C\u002Fcode> and in the console — with no change on\nyour side. If your integration reads the catalogue at start-up rather than\nhardcoding names, that is all it takes.\u003C\u002Fp>\n","# Oracles\n\n> What an oracle is, what is available to you, and why the names are what they are.\n\nAn oracle takes a request in plain language and returns an artifact that has passed\nits checks. It is the unit you buy, the unit you call and the unit you are\nbilled for. Today `chart`, `vector-graphics` and `coverage-policy` each cost **1 credit** per\nanswer, `valid` or `invalid`; an `error` is free.\n\n## Available to you\n\nThe console lists the oracles your organisation can call, read from the\ndeployment rather than written here — so it cannot describe an oracle that is\nnot actually served.\n\n[Browse the oracles](https:\u002F\u002Fapp.formalogic.io\u002Foracles)\n\nReal answers from `chart`, as they were returned:\n\n\nThe same list over HTTP is [`GET \u002Fv1\u002Foracles`](https:\u002F\u002Fdocs.formalogic.io\u002Flist-oracles).\n\n## Names are domain words\n\nYou ask the `chart` oracle, the `vector-graphics` oracle or the `coverage-policy`\noracle — named for what you want, not for what produces it.\n\nThat is a deliberate boundary. You are buying an answer about charts. What sits\nbehind the name is ours to change, and nothing about it appears in the name or\nin the response, so an integration of yours cannot come to depend on it and then\nbreak when we improve it.\n\n## Formats\n\nAn oracle declares the formats it can produce. Pass `format` to choose one; omit\nit for `default_format`.\n\nAsking for a format an oracle cannot produce is refused **and the refusal names\nthe ones it can**. That is the one error an agent can act on without a human,\nwhich is why it is shaped that way rather than as a bare rejection.\n\n### A format is not always a superset of the others\n\nFormats of the same oracle are not equally expressive. A request that succeeds for one can be refused for\nanother — the refusal is about what that format can express, never about whether\nyour request was reasonable.\n\n`chart` is the live example. `vega-lite` expresses the most; `gnuplot` expresses\nless, and refuses rather than quietly dropping what it cannot carry — time axes,\nvalues it would have to fetch rather than be given, and transformations that\nhappen before plotting rather than during it.\n\n`plotly`, `echarts` and `chartjs` return a document for that library — a Plotly\nfigure, an ECharts option, a Chart.js configuration — with every number already\ncomputed, so the same chart shows the same values in all of them. Because the numbers are computed\nbefore you receive them, all three need the data inline and refuse a chart whose\nvalues are at an address. Beyond that:\n\n| Format | Also refuses |\n|---|---|\n| `plotly` | trails, maps, images, small multiples (`row`, `column`) of anything but bars, lines, areas and points or split by dates or numbers, a radial value that is negative or falls outside the circle, an arc layered with another mark or with arcs on other scales, a `shape` on anything but a point or read from an ordered field, a `size` on anything but a point, an `opacity` on anything but a point or a bar, a `size` or `opacity` read from unordered categories, a `range` of colours on a numeric colour, colour on two channels at once, and a range between dates written with a time zone |\n| `echarts` | the same, axis `format` strings, a bar or band running between two dates, and a bar ranged along x unless y is a category |\n| `chartjs` | the same as `echarts` (except bars ranged along x), and box plots, heatmaps, text labels, a colour scale, a line across the whole plot, a range along a date axis, a second view or a band beside a colour legend (except a layer of arcs), an `rgb()` or `hsl()` colour on anything drawn below full opacity, and small multiples |\n\nWhere a format cannot carry something without refusing the whole chart, the\nanswer says so as a warning: `echarts` and `chartjs` take their width and height\nfrom the page, and `chartjs` draws a time axis as categories.\n\n**A refusal of this kind still costs a credit.** Deciding that something cannot\nbe rendered is the work — the same work as deciding it can. The table above is\nhere so that is a known limit rather than something you discover one credit at a\ntime.\n\n`vector-graphics` has the same shape across its three formats. `tikz` and `metapost`\nexpress the most; `pictex` expresses less and refuses rather than approximating\n— it has no arbitrary stroke colours, no fills, and no coloured text, and it\nnames which of those you asked for.\n\n### `vector-graphics` computes the geometry\n\nDescribe a figure by what it is, not by where each mark goes: the midpoint of\ntwo points, where two lines meet, a point partway along a ray, a circle tangent\nto a line, a line perpendicular to another, a length equal to a distance. The\ncoordinates in the TikZ you get back are computed for you.\n\nSay in your intent what the figure must show — three points collinear, two\nlines perpendicular — and it is checked. A figure that cannot show it comes back\n`invalid`, naming what failed and by how much, rather than looking right and\nbeing wrong.\n\nA returned figure is fitted to its canvas, with labels clear of the lines, trees\nand rows of boxes laid out from their text, and one consistent style:\nconstruction lines in grey, extensions dashed, the subject in a heavier line,\nfills tinted with matching outlines.\n\nSome figures need things `vector-graphics` does not draw: colour gradients, embedded\nimages, animation, fill patterns, transparency or shading. A request that cannot\nbe drawn without one is answered `invalid` with `detail` naming the feature,\ninstead of an approximation. See [Verdicts](https:\u002F\u002Fdocs.formalogic.io\u002Fverdicts).\n\n### `vector-graphics` returns source, not a picture\n\nThe `chart` formats return a document something else can draw. The\n`vector-graphics`\nformats return **TeX-family source** — `tikz`, `pictex` and `metapost` are all\nthings you typeset. You get a fragment to place in a document, not an image. To\nsee it drawn, a `valid` answer carries a `figure` token — see\n[Draw a figure](https:\u002F\u002Fdocs.formalogic.io\u002Ffigures).\n\nTwo real answers from `vector-graphics`, with the TikZ each one returned:\n\n\n### `coverage-policy` answers questions about a coverage policy, as JSON\n\n`coverage-policy` takes a question about the Medicare Local Coverage\nDetermination for total knee arthroplasty (LCD L36575, version 21), such as\n\"Can I get a knee replacement if I'm under 65?\", and returns the parts of that\npolicy that answer it: the rules, the named conditions and statements they rely\non, and the policy passage each part comes from. Every entry in an answer is\ntaken from the policy; nothing is written for the question. It records what the\npolicy says; it does not decide whether a patient qualifies.\n\nIts format, `lookup`, is a document: `result` is an object, and a `valid` answer\ncarries no `figure` block. The object's keys are `policy`, `review`, `asked`,\n`not_found`, `scope`, `rules`, `conditions`, `statements`, `reason_topics`,\n`notes`, `passages`, `examples`, `open_questions`, `other_documents` and\n`source_passages`.\n\n- `asked` says, in words, which parts of the policy were looked up.\n- `not_found` lists the searches that found no entry and the questions no rule\n  answers. Search matches exact words, so a search for \"X-rays\" finds nothing\n  in a policy that says \"radiography\". A question about something the policy is\n  silent on, such as an age limit, gets an entry here rather than a guess.\n- An entry names the passages it cites under `sources`, by id, and\n  `source_passages` holds each passage's pages, section and words.\n- `review` says how far the policy's representation has been reviewed. Today it\n  is a draft that has not had clinical review.\n\nSend `\"views\": [\"summary\"]` with the question to also get the answer as text\na person can read, in `views.summary`. It is built from `result` alone: each\nrule and condition by name with its pages, the lists of what must be true, the\npolicy's own wording quoted, what the policy does not mention, and the review\nnote. It never names an entry by its id. For \"Can I get a knee replacement if\nI'm under 65?\" it begins:\n\n```text\nFrom Total Knee Arthroplasty (LCD L36575 version 21; revision effective 2025-11-06).\n\nThe policy does not mention \"age\" or \"65\".\n\nIndications for a first total replacement (indication, pages 7, 8)\nThe policy says: \"Noridian will consider total knee replacement surgery medically necessary in the following circumstances:\"\nFor a first total knee replacement.\nIt applies when any one of these is true:\n- The advanced joint disease pathway (explained below)\n- Failure of a previous osteotomy\n- Distal femur fracture\n```\n\nA question about another policy or another procedure is still answered from\nthis one policy: the answer is what LCD L36575 says, which may not be what was\nasked about.\n\nCallers that send `format: \"json\"` still get the earlier answer for a passage of\na policy (its scope, rules, conditions and statements). That format is no longer\nlisted and will be retired.\n\n### What `result` holds\n\nA format that produces a document returns it decoded — `result` is an object.\nA format that produces a **script or plain text** returns it as a string. You\nalready know which, because you named the format and the response echoes it back\nbeside the result.\n\n## Every plan, every oracle\n\nNothing is gated by tier. An agent that cannot rely on a tool being there stops\nreaching for it, so what a plan buys is [volume](https:\u002F\u002Fdocs.formalogic.io\u002Flimits), never access.\n\n## New oracles\n\nThey appear in `GET \u002Fv1\u002Foracles` and in the console — with no change on\nyour side. If your integration reads the catalogue at start-up rather than\nhardcoding names, that is all it takes.\n",1793819974070]