briefloop 0.31.6__tar.gz → 0.31.7__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.
Files changed (1065) hide show
  1. {briefloop-0.31.6 → briefloop-0.31.7}/CHANGELOG.md +8 -0
  2. {briefloop-0.31.6 → briefloop-0.31.7}/PKG-INFO +2 -2
  3. {briefloop-0.31.6 → briefloop-0.31.7}/README.md +1 -1
  4. briefloop-0.31.7/VERSION +1 -0
  5. {briefloop-0.31.6 → briefloop-0.31.7}/desktop/electron/package-lock.json +2 -2
  6. {briefloop-0.31.6 → briefloop-0.31.7}/desktop/electron/package.json +1 -1
  7. {briefloop-0.31.6 → briefloop-0.31.7}/docs/default-behavior.md +2 -2
  8. {briefloop-0.31.6 → briefloop-0.31.7}/pyproject.toml +1 -1
  9. briefloop-0.31.7/src/briefloop/__init__.py +1 -0
  10. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/cli.py +8 -5
  11. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/draft_completion.py +23 -10
  12. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/native_orchestrator.py +3 -3
  13. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/native_roles.py +7 -2
  14. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/runtime.py +4 -4
  15. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/index.html +1 -1
  16. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/native-engine.mjs +1 -1
  17. briefloop-0.31.7/src/briefloop/static/release-notes.json +4 -0
  18. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/websearch.py +21 -9
  19. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop.egg-info/PKG-INFO +2 -2
  20. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_draft_completion.py +3 -3
  21. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fact_check_orchestration.py +40 -0
  22. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fact_check_phase.py +24 -0
  23. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_orchestrator.py +34 -0
  24. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_scout.py +52 -0
  25. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_platform.py +4 -1
  26. briefloop-0.31.6/VERSION +0 -1
  27. briefloop-0.31.6/src/briefloop/__init__.py +0 -1
  28. briefloop-0.31.6/src/briefloop/static/release-notes.json +0 -4
  29. {briefloop-0.31.6 → briefloop-0.31.7}/.gitattributes +0 -0
  30. {briefloop-0.31.6 → briefloop-0.31.7}/CONTRIBUTING.md +0 -0
  31. {briefloop-0.31.6 → briefloop-0.31.7}/KNOWN_ISSUES.md +0 -0
  32. {briefloop-0.31.6 → briefloop-0.31.7}/LICENSE +0 -0
  33. {briefloop-0.31.6 → briefloop-0.31.7}/MANIFEST.in +0 -0
  34. {briefloop-0.31.6 → briefloop-0.31.7}/SECURITY.md +0 -0
  35. {briefloop-0.31.6 → briefloop-0.31.7}/THIRD_PARTY_NOTICES.md +0 -0
  36. {briefloop-0.31.6 → briefloop-0.31.7}/bootstrap.py +0 -0
  37. {briefloop-0.31.6 → briefloop-0.31.7}/docs/OpenCode/347/211/210/346/234/254/345/205/274/345/256/271.md" +0 -0
  38. {briefloop-0.31.6 → briefloop-0.31.7}/docs/WorkBuddy/345/244/226/351/203/250/345/205/245/345/217/243.md" +0 -0
  39. {briefloop-0.31.6 → briefloop-0.31.7}/docs/architecture.md +0 -0
  40. {briefloop-0.31.6 → briefloop-0.31.7}/docs/article-materials.md +0 -0
  41. {briefloop-0.31.6 → briefloop-0.31.7}/docs/codex-history-isolation.md +0 -0
  42. {briefloop-0.31.6 → briefloop-0.31.7}/docs/compose/spec/home-v2.md +0 -0
  43. {briefloop-0.31.6 → briefloop-0.31.7}/docs/design-v3.1-validation.md +0 -0
  44. {briefloop-0.31.6 → briefloop-0.31.7}/docs/direct-mode.md +0 -0
  45. {briefloop-0.31.6 → briefloop-0.31.7}/docs/dmg-density-validation.md +0 -0
  46. {briefloop-0.31.6 → briefloop-0.31.7}/docs/draft-first.md +0 -0
  47. {briefloop-0.31.6 → briefloop-0.31.7}/docs/jev-precheck.md +0 -0
  48. {briefloop-0.31.6 → briefloop-0.31.7}/docs/native-integration.md +0 -0
  49. {briefloop-0.31.6 → briefloop-0.31.7}/docs/quality-reading-context.md +0 -0
  50. {briefloop-0.31.6 → briefloop-0.31.7}/docs/quarterly-report.md +0 -0
  51. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.26.0.md +0 -0
  52. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.26.1.md +0 -0
  53. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.26.2.md +0 -0
  54. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.26.3.md +0 -0
  55. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.26.4.md +0 -0
  56. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.27.0.md +0 -0
  57. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.28.0.md +0 -0
  58. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.28.1.md +0 -0
  59. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.28.2.md +0 -0
  60. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.28.3.md +0 -0
  61. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.28.4.md +0 -0
  62. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.29.0.md +0 -0
  63. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.29.1.md +0 -0
  64. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.30.0.md +0 -0
  65. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.31.0.md +0 -0
  66. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.31.1.md +0 -0
  67. {briefloop-0.31.6 → briefloop-0.31.7}/docs/release-0.31.4.md +0 -0
  68. {briefloop-0.31.6 → briefloop-0.31.7}/docs/report-length.md +0 -0
  69. {briefloop-0.31.6 → briefloop-0.31.7}/docs/report-revisions.md +0 -0
  70. {briefloop-0.31.6 → briefloop-0.31.7}/docs/report-time-window.md +0 -0
  71. {briefloop-0.31.6 → briefloop-0.31.7}/docs/report-version-information.md +0 -0
  72. {briefloop-0.31.6 → briefloop-0.31.7}/docs/research-context.md +0 -0
  73. {briefloop-0.31.6 → briefloop-0.31.7}/docs/research-handoff.md +0 -0
  74. {briefloop-0.31.6 → briefloop-0.31.7}/docs/revision-learning.md +0 -0
  75. {briefloop-0.31.6 → briefloop-0.31.7}/docs/source-library.md +0 -0
  76. {briefloop-0.31.6 → briefloop-0.31.7}/docs/sqlite-benchmark.md +0 -0
  77. {briefloop-0.31.6 → briefloop-0.31.7}/docs/technical-report-0.21.0/evidence-index.md +0 -0
  78. {briefloop-0.31.6 → briefloop-0.31.7}/docs/technical-report-0.21.0/technical-report.md +0 -0
  79. {briefloop-0.31.6 → briefloop-0.31.7}/docs/windows.md +0 -0
  80. {briefloop-0.31.6 → briefloop-0.31.7}/docs/writer-input.md +0 -0
  81. {briefloop-0.31.6 → briefloop-0.31.7}/docs/writing-agreements.md +0 -0
  82. {briefloop-0.31.6 → briefloop-0.31.7}/docs//344/272/247/345/223/201/345/256/232/344/275/215/344/270/216/351/252/214/350/257/201.md" +0 -0
  83. {briefloop-0.31.6 → briefloop-0.31.7}/docs//344/274/232/350/256/256/347/272/252/350/246/201.md" +0 -0
  84. {briefloop-0.31.6 → briefloop-0.31.7}/docs//344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -0
  85. {briefloop-0.31.6 → briefloop-0.31.7}/docs//345/206/205/347/275/256/345/274/225/346/223/216.md" +0 -0
  86. {briefloop-0.31.6 → briefloop-0.31.7}/docs//345/215/207/347/272/247/350/257/264/346/230/216.md" +0 -0
  87. {briefloop-0.31.6 → briefloop-0.31.7}/docs//345/233/276/350/241/250/344/270/216Excel.md" +0 -0
  88. {briefloop-0.31.6 → briefloop-0.31.7}/docs//345/244/232Runtime/344/270/216/346/250/241/345/236/213.md" +0 -0
  89. {briefloop-0.31.6 → briefloop-0.31.7}/docs//345/244/232/346/250/241/346/200/201/346/235/245/346/272/220.md" +0 -0
  90. {briefloop-0.31.6 → briefloop-0.31.7}/docs//345/256/232/346/227/266/346/212/245/345/221/212.md" +0 -0
  91. {briefloop-0.31.6 → briefloop-0.31.7}/docs//345/257/271/350/257/235/345/256/277/344/270/273/345/210/207/346/215/242.md" +0 -0
  92. {briefloop-0.31.6 → briefloop-0.31.7}/docs//346/212/245/345/221/212/347/274/226/350/276/221/344/270/216/346/250/241/346/235/277.md" +0 -0
  93. {briefloop-0.31.6 → briefloop-0.31.7}/docs//346/241/214/351/235/242/345/256/211/350/243/205/344/270/216/346/233/264/346/226/260.md" +0 -0
  94. {briefloop-0.31.6 → briefloop-0.31.7}/docs//346/267/261/345/272/246/347/240/224/347/251/266/344/270/216/344/272/213/345/256/236/346/240/270/346/237/245.md" +0 -0
  95. {briefloop-0.31.6 → briefloop-0.31.7}/docs//347/211/210/346/234/254/344/270/200/350/207/264/346/200/247/346/243/200/346/237/245.md" +0 -0
  96. {briefloop-0.31.6 → briefloop-0.31.7}/docs//347/233/256/346/240/207/351/251/261/345/212/250/347/240/224/347/251/266.md" +0 -0
  97. {briefloop-0.31.6 → briefloop-0.31.7}/docs//350/241/214/344/270/232/346/212/245/345/221/212.md" +0 -0
  98. {briefloop-0.31.6 → briefloop-0.31.7}/docs//350/257/201/345/210/270/347/240/224/347/251/266.md" +0 -0
  99. {briefloop-0.31.6 → briefloop-0.31.7}/docs//350/257/201/346/215/256/344/270/216/347/273/223/350/256/272/350/277/275/346/272/257.md" +0 -0
  100. {briefloop-0.31.6 → briefloop-0.31.7}/docs//350/277/220/350/241/214/346/227/266/351/200/211/346/213/251/344/270/216/346/243/200/346/265/213.md" +0 -0
  101. {briefloop-0.31.6 → briefloop-0.31.7}/docs//351/252/214/346/224/266/350/256/260/345/275/225.md" +0 -0
  102. {briefloop-0.31.6 → briefloop-0.31.7}/examples/internal-weekly-report/README.md +0 -0
  103. {briefloop-0.31.6 → briefloop-0.31.7}/examples/internal-weekly-report/report.md +0 -0
  104. {briefloop-0.31.6 → briefloop-0.31.7}/examples/internal-weekly-report/source.txt +0 -0
  105. {briefloop-0.31.6 → briefloop-0.31.7}/examples/meeting-minutes/transcript.txt +0 -0
  106. {briefloop-0.31.6 → briefloop-0.31.7}/examples/stock-research/earnings-event.txt +0 -0
  107. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/anchored-popover.js +0 -0
  108. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/api.js +0 -0
  109. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/app-updates.js +0 -0
  110. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/app.js +0 -0
  111. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/article-media.js +0 -0
  112. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/assessment-checks.js +0 -0
  113. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/assessment-panel.js +0 -0
  114. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/citation-evidence.js +0 -0
  115. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/citation-sources.js +0 -0
  116. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/clipboard.js +0 -0
  117. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/compact-report-controls.js +0 -0
  118. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/composer-options.js +0 -0
  119. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/connectors.js +0 -0
  120. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/delivery.js +0 -0
  121. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/dom.js +0 -0
  122. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/evidence-review-dialogs.js +0 -0
  123. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/excel-export.js +0 -0
  124. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/fact-check-availability.js +0 -0
  125. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/fact-check-grants.js +0 -0
  126. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/feedback-list.js +0 -0
  127. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/home.js +0 -0
  128. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/jev-checks.js +0 -0
  129. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/job-presentation.js +0 -0
  130. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/learning-onboarding.js +0 -0
  131. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/learning-retry.js +0 -0
  132. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/length-controls.js +0 -0
  133. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/market-convention.js +0 -0
  134. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/market-decorations.js +0 -0
  135. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/mcp-selection.js +0 -0
  136. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/model-catalog.js +0 -0
  137. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/native-requests.js +0 -0
  138. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/next-report-chat.js +0 -0
  139. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/next-report.js +0 -0
  140. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/notifications.js +0 -0
  141. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/office-tools.js +0 -0
  142. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/polling.js +0 -0
  143. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/previous-report.js +0 -0
  144. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/provider-capabilities.js +0 -0
  145. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/provider-settings.js +0 -0
  146. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/quick-report.js +0 -0
  147. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/readers.js +0 -0
  148. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/reasoning-controls.js +0 -0
  149. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-browsing.js +0 -0
  150. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-chat-context.js +0 -0
  151. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-export.js +0 -0
  152. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-feedback.js +0 -0
  153. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-form-defaults.js +0 -0
  154. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-language.js +0 -0
  155. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-panels.js +0 -0
  156. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-sources.js +0 -0
  157. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-start.js +0 -0
  158. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-sticky-layout.js +0 -0
  159. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/report-version-info.js +0 -0
  160. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/research-budget.js +0 -0
  161. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/research-goal-progress.js +0 -0
  162. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/research-process.js +0 -0
  163. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/review-controls.js +0 -0
  164. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/review-coverage.js +0 -0
  165. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/review-results.js +0 -0
  166. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/review-status.js +0 -0
  167. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/revision-questions.js +0 -0
  168. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/rich-document.js +0 -0
  169. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/runtime-cards.js +0 -0
  170. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/runtime-model-picker.js +0 -0
  171. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/runtime-permission-modes.js +0 -0
  172. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/runtime-permission-panel.js +0 -0
  173. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/runtime-picker-bindings.js +0 -0
  174. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/schedules.js +0 -0
  175. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/search-settings.js +0 -0
  176. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/session-budget.js +0 -0
  177. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/settings-navigation.js +0 -0
  178. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/skill-verification.js +0 -0
  179. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/source-library-controls.js +0 -0
  180. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/source-library-search.js +0 -0
  181. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/source-upload.js +0 -0
  182. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/source-viewer.js +0 -0
  183. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/sources-page.js +0 -0
  184. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/task-progress.js +0 -0
  185. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/template-output.js +0 -0
  186. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/templates.js +0 -0
  187. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/time.js +0 -0
  188. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/uploads.js +0 -0
  189. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/version-diff.js +0 -0
  190. {briefloop-0.31.6 → briefloop-0.31.7}/frontend/welcome.js +0 -0
  191. {briefloop-0.31.6 → briefloop-0.31.7}/package-lock.json +0 -0
  192. {briefloop-0.31.6 → briefloop-0.31.7}/package.json +0 -0
  193. {briefloop-0.31.6 → briefloop-0.31.7}/probes/mcp_m0/README.md +0 -0
  194. {briefloop-0.31.6 → briefloop-0.31.7}/probes/mcp_m0/probe.py +0 -0
  195. {briefloop-0.31.6 → briefloop-0.31.7}/probes/mcp_m0/requirements.txt +0 -0
  196. {briefloop-0.31.6 → briefloop-0.31.7}/probes/mcp_m0/server.py +0 -0
  197. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/README.md +0 -0
  198. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/bridge.test.mjs +0 -0
  199. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/build.mjs +0 -0
  200. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/catalog.json +0 -0
  201. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/claude.ts +0 -0
  202. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/main.ts +0 -0
  203. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/permission-catalog.ts +0 -0
  204. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/pi.ts +0 -0
  205. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/reasoning.ts +0 -0
  206. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/user-input.ts +0 -0
  207. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/windows-command.ts +0 -0
  208. {briefloop-0.31.6 → briefloop-0.31.7}/runtime-bridge/zcode.ts +0 -0
  209. {briefloop-0.31.6 → briefloop-0.31.7}/scripts/build_frontend.mjs +0 -0
  210. {briefloop-0.31.6 → briefloop-0.31.7}/scripts/build_frontend_licenses.mjs +0 -0
  211. {briefloop-0.31.6 → briefloop-0.31.7}/scripts/check_versions.py +0 -0
  212. {briefloop-0.31.6 → briefloop-0.31.7}/scripts/sync_versions.py +0 -0
  213. {briefloop-0.31.6 → briefloop-0.31.7}/scripts/test_frontend.mjs +0 -0
  214. {briefloop-0.31.6 → briefloop-0.31.7}/setup.cfg +0 -0
  215. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/__main__.py +0 -0
  216. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/_entrypoint.py +0 -0
  217. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/agent_commands.py +0 -0
  218. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/agent_prompts.py +0 -0
  219. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/analyst.py +0 -0
  220. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/analyst_drafts.py +0 -0
  221. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/app_server.py +0 -0
  222. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/article_materials.py +0 -0
  223. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/audit_bundle.py +0 -0
  224. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/backends/__init__.py +0 -0
  225. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/backends/opencode_server.py +0 -0
  226. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/backends/opencode_v2.py +0 -0
  227. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/bocha.py +0 -0
  228. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/bridge_harness.py +0 -0
  229. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/chat_dispatch.py +0 -0
  230. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/chat_execution.py +0 -0
  231. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/chat_store.py +0 -0
  232. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/chat_tools.py +0 -0
  233. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/codex_diagnostics.py +0 -0
  234. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/codex_home.py +0 -0
  235. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/company_context.py +0 -0
  236. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/comparison_contract.py +0 -0
  237. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/conflicts.py +0 -0
  238. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/MATERIALS.md +0 -0
  239. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/README.md +0 -0
  240. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/__init__.py +0 -0
  241. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/config.py +0 -0
  242. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/grants.py +0 -0
  243. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/materials.py +0 -0
  244. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/receipts.py +0 -0
  245. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/runtime.py +0 -0
  246. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/runtime_tools.py +0 -0
  247. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/service.py +0 -0
  248. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/stdio_supervisor.py +0 -0
  249. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/task_client.py +0 -0
  250. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/tasks.py +0 -0
  251. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/transport.py +0 -0
  252. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/connectors/windows_acl.py +0 -0
  253. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/coverage_record.py +0 -0
  254. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/default_fonts.py +0 -0
  255. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/deliverable_spec.py +0 -0
  256. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/delivery_checks.py +0 -0
  257. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/delivery_state.py +0 -0
  258. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/demo.py +0 -0
  259. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/direct_citations.py +0 -0
  260. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/direct_reports.py +0 -0
  261. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/document_export.py +0 -0
  262. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/document_model.py +0 -0
  263. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/document_workflows.py +0 -0
  264. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/docx_text.py +0 -0
  265. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/draft_checks.py +0 -0
  266. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/duckduckgo.py +0 -0
  267. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/evaluation_reading.py +0 -0
  268. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/evidence.py +0 -0
  269. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/evidence_context.py +0 -0
  270. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/execution_records.py +0 -0
  271. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/execution_timing.py +0 -0
  272. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/export_jobs.py +0 -0
  273. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/export_labeling.py +0 -0
  274. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/exports.py +0 -0
  275. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/external_client.py +0 -0
  276. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/external_mcp.py +0 -0
  277. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/external_requests.py +0 -0
  278. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/fact_check.py +0 -0
  279. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/fast_mode.py +0 -0
  280. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/fast_reports.py +0 -0
  281. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/fast_research.py +0 -0
  282. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/feedback_view.py +0 -0
  283. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/figure_support.py +0 -0
  284. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/figure_text.py +0 -0
  285. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/figures.py +0 -0
  286. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/finding_anchors.py +0 -0
  287. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/harness.py +0 -0
  288. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/host_bins.py +0 -0
  289. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/html_export.py +0 -0
  290. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/html_export_assets/report.css +0 -0
  291. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/html_export_assets/report.js +0 -0
  292. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/industry_data.py +0 -0
  293. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/industry_export.py +0 -0
  294. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/interactive_runtime.py +0 -0
  295. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/jev.py +0 -0
  296. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/jev_checks.py +0 -0
  297. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/learning.py +0 -0
  298. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/learning_budget.py +0 -0
  299. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/length.py +0 -0
  300. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/market_convention.py +0 -0
  301. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/media.py +0 -0
  302. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/model_budget.py +0 -0
  303. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/models.py +0 -0
  304. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/native_engine.py +0 -0
  305. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/native_harness.py +0 -0
  306. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/native_providers.py +0 -0
  307. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/next_report.py +0 -0
  308. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/notifications.py +0 -0
  309. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/office_cli.py +0 -0
  310. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/ooxml_order.py +0 -0
  311. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/opencode_harness.py +0 -0
  312. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/opencode_version.py +0 -0
  313. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/packet_views.py +0 -0
  314. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/parent_watch.py +0 -0
  315. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/plain_isolation.py +0 -0
  316. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/platform_support.py +0 -0
  317. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/previous_report.py +0 -0
  318. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/process_host.py +0 -0
  319. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/progress.py +0 -0
  320. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/projections.py +0 -0
  321. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/core.zh.md +0 -0
  322. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/mode.background.zh.md +0 -0
  323. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/mode.interactive.zh.md +0 -0
  324. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.analyst.zh.md +0 -0
  325. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.chat.zh.md +0 -0
  326. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.direct_writer.zh.md +0 -0
  327. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.evaluator.zh.md +0 -0
  328. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.fact_checker.zh.md +0 -0
  329. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.maintainer.zh.md +0 -0
  330. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.orchestrator.zh.md +0 -0
  331. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.proposer.zh.md +0 -0
  332. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.quick_writer.zh.md +0 -0
  333. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.reviewer.zh.md +0 -0
  334. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/prompt_assets/role.scout.zh.md +0 -0
  335. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/provider_catalog.py +0 -0
  336. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/readers.py +0 -0
  337. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/reconciliation.py +0 -0
  338. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/release.py +0 -0
  339. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/report_browsing.py +0 -0
  340. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/report_profiles.py +0 -0
  341. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/report_revision.py +0 -0
  342. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/report_time.py +0 -0
  343. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/report_tools.py +0 -0
  344. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/research_budget.py +0 -0
  345. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/research_goals.py +0 -0
  346. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/research_handoff.py +0 -0
  347. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/research_plan.py +0 -0
  348. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/research_reading.py +0 -0
  349. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/review.py +0 -0
  350. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/review_capability.py +0 -0
  351. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/review_learning.py +0 -0
  352. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/revision_edits.py +0 -0
  353. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/revision_evidence.py +0 -0
  354. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/revision_metadata.py +0 -0
  355. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/revision_policy.py +0 -0
  356. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/revision_research.py +0 -0
  357. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/rpc_writer.py +0 -0
  358. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/runtime_bridge.py +0 -0
  359. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/runtime_permissions.py +0 -0
  360. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/runtime_reasoning.py +0 -0
  361. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/schedules.py +0 -0
  362. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/scout.py +0 -0
  363. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/scout_coverage.py +0 -0
  364. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/scout_evidence.py +0 -0
  365. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/scout_tools.py +0 -0
  366. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/search_credentials.py +0 -0
  367. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/search_policy.py +0 -0
  368. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/server.py +0 -0
  369. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/skill_assets/briefloop-external/SKILL.md +0 -0
  370. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/skill_assets/duckduckgo/SKILL.md +0 -0
  371. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/skill_assets/multi-search/SKILL.md +0 -0
  372. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/skill_assets/tavily/SKILL.md +0 -0
  373. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/skill_delivery.py +0 -0
  374. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/skill_verification.py +0 -0
  375. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/skills.py +0 -0
  376. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/software_release_notes.py +0 -0
  377. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/software_version.py +0 -0
  378. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/source_context.py +0 -0
  379. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/source_extraction.py +0 -0
  380. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/source_ingestion.py +0 -0
  381. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/source_library_search.py +0 -0
  382. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/source_lifecycle.py +0 -0
  383. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/source_search.py +0 -0
  384. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/source_updates.py +0 -0
  385. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/sources.py +0 -0
  386. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/app.js +0 -0
  387. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/frontend-licenses.txt +0 -0
  388. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/native-engine-image-worker.mjs +0 -0
  389. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/native-engine-licenses.txt +0 -0
  390. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/native-engine-models.json +0 -0
  391. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/native-engine-photon.wasm +0 -0
  392. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-aider.png +0 -0
  393. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-amr.svg +0 -0
  394. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-antigravity.svg +0 -0
  395. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-bridge.LICENSE.txt +0 -0
  396. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-bridge.NOTICE.txt +0 -0
  397. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-bridge.mjs +0 -0
  398. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-briefloop.svg +0 -0
  399. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-claude.svg +0 -0
  400. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-codebuddy.svg +0 -0
  401. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-codex.svg +0 -0
  402. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-copilot.svg +0 -0
  403. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-cursor-agent.svg +0 -0
  404. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-deepseek.svg +0 -0
  405. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-devin.png +0 -0
  406. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-grok-build.svg +0 -0
  407. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-hermes.svg +0 -0
  408. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-kilo.svg +0 -0
  409. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-kimi.svg +0 -0
  410. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-kiro.svg +0 -0
  411. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-mimo.svg +0 -0
  412. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-opencode.svg +0 -0
  413. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-pi.svg +0 -0
  414. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-qoder.svg +0 -0
  415. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-qwen.svg +0 -0
  416. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-reasoning.json +0 -0
  417. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-reasonix.svg +0 -0
  418. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-trae-cli.png +0 -0
  419. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/runtime-vibe.svg +0 -0
  420. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/style.css +0 -0
  421. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/static/tokens.css +0 -0
  422. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/store.py +0 -0
  423. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/task_context.py +0 -0
  424. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/task_labels.py +0 -0
  425. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/task_notify.py +0 -0
  426. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/task_progress.py +0 -0
  427. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/tavily.py +0 -0
  428. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t1.docx +0 -0
  429. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t1.spec.json +0 -0
  430. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t2.docx +0 -0
  431. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t2.spec.json +0 -0
  432. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t3.docx +0 -0
  433. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t3.spec.json +0 -0
  434. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t4.docx +0 -0
  435. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t4.spec.json +0 -0
  436. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t5.docx +0 -0
  437. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/academic-paper-zh-t5.spec.json +0 -0
  438. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t1.docx +0 -0
  439. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t1.spec.json +0 -0
  440. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t2.docx +0 -0
  441. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t2.spec.json +0 -0
  442. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t3.docx +0 -0
  443. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t3.spec.json +0 -0
  444. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t4.docx +0 -0
  445. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t4.spec.json +0 -0
  446. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t5.docx +0 -0
  447. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/annual-report-zh-t5.spec.json +0 -0
  448. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t1.docx +0 -0
  449. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t1.spec.json +0 -0
  450. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t2.docx +0 -0
  451. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t2.spec.json +0 -0
  452. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t3.docx +0 -0
  453. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t3.spec.json +0 -0
  454. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t4.docx +0 -0
  455. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t4.spec.json +0 -0
  456. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t5.docx +0 -0
  457. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/business-report-zh-t5.spec.json +0 -0
  458. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t1.docx +0 -0
  459. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t1.spec.json +0 -0
  460. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t2.docx +0 -0
  461. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t2.spec.json +0 -0
  462. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t3.docx +0 -0
  463. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t3.spec.json +0 -0
  464. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t4.docx +0 -0
  465. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t4.spec.json +0 -0
  466. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t5.docx +0 -0
  467. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-en-t5.spec.json +0 -0
  468. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t1.docx +0 -0
  469. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t1.spec.json +0 -0
  470. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t2.docx +0 -0
  471. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t2.spec.json +0 -0
  472. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t3.docx +0 -0
  473. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t3.spec.json +0 -0
  474. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t4.docx +0 -0
  475. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t4.spec.json +0 -0
  476. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t5.docx +0 -0
  477. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/general-report-zh-t5.spec.json +0 -0
  478. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/government-doc-zh-t4.docx +0 -0
  479. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/government-doc-zh-t4.spec.json +0 -0
  480. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t1.docx +0 -0
  481. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t1.spec.json +0 -0
  482. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t2.docx +0 -0
  483. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t2.spec.json +0 -0
  484. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t3.docx +0 -0
  485. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t3.spec.json +0 -0
  486. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t4.docx +0 -0
  487. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t4.spec.json +0 -0
  488. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t5.docx +0 -0
  489. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/legal-contract-zh-t5.spec.json +0 -0
  490. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t1.docx +0 -0
  491. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t1.spec.json +0 -0
  492. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t2.docx +0 -0
  493. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t2.spec.json +0 -0
  494. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t3.docx +0 -0
  495. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t3.spec.json +0 -0
  496. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t4.docx +0 -0
  497. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t4.spec.json +0 -0
  498. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t5.docx +0 -0
  499. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/meeting-minutes-zh-t5.spec.json +0 -0
  500. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t1.docx +0 -0
  501. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t1.spec.json +0 -0
  502. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t2.docx +0 -0
  503. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t2.spec.json +0 -0
  504. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t3.docx +0 -0
  505. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t3.spec.json +0 -0
  506. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t4.docx +0 -0
  507. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t4.spec.json +0 -0
  508. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t5.docx +0 -0
  509. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-en-t5.spec.json +0 -0
  510. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t1.docx +0 -0
  511. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t1.spec.json +0 -0
  512. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t2.docx +0 -0
  513. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t2.spec.json +0 -0
  514. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t3.docx +0 -0
  515. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t3.spec.json +0 -0
  516. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t4.docx +0 -0
  517. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t4.spec.json +0 -0
  518. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t5.docx +0 -0
  519. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_assets/stock-research-zh-t5.spec.json +0 -0
  520. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/template_conversion.py +0 -0
  521. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/templates.py +0 -0
  522. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/user_input.py +0 -0
  523. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/version_execution.py +0 -0
  524. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/windows_process.py +0 -0
  525. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/word_import.py +0 -0
  526. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workbook_figures.py +0 -0
  527. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/evaluation.md +0 -0
  528. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/manifest.json +0 -0
  529. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/methods/decision_memo.md +0 -0
  530. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/methods/industry_periodic.md +0 -0
  531. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/methods/industry_quarterly.md +0 -0
  532. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/methods/industry_quarterly_review.md +0 -0
  533. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/methods/work_progress.md +0 -0
  534. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/planning.md +0 -0
  535. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/business_report/writing.md +0 -0
  536. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/general_report/evaluation.md +0 -0
  537. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/general_report/manifest.json +0 -0
  538. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/general_report/planning.md +0 -0
  539. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/general_report/writing.md +0 -0
  540. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/meeting_minutes/evaluation.md +0 -0
  541. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/meeting_minutes/manifest.json +0 -0
  542. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/meeting_minutes/planning.md +0 -0
  543. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/meeting_minutes/writing.md +0 -0
  544. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/stock_research/evaluation.md +0 -0
  545. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/stock_research/manifest.json +0 -0
  546. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/stock_research/methods/company_research.md +0 -0
  547. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/stock_research/methods/event_commentary.md +0 -0
  548. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/stock_research/methods/industry_tracking.md +0 -0
  549. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/stock_research/planning.md +0 -0
  550. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workflow_assets/stock_research/writing.md +0 -0
  551. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workspace_profile.py +0 -0
  552. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/workspaces.py +0 -0
  553. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/writer_assembly.py +0 -0
  554. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/writer_input.py +0 -0
  555. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/writing_agreements.py +0 -0
  556. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/writing_guidance.py +0 -0
  557. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/xlsx_export.py +0 -0
  558. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop/zhipu.py +0 -0
  559. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop.egg-info/SOURCES.txt +0 -0
  560. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop.egg-info/dependency_links.txt +0 -0
  561. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop.egg-info/entry_points.txt +0 -0
  562. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop.egg-info/requires.txt +0 -0
  563. {briefloop-0.31.6 → briefloop-0.31.7}/src/briefloop.egg-info/top_level.txt +0 -0
  564. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/__init__.py +0 -0
  565. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/__main__.py +0 -0
  566. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/_licenses/LICENSE +0 -0
  567. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/_licenses/NOTICE.md +0 -0
  568. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/_licenses/third_party/acorn/LICENSE +0 -0
  569. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/_licenses/third_party/acorn/NOTICE.md +0 -0
  570. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/_licenses/third_party/officeqa/LICENSE-APACHE +0 -0
  571. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/_licenses/third_party/officeqa/NOTICE +0 -0
  572. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/alfworld/__init__.py +0 -0
  573. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/alfworld/act.sh +0 -0
  574. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/alfworld/rollout.py +0 -0
  575. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/alfworld/step.py +0 -0
  576. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/benchmarks/__init__.py +0 -0
  577. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/benchmarks/alfworld.py +0 -0
  578. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/benchmarks/livemath.py +0 -0
  579. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/benchmarks/sealqa.py +0 -0
  580. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/benchmarks/spreadsheet.py +0 -0
  581. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/cli.py +0 -0
  582. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/codex_identity.py +0 -0
  583. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/engine.py +0 -0
  584. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/feedback_loop.py +0 -0
  585. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/isolated/__init__.py +0 -0
  586. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/isolated/audit.py +0 -0
  587. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/isolated/runtime.py +0 -0
  588. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/isolated/tools_server.py +0 -0
  589. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/jsonl.py +0 -0
  590. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/k4_lock.py +0 -0
  591. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/livemath/__init__.py +0 -0
  592. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/livemath/loop.py +0 -0
  593. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/livemath/rollout.py +0 -0
  594. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/native_agents.py +0 -0
  595. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/__init__.py +0 -0
  596. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/dataset.py +0 -0
  597. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/fetch.py +0 -0
  598. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/loop.py +0 -0
  599. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/retrieval.py +0 -0
  600. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/reward.py +0 -0
  601. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/rollout.py +0 -0
  602. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/scoring.py +0 -0
  603. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/officeqa/wiki_agents.py +0 -0
  604. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/paper_alignment/__init__.py +0 -0
  605. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/paper_alignment/contracts.py +0 -0
  606. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/paper_alignment/evidence.py +0 -0
  607. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/product.py +0 -0
  608. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/product_cli.py +0 -0
  609. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/product_install.py +0 -0
  610. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/product_views.py +0 -0
  611. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/id_split/split_manifest.json +0 -0
  612. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/id_split/test.json +0 -0
  613. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/id_split/train.json +0 -0
  614. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/id_split/val.json +0 -0
  615. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/wiki/SKILL-s0.md +0 -0
  616. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/wiki/index.md +0 -0
  617. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/wiki/logs.md +0 -0
  618. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/wiki/prompts/maintainer.md +0 -0
  619. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/wiki/prompts/proposer.md +0 -0
  620. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/alfworld/wiki/skill-impact.md +0 -0
  621. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/isolated/model-catalog-direct.json +0 -0
  622. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/id_split/split_manifest.json +0 -0
  623. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/id_split/test.json +0 -0
  624. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/id_split/train.json +0 -0
  625. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/id_split/val.json +0 -0
  626. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/id_split-v2/split_manifest.json +0 -0
  627. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/id_split-v2/test.json +0 -0
  628. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/id_split-v2/train.json +0 -0
  629. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/id_split-v2/val.json +0 -0
  630. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/protocol.json +0 -0
  631. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/wiki/SKILL-s0.md +0 -0
  632. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/wiki/index.md +0 -0
  633. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/wiki/logs.md +0 -0
  634. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/wiki/prompts/maintainer.md +0 -0
  635. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/wiki/prompts/proposer.md +0 -0
  636. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/livemath/wiki/skill-impact.md +0 -0
  637. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/id_split/split_manifest.json +0 -0
  638. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/id_split/test.json +0 -0
  639. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/id_split/train.json +0 -0
  640. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/id_split/val.json +0 -0
  641. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/protocol.json +0 -0
  642. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/wiki/SKILL-s0.md +0 -0
  643. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/wiki/index.md +0 -0
  644. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/wiki/logs.md +0 -0
  645. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/wiki/prompts/maintainer.md +0 -0
  646. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/wiki/prompts/proposer.md +0 -0
  647. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/officeqa/wiki/skill-impact.md +0 -0
  648. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/paper_alignment/README.md +0 -0
  649. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/paper_alignment/prompts/maintainer.paper.md +0 -0
  650. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/paper_alignment/prompts/officeqa.paper.md +0 -0
  651. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/paper_alignment/prompts/proposer.paper.md +0 -0
  652. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/paper_alignment/prompts/spreadsheet.paper.md +0 -0
  653. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/agents/claude-code/wikiskill-executor.md +0 -0
  654. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/agents/claude-code/wikiskill-maintainer.md +0 -0
  655. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/agents/claude-code/wikiskill-proposer.md +0 -0
  656. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/agents/codex/wikiskill-executor.toml +0 -0
  657. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/agents/codex/wikiskill-maintainer.toml +0 -0
  658. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/agents/codex/wikiskill-proposer.toml +0 -0
  659. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/entry-skill/SKILL.md +0 -0
  660. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/entry-skill/agents/openai.yaml +0 -0
  661. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/entry-skill/references/native-subagents.md +0 -0
  662. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/entry-skill/references/workflow.md +0 -0
  663. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/roles/executor.md +0 -0
  664. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/roles/maintainer.md +0 -0
  665. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/product/roles/proposer.md +0 -0
  666. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/final-20260907/manifest.json +0 -0
  667. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/final-20260907/math-episodes.json +0 -0
  668. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/final-20260907/sealqa-pairs.json +0 -0
  669. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/final-20260907/spreadsheet-SKILL.md +0 -0
  670. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/final-20260907/spreadsheet-pairs.json +0 -0
  671. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/final-20260907/summary.json +0 -0
  672. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/repeatability-20260908/example-provenance.json +0 -0
  673. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/repeatability-20260908/installed-smoke.json +0 -0
  674. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/repeatability-20260908/manifest.json +0 -0
  675. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/repeatability-20260908/repeat1-pairs.json +0 -0
  676. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/repeatability-20260908/repeat2-pairs.json +0 -0
  677. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/repeatability-20260908/repeat3-pairs.json +0 -0
  678. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/repeatability-20260908/summary.json +0 -0
  679. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/repeatability-20260908/wiki-deliver-the-recalculated-workbook.md +0 -0
  680. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/livemath/55.md +0 -0
  681. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/livemath/luna.md +0 -0
  682. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/officeqa/55.md +0 -0
  683. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/officeqa/terra.md +0 -0
  684. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/officeqa-retrieval/55.md +0 -0
  685. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/officeqa-retrieval/sol.md +0 -0
  686. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/sealqa/sol.md +0 -0
  687. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/spreadsheet/55.md +0 -0
  688. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/skills/spreadsheet/sol.md +0 -0
  689. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/snapshot.json +0 -0
  690. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/snapshot.sha256 +0 -0
  691. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260906/livemath-luna-pairs.json +0 -0
  692. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260906/livemath-luna-skill.md +0 -0
  693. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260906/manifest.json +0 -0
  694. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260906/officeqa-luna-skill.md +0 -0
  695. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260906/officeqa-sol-skill.md +0 -0
  696. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260906/officeqa-sol-v2-pairs.json +0 -0
  697. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260906/studies.json +0 -0
  698. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260907/effort-analysis.json +0 -0
  699. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260907/effort-pairs.json +0 -0
  700. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260907/manifest.json +0 -0
  701. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-pairs.json +0 -0
  702. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-skill.md +0 -0
  703. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-pairs.json +0 -0
  704. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-skill.md +0 -0
  705. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/research/update-20260907/studies.json +0 -0
  706. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/runtime/acorn.mjs +0 -0
  707. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/runtime/audit_js.mjs +0 -0
  708. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/id_split/split_manifest.json +0 -0
  709. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/id_split/test.json +0 -0
  710. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/id_split/train.json +0 -0
  711. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/id_split/val.json +0 -0
  712. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/protocol.json +0 -0
  713. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/wiki/SKILL-s0.md +0 -0
  714. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/wiki/index.md +0 -0
  715. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/wiki/logs.md +0 -0
  716. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/wiki/prompts/maintainer.md +0 -0
  717. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/wiki/prompts/proposer.md +0 -0
  718. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/sealqa/wiki/skill-impact.md +0 -0
  719. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/id_split/split_manifest.json +0 -0
  720. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/id_split/test.json +0 -0
  721. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/id_split/train.json +0 -0
  722. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/id_split/val.json +0 -0
  723. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/protocol.json +0 -0
  724. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/wiki/SKILL-s0.md +0 -0
  725. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/wiki/index.md +0 -0
  726. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/wiki/logs.md +0 -0
  727. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/wiki/prompts/maintainer.md +0 -0
  728. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/wiki/prompts/proposer.md +0 -0
  729. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/resources/spreadsheet/wiki/skill-impact.md +0 -0
  730. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/results.py +0 -0
  731. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/score_rules.py +0 -0
  732. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/scorer_trust.py +0 -0
  733. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/sealqa/__init__.py +0 -0
  734. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/sealqa/loop.py +0 -0
  735. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/sealqa/rollout.py +0 -0
  736. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/settings.py +0 -0
  737. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/skill_proposer.py +0 -0
  738. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/spreadsheet/__init__.py +0 -0
  739. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/spreadsheet/loop.py +0 -0
  740. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/spreadsheet/rollout.py +0 -0
  741. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/spreadsheet/study.py +0 -0
  742. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/tool_audit.py +0 -0
  743. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/wiki.py +0 -0
  744. {briefloop-0.31.6 → briefloop-0.31.7}/src/wikiskill/wiki_maintainer.py +0 -0
  745. {briefloop-0.31.6 → briefloop-0.31.7}/start.ps1 +0 -0
  746. {briefloop-0.31.6 → briefloop-0.31.7}/start.sh +0 -0
  747. {briefloop-0.31.6 → briefloop-0.31.7}/tests/check_distribution.py +0 -0
  748. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_anchored_popover.mjs +0 -0
  749. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_app_updates.mjs +0 -0
  750. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_assessment_checks.mjs +0 -0
  751. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_brand_colors.mjs +0 -0
  752. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_chat_attachments.mjs +0 -0
  753. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_chat_commands.mjs +0 -0
  754. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_chat_drafts.mjs +0 -0
  755. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_chat_layout.mjs +0 -0
  756. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_chat_polling.mjs +0 -0
  757. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_checkout_eol.mjs +0 -0
  758. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_citation_clipboard.mjs +0 -0
  759. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_citation_edit.mjs +0 -0
  760. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_citation_evidence.mjs +0 -0
  761. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_citation_sources.mjs +0 -0
  762. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_clipboard_fallback.mjs +0 -0
  763. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_excel_export.mjs +0 -0
  764. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_export_menu.mjs +0 -0
  765. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_fact_check_availability.mjs +0 -0
  766. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_fact_check_grants.mjs +0 -0
  767. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_fast_mode.mjs +0 -0
  768. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_feedback_list.mjs +0 -0
  769. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_home_v2.mjs +0 -0
  770. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_job_presentation.mjs +0 -0
  771. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_learning_authorization.mjs +0 -0
  772. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_learning_onboarding.mjs +0 -0
  773. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_learning_retry.mjs +0 -0
  774. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_length_controls.mjs +0 -0
  775. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_licenses.mjs +0 -0
  776. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_live_status.mjs +0 -0
  777. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_markdown_import.mjs +0 -0
  778. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_market_convention.mjs +0 -0
  779. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_mcp_selection.mjs +0 -0
  780. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_model_catalog_refresh.mjs +0 -0
  781. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_model_label.mjs +0 -0
  782. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_model_selection.mjs +0 -0
  783. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_native_requests.mjs +0 -0
  784. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_native_runtime.mjs +0 -0
  785. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_next_report.mjs +0 -0
  786. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_office_tools.mjs +0 -0
  787. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_open_brief_status.mjs +0 -0
  788. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_pending_report.mjs +0 -0
  789. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_polling.mjs +0 -0
  790. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_previous_report.mjs +0 -0
  791. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_progress_race.mjs +0 -0
  792. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_provider_capabilities.mjs +0 -0
  793. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_quick_report.mjs +0 -0
  794. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_readers.mjs +0 -0
  795. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_reasoning_controls.mjs +0 -0
  796. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_release_controls.mjs +0 -0
  797. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_release_navigation.mjs +0 -0
  798. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_browsing.mjs +0 -0
  799. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_chat_drawer.mjs +0 -0
  800. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_export.mjs +0 -0
  801. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_feedback.mjs +0 -0
  802. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_form_defaults.mjs +0 -0
  803. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_language.mjs +0 -0
  804. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_load.mjs +0 -0
  805. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_outline.mjs +0 -0
  806. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_panels.mjs +0 -0
  807. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_start.mjs +0 -0
  808. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_report_version_info.mjs +0 -0
  809. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_research_process.mjs +0 -0
  810. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_review_capability.mjs +0 -0
  811. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_review_coverage.mjs +0 -0
  812. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_review_status.mjs +0 -0
  813. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_revision_questions.mjs +0 -0
  814. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_runtime_discovery.mjs +0 -0
  815. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_runtime_feedback.mjs +0 -0
  816. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_runtime_model_picker.mjs +0 -0
  817. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_runtime_permission_panel.mjs +0 -0
  818. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_save_barrier.mjs +0 -0
  819. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_settings_navigation.mjs +0 -0
  820. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_settings_workspaces.mjs +0 -0
  821. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_setup_state.mjs +0 -0
  822. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_skill_verification.mjs +0 -0
  823. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_source_library.mjs +0 -0
  824. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_source_lifecycle.mjs +0 -0
  825. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_source_media.mjs +0 -0
  826. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_source_search.mjs +0 -0
  827. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_source_upload.mjs +0 -0
  828. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_startup_recovery.mjs +0 -0
  829. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_task_progress.mjs +0 -0
  830. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_template_groups.mjs +0 -0
  831. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_template_output.mjs +0 -0
  832. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_update_notifications.mjs +0 -0
  833. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_upload_limits.mjs +0 -0
  834. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_version_bodies.mjs +0 -0
  835. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_version_diff.mjs +0 -0
  836. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_welcome_gate.mjs +0 -0
  837. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_workspace_proposal.mjs +0 -0
  838. {briefloop-0.31.6 → briefloop-0.31.7}/tests/frontend_writing_preferences.mjs +0 -0
  839. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_agent_backend.py +0 -0
  840. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_agent_commands.py +0 -0
  841. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_agent_session_budget.py +0 -0
  842. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_analyst_draft_versions.py +0 -0
  843. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_article_materials.py +0 -0
  844. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_assessment_followup.py +0 -0
  845. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_bridge_harness.py +0 -0
  846. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_builtin_templates.py +0 -0
  847. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_chat_dispatch.py +0 -0
  848. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_chat_execution.py +0 -0
  849. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_chat_model_selection.py +0 -0
  850. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_chat_stop.py +0 -0
  851. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_cli_goal_handoff.py +0 -0
  852. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_codex_home.py +0 -0
  853. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_codex_idle.py +0 -0
  854. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_connection_test_history.py +0 -0
  855. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_connector_authorization.py +0 -0
  856. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_connector_empty_catalog.py +0 -0
  857. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_connector_materials.py +0 -0
  858. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_connectors.py +0 -0
  859. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_core.py +0 -0
  860. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_coverage_record.py +0 -0
  861. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_cross_module_regressions.py +0 -0
  862. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_delivery_checks.py +0 -0
  863. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_demo.py +0 -0
  864. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_desktop_lifecycle.py +0 -0
  865. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_direct_reports.py +0 -0
  866. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_document_workflows.py +0 -0
  867. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_draft_contract.py +0 -0
  868. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_draft_republish.py +0 -0
  869. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_english_reports.py +0 -0
  870. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_entrypoint.py +0 -0
  871. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_evidence.py +0 -0
  872. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_evidence_parse_failures.py +0 -0
  873. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_execution_records.py +0 -0
  874. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_export_admission.py +0 -0
  875. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_export_labeling.py +0 -0
  876. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_export_layout_swap.py +0 -0
  877. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_export_xlsx.py +0 -0
  878. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_external_mcp.py +0 -0
  879. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_external_requests.py +0 -0
  880. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fact_check_contract.py +0 -0
  881. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fact_check_review.py +0 -0
  882. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fact_check_switch.py +0 -0
  883. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fact_status_tool.py +0 -0
  884. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fast_evidence.py +0 -0
  885. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fast_mode.py +0 -0
  886. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fast_qualifier_checks.py +0 -0
  887. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fast_reports.py +0 -0
  888. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fast_research.py +0 -0
  889. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_feedback_view.py +0 -0
  890. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_fetch_contact.py +0 -0
  891. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_figure_exports.py +0 -0
  892. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_figure_flow.py +0 -0
  893. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_figure_text.py +0 -0
  894. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_figures.py +0 -0
  895. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_finding_anchors.py +0 -0
  896. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_generation_schema_guidance.py +0 -0
  897. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_harness.py +0 -0
  898. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_host_bins.py +0 -0
  899. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_html_export.py +0 -0
  900. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_html_export_states.py +0 -0
  901. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_human_learning.py +0 -0
  902. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_industry_export.py +0 -0
  903. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_industry_flow.py +0 -0
  904. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_industry_research.py +0 -0
  905. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_interactive_runtime.py +0 -0
  906. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_jev_checks.py +0 -0
  907. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_learning_authorization.py +0 -0
  908. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_learning_integrity.py +0 -0
  909. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_length.py +0 -0
  910. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_length_policy.py +0 -0
  911. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_markdown_download.py +0 -0
  912. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_market_convention.py +0 -0
  913. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_media_sources.py +0 -0
  914. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_model_catalog_defaults.py +0 -0
  915. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_monthly_research.py +0 -0
  916. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_multimodal_harness.py +0 -0
  917. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_multimodal_http.py +0 -0
  918. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_analyst.py +0 -0
  919. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_evaluator.py +0 -0
  920. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_goal_research.py +0 -0
  921. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_harness.py +0 -0
  922. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_learning.py +0 -0
  923. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_provider_storage.py +0 -0
  924. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_providers.py +0 -0
  925. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_review_contract.py +0 -0
  926. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_native_scout_round_paths.py +0 -0
  927. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_next_report.py +0 -0
  928. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_notifications.py +0 -0
  929. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_npm_native_shim.py +0 -0
  930. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_numeric_occurrence_review.py +0 -0
  931. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_office_cli.py +0 -0
  932. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_office_source_structure.py +0 -0
  933. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_office_surfaces.py +0 -0
  934. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_ooxml_order.py +0 -0
  935. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_harness.py +0 -0
  936. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_idle.py +0 -0
  937. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_prompt_versions.py +0 -0
  938. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_provider.py +0 -0
  939. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_questions.py +0 -0
  940. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_reasoning.py +0 -0
  941. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_review_version.py +0 -0
  942. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_search_prompt.py +0 -0
  943. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_server_stdin.py +0 -0
  944. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_v2.py +0 -0
  945. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_opencode_version_probe.py +0 -0
  946. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_plain_isolation.py +0 -0
  947. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_posix_process_tree.py +0 -0
  948. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_pr593_roundtrip.py +0 -0
  949. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_previous_report.py +0 -0
  950. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_product_summary_consistency.py +0 -0
  951. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_progress.py +0 -0
  952. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_progress_pipeline.py +0 -0
  953. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_provider_catalog.py +0 -0
  954. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_public_research.py +0 -0
  955. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_quality_checklist_candidate.py +0 -0
  956. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_quality_reading_context.py +0 -0
  957. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_quarterly_report.py +0 -0
  958. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_reader_contract.py +0 -0
  959. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_reader_profiles.py +0 -0
  960. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_reader_source_export.py +0 -0
  961. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_reader_workflow.py +0 -0
  962. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_reconciliation.py +0 -0
  963. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_release.py +0 -0
  964. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_release_identity.py +0 -0
  965. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_report_browsing.py +0 -0
  966. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_report_deletion.py +0 -0
  967. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_report_length_feedback.py +0 -0
  968. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_report_path_regressions.py +0 -0
  969. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_report_time.py +0 -0
  970. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_research_budget.py +0 -0
  971. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_research_gap_updates.py +0 -0
  972. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_research_goals.py +0 -0
  973. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_research_handoff.py +0 -0
  974. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_research_plan.py +0 -0
  975. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_research_response_admission.py +0 -0
  976. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_resume_in_place.py +0 -0
  977. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_review_capability.py +0 -0
  978. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_review_finding_consistency.py +0 -0
  979. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_review_modes.py +0 -0
  980. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_review_packet_paths.py +0 -0
  981. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_review_public_metadata.py +0 -0
  982. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_review_schema_drift.py +0 -0
  983. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_review_snapshot.py +0 -0
  984. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_review_visual_input.py +0 -0
  985. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_revision_citations.py +0 -0
  986. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_revision_edits.py +0 -0
  987. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_revision_policy.py +0 -0
  988. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_rich_document.py +0 -0
  989. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_role_models.py +0 -0
  990. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_runtime_bridge.py +0 -0
  991. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_runtime_bridge_idle.py +0 -0
  992. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_runtime_json_bom.py +0 -0
  993. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_runtime_liveness.py +0 -0
  994. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_runtime_names.py +0 -0
  995. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_runtime_permissions.py +0 -0
  996. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_runtime_propagation.py +0 -0
  997. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_runtime_retry.py +0 -0
  998. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_schedules.py +0 -0
  999. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_scout_coverage.py +0 -0
  1000. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_search_credentials.py +0 -0
  1001. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_search_policy.py +0 -0
  1002. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_server_boundary.py +0 -0
  1003. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_settings_transactions.py +0 -0
  1004. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_skill_verification.py +0 -0
  1005. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_software_release_notes.py +0 -0
  1006. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_software_version.py +0 -0
  1007. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_source_ingestion.py +0 -0
  1008. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_source_library_search.py +0 -0
  1009. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_source_lifecycle.py +0 -0
  1010. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_source_recovery_regressions.py +0 -0
  1011. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_source_updates.py +0 -0
  1012. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_sources_provenance.py +0 -0
  1013. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_store_wal.py +0 -0
  1014. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_table_citation_advisory.py +0 -0
  1015. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_task_context.py +0 -0
  1016. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_task_notify.py +0 -0
  1017. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_task_progress.py +0 -0
  1018. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_tavily.py +0 -0
  1019. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_template_conversion.py +0 -0
  1020. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_template_conversion_http.py +0 -0
  1021. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_templates.py +0 -0
  1022. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_user_input.py +0 -0
  1023. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_user_source_refresh.py +0 -0
  1024. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_version_consistency.py +0 -0
  1025. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_version_execution.py +0 -0
  1026. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_websearch.py +0 -0
  1027. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_wikiskill_engine_windows.py +0 -0
  1028. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_antigravity_permissions.py +0 -0
  1029. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_connector_acl.py +0 -0
  1030. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_distribution.py +0 -0
  1031. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_mcp_supervisor.py +0 -0
  1032. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_release_paths.py +0 -0
  1033. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_review_paths.py +0 -0
  1034. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_runtime_bundle.py +0 -0
  1035. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_windows_xlsx_paths.py +0 -0
  1036. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_word_import.py +0 -0
  1037. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_word_source_locators.py +0 -0
  1038. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_word_toc.py +0 -0
  1039. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_worker_idle.py +0 -0
  1040. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_workspace_action_errors.py +0 -0
  1041. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_workspace_profile.py +0 -0
  1042. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_workspaces.py +0 -0
  1043. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_writer_assembly.py +0 -0
  1044. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_writer_cli_guidance.py +0 -0
  1045. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_writer_context.py +0 -0
  1046. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_writer_input.py +0 -0
  1047. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_writing_agreements.py +0 -0
  1048. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_xlsx_officecli_integration.py +0 -0
  1049. {briefloop-0.31.6 → briefloop-0.31.7}/tests/test_xlsx_preview.py +0 -0
  1050. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/LICENSE +0 -0
  1051. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/NOTICE.md +0 -0
  1052. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/acp/constants.ts +0 -0
  1053. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/acp/json.ts +0 -0
  1054. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/acp/models.ts +0 -0
  1055. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/acp/rpc.ts +0 -0
  1056. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/acp/session-params.ts +0 -0
  1057. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/acp/types.ts +0 -0
  1058. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/byok-reference/byok-opencode.ts +0 -0
  1059. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/byok-reference/provider-models.ts +0 -0
  1060. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/core/index.ts +0 -0
  1061. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/core/json-line-stream.ts +0 -0
  1062. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/runtime-models/codex-models.ts +0 -0
  1063. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/runtime-models/mmd-routes.ts +0 -0
  1064. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/runtime-models/models.ts +0 -0
  1065. {briefloop-0.31.6 → briefloop-0.31.7}/third_party/open-design/runtime-models/opencode-models.ts +0 -0
