recce-nightly 1.28.0.20251208__tar.gz → 1.32.0.20260113a0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of recce-nightly might be problematic. Click here for more details.

Files changed (256) hide show
  1. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/.gitignore +7 -0
  2. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/PKG-INFO +54 -1
  3. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/README.md +53 -0
  4. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/pyproject.toml +6 -0
  5. recce_nightly-1.32.0.20260113a0/recce/VERSION +1 -0
  6. recce_nightly-1.32.0.20260113a0/recce/VERSION.bak +1 -0
  7. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/adapter/dbt_adapter/__init__.py +45 -6
  8. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/apis/run_func.py +34 -4
  9. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/cli.py +25 -4
  10. recce_nightly-1.32.0.20260113a0/recce/data/.gitkeep +0 -0
  11. recce_nightly-1.32.0.20260113a0/recce/data/404/index.html +2 -0
  12. recce_nightly-1.32.0.20260113a0/recce/data/404.html +2 -0
  13. recce_nightly-1.32.0.20260113a0/recce/data/__next.@lineage.!KHNsb3Qp.__PAGE__.txt +7 -0
  14. recce_nightly-1.32.0.20260113a0/recce/data/__next.@lineage.!KHNsb3Qp.txt +4 -0
  15. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/__next.__PAGE__.txt +2 -2
  16. recce_nightly-1.32.0.20260113a0/recce/data/__next._full.txt +33 -0
  17. recce_nightly-1.32.0.20260113a0/recce/data/__next._head.txt +6 -0
  18. recce_nightly-1.32.0.20260113a0/recce/data/__next._index.txt +15 -0
  19. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/__next._tree.txt +5 -5
  20. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/058ff74552b21862.js +1 -0
  21. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/08774b5f5d2409cf.js +1 -0
  22. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/0c8a7df4da7d1abd.js +1 -0
  23. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/1123b11b9536380a.js +1 -0
  24. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/12a01e1b9d6c9851.js +74 -0
  25. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/12ce527381ac41a0.js +9 -0
  26. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/1c892b1043430ede.js +1 -0
  27. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/1e4334d18b8a3acd.css +1 -0
  28. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/84b39e920d56185f.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/20e5889b8080b252.js +1 -1
  29. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/2192fa09d635fc40.js +1 -0
  30. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/40369ff1dc5b7b50.css → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/21eb68f20f428055.css +1 -2
  31. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/4149ea2824442ca7.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/22ffdfc5c7ffdcd5.js +1 -1
  32. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/db3a7542d7e3920a.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/2982366f89a5f741.js +1 -1
  33. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/2ada8753dabf1032.js +48 -0
  34. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/39999944e7676c4f.js +2 -0
  35. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/429ab504c7e69752.js +1 -0
  36. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/4d678259ce3436b0.js +53 -0
  37. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/541d148d76987a33.js +1 -0
  38. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/5c80abea6520f14a.js +1 -0
  39. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/5f81d085dcde10f2.js +5 -0
  40. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/77c3815a3f1feea2.js +1 -0
  41. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/7e750f6f5f5542e3.js +9 -0
  42. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/7af6b9e009c4950d.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/8f55db26be2ff1a8.js +1 -1
  43. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/94a3ae8b72310f75.js +1 -0
  44. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/94edc22174f48b9a.js +48 -0
  45. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/9d07ac7beaf2f874.js +25 -0
  46. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/a6681c810d31e8c7.js +5 -0
  47. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/a6dad97d9634a72d.js.map +1 -0
  48. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/a52a26d8f55cf7b6.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/b860325dc46e47c2.js +1 -1
  49. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/bdfcf621148ad9ee.js +1 -0
  50. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/620ef007f7c37991.js → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/c81f26d58461bf9e.js +1 -1
  51. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/d2565e3572b1ead7.js +38 -0
  52. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/de16e4ed3c137fec.js +101 -0
  53. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/ebdfbcf5fd8e998e.js +1 -0
  54. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/ed46900f63166b58.css +3 -0
  55. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/f2c59bf02f955ace.css +1 -0
  56. recce_nightly-1.32.0.20260113a0/recce/data/_next/static/chunks/turbopack-0e990351bb10571c.js +4 -0
  57. recce_nightly-1.32.0.20260113a0/recce/data/_not-found/__next._full.txt +24 -0
  58. recce_nightly-1.32.0.20260113a0/recce/data/_not-found/__next._head.txt +6 -0
  59. recce_nightly-1.32.0.20260113a0/recce/data/_not-found/__next._index.txt +13 -0
  60. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_not-found/__next._not-found.__PAGE__.txt +2 -2
  61. recce_nightly-1.32.0.20260113a0/recce/data/_not-found/__next._not-found.txt +4 -0
  62. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_not-found/__next._tree.txt +4 -4
  63. recce_nightly-1.32.0.20260113a0/recce/data/_not-found/index.html +2 -0
  64. recce_nightly-1.32.0.20260113a0/recce/data/_not-found/index.txt +24 -0
  65. recce_nightly-1.32.0.20260113a0/recce/data/checks/__next.@lineage.__DEFAULT__.txt +7 -0
  66. recce_nightly-1.32.0.20260113a0/recce/data/checks/__next._full.txt +35 -0
  67. recce_nightly-1.32.0.20260113a0/recce/data/checks/__next._head.txt +6 -0
  68. recce_nightly-1.32.0.20260113a0/recce/data/checks/__next._index.txt +15 -0
  69. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/checks/__next._tree.txt +5 -5
  70. recce_nightly-1.32.0.20260113a0/recce/data/checks/__next.checks.__PAGE__.txt +10 -0
  71. recce_nightly-1.32.0.20260113a0/recce/data/checks/__next.checks.txt +4 -0
  72. recce_nightly-1.32.0.20260113a0/recce/data/checks/index.html +2 -0
  73. recce_nightly-1.32.0.20260113a0/recce/data/checks/index.txt +35 -0
  74. recce_nightly-1.32.0.20260113a0/recce/data/index.html +2 -0
  75. recce_nightly-1.32.0.20260113a0/recce/data/index.txt +33 -0
  76. recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next.@lineage.__DEFAULT__.txt +7 -0
  77. recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next._full.txt +35 -0
  78. recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next._head.txt +6 -0
  79. recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next._index.txt +15 -0
  80. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/lineage/__next._tree.txt +5 -5
  81. recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next.lineage.__PAGE__.txt +9 -0
  82. recce_nightly-1.32.0.20260113a0/recce/data/lineage/__next.lineage.txt +4 -0
  83. recce_nightly-1.32.0.20260113a0/recce/data/lineage/index.html +2 -0
  84. recce_nightly-1.32.0.20260113a0/recce/data/lineage/index.txt +35 -0
  85. recce_nightly-1.32.0.20260113a0/recce/data/query/__next.@lineage.__DEFAULT__.txt +7 -0
  86. recce_nightly-1.32.0.20260113a0/recce/data/query/__next._full.txt +35 -0
  87. recce_nightly-1.32.0.20260113a0/recce/data/query/__next._head.txt +6 -0
  88. recce_nightly-1.32.0.20260113a0/recce/data/query/__next._index.txt +15 -0
  89. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/query/__next._tree.txt +5 -5
  90. recce_nightly-1.32.0.20260113a0/recce/data/query/__next.query.__PAGE__.txt +9 -0
  91. recce_nightly-1.32.0.20260113a0/recce/data/query/__next.query.txt +4 -0
  92. recce_nightly-1.32.0.20260113a0/recce/data/query/index.html +2 -0
  93. recce_nightly-1.32.0.20260113a0/recce/data/query/index.txt +35 -0
  94. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/mcp_server.py +167 -7
  95. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/models/check.py +10 -2
  96. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/models/run.py +0 -3
  97. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/server.py +38 -13
  98. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/state/cloud.py +2 -0
  99. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/summary.py +2 -1
  100. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/profile.py +2 -2
  101. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/query.py +40 -3
  102. recce_nightly-1.32.0.20260113a0/recce/tasks/utils.py +147 -0
  103. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/valuediff.py +84 -56
  104. recce_nightly-1.32.0.20260113a0/recce/util/startup_perf.py +121 -0
  105. recce_nightly-1.28.0.20251208/recce/VERSION +0 -1
  106. recce_nightly-1.28.0.20251208/recce/data/404.html +0 -2
  107. recce_nightly-1.28.0.20251208/recce/data/__next.@lineage.!KHNsb3Qp.__PAGE__.txt +0 -7
  108. recce_nightly-1.28.0.20251208/recce/data/__next.@lineage.!KHNsb3Qp.txt +0 -4
  109. recce_nightly-1.28.0.20251208/recce/data/__next._full.txt +0 -35
  110. recce_nightly-1.28.0.20251208/recce/data/__next._head.txt +0 -8
  111. recce_nightly-1.28.0.20251208/recce/data/__next._index.txt +0 -14
  112. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/0489710f83376429.js +0 -1
  113. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/0d2c3b8c8eba1c62.js +0 -2
  114. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/11a2a2967dd70bfc.js +0 -4
  115. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/176e43f2d695c339.js +0 -1
  116. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/1cf016339b18d43c.js +0 -11
  117. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/20e6b06ab6f05dd0.js +0 -2
  118. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/305ac5b2525ffc64.js +0 -2
  119. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/47564ecaa69df934.js +0 -1
  120. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/8feaa72f5cf4b1dc.css +0 -1
  121. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/9c054b0600e24469.js +0 -12
  122. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/a7f990c720047721.js +0 -1
  123. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/a8dfac6ccae9e75f.js +0 -1
  124. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/ab04baeee30276cb.js +0 -1
  125. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/ab4525e48355a85e.js +0 -1
  126. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/b38427ccdc316e3d.js +0 -1
  127. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/cf15cb904925f808.js +0 -1
  128. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/d0f91117d77ff844.css +0 -1
  129. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/d42f134c322cba42.js +0 -74
  130. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/d917bc8d5a83f3ba.js +0 -1
  131. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/deeef6d77883a7dc.js +0 -1
  132. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/e3cbc8623fb2b320.js +0 -34
  133. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/ebe8befeee9f808b.js +0 -1
  134. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/f2518281d70c5c02.js +0 -1
  135. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/f61ff1ff6b6a807d.js +0 -12
  136. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/f78dd13fdf964550.js +0 -1
  137. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/ff4f7584a2ae9ff8.js +0 -1
  138. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/ffe5529fff9d6fe6.css +0 -2
  139. recce_nightly-1.28.0.20251208/recce/data/_next/static/chunks/turbopack-ffda7a361cccaf35.js +0 -3
  140. recce_nightly-1.28.0.20251208/recce/data/_next/static/media/reload-image.7aa931c7.svg +0 -4
  141. recce_nightly-1.28.0.20251208/recce/data/_not-found/__next._full.txt +0 -24
  142. recce_nightly-1.28.0.20251208/recce/data/_not-found/__next._head.txt +0 -8
  143. recce_nightly-1.28.0.20251208/recce/data/_not-found/__next._index.txt +0 -13
  144. recce_nightly-1.28.0.20251208/recce/data/_not-found/__next._not-found.txt +0 -4
  145. recce_nightly-1.28.0.20251208/recce/data/_not-found.html +0 -2
  146. recce_nightly-1.28.0.20251208/recce/data/_not-found.txt +0 -24
  147. recce_nightly-1.28.0.20251208/recce/data/checks/__next.@lineage.__DEFAULT__.txt +0 -7
  148. recce_nightly-1.28.0.20251208/recce/data/checks/__next._full.txt +0 -38
  149. recce_nightly-1.28.0.20251208/recce/data/checks/__next._head.txt +0 -8
  150. recce_nightly-1.28.0.20251208/recce/data/checks/__next._index.txt +0 -14
  151. recce_nightly-1.28.0.20251208/recce/data/checks/__next.checks.__PAGE__.txt +0 -10
  152. recce_nightly-1.28.0.20251208/recce/data/checks/__next.checks.txt +0 -4
  153. recce_nightly-1.28.0.20251208/recce/data/checks.html +0 -2
  154. recce_nightly-1.28.0.20251208/recce/data/checks.txt +0 -38
  155. recce_nightly-1.28.0.20251208/recce/data/index.html +0 -2
  156. recce_nightly-1.28.0.20251208/recce/data/index.txt +0 -35
  157. recce_nightly-1.28.0.20251208/recce/data/lineage/__next.@lineage.__DEFAULT__.txt +0 -7
  158. recce_nightly-1.28.0.20251208/recce/data/lineage/__next._full.txt +0 -38
  159. recce_nightly-1.28.0.20251208/recce/data/lineage/__next._head.txt +0 -8
  160. recce_nightly-1.28.0.20251208/recce/data/lineage/__next._index.txt +0 -14
  161. recce_nightly-1.28.0.20251208/recce/data/lineage/__next.lineage.__PAGE__.txt +0 -10
  162. recce_nightly-1.28.0.20251208/recce/data/lineage/__next.lineage.txt +0 -4
  163. recce_nightly-1.28.0.20251208/recce/data/lineage.html +0 -2
  164. recce_nightly-1.28.0.20251208/recce/data/lineage.txt +0 -38
  165. recce_nightly-1.28.0.20251208/recce/data/query/__next.@lineage.__DEFAULT__.txt +0 -7
  166. recce_nightly-1.28.0.20251208/recce/data/query/__next._full.txt +0 -36
  167. recce_nightly-1.28.0.20251208/recce/data/query/__next._head.txt +0 -8
  168. recce_nightly-1.28.0.20251208/recce/data/query/__next._index.txt +0 -14
  169. recce_nightly-1.28.0.20251208/recce/data/query/__next.query.__PAGE__.txt +0 -9
  170. recce_nightly-1.28.0.20251208/recce/data/query/__next.query.txt +0 -4
  171. recce_nightly-1.28.0.20251208/recce/data/query.html +0 -2
  172. recce_nightly-1.28.0.20251208/recce/data/query.txt +0 -36
  173. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/LICENSE +0 -0
  174. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/__init__.py +0 -0
  175. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/adapter/__init__.py +0 -0
  176. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/adapter/base.py +0 -0
  177. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/adapter/dbt_adapter/dbt_version.py +0 -0
  178. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/adapter/sqlmesh_adapter.py +0 -0
  179. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/apis/__init__.py +0 -0
  180. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/apis/check_api.py +0 -0
  181. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/apis/check_events_api.py +0 -0
  182. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/apis/check_func.py +0 -0
  183. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/apis/run_api.py +0 -0
  184. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/artifact.py +0 -0
  185. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/config.py +0 -0
  186. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/connect_to_cloud.py +0 -0
  187. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/core.py +0 -0
  188. {recce_nightly-1.28.0.20251208/recce/data/_next/static/vSqwDa77se-B9vgwcHKDr → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/98tBhkYDWuAefdA7Ln9XX}/_buildManifest.js +0 -0
  189. {recce_nightly-1.28.0.20251208/recce/data/_next/static/vSqwDa77se-B9vgwcHKDr → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/98tBhkYDWuAefdA7Ln9XX}/_clientMiddlewareManifest.json +0 -0
  190. {recce_nightly-1.28.0.20251208/recce/data/_next/static/vSqwDa77se-B9vgwcHKDr → recce_nightly-1.32.0.20260113a0/recce/data/_next/static/98tBhkYDWuAefdA7Ln9XX}/_ssgManifest.js +0 -0
  191. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/chunks/5c4dfb0d09eaa401.js +0 -0
  192. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/chunks/6d8557f062aa4386.css +0 -0
  193. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/chunks/923964f18c87d0f1.css +0 -0
  194. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/chunks/a6dad97d9634a72d.js +0 -0
  195. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
  196. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
  197. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff +0 -0
  198. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
  199. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff +0 -0
  200. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
  201. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff +0 -0
  202. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
  203. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff +0 -0
  204. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff +0 -0
  205. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
  206. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/auth_callback.html +0 -0
  207. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/favicon.ico +0 -0
  208. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/imgs/feedback/thumbs-down.png +0 -0
  209. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/imgs/feedback/thumbs-up.png +0 -0
  210. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/imgs/reload-image.svg +0 -0
  211. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/data/logo/recce-logo-white.png +0 -0
  212. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/diff.py +0 -0
  213. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/event/CONFIG +0 -0
  214. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/event/CONFIG.bak +0 -0
  215. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/event/SENTRY_DNS +0 -0
  216. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/event/__init__.py +0 -0
  217. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/event/collector.py +0 -0
  218. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/event/track.py +0 -0
  219. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/exceptions.py +0 -0
  220. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/git.py +0 -0
  221. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/github.py +0 -0
  222. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/models/__init__.py +0 -0
  223. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/models/types.py +0 -0
  224. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/pull_request.py +0 -0
  225. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/run.py +0 -0
  226. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/state/__init__.py +0 -0
  227. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/state/const.py +0 -0
  228. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/state/local.py +0 -0
  229. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/state/state.py +0 -0
  230. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/state/state_loader.py +0 -0
  231. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/__init__.py +0 -0
  232. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/core.py +0 -0
  233. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/dataframe.py +0 -0
  234. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/histogram.py +0 -0
  235. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/lineage.py +0 -0
  236. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/rowcount.py +0 -0
  237. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/schema.py +0 -0
  238. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/tasks/top_k.py +0 -0
  239. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/__init__.py +0 -0
  240. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/api_token.py +0 -0
  241. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/breaking.py +0 -0
  242. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/cache.py +0 -0
  243. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/cll.py +0 -0
  244. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/cloud/__init__.py +0 -0
  245. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/cloud/base.py +0 -0
  246. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/cloud/check_events.py +0 -0
  247. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/cloud/checks.py +0 -0
  248. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/io.py +0 -0
  249. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/lineage.py +0 -0
  250. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/logger.py +0 -0
  251. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/onboarding_state.py +0 -0
  252. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/perf_tracking.py +0 -0
  253. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/pydantic_model.py +0 -0
  254. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/recce_cloud.py +0 -0
  255. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/util/singleton.py +0 -0
  256. {recce_nightly-1.28.0.20251208 → recce_nightly-1.32.0.20260113a0}/recce/yaml/__init__.py +0 -0
