ai-client.json 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. {
  2. "schemaVersion": 1,
  3. "pageVersion": "sha256:e30d17eaaf9e0d8e88f0bc51ae0a0c586c23d7bea67344aa86f5188912c80441",
  4. "claims": [
  5. {
  6. "id": "claim_c5dd9ee6003245adaa1701eb40862582",
  7. "statement": "Role serialises to system, user and assistant, and ChatTurn holds a role and content.",
  8. "evidence": [
  9. {
  10. "resource": "repo://src/ai.rs#L42-L67",
  11. "version": "repo-lines-v1:sha256:2985d21aab6a595c3f5ede27b794f4b4793b24bfb2676f79788e10d0f5c1638c:eyJzZWxlY3RlZExpbmVDb3VudCI6MjYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA5YzYwYmU2NjI3ZGFmNGM2MzEzZThlMTdmNzExNzFjY2RlYWU5MjZiNTBlZmU1ZWIyNTljN2FhN2Q0MGUzZDUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjJmNzFiMjQ4YTgyZjdiZjQ0YzUyZmY4ODk2NDNiZWJmNGI1YWNjZmQ4N2YzOWIzNWIxNGZiNTU2MmRkMTRlODgiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6Ijk0ODgzMTY4NjYzMDEyM2RlNmQ0ZmJlNmJiYjBiZmM5Njg1MzgzOTI3MmQ1YTNmYzFiZjViMjdiZWY3NjlkNTUifQ"
  12. }
  13. ]
  14. },
  15. {
  16. "id": "claim_93019c6e84b74870ba0a05b843fffef8",
  17. "statement": "AiClient and ImageInput Debug implementations omit the API key and image bytes.",
  18. "evidence": [
  19. {
  20. "resource": "repo://src/ai.rs#L102-L138",
  21. "version": "repo-lines-v1:sha256:252913842faf254329b50d5fd74240a84fdd0456ec9e8e68bcc77e1d8883daa4:eyJzZWxlY3RlZExpbmVDb3VudCI6MzcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE2NTYxZDE4YzQxMTY4MjBjZGFiOTJmMjQwNDVhNzlmMTVlNzZmZTdiY2FiODY4Y2JkYTMyZWI1YzM0NWQ1YmMiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjM3ZDYwZjQxMWJhNTUxYTEzOGUwOWJkYjdiMDg5YjRjMGE3NDUyNTU2MzUzYmE3YTAxNGVhODA5ODEyY2M1Y2QiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjIyZmQyY2VkZGZlMDVkZDM4ZTYwZmRjYzkwNGU1OWZkZTM3Y2IxODY4Yjk3MzhlODJkNWI2ZTIxZmE3Nzg0OWYifQ"
  22. }
  23. ]
  24. },
  25. {
  26. "id": "claim_5dfcd52a48d349059a04d949e6637509",
  27. "statement": "AiClient::new requires openai_api_key, uses a 60 second request timeout, builds the endpoint from the base URL without trailing slash plus /chat/completions and copies the retry count from ai_retries.",
  28. "evidence": [
  29. {
  30. "resource": "repo://src/ai.rs#L147-L171",
  31. "version": "repo-lines-v1:sha256:44a0131bcff163d3b23847cb3c2a056e5eadd8bc591340fa6c19aa263ff24757:eyJzZWxlY3RlZExpbmVDb3VudCI6MjUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQyMDRmMzBiYmM1OTNhOGQxOGFiYTY3OWYyMWQ0ZGY1M2JiN2YxYjdlYWIwYTNkNDRmOWJhMjgyZmVhYjFhYjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjA2YWQyYTE2MzQ0NTcwYjlkY2QwODA0NjQ4Y2NhNzgxYTA0YmRiNWVmMTkwYTQxZGRlOWQ1N2NjYzE0ZjBhY2QiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImY0OGYzMmRjZTI0MWMwNmFjYzBlZjdjZTc4NWM4MGZjM2E5NTk3MTZlODYwNTcwYjdkZmM0MWNiYjg0MWZjNDkifQ"
  32. },
  33. {
  34. "resource": "repo://src/ai.rs#L23-L26",
  35. "version": "repo-lines-v1:sha256:387091425f02a452aec12422a8131f0728f26389419cee2af4500edf72eba0d1:eyJzZWxlY3RlZExpbmVDb3VudCI6NCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZTdjZDhjOGU3Yzc4MWIxNTNhYzUzOGI4MGU4YmUwYjI5OTkzZjNlMTI0ZThmYjRhMzcwOGQ5Yjk5YzkwNmRlZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYzgxOGM0OTA5ZDY1ZmUwYmI0NWFmYjQyYmNlNTE4YjA1MzlkOTFhMzY2NzUyMWMwMTYxYjYxMzkwZGY4MTI2YyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZjAxZGVmODgwNmEwNDc3ZGQyNTdmOGM5NDlkZDViOWE3ZjA2MzZjOWQzZjkwY2VlZWQ3OTRkZjE0NjZlOWIwNyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYzY0NGQwYjM2ZWY3MmUxMTU1YTY5N2MwNGU4ZmZhNjNmZDU1MjQ2NTkyZWI2YTM3MTNkNjA2M2Y3Y2JjYjBmOCJ9"
  36. }
  37. ]
  38. },
  39. {
  40. "id": "claim_c2b08a6fd5474b718caeccd3caf28a21",
  41. "statement": "The default base URL is https://ollama.com/v1 and the default model is deepseek-v4.1-flash.",
  42. "evidence": [
  43. {
  44. "resource": "repo://src/config.rs#L35-L37",
  45. "version": "repo-lines-v1:sha256:ace88a2257793291dac3b3a9be115c8460366e7dce83953bc6d52977e07763a4:eyJzZWxlY3RlZExpbmVDb3VudCI6MywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZTc2MTBlZDMwOGNjNWU5MmE3MzAxODA5ZDE1OWZiODlkOTg5ZjIxYTNmZjMwZTc5MGQ2NjU4ZDAwNTM0MThjNCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYWM0ZGZhMzdlOWNjNjNjNTM4MmEzNjg2M2Q2Nzg3ZWU0OWViYTU2N2EyNGFiYmYyZGI3OTlhN2YwOWFjMmI1NCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiY2JiNmQ0YzQ2ZTZkZWY5ZGZmYWRiYzZiNTIwN2U4N2EwZTI4MzQzMjliZmI0M2I1YjI2NmU2MTA0Y2RlZWJiMiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiN2U4MDVmNGIzNWUzODc2YTEyODk5MTUyODJhZGE1Y2QzM2E3N2Y1MzJiZjI5YzE4Yzg5ZGEyMmIxNGNmNTBiZCJ9"
  46. }
  47. ]
  48. },
  49. {
  50. "id": "claim_f1bcd507d7bc494488698809a5e4d5af",
  51. "statement": "complete sends a body with the model and role/content messages.",
  52. "evidence": [
  53. {
  54. "resource": "repo://src/ai.rs#L180-L182",
  55. "version": "repo-lines-v1:sha256:6c710c12e7719cdb505b12f9af500f78a0569c21c8098a12c1b53b5c19d43207:eyJzZWxlY3RlZExpbmVDb3VudCI6MywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMGE5MGZlNDNkOTJhMDA1YTM3YjEyYmM5Nzk3MTIxNGVjNDc1NDk2MTc0MmUyNzQ0OTgwODQ0ZTVkYWFlMTNmNSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMTNiOWZjMjM4M2MwMzAwYjUwMzI2NzhkMjUxNDZjYWE3ZDJmODZlOTQwMzZmZTg3ZGI2NTU2ZjZlZTk2MzVjZSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiM2JlODA2YWQyMDg1ZmYxMDNjZGJjODM1ODRkYjM4MGRmNDU5N2YwNmQ0YmY5NDk0Nzc0ZDVmZGVlODliZjBiYyJ9"
  56. },
  57. {
  58. "resource": "repo://src/ai.rs#L325-L346",
  59. "version": "repo-lines-v1:sha256:fc6890863f2d103b4db6f7460506060b7e629e95f79e42e6bca5d92ecf262f51:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdiZjlhNjk0Mjc3MDY1MDI5ZThmZDIwMjYwYzBmMzZjZDNjMDYzYzQ5Yjg3NTU2YzI1NzdjZDZiZmZjODM3NDEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ4MGYwYWFiOGM0NDViYTQ5ZGYxNmVjMDY4ZDk0ODgwYjJjZGJhYzc1MDE3MWU3YzgyMzg4MzMzNTExM2M3YTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImMwNDdhZDE2MzZiMWQ2OTc3ODM5NDBjNDMxZmIzN2IwZjFhMWRjNTNlMzc2YzI1YWZkZGUxMGJlYjI3ZGE1MjAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjczNTE1ZjNiMTM5NmQwNmQxMDZlZmM0ZWM5ZDdjYjU0MjVlMWJjMzU3Y2I2OGJhM2U4NTBkMDVmOWY2OTRjNzEifQ"
  60. }
  61. ]
  62. },
  63. {
  64. "id": "claim_eca836c7fc554ba9b5a1e0bbfe970f9d",
  65. "statement": "complete_with_image requires a vision model and validates that the image is non-empty and at most MAX_IMAGE_BYTES (5 MiB).",
  66. "evidence": [
  67. {
  68. "resource": "repo://src/ai.rs#L18-L20",
  69. "version": "repo-lines-v1:sha256:cddeca6fba6fde7769f6cdec95f08d62b34b93c4f1a6822927f4b106a7db0a07:eyJzZWxlY3RlZExpbmVDb3VudCI6MywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNTkyZDVjNzYwZTNiYmRlNWQ3MDRlNjE4YWY1ZmVmZTY5YWMzODEyMjg0MGU3NTUwYjk1N2RlYTZkMjFiY2YxZiIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMGJmZTUyOGM4OWM4NTc2YTQxMjYyZDU4NTdkMjE4ZDFjYWIzYTFhYzY4MzVlMGVjMDI4ODI2ZDk5YWVkZWVhNiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNDdiNTMxMDc0OTNkYTIyZTIzZmQyYTlmZTVjY2EwYjFhOGQzYjM2MmI2YzQ1YjkyMjZiZDM1OWE5MzgxODFiMyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMDM4NDJhNGNmOTA1YmJmOWY2NmFkNTY5ODljYjZiYmFhNjNhMzQ0YmIwMjUwNjY4YmU2ODVhNjZlMGRjYjgwZiJ9"
  70. },
  71. {
  72. "resource": "repo://src/ai.rs#L200-L213",
  73. "version": "repo-lines-v1:sha256:09ee9e9276c0c6cfe14563db8840a913e8c6c327a0394f7b9be32282dfd32da6:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFmNmNhMjIzNTg1NmI2MmM3NmZjMDk5ZDk5ZGFiOWFhMzRiY2I2MjM3ZTY0NjkxOTE2OTM4ODVhYTA2MzMxZjciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjAwNTU5ZGE4YzBkNGQ0Y2ZkMjFkMzZhZGFlMWFmMjNlYWM2Mjk5OGU1Mjg5NTJiMDViNTcxY2JkNTZiOTVhODQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjA1ZWY0YzRmMGNjMDcxMzBjOTc1ZWVhM2E3MzdkMGJmOGNjZjY3MThiODUwMDY5NWY0NTU2Y2E2OTk5NmQ0YTcifQ"
  74. },
  75. {
  76. "resource": "repo://src/ai.rs#L385-L399",
  77. "version": "repo-lines-v1:sha256:68a089645a7a69cf4f7f652087e4d1f3a7c37fbcdaa506a831122eef48a12189:eyJzZWxlY3RlZExpbmVDb3VudCI6MTUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImY5YzNhMGViNjE4M2YxNzFmMmE4ZTQxY2JlNWFmMjc0YjdhNjk1ZmM5Zjk3YTAwZDUzZGQ4MmVmYmJiMDE2ZWEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjRiNGU1YzcxMTNkZTFlMWIwOTIyYjEyYTlhM2ZhMGJjYTVmNzI5YzQ3OGM5NzA5ZDczZWYyMmUyYWM0YTEyZDQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImY1NjQyY2ZlYzYwMmNlYzJhOWUyZDk4ODc3OWUzNjIwZjkzZDU2NWRjZDA1MjM1NWFjZmFlOTkyMjAwODRmYjEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjhjYzlkYTNhZDRjZjZmY2RiMDkwNTE4MmY3ODgyMzIxZTE0MGU5ZWZiYTJmNjBhMjJjODdiY2YwYzk0ZWVkNTAifQ"
  78. }
  79. ]
  80. },
  81. {
  82. "id": "claim_23440e7b2c704bdd90c1385f5bcb4ecd",
  83. "statement": "The vision body turns the last user turn into text and image_url parts, or appends an image-only user message, embedding the image as a base64 data URL.",
  84. "evidence": [
  85. {
  86. "resource": "repo://src/ai.rs#L348-L378",
  87. "version": "repo-lines-v1:sha256:0421b4eafacfa0da02301fb95fc4b94d4cd4b0a9d61791112860348f252e7675:eyJzZWxlY3RlZExpbmVDb3VudCI6MzEsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdlZTMyOWRjZTI2MzIyY2FkMmI0N2E0NGU0MjY1YmEwNzM3YjM1NDJjMjM1MzUwZmQyMWZlOGI0MTNjM2M4ODUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImRjNWUzZjQ5YTQ0MjE1MjlmZmI4NTMyNzkzY2ZlZTllNjlkMzFhNWZhMWY4YzA1ZGJlMTcwZGI0MTRlMGQxYjMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJjMWU2Yzg2MTE1NTc0YWZlM2FhMjAwNDYxYzRkMmUzZmRiNzI5ZjFmYjMyMjQzN2VmNGJhNWZmYzJmMDkxZGIifQ"
  88. }
  89. ]
  90. },
  91. {
  92. "id": "claim_8b2297ed4cce446aaf66b88450532f54",
  93. "statement": "request_reply posts with bearer auth and reports transport, read, non-2xx (as a typed StatusError) and invalid JSON errors with response bodies truncated to 300 characters.",
  94. "evidence": [
  95. {
  96. "resource": "repo://src/ai.rs#L265-L291",
  97. "version": "repo-lines-v1:sha256:b80ccebb98e52d79a2155c3e75a8de42dc9ab06286c6639216c4094f37a90562:eyJzZWxlY3RlZExpbmVDb3VudCI6MjcsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFmYWQyYmNjYzU1ZWJiNGE5OTJlNjQ1YmE4ZDBiNDc3MWFjNDk0YTcwMDhlMDUxOTk5MmMxOWQ4ZjQwYTFmYjEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjUzNGRhMTA2NDE1N2QyNzIyZWNjYzIzNTUzNTlhZDIyN2IwYjQwNDU5YWRkMGM0YWRhODZkMTNhZDZlODJjZTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImI2YzllMjYwYjQyZThmYmJiMDRiOWZiM2UwOWEzNmMyZjI1OWI1MDBhOTM1OWE0OTYwMTA2NDYxNWIxY2Q5YjMifQ"
  98. },
  99. {
  100. "resource": "repo://src/ai.rs#L522-L524",
  101. "version": "repo-lines-v1:sha256:81326ce3f8703f9c90b0068b202df13efb9689c0fe8ee236b5f77cbaa6edc4d4:eyJzZWxlY3RlZExpbmVDb3VudCI6MywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZGYzN2E0ZTlhMDhhNjc2ZjRjMTg3MTA1ZTk0OTQ2YWM4MjhiZWM4ZTZhMjlmYWMxYTk5NDk2ZDBiNjYwYWIyZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiN2UyNTA4ZjI2MjVhMWRhY2EwMjIyZWMzYTdmYzNkMWQ4MzZjODdlZjQyODVhYTlmYzZiZmQ0ZTAwN2MzOGY4NCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiN2JjOThkNmIwZGM0OTJjNTAxNmRmMTA4MDVhM2E1NGViOWMxODRhNWE2MTM3ZTdmNGJlY2ZhMGMyMjA1NTBkMCJ9"
  102. },
  103. {
  104. "resource": "repo://src/ai.rs#L83-L98",
  105. "version": "repo-lines-v1:sha256:7772287888f472e0806adf8646ac05d7d32a9518c29e32a7359cf3194b2230c7:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImVmOTlmZDhkOTIwYjk2MTFiZmI3MDkxZTJjZTU3ODM3ZTY5MzY2NmVkNjRjMzFmNmIzMDY5MjJhYjVjOTBkMjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImJjMDk2M2MxZWY1YzRiMjZkZDNmNGY2MDhlZGRhZmNhMDRkMDVhNjI1ODk1YTcxZTYzMmY2N2Y4OTQxYjc2M2IiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjM3ZDYwZjQxMWJhNTUxYTEzOGUwOWJkYjdiMDg5YjRjMGE3NDUyNTU2MzUzYmE3YTAxNGVhODA5ODEyY2M1Y2QifQ"
  106. }
  107. ]
  108. },
  109. {
  110. "id": "claim_1acd5c55f8234d20bf935285166fe3b1",
  111. "statement": "parse_reply returns the trimmed first choice content and fails on missing choices or empty content.",
  112. "evidence": [
  113. {
  114. "resource": "repo://src/ai.rs#L405-L422",
  115. "version": "repo-lines-v1:sha256:b4141c4af9d4b72b638ca3901c24c019a87de5cc0149465761d63c1c2a7b30c0:eyJzZWxlY3RlZExpbmVDb3VudCI6MTgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjlhNGJhYzcxZjEwYTkwZWNmMzZkMzM5ZjJjZGZkZmY3OThmNTk4NDE4ODc0NWM3M2IzYTkzMDVmMTE0YjI4ZDAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImIxNDJlMWMwZDkyM2E5YWY0YzczOGRhZThhMjkwMjg1YzRmYmNkMmY5YmQ1OGY1NGMzMTk1M2NhMTliZDE4ZTQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJjZTgwZDQ1MzU3ZWY2NWZiNjUzODgzZWEzOTU1NDMyMDMzN2Q0YjA3MzcxNzQ1ZWE0MGFkYzRmMGFjNTU0YTcifQ"
  116. }
  117. ]
  118. },
  119. {
  120. "id": "claim_81e7f0f6c91247d7a19ac4576bc19245",
  121. "statement": "When ai_log is enabled, send_body appends one record per request (header with timestamp, endpoint and model, pretty request body, RISPOSTA or ERRORE outcome) to ai_requests.log in the data directory, ignoring write failures.",
  122. "evidence": [
  123. {
  124. "resource": "repo://src/ai.rs#L238-L257",
  125. "version": "repo-lines-v1:sha256:ba98f0d5c85a04762a0b5b0f52b0312a6fe7010f6894234828e6040933fd49bd:eyJzZWxlY3RlZExpbmVDb3VudCI6MjAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjUxNzY0ZmUzOGM2MTVjODM3MzM2M2ZhM2U2OTVhNTQ3Y2M0MGM5MjhmZjIwYjE0ZTI3NGRjZjQxNDI5NjI5MjQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjZiMjBlNzhiOGRlMmI1ZDBlYzRlNDgwN2I0ZTNhODFmYzIyYjczMTQ4Mzg2ZWVmNzM1ZjZjYzFlMTIyYjRkZWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJmNjljNjZiNTk4NDRmMjg4YzY3Yzg4NWY2NzQwNmEwNmExNjg4OWI4ZTc4NDMzNDZiMWUzNmRkNjRlYWIzNTUifQ"
  126. },
  127. {
  128. "resource": "repo://src/ai.rs#L473-L516",
  129. "version": "repo-lines-v1:sha256:708d606edee28a507ed556f78b94a9c7da74e9c069e02f390412464b7b2ea30e:eyJzZWxlY3RlZExpbmVDb3VudCI6NDQsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkxYjRlNWM3NzBmZmRlY2QyZDNlNDczNWUxNjFlOGZiMTVmYmM5NTFkZWMyNmI4YmY2ZWQ3MzdjMmVhZmE4MDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZkMjAxZWU4NzY1ZDNhMzAxMjY5NDkzNmVkZjFmNWQ2NzlhMzAyN2ExYTgwMzg0MjJmYTkzZTZmYzllN2RkZWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJjZTgwZDQ1MzU3ZWY2NWZiNjUzODgzZWEzOTU1NDMyMDMzN2Q0YjA3MzcxNzQ1ZWE0MGFkYzRmMGFjNTU0YTcifQ"
  130. },
  131. {
  132. "resource": "repo://src/config.rs#L314-L320",
  133. "version": "repo-lines-v1:sha256:77a53fa11fa04d405caba6426205b2c57c25edd1b59ce057d5429c3cb0af854d:eyJzZWxlY3RlZExpbmVDb3VudCI6NywiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNzUyM2JkYmRjYjY1ZGIyYThmNWU0OGI0ZmUyMDdjOTUxYjdjNzE3NDYxYzgwNjUzODMxNjExZGI0YjMxZjdhZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDg5M2Y0MGUzNzgxZWI4OTZjODJkMDQ2YTA4MDY3YTExZTM1Y2RmMmYxZGZhZjI2ZmVhOTBiOGRiNjY3NjQxMyIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNDRhMWY2MWFmZTk3ZWM0YWZjODI1OWM4ZGI4MDljZjlmMjkxNWQ3ZWUwYWRlZWJhNzdkZDMxZDBjZmJkM2JhZSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiYTUyMTYwNGIzNWZjNDBhZjAwY2JhNGVlYTJmZDVlMmMzYWYxODYzYjM5MTE4NWQ3YmY0YmIwOWU3MmQwYzhiMyJ9"
  134. }
  135. ]
  136. },
  137. {
  138. "id": "claim_f0daf29d06b746e4a4770b63d4051776",
  139. "statement": "Log records replace image base64 data URLs with a placeholder carrying only the payload length and never include the API key.",
  140. "evidence": [
  141. {
  142. "resource": "repo://src/ai.rs#L424-L471",
  143. "version": "repo-lines-v1:sha256:e830f325d8c43a24ff3d984cdf42ad06554b5a92cf56bc4bf6c77a580822e60c:eyJzZWxlY3RlZExpbmVDb3VudCI6NDgsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjNhZmRkOGE1NjBlNzQ4ZmFmNGRlZDhhYjJmOWU4NmUyMTU5NDA1YTAxMGUwYzE4YjI2M2NhNDE4MzAxMzFjZTciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjcwZmRhNDBjNDBhZTM2Yzk5ODVhZWRjMDE5MDM3NDJmMTViYmY5ZDY4N2IxZjk1MTVmZDkwOWU2ZGUzY2E2ZTkiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjFmYjc4NDZkODI2ZmYyZmU0ZGExODEzZjRmODQxM2ViOWEyMWQwZjZlNWUwOTFkMjFhMDI1OWI3NzhiOGIyNWMifQ"
  144. },
  145. {
  146. "resource": "repo://src/ai.rs#L473-L495",
  147. "version": "repo-lines-v1:sha256:e7220f3e055e3aba45c898158efa96ce9e802fc18cbcac7911028d984018c8ad:eyJzZWxlY3RlZExpbmVDb3VudCI6MjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkxYjRlNWM3NzBmZmRlY2QyZDNlNDczNWUxNjFlOGZiMTVmYmM5NTFkZWMyNmI4YmY2ZWQ3MzdjMmVhZmE4MDciLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImZkMjAxZWU4NzY1ZDNhMzAxMjY5NDkzNmVkZjFmNWQ2NzlhMzAyN2ExYTgwMzg0MjJmYTkzZTZmYzllN2RkZWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjNhNTdiMWEyNDNlMjM2MjAyZjY2OGUyYmMwY2EyMTMwNDJmOTgwYzM4NGY4ZmMwZWRlNWZlN2ZiYzNkOTEyY2UifQ"
  148. }
  149. ]
  150. },
  151. {
  152. "id": "claim_9851fadc06844be99a0f3d957816a806",
  153. "statement": "Completions are sent through send_with_retry, which makes up to 1 + ai_retries attempts, retrying only errors accepted by is_retryable and returning the last attempt's error.",
  154. "evidence": [
  155. {
  156. "resource": "repo://src/ai.rs#L215-L236",
  157. "version": "repo-lines-v1:sha256:d5a01e2627147cde8f8cbee315d1c0b7ec0b988745e4b6de771e10c7aecdb27e:eyJzZWxlY3RlZExpbmVDb3VudCI6MjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjYwNzBmYTg1ZjNiN2RjOGYwM2QwYjBmMjA2NWNhYzQ5NWYxNWQyNzQwMWExN2I4YzE2Y2Q4ZmQ5YWIwMWQ0MWQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjZiMjBlNzhiOGRlMmI1ZDBlYzRlNDgwN2I0ZTNhODFmYzIyYjczMTQ4Mzg2ZWVmNzM1ZjZjYzFlMTIyYjRkZWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjExYWIwMTYzYTk2YjkzZWI0ODA1NmUxM2Y4ODUzMTJmOGVhNDQ5NjcwYmY3MWU2ZTRiZTAxOTU0ODg1OTk2YjEifQ"
  158. }
  159. ]
  160. },
  161. {
  162. "id": "claim_3db025b2e15e4fafb172f9c85b626365",
  163. "statement": "is_retryable rejects HTTP 4xx responses other than 429 and accepts 429, 5xx and every non-status failure.",
  164. "evidence": [
  165. {
  166. "resource": "repo://src/ai.rs#L294-L309",
  167. "version": "repo-lines-v1:sha256:29bbd06d8acee1a3e8788f3a5d669981da5c3ff1da3d4ad7b5a66e0cfcd3a69a:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQxOGVkNTcxN2U3MjlmODcxM2RkZjJiYWE4ZGI1ZGZlZDgzNWYyY2JhZDI3ZGEwNTUwMzgwMWNiNmZlNTAwNGYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxMmNhMzQ1Y2NmNzViZjljMDgwNmJjZTY5NWJlOGRlODA4Yjc5OTg0MjUxYTdhNTRkMjAyY2Y2MTAxZGQ0NTEiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjE5ZTc2MzU1Y2YxMTk5NDgwYzNmOTk4MzZiMTQ4NmM4NDFkODkxZmFhZDkwNGM2MDhlMDkzMDIyZDM3NTdhZWUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjVjZGFjZmMzNDYzZjY1NDljYjAzNTQ0MzdiNjg3N2YzYmNlZjVhNWQ4NDk2YmMwYjFhYzc0YTE5OWUyY2Q0YTEifQ"
  168. },
  169. {
  170. "resource": "repo://src/ai.rs#L815-L827",
  171. "version": "repo-lines-v1:sha256:ca506079bde5869a2030b03b404d24fe4f1aff152bd99d9f352fb55bbbd97ef9:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjBiYjUyNzU4NmNlYTg4OTNjNTY4ZjQzNDcxMTYwZjc1ZmY1YjAwMmJlYmFmYzExYmYyYzAxNDYwZDIzZDM4NTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImEwMGRiMDQwZjI5MDliZjk3OGZmMGE5NTZhNTVlODNjNjUzNDE4ZGU2YmI2OGY4MDQxZGE5NzZmOGQzZDIyNzAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImFhNTVkYzhiMzVlYzYwZGNmZDI4Mjc4NzJlMmM4MjAyNmFhN2I3NGZmMjMyMzUxZmQ4MGVmZTgyZjhkNjUzZjUifQ"
  172. }
  173. ]
  174. },
  175. {
  176. "id": "claim_7034e6fb066940d290795dfacb0eec1f",
  177. "statement": "The wait before retry number n is 2 seconds times n (linear backoff).",
  178. "evidence": [
  179. {
  180. "resource": "repo://src/ai.rs#L311-L318",
  181. "version": "repo-lines-v1:sha256:97d05ac13a6dbe53449bb68ab41111ae5cd01fd47dfe333a12720fe3807b20ca:eyJzZWxlY3RlZExpbmVDb3VudCI6OCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiOTIwYTE1YWFhMWYxOTliZDY5OWE4ZDYwMmUxZjBmZTI4Y2EzZjY5MDBiYzdkMzRlNTA5ZjA3MDQ5ZjRkN2FiNCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNDEyY2EzNDVjY2Y3NWJmOWMwODA2YmNlNjk1YmU4ZGU4MDhiNzk5ODQyNTFhN2E1NGQyMDJjZjYxMDFkZDQ1MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMTllNzYzNTVjZjExOTk0ODBjM2Y5OTgzNmIxNDg2Yzg0MWQ4OTFmYWFkOTA0YzYwOGUwOTMwMjJkMzc1N2FlZSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMmIxNGY0OGEzYjA0NzBiZWJhYWYzOTkyZGUzMWVjOTIzNzQ2OGI2NjhiZGYyOTE3NzgzODdiZGZmNmVmZWM3ZiJ9"
  182. },
  183. {
  184. "resource": "repo://src/ai.rs#L38-L38",
  185. "version": "repo-lines-v1:sha256:c0abec049dcec979dadad10a8d96775d266ee7888872117d2eee460f37308a08:eyJzZWxlY3RlZExpbmVDb3VudCI6MSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiYzBhYmVjMDQ5ZGNlYzk3OWRhZGFkMTBhOGQ5Njc3NWQyNjZlZTc4ODg4NzIxMTdkMmVlZTQ2MGYzNzMwOGEwOCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiYzBhYmVjMDQ5ZGNlYzk3OWRhZGFkMTBhOGQ5Njc3NWQyNjZlZTc4ODg4NzIxMTdkMmVlZTQ2MGYzNzMwOGEwOCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYjhhZjk3MTA0ZmI2ZjRhYjViOTFiZmQ5YWZhMzNkOTYxOTkwMGU1NWFmYmUwZmRkY2U5ZTFhYjNhYmQwOWNhYyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMmY3MWIyNDhhODJmN2JmNDRjNTJmZjg4OTY0M2JlYmY0YjVhY2NmZDg3ZjM5YjM1YjE0ZmI1NTYyZGQxNGU4OCJ9"
  186. }
  187. ]
  188. },
  189. {
  190. "id": "claim_6439ccd0b4f54d9cad75a0e3501d84fb",
  191. "statement": "When ai_log is enabled, one log record is appended per attempt, so each retry is logged separately.",
  192. "evidence": [
  193. {
  194. "resource": "repo://src/ai.rs#L222-L257",
  195. "version": "repo-lines-v1:sha256:62a72cdb2ab2e3786211b08faa8c92071d19a7d061bf7588f394b3a5f0f2e602:eyJzZWxlY3RlZExpbmVDb3VudCI6MzYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ5MDNlZTRhMmIxYTAzYWQ1OTllYzZmYzk3MTljMDRlNWE4YzBiNjc2OTI5ZTcxYmM1ZjA5ZTNlM2M4ZWEyOGIiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQ4OTNmNDBlMzc4MWViODk2YzgyZDA0NmEwODA2N2ExMWUzNWNkZjJmMWRmYWYyNmZlYTkwYjhkYjY2NzY0MTMiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjIxNTYzYjg3YWUxODczMjczNmEwZDU1MTcwYjRkYTE1NGY5MGE3MmI2YTE2YWNjMDRjOTMwYTgxZDFhNmFjNWQiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjJmNjljNjZiNTk4NDRmMjg4YzY3Yzg4NWY2NzQwNmEwNmExNjg4OWI4ZTc4NDMzNDZiMWUzNmRkNjRlYWIzNTUifQ"
  196. }
  197. ]
  198. }
  199. ],
  200. "verification": {
  201. "by": "openwiki/0.7.2",
  202. "at": "2026-10-20T20:27:06.515Z"
  203. }
  204. }