@@ -1,5 +1,13 @@
1
1
  # 变更记录
2
2
 
3
+ ## 0.31.7
4
+
5
+ - 修复研究工具参数错误被误认成搜索服务故障,作者可按回执纠正参数继续检索。
6
+ - 修复多行原文读取和历史日期过滤,直接研究无需派发 Scout 也能正常交接写稿。
7
+ - 失败事实核查可在原预算内重新尝试,保留旧结果并拒绝旧任务的迟到提交。
8
+ - 默认直写作者支持上下文连续压缩,长研究不再因漏接压缩而中止。
9
+ - Mac 发行接入 Developer ID 签名和 Apple 公证;正式通过状态以发行验收记录为准。
10
+
3
11
  ## 0.31.6
4
12
 
5
13
  - 收敛新报告入口:按任务自动选择所需流程,保留材料范围、研究投入和篇幅;原有任务配置不改。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: briefloop
3
- Version: 0.31.6
3
+ Version: 0.31.7
4
4
  Summary: Local multi-runtime agent workbench for sourced briefings, independent review and skill learning
5
5
  Author: Stahl-G
6
6
  License-Expression: MIT
@@ -52,7 +52,7 @@ Dynamic: license-file
52
52
 
53
53
  报告可选中文或英文,英文写作规范、词数和导出版式贯穿写稿与审阅;新增 Excel 报表导出,未安装 OfficeCLI 也能使用。OpenCode 1.x 与 2.x 同时支持,普通审阅和严格审阅分别展示实际能力,重大事实错误与证据缺口仍阻止正式交付。