@@ -17,3 +17,10 @@ build
17
17
  .DS_Store
18
18
 
19
19
  recce.yml
20
+
21
+ # Ignore build artifacts from frontend
22
+ recce/data
23
+ .worktrees
24
+
25
+ # ignore Claude logs and plans
26
+ docs/plans
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: recce-nightly
3
- Version: 1.28.0.20251208
3
+ Version: 1.32.0.20260113a0
4
4
  Summary: Environment diff tool for dbt
5
5
  Project-URL: Bug Tracker, https://github.com/InfuseAI/recce/issues
6
6
  Project-URL: Homepage, https://github.com/InfuseAI/recce
@@ -88,6 +88,7 @@ Description-Content-Type: text/markdown
88
88
  </p>
89
89
 
90
90
  ## Trust, Verify, Ship
91
+
91
92
  Cut dbt review time by 90% and ship accurate data fast
92
93
 
93
94
  Recce gives data teams a faster, more reliable way to understand, review, and ship changes without all the guesswork or manual overhead.
@@ -99,12 +100,14 @@ Recce gives data teams a faster, more reliable way to understand, review, and sh
99
100
  Recce offers two packages to fit different use cases:
100
101
 
101
102
  **For full local development and Recce Cloud features:**
103
+
102
104
  ```bash
103
105
  pip install -U recce
104
106
  recce server
105
107
  ```