54
54
 
55
- 本轮提供 macOS Apple Silicon、Python/CLI/PyPI 与 GitHub 源码;Windows 安装包沿用既有稳定版,待原生验收后单独更新。本轮 Mac 包未做 Developer ID 签名或 Apple 公证,平台验证与工件哈希见发行页。完整变更见 [CHANGELOG](CHANGELOG.md)。
55
+ 提供 macOS Apple Silicon、Windows 和 Python/CLI 安装入口。Mac 签名、公证、各平台验收状态及工件哈希见对应发行页。完整变更见 [CHANGELOG](CHANGELOG.md)。
56
56
 
57
57
  新工作区默认优先 Tavily,同时允许宿主自带搜索补查;可主动启用博查、智谱搜索或 DuckDuckGo,按跨市场覆盖或具体缺口补查。受控渠道共用本轮预算,搜索失败、实际发现渠道与原文分别保留。Tavily 需要 API Key,额度以服务账号为准;宿主自带搜索取决于实际工具与权限。
58
58
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  报告可选中文或英文,英文写作规范、词数和导出版式贯穿写稿与审阅;新增 Excel 报表导出,未安装 OfficeCLI 也能使用。OpenCode 1.x 与 2.x 同时支持,普通审阅和严格审阅分别展示实际能力,重大事实错误与证据缺口仍阻止正式交付。
14
14
 
15
- 本轮提供 macOS Apple Silicon、Python/CLI/PyPI 与 GitHub 源码;Windows 安装包沿用既有稳定版,待原生验收后单独更新。本轮 Mac 包未做 Developer ID 签名或 Apple 公证,平台验证与工件哈希见发行页。完整变更见 [CHANGELOG](CHANGELOG.md)。
15
+ 提供 macOS Apple Silicon、Windows 和 Python/CLI 安装入口。Mac 签名、公证、各平台验收状态及工件哈希见对应发行页。完整变更见 [CHANGELOG](CHANGELOG.md)。
16
16
 
17
17
  新工作区默认优先 Tavily,同时允许宿主自带搜索补查;可主动启用博查、智谱搜索或 DuckDuckGo,按跨市场覆盖或具体缺口补查。受控渠道共用本轮预算,搜索失败、实际发现渠道与原文分别保留。Tavily 需要 API Key,额度以服务账号为准;宿主自带搜索取决于实际工具与权限。
18
18
 
@@ -0,0 +1 @@
1
+ 0.31.7
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.31.6",
3
+ "version": "0.31.7",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "briefloop-desktop",
9
- "version": "0.31.6",
9
+ "version": "0.31.7",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.31.6",
3
+ "version": "0.31.7",
4
4
  "private": true,