106
108
 
107
109
  **For CI/CD artifact uploads only (lightweight):**
110
+
108
111
  ```bash
109
112
  pip install -U recce-cloud
110
113
  recce-cloud upload
@@ -122,6 +125,8 @@ pip install -U recce
122
125
  recce server
123
126
  ```
124
127
 
128
+ (Note: while recce is not version spsecific, `dbt-core` is currently [not compatible with Python 3.13](https://docs.getdbt.com/faqs/Core/install-python-compatibility). Please make sure to use Python 3.10 - 3.12.)
129
+
125
130
  This starts Recce locally, where you can explore lineage and run queries. To unlock the full set of diffing tools, such as data comparisons and impact checks, you'll need to prepare two environments to compare against. You can follow our [Getting Started](https://docs.reccehq.com/get-started/) and [5-minute Jaffle Shop tutorial](https://docs.reccehq.com/get-started-jaffle-shop/) to try it out step-by-step.
126
131
 
127
132
  ## What You Get
@@ -167,6 +172,54 @@ Ready to collaborate and move faster as a team? Recce Cloud adds real-time colla
167
172
  Recce Cloud is a hosted version of Recce that standardizes your workflow, keeps teams aligned, and reduces errors—so you can ship data changes with confidence.
168
173
  👉 [View Pricing and Plans](https://reccehq.com/pricing)
169
174
 
175
+ ## Developer Documentation
176
+
177
+ If you want to contribute to Recce or test local changes in your dbt project, follow these steps to install the development version.
178
+
179
+ ### Installing the Local Dev Version
180
+
181
+ 1. **Clone the repository** (if you haven't already):
182
+
183
+ ```bash
184
+ git clone https://github.com/DataRecce/recce.git
185
+ cd recce
186
+ ```
187
+
188
+ 2. **Build the project** from the repository root:
189
+
190
+ ```bash
191
+ make build
192
+ ```
193
+
194
+ This builds the frontend assets and prepares the package for installation.
195
+
196
+ 3. **Install the local dev version** in your dbt project:
197
+
198
+ ```bash
199
+ # Navigate to your dbt project
200
+ cd /path/to/your/dbt-project
201
+
202
+ # Install recce in editable mode (replace with your actual path to the recce repo)
203
+ pip install -e /path/to/recce
204
+ ```
205
+
206
+ Using `-e` (editable mode) means any changes you make to the Recce source code will be immediately available without reinstalling.
207
+
208
+ 4. **Start the Recce server** to verify the installation:
209
+
210
+ ```bash
211
+ recce server
212
+ ```
213
+
214
+ ### Development Tips
215
+
216
+ - After making frontend changes in `js/`, run `make build` again to rebuild the static assets
217
+ - Run `make install-dev` in the recce repository to install development dependencies
218
+ - Use `make test` to run the Python test suite
219
+ - Use `cd js && pnpm test` to run the frontend test suite
220
+
221
+ For more detailed development guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
222
+
170
223
  ## Community & Support
171
224
 
172
225
  Here's where you can get in touch with the Recce team and find support, add a subscribe to our newsletter option as well:
@@ -27,6 +27,7 @@
27
27
  </p>
28
28
 
29
29
  ## Trust, Verify, Ship
30
+
30
31
  Cut dbt review time by 90% and ship accurate data fast
31
32
 
32
33
  Recce gives data teams a faster, more reliable way to understand, review, and ship changes without all the guesswork or manual overhead.
@@ -38,12 +39,14 @@ Recce gives data teams a faster, more reliable way to understand, review, and sh
38
39
  Recce offers two packages to fit different use cases:
39
40
 
40
41
  **For full local development and Recce Cloud features:**
42
+
41
43
  ```bash
42
44
  pip install -U recce
43
45
  recce server
44
46
  ```
45
47
 
46
48
  **For CI/CD artifact uploads only (lightweight):**
49
+
47
50
  ```bash
48
51
  pip install -U recce-cloud
49
52
  recce-cloud upload
@@ -61,6 +64,8 @@ pip install -U recce
61
64
  recce server
62
65
  ```
63
66
 
67
+ (Note: while recce is not version spsecific, `dbt-core` is currently [not compatible with Python 3.13](https://docs.getdbt.com/faqs/Core/install-python-compatibility). Please make sure to use Python 3.10 - 3.12.)
68
+
64
69
  This starts Recce locally, where you can explore lineage and run queries. To unlock the full set of diffing tools, such as data comparisons and impact checks, you'll need to prepare two environments to compare against. You can follow our [Getting Started](https://docs.reccehq.com/get-started/) and [5-minute Jaffle Shop tutorial](https://docs.reccehq.com/get-started-jaffle-shop/) to try it out step-by-step.
65
70
 
66
71
  ## What You Get
@@ -106,6 +111,54 @@ Ready to collaborate and move faster as a team? Recce Cloud adds real-time colla
106
111
  Recce Cloud is a hosted version of Recce that standardizes your workflow, keeps teams aligned, and reduces errors—so you can ship data changes with confidence.
107
112
  👉 [View Pricing and Plans](https://reccehq.com/pricing)
108
113
 
114
+ ## Developer Documentation
115
+
116
+ If you want to contribute to Recce or test local changes in your dbt project, follow these steps to install the development version.
117
+
118
+ ### Installing the Local Dev Version
119
+
120
+ 1. **Clone the repository** (if you haven't already):
121
+
122
+ ```bash
123
+ git clone https://github.com/DataRecce/recce.git
124
+ cd recce
125
+ ```
126
+
127
+ 2. **Build the project** from the repository root:
128
+
129
+ ```bash
130
+ make build
131
+ ```
132
+
133
+ This builds the frontend assets and prepares the package for installation.
134
+
135
+ 3. **Install the local dev version** in your dbt project:
136
+
137
+ ```bash
138
+ # Navigate to your dbt project
139
+ cd /path/to/your/dbt-project
140
+
141
+ # Install recce in editable mode (replace with your actual path to the recce repo)
142
+ pip install -e /path/to/recce
143
+ ```
144
+
145
+ Using `-e` (editable mode) means any changes you make to the Recce source code will be immediately available without reinstalling.
146
+
147
+ 4. **Start the Recce server** to verify the installation:
148
+
149
+ ```bash
150
+ recce server
151
+ ```
152
+
153
+ ### Development Tips
154
+
155
+ - After making frontend changes in `js/`, run `make build` again to rebuild the static assets
156
+ - Run `make install-dev` in the recce repository to install development dependencies
157
+ - Use `make test` to run the Python test suite
158
+ - Use `cd js && pnpm test` to run the frontend test suite
159
+
160
+ For more detailed development guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
161
+
109
162
  ## Community & Support
110
163
 
111
164
  Here's where you can get in touch with the Recce team and find support, add a subscribe to our newsletter option as well:
@@ -83,9 +83,15 @@ pattern = "(?P<version>.+)"
83
83
  include = [
84
84
  "/recce",
85
85
  ]
86
+ artifacts = [
87
+ "/recce/data",
88
+ ]
86
89
 
87
90
  [tool.hatch.build.targets.wheel]
88
91
  packages = ["recce"]
92
+ artifacts = [
93
+ "/recce/data",
94
+ ]
89
95
 
90
96
  [tool.uv.workspace]
91
97
  members = ["recce_cloud"]
@@ -0,0 +1 @@
1
+ 1.32.0.20260113a0
@@ -0,0 +1 @@
1
+ 1.32.0.dev0
@@ -1,6 +1,7 @@
1
1
  import json
2
2
  import logging
3
3
  import os
4
+ import time
4
5
  import uuid
5
6
  from contextlib import contextmanager
6
7
  from copy import deepcopy
@@ -32,6 +33,7 @@ from recce.util.lineage import (
32
33
  find_upstream,
33
34
  )
34
35
  from recce.util.perf_tracking import LineagePerfTracker
36
+ from recce.util.startup_perf import track_timing
35
37
 
36
38
  from ...tasks.profile import ProfileTask
37
39
  from ...util.breaking import BreakingPerformanceTracking, parse_change_category
@@ -110,6 +112,7 @@ from dbt.config.runtime import RuntimeConfig # noqa: E402
110
112
  from dbt.contracts.graph.manifest import ( # noqa: E402
111
113
  MacroManifest,
112
114
  Manifest,
115
+ ManifestMetadata,
113
116
  WritableManifest,
114
117
  )
115
118
  from dbt.contracts.graph.nodes import ManifestNode # noqa: E402
@@ -209,9 +212,12 @@ def as_manifest(m: WritableManifest) -> Manifest:
209
212
  new_data = {k: v for k, v in data.items() if k in all_fields}
210
213
  return Manifest(**new_data)
211
214
  else:
212
- return Manifest.from_writable_manifest(m)
215
+ result = Manifest.from_writable_manifest(m)
216
+ result.metadata = ManifestMetadata(**m.metadata.__dict__)
217
+ return result
213
218
 
214
219
 
220
+ @track_timing(record_size=True)
215
221
  def load_manifest(path: str = None, data: dict = None):
216
222
  if path is not None:
217
223
  if not os.path.isfile(path):
@@ -221,6 +227,7 @@ def load_manifest(path: str = None, data: dict = None):
221
227
  return WritableManifest.upgrade_schema_version(data)
222
228
 
223
229
 
230
+ @track_timing(record_size=True)
224
231
  def load_catalog(path: str = None, data: dict = None):
225
232
  if path is not None:
226
233
  if not os.path.isfile(path):
@@ -279,7 +286,10 @@ class DbtArgs:
279
286
  target_path: Optional[str] = (None,)
280
287
  project_only_flags: Optional[Dict[str, Any]] = None
281
288
  which: Optional[str] = None
282
- state_modified_compare_more_unrendered_values: Optional[bool] = True # new flag added since dbt v1.9
289
+ # Behavior flags - need to be present on args object for set_from_args
290
+ state_modified_compare_more_unrendered_values: Optional[bool] = True # dbt v1.9
291
+ require_unique_project_resource_names: Optional[bool] = False # dbt v1.11
292
+ require_ref_searches_node_package_before_root: Optional[bool] = False # dbt v1.11
283
293
 
284
294
 
285
295
  @dataclass
@@ -473,6 +483,7 @@ class DbtAdapter(BaseAdapter):
473
483
 
474
484
  return result
475
485
 
486
+ @track_timing("artifact_load")
476
487
  def load_artifacts(self):
477
488
  """
478
489
  Load the artifacts from the 'target' and 'target-base' directory
@@ -488,16 +499,20 @@ class DbtAdapter(BaseAdapter):
488
499
 
489
500
  # load the artifacts
490
501
  path = os.path.join(project_root, target_path, "manifest.json")
491
- curr_manifest = load_manifest(path=path)
502
+ curr_manifest = load_manifest(path=path, timing_name="curr_manifest")
492
503
  if curr_manifest is None:
493
504
  raise FileNotFoundError(ENOENT, os.strerror(ENOENT), path)
494
505
  path = os.path.join(project_root, target_base_path, "manifest.json")
495
- base_manifest = load_manifest(path=path)
506
+ base_manifest = load_manifest(path=path, timing_name="base_manifest")
496
507
  if base_manifest is None:
497
508
  raise FileNotFoundError(ENOENT, os.strerror(ENOENT), path)
498
509
 
499
- curr_catalog = load_catalog(path=os.path.join(project_root, target_path, "catalog.json"))
500
- base_catalog = load_catalog(path=os.path.join(project_root, target_base_path, "catalog.json"))
510
+ curr_catalog = load_catalog(
511
+ path=os.path.join(project_root, target_path, "catalog.json"), timing_name="curr_catalog"
512
+ )
513
+ base_catalog = load_catalog(
514
+ path=os.path.join(project_root, target_base_path, "catalog.json"), timing_name="base_catalog"
515
+ )
501
516
 
502
517
  # set the value if all the artifacts are loaded successfully
503
518
  self.curr_manifest = curr_manifest
@@ -801,10 +816,15 @@ class DbtAdapter(BaseAdapter):
801
816
 
802
817
  @lru_cache(maxsize=1)
803
818
  def _get_lineage_diff_cached(self, cache_key) -> LineageDiff:
819
+ start_time = time.perf_counter_ns()
820
+
804
821
  base = self.get_lineage(base=True)
805
822
  current = self.get_lineage(base=False)
806
823
 
824
+ select_start = time.perf_counter_ns()
807
825
  modified_nodes = self.select_nodes(select="state:modified")
826
+ select_elapsed_ms = (time.perf_counter_ns() - select_start) / 1_000_000
827
+
808
828
  diff = {}
809
829
  for node_id in modified_nodes:
810
830
  base_node = base.get("nodes", {}).get(node_id)
@@ -816,6 +836,16 @@ class DbtAdapter(BaseAdapter):
816
836
  elif curr_node:
817
837
  diff[node_id] = NodeDiff(change_status="added")
818
838
 
839
+ total_elapsed_ms = (time.perf_counter_ns() - start_time) / 1_000_000
840
+ log_performance(
841
+ "lineage diff",
842
+ {
843
+ "total_elapsed_ms": total_elapsed_ms,
844
+ "select_modified_elapsed_ms": select_elapsed_ms,
845
+ "modified_nodes": len(modified_nodes),
846
+ },
847
+ )
848
+
819
849
  return LineageDiff(
820
850
  base=base,
821
851
  current=current,
@@ -1524,6 +1554,15 @@ class DbtAdapter(BaseAdapter):
1524
1554
 
1525
1555
  specs = [_parse_difference(select_list, exclude_list)]
1526
1556
 
1557
+ # If packages is not provided, use the project name from manifest metadata as default
1558
+ if packages is None:
1559
+ if (
1560
+ self.manifest.metadata
1561
+ and hasattr(self.manifest.metadata, "project_name")
1562
+ and self.manifest.metadata.project_name
1563
+ ):
1564
+ packages = [self.manifest.metadata.project_name]
1565
+
1527
1566
  if packages is not None:
1528
1567
  package_spec = SelectionUnion([_parse_difference([f"package:{p}"], None) for p in packages])
1529
1568
  specs.append(package_spec)
@@ -74,7 +74,8 @@ def generate_run_name(run):
74
74
 
75
75
 
76
76
  def create_task(run_type: RunType, params: dict):
77
- if default_context().adapter_type == "sqlmesh":
77
+ context = default_context()
78
+ if context is not None and context.adapter_type == "sqlmesh":
78
79
  from recce.adapter.sqlmesh_adapter import (
79
80
  sqlmesh_supported_registry as sqlmesh_registry,
80
81
  )
@@ -122,12 +123,16 @@ def submit_run(type, params, check_id=None):
122
123
 
123
124
  task.progress_listener = progress_listener
124
125
 
125
- async def update_run_result(run_id, result, error):
126
+ async def update_run_result(run, result, error, updated_params=None):
127
+ """Update run with result, error, and optionally updated params."""
126
128
  if run is None:
127
129
  return
128
130
  if result is not None:
129
131
  run.result = result
130
132
  run.status = RunStatus.FINISHED
133
+ if updated_params is not None:
134
+ # Merge updated params (preserves any fields not in updated_params)
135
+ run.params.update(updated_params)
131
136
  if error is not None:
132
137
  failed_reason = str(error) if str(error) != "None" else repr(error)
133
138
  run.error = failed_reason
@@ -138,10 +143,35 @@ def submit_run(type, params, check_id=None):
138
143
  def fn():
139
144
  try:
140
145
  result = task.execute()
141
- asyncio.run_coroutine_threadsafe(update_run_result(run.run_id, result, None), loop)
146
+
147
+ # Extract updated params from task after execution
148
+ updated_params = None
149
+ if hasattr(task, "params") and task.params is not None:
150
+ # Serialization logic:
151
+ # - Most tasks use Pydantic models (v2: model_dump, v1: dict)
152
+ # - Some tasks may use plain dicts
153
+ # - If params is an unexpected type, log a warning for debugging
154
+ # - Handle the case where model_dump() or dict() raises an exception.
155
+ try:
156
+ if hasattr(task.params, "model_dump"):
157
+ updated_params = task.params.model_dump()
158
+ elif hasattr(task.params, "dict"):
159
+ updated_params = task.params.dict()
160
+ elif isinstance(task.params, dict):
161
+ updated_params = task.params
162
+ else:
163
+ logger.warning(
164
+ f"Could not serialize task.params for run_id={run.run_id}: "
165
+ f"unexpected type {type(task.params)} with value {repr(task.params)}"
166
+ )
167
+ except Exception as e:
168
+ logger.warning(f"Failed to serialize task.params: {e}")
169
+ updated_params = None
170
+
171
+ asyncio.run_coroutine_threadsafe(update_run_result(run, result, None, updated_params), loop)
142
172
  return result
143
173
  except BaseException as e:
144
- asyncio.run_coroutine_threadsafe(update_run_result(run.run_id, None, e), loop)
174
+ asyncio.run_coroutine_threadsafe(update_run_result(run, None, e, None), loop)
145
175
  if isinstance(e, RecceException) and e.is_raise is False:
146
176
  return None
147
177
  import sentry_sdk
@@ -37,6 +37,7 @@ from recce.util.onboarding_state import update_onboarding_state
37
37
  from recce.util.recce_cloud import (
38
38
  RecceCloudException,
39
39
  )
40
+ from recce.util.startup_perf import track_timing
40
41
 
41
42
  from .core import RecceContext, set_default_context
42
43
  from .event.track import TrackCommand
@@ -76,6 +77,7 @@ def patch_derived_args(args):
76
77
  args["review"] = True
77
78
 
78
79
 
80
+ @track_timing("state_loader_init")
79
81
  def create_state_loader_by_args(state_file=None, **kwargs):
80
82
  """
81
83
  Create a state loader based on CLI arguments.
@@ -529,12 +531,19 @@ def server(host, port, lifetime, idle_timeout=0, state_file=None, **kwargs):
529
531
 
530
532
  RecceConfig(config_file=kwargs.get("config"))
531
533
 
534
+ # Initialize startup performance tracking
535
+ from recce.util.startup_perf import StartupPerfTracker, set_startup_tracker
536
+
537
+ startup_tracker = StartupPerfTracker()
538
+ set_startup_tracker(startup_tracker)
539
+
532
540
  handle_debug_flag(**kwargs)
533
541
  patch_derived_args(kwargs)
534
542
 
535
543
  server_mode = kwargs.get("mode") if kwargs.get("mode") else RecceServerMode.server
536
544
  is_review = kwargs.get("review", False)
537
545
  is_cloud = kwargs.get("cloud", False)
546
+ startup_tracker.set_cloud_mode(is_cloud)
538
547
  flag = {
539
548
  "single_env_onboarding": False,
540
549
  "show_relaunch_hint": False,
@@ -580,8 +589,13 @@ def server(host, port, lifetime, idle_timeout=0, state_file=None, **kwargs):
580
589
  update_onboarding_state(api_token, flag.get("single_env_onboarding"))
581
590
 
582
591
  # Create state loader using shared function
592
+ from recce.util.startup_perf import get_startup_tracker
593
+
583
594
  state_loader = create_state_loader_by_args(state_file, **kwargs)
584
595
 
596
+ if (tracker := get_startup_tracker()) and hasattr(state_loader, "catalog"):
597
+ tracker.set_catalog_type(state_loader.catalog)
598
+
585
599
  if not state_loader.verify():
586
600
  error, hint = state_loader.error_and_hint
587
601
  console.print(f"[[red]Error[/red]] {error}")
@@ -1734,6 +1748,7 @@ def read_only(ctx, state_file=None, **kwargs):
1734
1748
 
1735
1749
 
1736
1750
  @cli.command(cls=TrackCommand)
1751
+ @click.argument("state_file", required=False)
1737
1752
  @click.option("--sse", is_flag=True, default=False, help="Start in HTTP/SSE mode instead of stdio mode")
1738
1753
  @click.option("--host", default="localhost", help="Host to bind to in SSE mode (default: localhost)")
1739
1754
  @click.option("--port", default=8000, type=int, help="Port to bind to in SSE mode (default: 8000)")
@@ -1744,7 +1759,7 @@ def read_only(ctx, state_file=None, **kwargs):
1744
1759
  @add_options(recce_cloud_options)
1745
1760
  @add_options(recce_cloud_auth_options)
1746
1761
  @add_options(recce_hidden_options)
1747
- def mcp_server(sse, host, port, **kwargs):
1762
+ def mcp_server(state_file, sse, host, port, **kwargs):
1748
1763
  """
1749
1764
  Start the Recce MCP (Model Context Protocol) server
1750
1765
 
@@ -1752,12 +1767,18 @@ def mcp_server(sse, host, port, **kwargs):
1752
1767
  with Recce's data validation capabilities. By default, it uses stdio for
1753
1768
  communication. Use --sse to enable HTTP/Server-Sent Events mode instead.
1754
1769
 
1770
+ STATE_FILE is the path to the recce state file (optional).
1771
+
1755
1772
  Examples:\n
1756
1773
 
1757
1774
  \b
1758
1775
  # Start the MCP server in stdio mode (default)
1759
1776
  recce mcp-server
1760
1777
 
1778
+ \b
1779
+ # Start with a state file
1780
+ recce mcp-server recce_state.json
1781
+
1761
1782
  \b
1762
1783
  # Start in HTTP/SSE mode on default port 8000
1763
1784
  recce mcp-server --sse
@@ -1793,10 +1814,10 @@ def mcp_server(sse, host, port, **kwargs):
1793
1814
  show_invalid_api_token_message()
1794
1815
  exit(1)
1795
1816
 
1796
- # Create state loader using shared function (if cloud mode is enabled)
1817
+ # Create state loader using shared function (for cloud mode or when state_file is provided)
1797
1818
  is_cloud = kwargs.get("cloud", False)
1798
- if is_cloud:
1799
- state_loader = create_state_loader_by_args(None, **kwargs)
1819
+ if is_cloud or state_file:
1820
+ state_loader = create_state_loader_by_args(state_file, **kwargs)
1800
1821
  kwargs["state_loader"] = state_loader
1801
1822
 
1802
1823
  try:
File without changes
@@ -0,0 +1,2 @@
1
+ <!DOCTYPE html><!--98tBhkYDWuAefdA7Ln9XX--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/logo/recce-logo-white.png"/><link rel="stylesheet" href="/_next/static/chunks/f2c59bf02f955ace.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/ed46900f63166b58.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/6d8557f062aa4386.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/1e4334d18b8a3acd.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/923964f18c87d0f1.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/1123b11b9536380a.js"/><script src="/_next/static/chunks/2192fa09d635fc40.js" async=""></script><script src="/_next/static/chunks/a6681c810d31e8c7.js" async=""></script><script src="/_next/static/chunks/turbopack-0e990351bb10571c.js" async=""></script><script src="/_next/static/chunks/058ff74552b21862.js" async=""></script><script src="/_next/static/chunks/22ffdfc5c7ffdcd5.js" async=""></script><script src="/_next/static/chunks/12ce527381ac41a0.js" async=""></script><script src="/_next/static/chunks/541d148d76987a33.js" async=""></script><script src="/_next/static/chunks/4d678259ce3436b0.js" async=""></script><script src="/_next/static/chunks/9d07ac7beaf2f874.js" async=""></script><script src="/_next/static/chunks/de16e4ed3c137fec.js" async=""></script><script src="/_next/static/chunks/d2565e3572b1ead7.js" async=""></script><script src="/_next/static/chunks/b860325dc46e47c2.js" async=""></script><script src="/_next/static/chunks/0c8a7df4da7d1abd.js" async=""></script><script src="/_next/static/chunks/77c3815a3f1feea2.js" async=""></script><script src="/_next/static/chunks/bdfcf621148ad9ee.js" async=""></script><script src="/_next/static/chunks/7e750f6f5f5542e3.js" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtm.js?id=GTM-M2HVJQFD" as="script"/><title>404: This page could not be found.</title><meta name="robots" content="noindex"/><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><link rel="icon" href="/favicon.ico?favicon.a8d38d84.ico" sizes="32x32" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","light",null,["light","dark"],null,false,true)</script><style data-emotion="css-global 1sm4dhk">html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:700;}body{margin:0;color:#171717;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;background-color:#FFFFFF;}@media print{body{background-color:#fff;}}body::backdrop{background-color:#FFFFFF;}</style><style data-emotion="css lb61rc">.css-lb61rc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100vh;overflow:hidden;}</style><div class="MuiBox-root css-lb61rc"><style data-emotion="css 1iwwiyf">.css-1iwwiyf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:10px;min-height:40px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#FF6E42;}</style><div class="MuiBox-root css-1iwwiyf"><style data-emotion="css 1cto74x">.css-1cto74x{-webkit-text-decoration:none;text-decoration:none;color:#2A6CA7;text-decoration-color:#79B0E2;}.css-1cto74x:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1cto74x:hover{color:#225581;}.css-1cto74x:hover{-webkit-text-decoration:none;text-decoration:none;}</style><style data-emotion="css oqdijk">.css-oqdijk{margin:0;font:inherit;line-height:inherit;letter-spacing:inherit;color:#3182CE;font-weight:500;-webkit-text-decoration:none;text-decoration:none;color:#2A6CA7;text-decoration-color:#79B0E2;}.css-oqdijk:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-oqdijk:hover{color:#225581;}.css-oqdijk:hover{-webkit-text-decoration:none;text-decoration:none;}</style><a class="MuiTypography-root MuiTypography-inherit MuiLink-root MuiLink-underlineHover css-oqdijk" href="https://reccehq.com/" target="_blank"><style data-emotion="css 15zum9u">.css-15zum9u{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:10px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="MuiBox-root css-15zum9u"><style data-emotion="css u2at6n">.css-u2at6n{width:20px;height:20px;margin-left:18px;}</style><img class="MuiBox-root css-u2at6n" src="/logo/recce-logo-white.png" alt="recce-logo-white"/><style data-emotion="css a5dmb1">.css-a5dmb1{margin:0;font-weight:600;font-size:1.25rem;line-height:1.4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";color:#fff;font-family:"Montserrat",sans-serif;font-size:1.25rem;}</style><h4 class="MuiTypography-root MuiTypography-h4 css-a5dmb1">RECCE</h4></div></a><style data-emotion="css b1pxe1">.css-b1pxe1{text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.5rem;padding:8px;border-radius:50%;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;--IconButton-hoverBg:rgba(0, 0, 0, 0.04);padding:5px;font-size:1.125rem;border-radius:6px;padding:4px;color:rgba(255, 255, 255, 0.8);}.css-b1pxe1:hover{background-color:var(--IconButton-hoverBg);}@media (hover: none){.css-b1pxe1:hover{background-color:transparent;}}.css-b1pxe1.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}.css-b1pxe1.MuiIconButton-loading{color:transparent;}.css-b1pxe1:hover{background-color:rgba(255, 255, 255, 0.1);}</style><style data-emotion="css 1ksaga0">.css-1ksaga0{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-align:center;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:1.5rem;padding:8px;border-radius:50%;color:rgba(0, 0, 0, 0.54);-webkit-transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;--IconButton-hoverBg:rgba(0, 0, 0, 0.04);padding:5px;font-size:1.125rem;border-radius:6px;padding:4px;color:rgba(255, 255, 255, 0.8);}.css-1ksaga0::-moz-focus-inner{border-style:none;}.css-1ksaga0.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1ksaga0{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1ksaga0:hover{background-color:var(--IconButton-hoverBg);}@media (hover: none){.css-1ksaga0:hover{background-color:transparent;}}.css-1ksaga0.Mui-disabled{background-color:transparent;color:rgba(0, 0, 0, 0.26);}.css-1ksaga0.MuiIconButton-loading{color:transparent;}.css-1ksaga0:hover{background-color:rgba(255, 255, 255, 0.1);}</style><button class="MuiButtonBase-root Mui-disabled MuiIconButton-root Mui-disabled MuiIconButton-sizeSmall css-1ksaga0" tabindex="-1" type="button" disabled=""><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" style="width:18px;height:18px" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z"></path></svg></button><style data-emotion="css 1jcz15f">.css-1jcz15f{margin:0;font-size:0.875rem;line-height:1.5;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-weight:400;color:rgba(255,255,255,0.8);font-size:sm;text-transform:uppercase;border-width:1px;padding-left:4px;padding-right:4px;border-radius:4.5px;}</style><span class="MuiTypography-root MuiTypography-body1 css-1jcz15f"></span><style data-emotion="css 1rr4qq7">.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}</style><div class="MuiBox-root css-1rr4qq7"></div><style data-emotion="css 9d3kiv">.css-9d3kiv{color:#fff;font-size:0.875rem;font-weight:600;background-color:brand.700;border-radius:6px;padding-left:12px;padding-right:12px;padding-top:4px;padding-bottom:4px;margin-right:8px;cursor:pointer;border:none;}</style><button class="MuiBox-root css-9d3kiv">Connect to Cloud</button></div><style data-emotion="css 1dhtcsx">.css-1dhtcsx{border-bottom:1px solid lightgray;padding-left:12px;padding-right:12px;}</style><div class="MuiBox-root css-1dhtcsx"><style data-emotion="css kkbn2n">.css-kkbn2n{display:grid;grid-template-columns:1fr auto 1fr;width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="MuiBox-root css-kkbn2n"><style data-emotion="css 1qlx8uq">.css-1qlx8uq{overflow:hidden;min-height:48px;-webkit-overflow-scrolling:touch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:none;min-height:auto;}@media (max-width:599.95px){.css-1qlx8uq .MuiTabs-scrollButtons{display:none;}}</style><div class="MuiTabs-root css-1qlx8uq"><style data-emotion="css 2xu61f">.css-2xu61f{position:relative;display:inline-block;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;white-space:nowrap;overflow-x:hidden;width:100%;}</style><div style="overflow:hidden;margin-bottom:0" class="MuiTabs-scroller MuiTabs-fixed css-2xu61f"><style data-emotion="css 17do188">.css-17do188{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><div role="tablist" class="MuiTabs-list MuiTabs-flexContainer css-17do188"><style data-emotion="css 1n2jfwv">.css-1n2jfwv{text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.25;max-width:360px;min-width:90px;position:relative;min-height:48px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:12px 16px;overflow:hidden;white-space:normal;text-align:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#525252;text-transform:none;font-weight:500;min-height:48px;padding:0px;}.css-1n2jfwv.Mui-selected{color:#3182CE;}.css-1n2jfwv.Mui-disabled{color:rgba(0, 0, 0, 0.38);}</style><style data-emotion="css 1ameuk9">.css-1ameuk9{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;text-transform:none;font-weight:500;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:0.875rem;line-height:1.25;max-width:360px;min-width:90px;position:relative;min-height:48px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:12px 16px;overflow:hidden;white-space:normal;text-align:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#525252;text-transform:none;font-weight:500;min-height:48px;padding:0px;}.css-1ameuk9::-moz-focus-inner{border-style:none;}.css-1ameuk9.Mui-disabled{pointer-events:none;cursor:default;}@media print{.css-1ameuk9{-webkit-print-color-adjust:exact;color-adjust:exact;}}.css-1ameuk9.Mui-selected{color:#3182CE;}.css-1ameuk9.Mui-disabled{color:rgba(0, 0, 0, 0.38);}</style><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-selected Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="true"><style data-emotion="css 171onha">.css-171onha{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;}</style><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem" href="/lineage/">Lineage</a></div><style data-emotion="css l6r5ej">.css-l6r5ej{position:absolute;height:2px;bottom:0;width:100%;-webkit-transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;background-color:#3182CE;height:2px;}</style><span class="MuiTabs-indicator css-l6r5ej"></span></button><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="false"><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem" href="/query/">Query</a></div></button><button class="MuiButtonBase-root Mui-disabled MuiTab-root MuiTab-textColorPrimary Mui-disabled css-1ameuk9" tabindex="-1" type="button" disabled="" role="tab" aria-selected="false"><div class="MuiBox-root css-171onha"><a style="text-decoration:none;color:inherit;padding:0.875rem 1.1875rem;display:flex;gap:3px;align-items:center" href="/checks/">Checklist<!-- --> </a></div></button></div></div></div><style data-emotion="css vx1bta">.css-vx1bta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}</style><div class="MuiBox-root css-vx1bta"></div></div></div><div style="display:flex;flex-direction:row;height:100%"><div class="MuiBox-root css-0" style="contain:size"></div><div style="display:flex;flex-direction:column;flex:1;contain:size"><!--$?--><template id="B:0"></template><style data-emotion="css 11iw7t1">.css-11iw7t1{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;contain:size;}</style><div class="MuiBox-root css-11iw7t1"><style data-emotion="css tkevr6">.css-tkevr6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;height:100%;}</style><div class="MuiBox-root css-tkevr6"><style data-emotion="css 18h6s44 animation-61bdi0">.css-18h6s44{display:inline-block;-webkit-animation:animation-61bdi0 1.4s linear infinite;animation:animation-61bdi0 1.4s linear infinite;color:#3182CE;}@-webkit-keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-61bdi0{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}</style><span class="MuiCircularProgress-root MuiCircularProgress-indeterminate MuiCircularProgress-colorPrimary css-18h6s44" style="width:48px;height:48px" role="progressbar"><style data-emotion="css 4ejps8">.css-4ejps8{display:block;}</style><svg class="MuiCircularProgress-svg css-4ejps8" viewBox="22 22 44 44"><style data-emotion="css 13odlrs animation-1o38n3e">.css-13odlrs{stroke:currentColor;stroke-dasharray:80px,200px;stroke-dashoffset:0;-webkit-animation:animation-1o38n3e 1.4s ease-in-out infinite;animation:animation-1o38n3e 1.4s ease-in-out infinite;}@-webkit-keyframes animation-1o38n3e{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:1px,200px;stroke-dashoffset:-126px;}}@keyframes animation-1o38n3e{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0;}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px;}100%{stroke-dasharray:1px,200px;stroke-dashoffset:-126px;}}</style><circle class="MuiCircularProgress-circle MuiCircularProgress-circleIndeterminate css-13odlrs" cx="44" cy="44" r="20.2" fill="none" stroke-width="3.6"></circle></svg></span></div></div><!--/$--><style data-emotion="css 10klw3m">.css-10klw3m{height:100%;}</style><div class="MuiBox-root css-10klw3m"></div></div></div></div><style data-emotion="css depviu">@media print{.css-depviu{position:absolute!important;}}</style><script>requestAnimationFrame(function(){$RT=performance.now()});</script><script src="/_next/static/chunks/1123b11b9536380a.js" id="_R_" async=""></script><div hidden id="S:0"><style data-emotion="css 18l2koh">.css-18l2koh{padding:0px;contain:content;height:100%;position:relative;}</style><div class="MuiBox-root css-18l2koh"><style data-emotion="css r2yx1p">.css-r2yx1p{display:none;height:100%;position:absolute;inset:0;}</style><div class="MuiBox-root css-r2yx1p"></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></div></div><script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$~"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
2
+ $RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$~",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")</script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[932032,[\"/_next/static/chunks/058ff74552b21862.js\",\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"/_next/static/chunks/12ce527381ac41a0.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/4d678259ce3436b0.js\",\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"/_next/static/chunks/de16e4ed3c137fec.js\",\"/_next/static/chunks/d2565e3572b1ead7.js\"],\"GoogleTagManager\"]\n3:I[825582,[\"/_next/static/chunks/058ff74552b21862.js\",\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"/_next/static/chunks/12ce527381ac41a0.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/4d678259ce3436b0.js\",\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"/_next/static/chunks/de16e4ed3c137fec.js\",\"/_next/static/chunks/d2565e3572b1ead7.js\"],\"\"]\n4:I[84654,[\"/_next/static/chunks/058ff74552b21862.js\",\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"/_next/static/chunks/12ce527381ac41a0.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/4d678259ce3436b0.js\",\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"/_next/static/chunks/de16e4ed3c137fec.js\",\"/_next/static/chunks/d2565e3572b1ead7.js\"],\"default\"]\n5:I[340250,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"default\"]\n6:I[408821,[\"/_next/static/chunks/058ff74552b21862.js\",\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"/_next/static/chunks/12ce527381ac41a0.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/4d678259ce3436b0.js\",\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"/_next/static/chunks/de16e4ed3c137fec.js\",\"/_next/static/chunks/d2565e3572b1ead7.js\",\"/_next/static/chunks/77c3815a3f1feea2.js\"],\"default\"]\n7:I[703827,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"default\"]\n8:I[20967,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"OutletBoundary\"]\nb:I[253348,[\"/_next/static/chunks/bdfcf621148ad9ee.js\",\"/_next/static/chunks/541d148d76987a33.js\",\"/_next/static/chunks/7e750f6f5f5542e3.js\"],\"default\"]\n:HL[\"/_next/static/chunks/f2c59bf02f955ace.css\",\"style\"]\n:HL[\"/_next/static/chunks/ed46900f63166b58.css\",\"style\"]\n:HL[\"/_next/static/chunks/6d8557f062aa4386.css\",\"style\"]\n:HL[\"/_next/static/chunks/1e4334d18b8a3acd.css\",\"style\"]\n:HL[\"/_next/static/chunks/923964f18c87d0f1.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"98tBhkYDWuAefdA7Ln9XX\",\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/f2c59bf02f955ace.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/ed46900f63166b58.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/6d8557f062aa4386.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1e4334d18b8a3acd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/923964f18c87d0f1.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/058ff74552b21862.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/22ffdfc5c7ffdcd5.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/12ce527381ac41a0.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/541d148d76987a33.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/_next/static/chunks/4d678259ce3436b0.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-5\",{\"src\":\"/_next/static/chunks/9d07ac7beaf2f874.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-6\",{\"src\":\"/_next/static/chunks/de16e4ed3c137fec.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-7\",{\"src\":\"/_next/static/chunks/d2565e3572b1ead7.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"$L2\",null,{\"gtmId\":\"GTM-M2HVJQFD\"}],[\"$\",\"$L3\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n const hash = window.location.hash;\\n if (hash.startsWith('#!')) {\\n const newLocation = window.location.origin + window.location.pathname;\\n window.location.assign(newLocation);\\n }\\n })();\\n \"}}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L4\",null,{\"lineage\":\"$undefined\",\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$6\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/77c3815a3f1feea2.js\",\"async\":true}]],\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:2:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}]]}],{},null,false,false]},null,false,false]},null,false,false],\"$La\",false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:\"$Sreact.suspense\"\ne:I[20967,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"ViewportBoundary\"]\n10:I[20967,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"MetadataBoundary\"]\n9:[\"$\",\"$c\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@d\"}]\na:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Le\",null,{\"children\":\"$Lf\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L10\",null,{\"children\":[\"$\",\"$c\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L11\"}]}]}],null]}]\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"12:I[767811,[\"/_next/static/chunks/b860325dc46e47c2.js\",\"/_next/static/chunks/0c8a7df4da7d1abd.js\"],\"IconMark\"]\nd:null\n11:[[\"$\",\"title\",\"0\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.a8d38d84.ico\",\"sizes\":\"32x32\",\"type\":\"image/x-icon\"}],[\"$\",\"$L12\",\"3\",{}]]\n"])</script></body></html>