5
5
  "description": "BriefLoop local desktop workspace",
6
6
  "author": "Stahl-G",
@@ -12,10 +12,10 @@
12
12
  | 报告反馈继续补查 | Native 报告聊天与其他宿主一样,在该消息获准联网后提供实际搜索、网页读取工具 | 绑定本消息、原稿版本与剩余预算;普通聊天、只读讨论、离线反馈不会取得该权限,完成或中断后失效 |
13
13
  | 直写稿独立事实核查 | 已有依据补全调用选择最多 12 条公开事实候选,定位到正文与原件后进入默认核查流程 | 候选不是正确性判定;联网核查及独立审阅仍各自执行。只处理可确认的匿名公开 HTTP 原件,混有未确认材料时不自动提取 |
14
14
  | 核查缺口显示 | 检查栏显示当前版本未进入核查的原因 | 旧稿原因不覆盖新稿,真实结果和正在执行的阶段优先;不往报告正文追加流程声明 |
15
- | 失败检查恢复 | 绑定原稿的检查可按当前模型新建重试,保留失败记录 | 只重做检查,正文不变;实际模型和思考档位单独记录 |
15
+ | 失败检查恢复 | 绑定原稿的检查可恢复或按当前模型重试,保留失败记录与已用额度 | 工具或抓取失败后的核查可重试;只重做检查,实际模型和思考档位单独记录 |
16
16
 
17
17
  公开原件准入当前不包含上传文件、连接器或通用提供方响应,也不接受含凭据、查询参数或片段的地址。
18
- 空内容的失败公开抓取不会阻断同报告其他有效原件,但不能作为候选依据。已有标准流程及手动登记的主张维持原有行为。
18
+ 失败或空正文来源也必须通过公开资料许可检查;不能因抓取失败而放行其 URL。混有未确认来源时,自动候选提取与外部事实核查均停止;已有标准流程及手动登记的主张维持原有行为。
19
19
  候选选择仍会遗漏事实;没有候选、搜索额度不足或检查未完成都不能显示为整稿核实。
20
20
  自动派发和实际执行前会复核公开资料范围,失效的旧稿绑定不进入新版核查。
21
21
  事实核查查询可以查历史背景,不被本期新闻窗口覆盖;普通 Tavily 研究按 UTC 日期扩大到覆盖边界,报告自身时间范围保持原值。
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "briefloop"
7
- version = "0.31.6"
7
+ version = "0.31.7"
8
8
  description = "Local multi-runtime agent workbench for sourced briefings, independent review and skill learning"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1 @@
1
+ __version__ = "0.31.7"
@@ -15,11 +15,14 @@ from . import __version__
15
15
 
16
16
  def _search_failure(operation,exc,provider='tavily'):
17
17
  """A structured, redacted failure so the Scout's path-switching can act on it."""
18
- return {'provider':getattr(exc,'provider',None) or provider,'operation':operation,'status':'failed',
19
- 'failure_kind':getattr(exc,'failure_kind','provider_error'),
20
- 'http_status':getattr(exc,'status',None),
21
- 'error':str(exc),
22
- 'request_record_path':getattr(exc,'request_record_path',None)}
18
+ result = {'provider':getattr(exc,'provider',None) or provider,'operation':operation,'status':'failed',
19
+ 'failure_kind':getattr(exc,'failure_kind','provider_error'),
20
+ 'http_status':getattr(exc,'status',None),
21
+ 'error':str(exc),
22
+ 'request_record_path':getattr(exc,'request_record_path',None)}
23
+ if result['failure_kind'] == 'invalid_arguments':
24
+ result.update(recoverable=True, recovery_action='correct_arguments')
25
+ return result
23
26
 
24
27
 
25
28
  def main():
@@ -5,7 +5,7 @@ an independent fact check, and completing this job does not create a release.
5
5
  """
6
6
  import hashlib
7
7
  import json
8
- from .store import dump, Conflict
8
+ from .store import dump, Conflict, uid, now
9
9
 
10
10
 
11
11
  def source_metadata(store, source_id):
@@ -298,28 +298,41 @@ def require_fact_check_settled(store, job):
298
298
  raise ValueError('本版本候选核查尚未完成('+str(stage.get('status') or '未接纳')+');请先处理核查预算或中断状态,再恢复检查。')
299
299
 
300
300
 
301
- def resume_cancelled_stage(connection, job):
302
- """Explicit parent resume restores only its own cancelled stage/budget.
301
+ def resume_fact_check_stage(connection, job):
302
+ """Resume an owned cancelled check or retry a failed one with the same allowance.
303
303
 
304
- Keep the cancellation history and request ledger. No new allowance or stage
305
- is created, and a budget-exhausted/completed stage is never reopened here.
304
+ Failed attempts retain their own stage identity, rejecting late results.
305
+ Request charges, source bindings and the original budget remain unchanged.
306
306
  """
307
307
  payload=json.loads(job['payload'])
308
308
  if not payload.get('continuation_of'):return
309
309
  from .research_plan import _read_plan, _save_plan
310
310
  plan=_read_plan(connection,payload['run_id']) or {}
311
311
  stage=plan.get('fact_check') or {}
312
- if stage.get('status')!='cancelled':return
312
+ if stage.get('status') not in ('cancelled', 'failed'):return
313
313
  versions = _fact_check_versions(None, job, payload, connection=connection)
314
314
  owners = [attempt['id'] for attempt in _check_attempts(None, job, payload, connection=connection)]
315
- owned=connection.execute("SELECT id FROM jobs WHERE kind='fact_check' AND status='cancelled' "
315
+ statuses = ('cancelled',) if stage['status'] == 'cancelled' else ('complete', 'failed', 'interrupted', 'cancelled')
316
+ owned=connection.execute("SELECT id FROM jobs WHERE kind='fact_check' AND status IN ("
317
+ + ','.join('?' for _ in statuses) + ') '
318
+
316
319
  "AND json_extract(payload,'$.parent_job_id') IN (" + ','.join('?' for _ in owners) + ') '
317
320
  "AND json_extract(payload,'$.run_id')=? "
318
321
  "AND json_extract(payload,'$.version_id') IN (" + ','.join('?' for _ in versions) + ') '
319
- "AND json_extract(payload,'$.stage_id')=?", (*owners,payload['run_id'],*versions,stage.get('stage_id'))).fetchone()
322
+ "AND json_extract(payload,'$.stage_id')=?", (*statuses,*owners,payload['run_id'],*versions,stage.get('stage_id'))).fetchone()
320
323
  if not owned:return
321
- stage.setdefault('interrupted_closures',[]).append({key:stage.get(key) for key in ('status','closed','outcome')})
322
- stage.update(status='active',closed=None,outcome=None)
324
+ if stage['status'] == 'failed':
325
+ from .research_budget import restore_fact_check_budget_offset
326
+ retry = {**stage, 'status': 'active', 'closed': None, 'outcome': None}
327
+ # Restore old published offsets against the old request ledger before
328
+ # assigning a new identity. This cannot replenish consumed allowance.
329
+ restore_fact_check_budget_offset(connection, payload['run_id'], {**plan, 'fact_check': retry})
330
+ retry.update(stage_id=uid('fchk'), created=now(), retry_of_stage_id=stage['stage_id'])
331
+ plan.setdefault('fact_check_history', []).append(stage)
332
+ plan['fact_check'] = retry
333
+ else:
334
+ stage.setdefault('interrupted_closures', []).append({key: stage.get(key) for key in ('status', 'closed', 'outcome')})
335
+ stage.update(status='active', closed=None, outcome=None)
323
336
  _save_plan(connection,payload['run_id'],plan)
324
337
 
325
338
 
@@ -315,9 +315,9 @@ def _refresh_research(store, config):
315
315
  else:
316
316
  from .research_plan import frozen
317
317
  from .scout_coverage import view
318
- # A new goal run can research directly. Do not fabricate Scout receipts
319
- # or hide promised workers when creating the writer's input container.
320
- if not (frozen(store, config['run_id']) or {}).get('goal_contract') or view(store, config['run_id'])['scout_execution']:
318
+ # Any frozen strategy can research directly without inventing Scout
319
+ # receipts. Promised workers still need their normal join/closeout.
320
+ if not frozen(store, config['run_id']) or view(store, config['run_id'])['scout_execution']:
321
321
  return
322
322
  research = {'sources': [], 'gaps': []}
323
323
  research = current_research(store, config['run_id'], research, register=True)
@@ -481,6 +481,9 @@ def source_read(store, config, args):
481
481
  limit = min(int(args.get('max_chars') or READ_CHARS), READ_CHARS)
482
482
  try:
483
483
  offset = args.get('start_char')
484
+ # Zero offset does not conflict with an explicit multi-line window.
485
+ if type(offset) is int and offset == 0 and end is not None and end != (start or 1):
486
+ offset = None
484
487
  if offset is not None:
485
488
  lines = store.source_text(sid).splitlines(); number = start or 1
486
489
  if (type(offset) is not int or offset < 0 or number < 1 or number > len(lines)
@@ -628,7 +631,8 @@ SCOUT_READ_TOOLS = [
628
631
  'parameters': {'type': 'object', 'required': ['source_id'], 'additionalProperties': False,
629
632
  'properties': {'source_id': {'type': 'string'},
630
633
  'start_line': {'type': 'integer', 'minimum': 1},
631
- 'start_char': {'type': 'integer', 'minimum': 0, 'description': '超长单行的字符偏移,从 0 开始;只读取 start_line 这一行'},
634
+ 'start_char': {'type': 'integer', 'minimum': 0,
635
+ 'description': '单行字符偏移,从 0 开始。非零偏移只读 start_line,end_line 须相同;0 可用于正常多行读取。'},
632
636
  'end_line': {'type': 'integer', 'minimum': 1},
633
637
  'max_chars': {'type': 'integer', 'minimum': 1}}},
634
638
  'handler': source_read},
@@ -654,7 +658,8 @@ def _scout_web_tools(channels):
654
658
  'query': {'type': 'string'},
655
659
  'purpose': {'type': 'string', 'enum': ['primary', 'coverage_probe', 'gap_repair']},
656
660
  'reason': {'type': 'string', 'description': '这次想多知道什么'},
657
- 'gap_id': {'type': 'string'},
661
+ 'gap_id': {'type': 'string',
662
+ 'description': '可省略。仅引用现有计划已登记的真实缺口 ID;gap_repair 先取得 ID,primary/coverage_probe 不要编造。'},
658
663
  'topic': {'type': 'string', 'enum': ['general', 'news']},
659
664
  'time_range': {'type': 'string', 'enum': ['day', 'week', 'month', 'year']},
660
665
  'start_date': _DATE, 'end_date': _DATE,
@@ -725,12 +725,12 @@ class Worker:
725
725
  if job['kind']=='learn':
726
726
  self._check_feedback_owner(c,jid,payload)
727
727
  if job['kind']=='assess' and payload.get('continuation_of'):
728
- from .draft_completion import resume_cancelled_stage
728
+ from .draft_completion import resume_fact_check_stage
729
729
  if c.execute("SELECT id FROM jobs WHERE id<>? AND status IN ('queued','running') AND json_extract(payload,'$.continuation_of')=?",(jid,payload['continuation_of'])).fetchone():
730
730
  raise ValueError('本报告另一个检查任务仍在执行,请先等待或停止它')
731
731
  if any(child['id'] in self._review_jobs for child in c.execute("SELECT id FROM jobs WHERE json_extract(payload,'$.parent_job_id')=?",(jid,))):
732
732
  raise ValueError('关联核查仍在停止,请稍后恢复')
733
- resume_cancelled_stage(c,job)
733
+ resume_fact_check_stage(c,job)
734
734
  # Resume keeps the frozen configuration and original task identity.
735
735
  payload['attempt']=int(payload.get('attempt',1))+1
736
736
  c.execute("UPDATE jobs SET payload=?,status='queued',error=NULL,updated=? WHERE id=?",(dump(payload),now(),jid))
@@ -824,8 +824,8 @@ class Worker:
824
824
  frozen['checks_identity']=hashlib.sha256(dump([
825
825
  original['continuation_of'],payload['checks_input'],identity_payload]).encode()).hexdigest()
826
826
  connection.execute('UPDATE jobs SET payload=? WHERE id=?',(dump(frozen),new_id))
827
- from .draft_completion import resume_cancelled_stage
828
- resume_cancelled_stage(connection, {'id': new_id, 'payload': dump(frozen)})
827
+ from .draft_completion import resume_fact_check_stage
828
+ resume_fact_check_stage(connection, {'id': new_id, 'payload': dump(frozen)})
829
829
  return
830
830
  if job['kind']!='learn':return
831
831
  self._check_feedback_owner(connection,jid,original)
@@ -79,7 +79,7 @@
79
79
  <div class="settings-page-header"><div><p class="eyebrow">BRIEFLOOP · 设置</p><h1 id="settings-title">模型与工作设置</h1><p class="help">配置执行引擎、模型与工作习惯。</p></div><button id="settings-close" type="button" class="outline">返回 ↗</button></div>
80
80
  <div class="settings-layout"><nav class="settings-nav" aria-label="设置分类"><button type="button" data-settings-view="models" class="active">模型与提供商</button><button type="button" data-settings-view="connectors">数据连接器(MCP)</button><button type="button" data-settings-view="execution">运行与搜索</button><button type="button" data-settings-view="learning">反馈与学习</button><button type="button" data-settings-view="workspaces">工作区</button><button type="button" data-settings-view="updates">版本与更新</button></nav>
81
81
  <div class="settings-content"><section id="settings-view-models"><div class="settings-segments" role="tablist" aria-label="模型接入方式"><button id="settings-tab-api" role="tab" aria-selected="false" aria-controls="settings-api" type="button" title="基于 Pi SDK">BriefLoop Agent</button><button id="settings-tab-cli" role="tab" aria-selected="true" aria-controls="settings-cli" type="button">Agent CLI</button></div><div id="settings-session-note" class="settings-session-note help" hidden></div><section id="settings-cli" role="tabpanel" aria-labelledby="settings-tab-cli"><div id="settings-runtime-list"></div><div id="settings-model-block"></div></section><section id="settings-api" role="tabpanel" aria-labelledby="settings-tab-api" hidden><div id="settings-native-runtime"></div></section></section>
82
- <section id="settings-view-updates" data-web-version="0.31.6" hidden>
82
+ <section id="settings-view-updates" data-web-version="0.31.7" hidden>
83
83
  <h2>版本与更新</h2><p id="app-update-version">正在读取实际运行版本…</p><p id="app-update-latest-version" class="help">尚未检查可用版本</p><pre id="app-update-command" hidden></pre>
84
84
  <p id="app-update-status" role="status" aria-live="polite">尚未检查更新</p>
85
85
  <p id="app-update-test-source" class="help" hidden>本地测试更新源 · 仅验证流程,不代表官方发布</p>
@@ -2763,7 +2763,7 @@ Options:
2763
2763
  4. \u5173\u952E\u7ED3\u8BBA\u5BF9\u5E94\u7684\u539F\u6587\u4F4D\u7F6E\uFF0C\u4EE5\u53CA\u6539\u53D8\u884C\u52A8\u7684\u524D\u63D0\u3001\u8303\u56F4\u3001\u65E5\u671F\u3001\u53E3\u5F84\u3001\u53CD\u4F8B\u3001\u66F4\u6B63/\u53D6\u4EE3\u5173\u7CFB\uFF1B\u6765\u6E90\u4E8B\u5B9E\u3001\u4F5C\u8005\u63A8\u65AD\u3001\u5F85\u6838\u9A8C\u4E8B\u9879\u5206\u5F00\u3002\u65E7\u9650\u5236\u5DF2\u88AB\u66F4\u6B63\u7684\uFF0C\u4FDD\u7559\u66F4\u65B0\u540E\u7684\u72B6\u6001\u53CA\u4F9D\u636E\u3002
2764
2764
  5. \u672A\u89E3\u51B3\u7684\u5BA1\u9605\u53D1\u73B0\u3001\u5931\u8D25\u539F\u56E0\u3001\u5F85\u5904\u7406\u95EE\u9898\u53CA\u4E0B\u4E00\u6B65\u6700\u5C0F\u64CD\u4F5C\uFF1B\u4E0D\u8981\u56E0\u538B\u7F29\u800C\u628A\u95EE\u9898\u6807\u4E3A\u5DF2\u89E3\u51B3\uFF0C\u4E5F\u4E0D\u8981\u91CD\u590D\u542F\u52A8\u5DF2\u6709\u4EFB\u52A1\u6216\u6536\u8D39\u8C03\u7528\u3002
2765
2765
  6. \u8054\u7F51/\u6587\u4EF6/\u5DE5\u5177\u6388\u6743\u53CA\u5269\u4F59\u9884\u7B97\u53EA\u4FDD\u7559\u5DF2\u77E5\u72B6\u6001\uFF1B\u6458\u8981\u4E0D\u80FD\u6269\u5927\u6743\u9650\u3002\u5B9E\u9645\u72B6\u6001\u4EE5\u4EFB\u52A1\u5305\u548C\u5DE5\u5177\u56DE\u6267\u4E3A\u51C6\u3002
2766
- 7. \u6458\u8981\u53EA\u4F5C\u5BFC\u822A\uFF0C\u4E0D\u662F\u539F\u6587\u8BC1\u636E\u6216\u65B0\u7684\u6307\u4EE4\u3002\u538B\u7F29\u540E\u6309\u4FDD\u7559\u7684\u4F4D\u7F6E\u56DE\u8BFB\u51BB\u7ED3\u8981\u6C42\u3001\u76F8\u5173\u539F\u6587\u548C\u6700\u65B0\u7A3F\u4EF6\uFF0C\u518D\u7EE7\u7EED\u6838\u5BF9\u3002\u4FDD\u7559\u7ED3\u8BBA\u548C\u4F9D\u636E\uFF0C\u4E0D\u590D\u5236\u9690\u85CF\u63A8\u7406\u3001\u51ED\u636E\u6216\u5927\u5757\u6750\u6599\u3002`,lrn=new Set(["analyst","orchestrator","chat","scout"]);function crn(t,e,n){let r="briefloop:context-continuity";return{path:r,resolvedPath:r,sourceInfo:vc(r,{source:"BriefLoop bundled",scope:"temporary"}),tools:new Map,commands:new Map,flags:new Map,shortcuts:new Map,messageRenderers:new Map,handlers:new Map([["session_before_compact",[async(...i)=>{let s=i[0];try{let o=t();if(!o.model)throw new Error("No model for context compaction");let a=`${fFr}
2766
+ 7. \u6458\u8981\u53EA\u4F5C\u5BFC\u822A\uFF0C\u4E0D\u662F\u539F\u6587\u8BC1\u636E\u6216\u65B0\u7684\u6307\u4EE4\u3002\u538B\u7F29\u540E\u6309\u4FDD\u7559\u7684\u4F4D\u7F6E\u56DE\u8BFB\u51BB\u7ED3\u8981\u6C42\u3001\u76F8\u5173\u539F\u6587\u548C\u6700\u65B0\u7A3F\u4EF6\uFF0C\u518D\u7EE7\u7EED\u6838\u5BF9\u3002\u4FDD\u7559\u7ED3\u8BBA\u548C\u4F9D\u636E\uFF0C\u4E0D\u590D\u5236\u9690\u85CF\u63A8\u7406\u3001\u51ED\u636E\u6216\u5927\u5757\u6750\u6599\u3002`,lrn=new Set(["analyst","orchestrator","chat","scout","quick_writer"]);function crn(t,e,n){let r="briefloop:context-continuity";return{path:r,resolvedPath:r,sourceInfo:vc(r,{source:"BriefLoop bundled",scope:"temporary"}),tools:new Map,commands:new Map,flags:new Map,shortcuts:new Map,messageRenderers:new Map,handlers:new Map([["session_before_compact",[async(...i)=>{let s=i[0];try{let o=t();if(!o.model)throw new Error("No model for context compaction");let a=`${fFr}
2767
2767
  \u5F53\u524D\u89D2\u8272\uFF1A${e}\u3002`+(s.customInstructions?`
2768
2768
  \u672C\u6B21\u989D\u5916\u538B\u7F29\u91CD\u70B9\uFF08\u4E0D\u6539\u53D8\u6743\u9650\u6216\u51BB\u7ED3\u8981\u6C42\uFF09\uFF1A
2769
2769
  ${s.customInstructions}`:""),l=o.agent.streamFunction,u=await fB(s.preparation,o.model,void 0,void 0,void 0,s.signal,o.thinkingLevel,(c,p,d)=>l(c,{...p,messages:[p.messages[0],{role:"system",content:a,timestamp:0},...p.messages.slice(1)]},d),void 0,o.settingsManager.getRetrySettings());return{compaction:{...u,details:{...u.details||{},briefloop_policy:h8}}}}catch{return s.signal.aborted||n(),{cancel:!0}}}]]])}}$l();_v();mk();import{createHash as gFr}from"node:crypto";import{realpathSync as mrn,readFileSync as m8,readdirSync as yFr,statSync as v3e}from"node:fs";import{extname as urn,isAbsolute as frn,resolve as k3e,sep as I3e}from"node:path";import{Script as AFr}from"node:vm";var f8=6e4,prn=20*1024*1024,_Fr=20*1024*1024,w3e=160,Jue={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp"},drn=new Set([".pdf",".bin",".xlsx",".xls",".docx",".doc",".zip",".pptx",...Object.keys(Jue)]);function ZF(t,e){if(!e||frn(e)||e.includes("\0"))throw new Error("packet paths are relative to the packet root");let n=k3e(t,e),r=t.endsWith(I3e)?t:t+I3e;if(n!==t&&!n.startsWith(r))throw new Error("packet tools only resolve inside the review packet");let i=mrn(n);if(i!==n&&!i.startsWith(r))throw new Error("packet tools refuse symlink escapes");if(!v3e(i).isFile())throw new Error(`not a packet file: ${e}`);return i}function R3e(t,e,n){for(let r of yFr(t,{withFileTypes:!0})){if(r.isSymbolicLink())continue;let i=k3e(t,r.name);r.isDirectory()?R3e(i,e,n):r.isFile()&&n.push(i.slice(e.length+1).split(I3e).join("/"))}}function IC(t,e={}){return{content:[{type:"text",text:t}],details:e}}function hrn(t,e=f8){return t.length<=e?t:t.slice(0,e)+`
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": "0.31.7",
3
+ "notes": "- 修复研究工具参数错误被误认成搜索服务故障,作者可按回执纠正参数继续检索。\n- 修复多行原文读取和历史日期过滤,直接研究无需派发 Scout 也能正常交接写稿。\n- 失败事实核查可在原预算内重新尝试,保留旧结果并拒绝旧任务的迟到提交。\n- 默认直写作者支持上下文连续压缩,长研究不再因漏接压缩而中止。\n- Mac 发行接入 Developer ID 签名和 Apple 公证;正式通过状态以发行验收记录为准。"
4
+ }
@@ -15,7 +15,8 @@ PROVIDER_LABELS={'tavily':'Tavily','duckduckgo':'DuckDuckGo','bocha':'博查','z
15
15
 
16
16
  # Stable, redacted classification for the request envelope. Do not infer a
17
17
  # provider's billing outcome from these; they only say why an attempt stopped.
18
- FAILURE_KINDS=('auth','quota','rate_limit','timeout','tls','network','invalid_response','too_large','provider_error','budget','local_error')
18
+ FAILURE_KINDS=('auth','quota','rate_limit','timeout','tls','network','invalid_response','too_large',
19
+ 'provider_error','budget','local_error','invalid_arguments','policy')
19
20
 
20
21
 
21
22
  class SearchError(ValueError):
@@ -88,10 +89,14 @@ def check_run(store,run_id,provider):
88
89
  fail=getattr(provider_module(provider),'ProviderError',SearchError)
89
90
  run=store.one('runs',run_id)
90
91
  if not json.loads(run['requirements']).get('allow_web'):
91
- error=fail('本轮未允许联网搜索');error.provider=provider;raise error
92
+ error=marked('本轮未允许联网搜索','policy',cls=fail)
93
+ error.provider=provider
94
+ raise error
92
95
  from .search_policy import for_run,allowed
93
96
  if provider not in allowed(for_run(store,run_id)):
94
- error=fail('本轮搜索服务不是 '+PROVIDER_LABELS[provider]+',请在设置中选择后发起新任务');error.provider=provider;raise error
97
+ error=marked('本轮搜索服务不是 '+PROVIDER_LABELS[provider]+',请在设置中选择后发起新任务','policy',cls=fail)
98
+ error.provider=provider
99
+ raise error
95
100
  return run
96
101
 
97
102
 
@@ -124,11 +129,11 @@ def search(query,*,provider=None,topic='general',time_range=None,start_date=None
124
129
  key_file=None,store=None,run_id=None,purpose='primary',reason='',gap_id=None):
125
130
  """One metered search request; provider stays swappable behind one envelope."""
126
131
  if provider is None:
127
- if store is None or run_id is None:raise SearchError('未指定搜索 provider')
132
+ if store is None or run_id is None:raise marked('未指定搜索 provider','invalid_arguments')
128
133
  provider=provider_for_run(store,run_id)
129
134
  else:provider=normalize_provider(provider)
130
- if purpose not in ('primary','coverage_probe','gap_repair'):raise SearchError('无效搜索用途')
131
- if not isinstance(reason,str) or len(reason)>1000:raise SearchError('搜索原因过长')
135
+ if purpose not in ('primary','coverage_probe','gap_repair'):raise marked('无效搜索用途','invalid_arguments')
136
+ if not isinstance(reason,str) or len(reason)>1000:raise marked('搜索原因过长','invalid_arguments')
132
137
  module=provider_module(provider)
133
138
  if store is not None and run_id and provider == 'tavily':
134
139
  import json
@@ -148,13 +153,18 @@ def search(query,*,provider=None,topic='general',time_range=None,start_date=None
148
153
  time_range = None
149
154
  # A fact-check query may concern historical/background statements.
150
155
  # Its explicit dates (if any) survive instead of inheriting the news window.
156
+ if provider == 'tavily' and (start_date or end_date):
157
+ time_range = None
151
158
  options={'topic':topic,'time_range':time_range,'start_date':start_date,'end_date':end_date,
152
159
  'include_domains':list(include_domains or []),'exclude_domains':list(exclude_domains or []),
153
160
  'max_results':max_results,'search_depth':search_depth}
154
161
  if provider=='zhipu':
155
162
  from .search_policy import for_run
156
163
  options['search_engine']=for_run(store,run_id)['zhipu_engine'] if store is not None and run_id else 'search_std'
157
- parameters=module.validate_search(query,options)
164
+ try:
165
+ parameters=module.validate_search(query,options)
166
+ except SearchError as exc:
167
+ raise marked(str(exc),'invalid_arguments',cls=type(exc)) from exc
158
168
  reservation=None;local_id=None;round_id=None;claim=None
159
169
  if store is not None and run_id is not None:
160
170
  check_run(store,run_id,provider)
@@ -162,7 +172,9 @@ def search(query,*,provider=None,topic='general',time_range=None,start_date=None
162
172
  from .research_plan import frozen
163
173
  plan=frozen(store,run_id) or {}
164
174
  gaps=[g for info in plan.get('rounds',{}).values() for g in info.get('gaps',[])]
165
- if not any(g.get('id')==gap_id for g in gaps):raise SearchError('缺口不属于本轮计划')
175
+ if not any(g.get('id')==gap_id for g in gaps):
176
+ raise marked('gap_id 不属于本轮已登记缺口;普通搜索可省略,补缺口时先取得计划中的真实 ID',
177
+ 'invalid_arguments')
166
178
  from . import research_budget as budget
167
179
  # The identity uses validated options; the shared budget caps admitted
168
180
  # URLs, not provider results. Different key files must not join one
@@ -317,7 +329,7 @@ def extract(store,urls,*,run_id=None,provider=None,extract_depth='basic',key_fil
317
329
  """Provider-facing extraction entry: Tavily uses its API; keyless providers
318
330
  register pages through the same metered direct-fetch path as add-url."""
319
331
  if provider is None:
320
- if run_id is None:raise SearchError('未指定搜索 provider')
332
+ if run_id is None:raise marked('未指定搜索 provider','invalid_arguments')
321
333
  provider=provider_for_run(store,run_id)
322
334
  else:provider=normalize_provider(provider)
323
335
  return provider_module(provider).extract(store,urls,run_id=run_id,extract_depth=extract_depth,key_file=key_file)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: briefloop
3
- Version: 0.31.6
3
+ Version: 0.31.7
4
4
  Summary: Local multi-runtime agent workbench for sourced briefings, independent review and skill learning
5
5
  Author: Stahl-G
6
6
  License-Expression: MIT
@@ -52,7 +52,7 @@ Dynamic: license-file
52
52
 
53
53
  报告可选中文或英文,英文写作规范、词数和导出版式贯穿写稿与审阅;新增 Excel 报表导出,未安装 OfficeCLI 也能使用。OpenCode 1.x 与 2.x 同时支持,普通审阅和严格审阅分别展示实际能力,重大事实错误与证据缺口仍阻止正式交付。
54
54
 
55
- 本轮提供 macOS Apple Silicon、Python/CLI/PyPI 与 GitHub 源码;Windows 安装包沿用既有稳定版,待原生验收后单独更新。本轮 Mac 包未做 Developer ID 签名或 Apple 公证,平台验证与工件哈希见发行页。完整变更见 [CHANGELOG](CHANGELOG.md)。
55
+ 提供 macOS Apple Silicon、Windows 和 Python/CLI 安装入口。Mac 签名、公证、各平台验收状态及工件哈希见对应发行页。完整变更见 [CHANGELOG](CHANGELOG.md)。
56
56
 
57
57
  新工作区默认优先 Tavily,同时允许宿主自带搜索补查;可主动启用博查、智谱搜索或 DuckDuckGo,按跨市场覆盖或具体缺口补查。受控渠道共用本轮预算,搜索失败、实际发现渠道与原文分别保留。Tavily 需要 API Key,额度以服务账号为准;宿主自带搜索取决于实际工具与权限。
58
58
 
@@ -94,7 +94,7 @@ def finish(store,job,worker):
94
94
 
95
95
  def test_evidence_child_fact_check_sources_are_admitted_without_accepting_unrelated_sources(tmp_path, monkeypatch):
96
96
  from briefloop import research_plan, tavily
97
- from briefloop.draft_completion import binding, accept_stage_sources, require_fact_check_settled, resume_cancelled_stage
97
+ from briefloop.draft_completion import binding, accept_stage_sources, require_fact_check_settled, resume_fact_check_stage
98
98
  store = Store(tmp_path)
99
99
  run = store.create_run({'title': 'R', 'objective': 'Public update', 'allow_web': True, 'fact_check': True,
100
100
  'completion_mode': 'direct', 'search_policy': {'primary_provider': 'tavily', 'coverage_mode': 'primary_only'},
@@ -134,7 +134,7 @@ def test_evidence_child_fact_check_sources_are_admitted_without_accepting_unrela
134
134
  retry = worker.retry_with_current_model(parent['id'])
135
135
  assert research_plan.frozen(store, run['id'])['fact_check']['status'] == 'active'
136
136
  with store.tx() as connection:
137
- resume_cancelled_stage(connection, parent)
137
+ resume_fact_check_stage(connection, parent)
138
138
  resumed = research_plan.frozen(store, run['id'])['fact_check']
139
139
  assert resumed['status'] == 'active'
140
140
  assert resumed['stage_id'] == before_resume['stage_id']
@@ -143,7 +143,7 @@ def test_evidence_child_fact_check_sources_are_admitted_without_accepting_unrela
143
143
  assert unchanged(resumed) == unchanged(before_resume)
144
144
  assert resumed['interrupted_closures'][-1]['status'] == 'cancelled'
145
145
  with store.tx() as connection:
146
- resume_cancelled_stage(connection, parent)
146
+ resume_fact_check_stage(connection, parent)
147
147
  assert research_plan.frozen(store, run['id'])['fact_check'] == resumed
148
148
  store.update_job(check['id'], 'complete')
149
149
  research_plan.finish_fact_check(store, run['id'], status='completed')
@@ -321,3 +321,43 @@ def test_pending_grant_receipt_does_not_add_again_after_the_stage_consumes_it(tm
321
321
  assert len(before['fact_check']['initial_grants']) == 1
322
322
  assert research_plan.pending_fact_check_grant(store, run['id']) is None
323
323
  assert store.rows("SELECT id FROM jobs WHERE kind='fact_check'") == []
324
+
325
+
326
+ def test_parent_retry_replaces_failed_check_stage_without_resetting_allowance(tmp_path):
327
+ from briefloop.runtime import Worker
328
+ from briefloop.draft_completion import binding, require_fact_check_settled
329
+ store, run, _ = _world(tmp_path)
330
+ brief, claim, _ = _claim_version(store, run)
331
+ research_plan.finish_round(store, run['id'])
332
+ parent = store.enqueue('assess', {'run_id': run['id'], 'version_id': brief['id'],
333
+ 'runtime': {'model': 'test'}, 'continuation_of': 'job_original', 'checks_input': binding(store, brief['id'])})
334
+ worker = Worker(store)
335
+ first = worker._admit_fact_check(parent, brief)
336
+ old = store.rows("SELECT * FROM jobs WHERE kind='fact_check'")[0]
337
+ research_plan.add_fact_check_grant(store, run['id'], SHARE)
338
+ request = budget.reserve_search(store, run['id'], 1)
339
+ before = budget.snapshot(store, run['id'])
340
+ failed_result = {'version_id': brief['id'], 'stage_id': first['stage_id'],
341
+ 'selection': {'claim_ids': [claim['id']]}, 'execution': {'status': 'failed', 'summary': 'Source reader failed'},
342
+ 'candidates': [{'claim_id': claim['id'], 'status': 'insufficient_evidence', 'reason': 'Could not read source',
343
+ 'span_ids': [], 'query_ids': [request['request_id']]}]}
344
+ saved = fact_check.submit_result(store, run['id'], failed_result, job_id=old['id'])
345
+ store.update_job(old['id'], 'complete', result={'execution': 'failed'})
346
+ store.update_job(parent['id'], 'failed', error='Fact check failed')
347
+ worker.resume(parent['id'])
348
+ retry_stage = research_plan.frozen(store, run['id'])['fact_check']
349
+ assert retry_stage['status'] == 'active' and retry_stage['stage_id'] != first['stage_id']
350
+ assert retry_stage['retry_of_stage_id'] == first['stage_id']
351
+ after = budget.snapshot(store, run['id'])
352
+ assert after['limits'] == before['limits'] and after['used'] == before['used']
353
+ assert fact_check.get_record(store, saved['record']['id'])['data']['execution']['status'] == 'failed'
354
+ with pytest.raises(ValueError):
355
+ fact_check.submit_result(store, run['id'], failed_result, job_id=old['id'])
356
+ with pytest.raises(ValueError):
357
+ require_fact_check_settled(store, store.one('jobs', parent['id']))
358
+ worker._admit_fact_check(store.one('jobs', parent['id']), brief)
359
+ worker._admit_fact_check(store.one('jobs', parent['id']), brief)
360
+ checks = store.rows("SELECT * FROM jobs WHERE kind='fact_check' ORDER BY rowid")
361
+ assert len(checks) == 2 and checks[-1]['status'] == 'queued'
362
+ assert json.loads(checks[-1]['payload'])['stage_id'] == retry_stage['stage_id']
363
+ assert store.one('jobs', old['id'])['status'] == 'complete'
@@ -122,3 +122,27 @@ def test_cancelled_stage_rejects_new_and_late_requests(tmp_path):
122
122
  with pytest.raises(research_plan.AdmissionError) as blocked:
123
123
  budget.reserve_search(store, run['id'], 1)
124
124
  assert blocked.value.code == 'fact_check_closed'
125
+
126
+
127
+ def test_fact_check_search_absolute_dates_clear_relative_filter(tmp_path, monkeypatch):
128
+ from briefloop import tavily, websearch
129
+ store = Store(tmp_path)
130
+ store.update_settings({'search_provider': 'tavily', 'search_policy': {'primary_provider': 'tavily'}})
131
+ run = _run(store, period_start='2026-09-21', period_end='2026-09-27',
132
+ research_budget={'search_requests': 4, 'candidate_urls': 20, 'source_pages': 6})
133
+ _closed_round(store, run)
134
+ research_plan.admit_fact_check(store, run['id'], {'kind': 'task_reserve', 'limits': SHARE})
135
+ requests = []
136
+
137
+ def post(endpoint, payload, **kwargs):
138
+ requests.append(payload)
139
+ result = {'results': [{'title': 'Historical original', 'url': 'https://example.test/history', 'content': 'Background'}]}
140
+ return result, json.dumps(result).encode()
141
+
142
+ monkeypatch.setattr(tavily, '_post', post)
143
+ result = websearch.search('historical background', provider='tavily', time_range='year',
144
+ start_date='2020-01-01', end_date='2020-12-31', store=store, run_id=run['id'])
145
+ assert result['status'] == 'ok'
146
+ assert requests[0]['start_date'] == '2020-01-01' and requests[0]['end_date'] == '2020-12-31'
147
+ assert 'time_range' not in requests[0]
148
+ assert budget.snapshot(store, run['id'])['stages']['fact_check']['search_requests'] == 1
@@ -403,3 +403,37 @@ def test_revision_responses_without_review_findings_are_told_to_send_none():
403
403
  with pytest.raises(ValueError, match='"expected": \\["review_1"\\]'):
404
404
  validate_arrays([], answer, {'review_1'})
405
405
  validate_arrays([], [], set())
406
+
407
+
408
+ def test_guided_direct_research_without_scout_reaches_writer(tmp_path):
409
+ class DirectEngine(FlowEngine):
410
+ def next(self, sid):
411
+ if self.sessions[sid]['role'] == 'orchestrator' and not getattr(self, 'direct_started', False):
412
+ self.direct_started = True
413
+ self.queues[sid] = [
414
+ ('save_plan', {'plan': {'summary': 'Read the supplied revenue',
415
+ 'reader_contract': contract(self.store, self.run['id']), 'scout_tasks': []}}),
416
+ ('source_read', {'source_id': self.source['id']}),
417
+ ('save_research_handoff', {'handoff': {'learnings': [], 'covered': ['Revenue read'], 'open_questions': []}}),
418
+ ('workspace_action', {'request': {'action': 'finish_research_round', 'gaps': [], 'summary': 'Direct research finished'}}),
419
+ ('workspace_action', {'request': {'action': 'reconciliation_save', 'reconciliation': {
420
+ 'status': 'not_applicable', 'examined_claim_ids': [], 'unexamined_claim_ids': [],
421
+ 'relations': [], 'open_questions': [], 'coverage_notes': 'No source claims in fixture'}}}),
422
+ ('write_report', {'instructions': 'State the supplied revenue'}),
423
+ ('finish_task', {})]
424
+ super().next(sid)
425
+
426
+ store, source, run, job = setup(tmp_path)
427
+ engine = DirectEngine(store, run, source)
428
+ harness = NativeHarness(store, engine)
429
+ worker = Worker(store)
430
+ worker.runtime = InteractiveRuntime(store, backends={'briefloop-native': harness})
431
+ try:
432
+ result = worker.generate(job, score=False)
433
+ brief = store.one('briefs', result['version_id'])
434
+ assert '1200' in brief['markdown']
435
+ assert sorted(session['role'] for session in engine.sessions.values()) == ['analyst', 'orchestrator']
436
+ research = json.loads((worker.folder(job) / 'research.json').read_text())
437
+ assert research['sources'] == []
438
+ finally:
439
+ harness.close()
@@ -316,3 +316,55 @@ def test_source_regex_timeout_reaps_worker_and_next_search_works(tmp_path, monke
316
316
  assert len(processes) == 1 and processes[0].poll() is not None
317
317
  following = run_tool(store, config, 'source_grep', {'source_id': sid, 'pattern': '收入(USD)'})
318
318
  assert following['ok'] and f'{sid} 2 (start_char=0)' in following['content'][0]['text']
319
+
320
+
321
+ def test_search_argument_failure_recovers_without_spending_provider_budget(tmp_path, monkeypatch):
322
+ from briefloop import duckduckgo, research_budget
323
+ store, run_id, _ = _run(tmp_path, allow_web=True, policy={'primary_provider': 'duckduckgo'})
324
+ config = _config(store, run_id, 'argument-recovery')
325
+ calls = []
326
+
327
+ class Provider:
328
+ validate_search = staticmethod(duckduckgo.validate_search)
329
+ search_note = staticmethod(lambda: 'discovery only')
330
+ rows = staticmethod(lambda parsed: [{'url': 'https://example.test/report', 'title': 'Report', 'content': 'snippet'}])
331
+
332
+ @staticmethod
333
+ def call_search(query, parameters, **kwargs):
334
+ calls.append(query)
335
+ if query == 'upstream failure':
336
+ raise websearch.marked('synthetic upstream failure', 'network')
337
+ return {}, b'{}', 'request', None
338
+
339
+ monkeypatch.setattr(websearch, 'provider_module', lambda provider: Provider)
340
+ arguments = {'provider': 'duckduckgo', 'query': 'orders', 'purpose': 'primary', 'reason': 'find orders'}
341
+ for invalid in ({'gap_id': 'week-news'}, {'max_results': 99}):
342
+ result = run_tool(store, config, 'web_search', {**arguments, **invalid})
343
+ body = json.loads(result['content'][0]['text'])
344
+ assert body['status'] == 'failed' and body['failure_kind'] == 'invalid_arguments'
345
+ assert body['recoverable'] is True and body['recovery_action'] == 'correct_arguments'
346
+ assert calls == []
347
+ assert research_budget.snapshot(store, run_id)['used']['search_requests'] == 0
348
+
349
+ recovered = json.loads(run_tool(store, config, 'web_search', arguments)['content'][0]['text'])
350
+ assert recovered['status'] == 'ok' and len(recovered['results']) == 1
351
+ assert calls == ['orders']
352
+ upstream_result = run_tool(store, config, 'web_search', {**arguments, 'query': 'upstream failure'})
353
+ upstream = json.loads(upstream_result['content'][0]['text'])
354
+ assert upstream['failure_kind'] == 'network'
355
+ assert 'recovery_action' not in upstream
356
+ assert research_budget.snapshot(store, run_id)['used']['search_requests'] == 2
357
+
358
+
359
+ def test_source_read_zero_offset_preserves_requested_multiline_window(tmp_path):
360
+ store, run_id, sid = _run(tmp_path)
361
+ config = _config(store, run_id, 'zero-offset-read')
362
+ arguments = {'source_id': sid, 'start_line': 1, 'end_line': 3}
363
+ ordinary = run_tool(store, config, 'source_read', arguments)
364
+ zero = run_tool(store, config, 'source_read', {**arguments, 'start_char': 0})
365
+ assert zero == ordinary
366
+ assert '2: Revenue rose to USD 12 million' in zero['content'][0]['text']
367
+ assert '3: up from USD 10 million.' in zero['content'][0]['text']
368
+ assert not run_tool(store, config, 'source_read', {**arguments, 'start_char': 1})['ok']
369
+ single = run_tool(store, config, 'source_read', {**arguments, 'end_line': 1, 'start_char': 1})
370
+ assert single['ok'] and '1: eader' in single['content'][0]['text']