briefloop 0.28.2__tar.gz → 0.28.4__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 (1009) hide show
  1. {briefloop-0.28.2 → briefloop-0.28.4}/.gitattributes +1 -0
  2. {briefloop-0.28.2 → briefloop-0.28.4}/CHANGELOG.md +18 -0
  3. {briefloop-0.28.2 → briefloop-0.28.4}/PKG-INFO +1 -1
  4. briefloop-0.28.4/VERSION +1 -0
  5. {briefloop-0.28.2 → briefloop-0.28.4}/desktop/electron/package-lock.json +2 -2
  6. {briefloop-0.28.2 → briefloop-0.28.4}/desktop/electron/package.json +1 -1
  7. briefloop-0.28.4/docs/release-0.28.3.md +13 -0
  8. briefloop-0.28.4/docs/release-0.28.4.md +9 -0
  9. {briefloop-0.28.2 → briefloop-0.28.4}/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 +1 -1
  10. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/app-updates.js +45 -11
  11. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/app.js +11 -4
  12. briefloop-0.28.4/frontend/next-report.js +53 -0
  13. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/research-process.js +1 -0
  14. {briefloop-0.28.2 → briefloop-0.28.4}/pyproject.toml +1 -1
  15. {briefloop-0.28.2 → briefloop-0.28.4}/scripts/build_frontend.mjs +9 -0
  16. briefloop-0.28.4/src/briefloop/__init__.py +1 -0
  17. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/chat_tools.py +10 -1
  18. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/external_client.py +7 -1
  19. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/models.py +3 -1
  20. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/native_orchestrator.py +46 -11
  21. briefloop-0.28.4/src/briefloop/next_report.py +49 -0
  22. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/progress.py +2 -0
  23. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/runtime.py +2 -0
  24. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/schedules.py +1 -1
  25. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/server.py +12 -1
  26. briefloop-0.28.4/src/briefloop/software_release_notes.py +56 -0
  27. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/software_version.py +2 -1
  28. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/app.js +81 -81
  29. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/index.html +9 -6
  30. briefloop-0.28.4/src/briefloop/static/native-engine-image-worker.mjs +8 -0
  31. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/native-engine-licenses.txt +18 -18
  32. briefloop-0.28.4/src/briefloop/static/native-engine-photon.wasm +0 -0
  33. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/native-engine.mjs +2240 -1772
  34. briefloop-0.28.4/src/briefloop/static/release-notes.json +4 -0
  35. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/style.css +4 -0
  36. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/store.py +10 -2
  37. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/task_progress.py +2 -2
  38. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop.egg-info/PKG-INFO +1 -1
  39. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop.egg-info/SOURCES.txt +14 -0
  40. {briefloop-0.28.2 → briefloop-0.28.4}/start.sh +0 -0
  41. {briefloop-0.28.2 → briefloop-0.28.4}/tests/check_distribution.py +3 -0
  42. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_app_updates.mjs +35 -5
  43. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_chat_commands.mjs +1 -1
  44. briefloop-0.28.4/tests/frontend_next_report.mjs +46 -0
  45. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_form_defaults.mjs +7 -2
  46. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_research_process.mjs +5 -0
  47. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_save_barrier.mjs +6 -1
  48. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_setup_state.mjs +1 -1
  49. briefloop-0.28.4/tests/test_chat_stop.py +70 -0
  50. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fact_check_switch.py +19 -4
  51. briefloop-0.28.4/tests/test_native_scout_round_paths.py +69 -0
  52. briefloop-0.28.4/tests/test_next_report.py +73 -0
  53. briefloop-0.28.4/tests/test_periodic_preflight.py +98 -0
  54. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_capability.py +2 -2
  55. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_scout_coverage.py +49 -0
  56. briefloop-0.28.4/tests/test_software_release_notes.py +79 -0
  57. briefloop-0.28.2/VERSION +0 -1
  58. briefloop-0.28.2/src/briefloop/__init__.py +0 -1
  59. {briefloop-0.28.2 → briefloop-0.28.4}/CONTRIBUTING.md +0 -0
  60. {briefloop-0.28.2 → briefloop-0.28.4}/KNOWN_ISSUES.md +0 -0
  61. {briefloop-0.28.2 → briefloop-0.28.4}/LICENSE +0 -0
  62. {briefloop-0.28.2 → briefloop-0.28.4}/MANIFEST.in +0 -0
  63. {briefloop-0.28.2 → briefloop-0.28.4}/README.md +0 -0
  64. {briefloop-0.28.2 → briefloop-0.28.4}/SECURITY.md +0 -0
  65. {briefloop-0.28.2 → briefloop-0.28.4}/THIRD_PARTY_NOTICES.md +0 -0
  66. {briefloop-0.28.2 → briefloop-0.28.4}/bootstrap.py +0 -0
  67. {briefloop-0.28.2 → briefloop-0.28.4}/docs/OpenCode/347/211/210/346/234/254/345/205/274/345/256/271.md" +0 -0
  68. {briefloop-0.28.2 → briefloop-0.28.4}/docs/WorkBuddy/345/244/226/351/203/250/345/205/245/345/217/243.md" +0 -0
  69. {briefloop-0.28.2 → briefloop-0.28.4}/docs/architecture.md +0 -0
  70. {briefloop-0.28.2 → briefloop-0.28.4}/docs/compose/spec/home-v2.md +0 -0
  71. {briefloop-0.28.2 → briefloop-0.28.4}/docs/design-v3.1-validation.md +0 -0
  72. {briefloop-0.28.2 → briefloop-0.28.4}/docs/dmg-density-validation.md +0 -0
  73. {briefloop-0.28.2 → briefloop-0.28.4}/docs/draft-first.md +0 -0
  74. {briefloop-0.28.2 → briefloop-0.28.4}/docs/jev-precheck.md +0 -0
  75. {briefloop-0.28.2 → briefloop-0.28.4}/docs/native-integration.md +0 -0
  76. {briefloop-0.28.2 → briefloop-0.28.4}/docs/quality-reading-context.md +0 -0
  77. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.26.0.md +0 -0
  78. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.26.1.md +0 -0
  79. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.26.2.md +0 -0
  80. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.26.3.md +0 -0
  81. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.26.4.md +0 -0
  82. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.27.0.md +0 -0
  83. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.28.0.md +0 -0
  84. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.28.1.md +0 -0
  85. {briefloop-0.28.2 → briefloop-0.28.4}/docs/release-0.28.2.md +0 -0
  86. {briefloop-0.28.2 → briefloop-0.28.4}/docs/report-length.md +0 -0
  87. {briefloop-0.28.2 → briefloop-0.28.4}/docs/report-time-window.md +0 -0
  88. {briefloop-0.28.2 → briefloop-0.28.4}/docs/report-version-information.md +0 -0
  89. {briefloop-0.28.2 → briefloop-0.28.4}/docs/research-handoff.md +0 -0
  90. {briefloop-0.28.2 → briefloop-0.28.4}/docs/revision-learning.md +0 -0
  91. {briefloop-0.28.2 → briefloop-0.28.4}/docs/sqlite-benchmark.md +0 -0
  92. {briefloop-0.28.2 → briefloop-0.28.4}/docs/technical-report-0.21.0/evidence-index.md +0 -0
  93. {briefloop-0.28.2 → briefloop-0.28.4}/docs/technical-report-0.21.0/technical-report.md +0 -0
  94. {briefloop-0.28.2 → briefloop-0.28.4}/docs/windows.md +0 -0
  95. {briefloop-0.28.2 → briefloop-0.28.4}/docs/writer-input.md +0 -0
  96. {briefloop-0.28.2 → briefloop-0.28.4}/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
  97. {briefloop-0.28.2 → briefloop-0.28.4}/docs//344/274/232/350/256/256/347/272/252/350/246/201.md" +0 -0
  98. {briefloop-0.28.2 → briefloop-0.28.4}/docs//344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -0
  99. {briefloop-0.28.2 → briefloop-0.28.4}/docs//345/206/205/347/275/256/345/274/225/346/223/216.md" +0 -0
  100. {briefloop-0.28.2 → briefloop-0.28.4}/docs//345/215/207/347/272/247/350/257/264/346/230/216.md" +0 -0
  101. {briefloop-0.28.2 → briefloop-0.28.4}/docs//345/233/276/350/241/250/344/270/216Excel.md" +0 -0
  102. {briefloop-0.28.2 → briefloop-0.28.4}/docs//345/244/232Runtime/344/270/216/346/250/241/345/236/213.md" +0 -0
  103. {briefloop-0.28.2 → briefloop-0.28.4}/docs//345/244/232/346/250/241/346/200/201/346/235/245/346/272/220.md" +0 -0
  104. {briefloop-0.28.2 → briefloop-0.28.4}/docs//345/256/232/346/227/266/346/212/245/345/221/212.md" +0 -0
  105. {briefloop-0.28.2 → briefloop-0.28.4}/docs//345/257/271/350/257/235/345/256/277/344/270/273/345/210/207/346/215/242.md" +0 -0
  106. {briefloop-0.28.2 → briefloop-0.28.4}/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
  107. {briefloop-0.28.2 → briefloop-0.28.4}/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
  108. {briefloop-0.28.2 → briefloop-0.28.4}/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
  109. {briefloop-0.28.2 → briefloop-0.28.4}/docs//350/241/214/344/270/232/346/212/245/345/221/212.md" +0 -0
  110. {briefloop-0.28.2 → briefloop-0.28.4}/docs//350/257/201/345/210/270/347/240/224/347/251/266.md" +0 -0
  111. {briefloop-0.28.2 → briefloop-0.28.4}/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
  112. {briefloop-0.28.2 → briefloop-0.28.4}/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
  113. {briefloop-0.28.2 → briefloop-0.28.4}/docs//351/252/214/346/224/266/350/256/260/345/275/225.md" +0 -0
  114. {briefloop-0.28.2 → briefloop-0.28.4}/examples/internal-weekly-report/README.md +0 -0
  115. {briefloop-0.28.2 → briefloop-0.28.4}/examples/internal-weekly-report/report.md +0 -0
  116. {briefloop-0.28.2 → briefloop-0.28.4}/examples/internal-weekly-report/source.txt +0 -0
  117. {briefloop-0.28.2 → briefloop-0.28.4}/examples/meeting-minutes/transcript.txt +0 -0
  118. {briefloop-0.28.2 → briefloop-0.28.4}/examples/stock-research/earnings-event.txt +0 -0
  119. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/anchored-popover.js +0 -0
  120. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/api.js +0 -0
  121. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/assessment-checks.js +0 -0
  122. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/assessment-panel.js +0 -0
  123. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/citation-evidence.js +0 -0
  124. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/citation-sources.js +0 -0
  125. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/clipboard.js +0 -0
  126. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/composer-options.js +0 -0
  127. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/connectors.js +0 -0
  128. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/delivery.js +0 -0
  129. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/dom.js +0 -0
  130. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/excel-export.js +0 -0
  131. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/fact-check-availability.js +0 -0
  132. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/fact-check-grants.js +0 -0
  133. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/feedback-list.js +0 -0
  134. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/jev-checks.js +0 -0
  135. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/job-presentation.js +0 -0
  136. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/learning-retry.js +0 -0
  137. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/length-controls.js +0 -0
  138. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/market-convention.js +0 -0
  139. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/market-decorations.js +0 -0
  140. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/mcp-selection.js +0 -0
  141. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/model-catalog.js +0 -0
  142. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/native-requests.js +0 -0
  143. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/notifications.js +0 -0
  144. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/office-tools.js +0 -0
  145. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/polling.js +0 -0
  146. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/previous-report.js +0 -0
  147. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/provider-capabilities.js +0 -0
  148. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/quick-report.js +0 -0
  149. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/readers.js +0 -0
  150. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/reasoning-controls.js +0 -0
  151. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/report-browsing.js +0 -0
  152. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/report-export.js +0 -0
  153. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/report-form-defaults.js +0 -0
  154. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/report-language.js +0 -0
  155. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/report-panels.js +0 -0
  156. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/report-sources.js +0 -0
  157. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/report-version-info.js +0 -0
  158. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/review-controls.js +0 -0
  159. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/review-coverage.js +0 -0
  160. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/review-results.js +0 -0
  161. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/review-status.js +0 -0
  162. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/revision-questions.js +0 -0
  163. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/rich-document.js +0 -0
  164. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/runtime-cards.js +0 -0
  165. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/runtime-model-picker.js +0 -0
  166. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/runtime-permission-modes.js +0 -0
  167. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/runtime-permission-panel.js +0 -0
  168. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/runtime-picker-bindings.js +0 -0
  169. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/schedules.js +0 -0
  170. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/session-budget.js +0 -0
  171. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/skill-verification.js +0 -0
  172. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/source-library-search.js +0 -0
  173. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/source-upload.js +0 -0
  174. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/task-progress.js +0 -0
  175. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/template-output.js +0 -0
  176. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/templates.js +0 -0
  177. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/time.js +0 -0
  178. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/uploads.js +0 -0
  179. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/version-diff.js +0 -0
  180. {briefloop-0.28.2 → briefloop-0.28.4}/frontend/welcome.js +0 -0
  181. {briefloop-0.28.2 → briefloop-0.28.4}/package-lock.json +0 -0
  182. {briefloop-0.28.2 → briefloop-0.28.4}/package.json +0 -0
  183. {briefloop-0.28.2 → briefloop-0.28.4}/probes/mcp_m0/README.md +0 -0
  184. {briefloop-0.28.2 → briefloop-0.28.4}/probes/mcp_m0/probe.py +0 -0
  185. {briefloop-0.28.2 → briefloop-0.28.4}/probes/mcp_m0/requirements.txt +0 -0
  186. {briefloop-0.28.2 → briefloop-0.28.4}/probes/mcp_m0/server.py +0 -0
  187. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/README.md +0 -0
  188. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/bridge.test.mjs +0 -0
  189. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/build.mjs +0 -0
  190. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/catalog.json +0 -0
  191. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/claude.ts +0 -0
  192. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/main.ts +0 -0
  193. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/permission-catalog.ts +0 -0
  194. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/pi.ts +0 -0
  195. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/reasoning.ts +0 -0
  196. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/user-input.ts +0 -0
  197. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/windows-command.ts +0 -0
  198. {briefloop-0.28.2 → briefloop-0.28.4}/runtime-bridge/zcode.ts +0 -0
  199. {briefloop-0.28.2 → briefloop-0.28.4}/scripts/build_frontend_licenses.mjs +0 -0
  200. {briefloop-0.28.2 → briefloop-0.28.4}/scripts/check_versions.py +0 -0
  201. {briefloop-0.28.2 → briefloop-0.28.4}/scripts/sync_versions.py +0 -0
  202. {briefloop-0.28.2 → briefloop-0.28.4}/scripts/test_frontend.mjs +0 -0
  203. {briefloop-0.28.2 → briefloop-0.28.4}/setup.cfg +0 -0
  204. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/__main__.py +0 -0
  205. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/_entrypoint.py +0 -0
  206. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/agent_commands.py +0 -0
  207. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/agent_prompts.py +0 -0
  208. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/analyst.py +0 -0
  209. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/analyst_drafts.py +0 -0
  210. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/app_server.py +0 -0
  211. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/audit_bundle.py +0 -0
  212. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/backends/__init__.py +0 -0
  213. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/backends/opencode_server.py +0 -0
  214. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/backends/opencode_v2.py +0 -0
  215. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/bocha.py +0 -0
  216. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/bridge_harness.py +0 -0
  217. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/chat_dispatch.py +0 -0
  218. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/chat_execution.py +0 -0
  219. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/chat_store.py +0 -0
  220. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/cli.py +0 -0
  221. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/codex_diagnostics.py +0 -0
  222. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/company_context.py +0 -0
  223. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/comparison_contract.py +0 -0
  224. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/conflicts.py +0 -0
  225. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/MATERIALS.md +0 -0
  226. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/README.md +0 -0
  227. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/__init__.py +0 -0
  228. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/config.py +0 -0
  229. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/grants.py +0 -0
  230. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/materials.py +0 -0
  231. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/receipts.py +0 -0
  232. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/runtime.py +0 -0
  233. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/runtime_tools.py +0 -0
  234. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/service.py +0 -0
  235. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/stdio_supervisor.py +0 -0
  236. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/task_client.py +0 -0
  237. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/tasks.py +0 -0
  238. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/transport.py +0 -0
  239. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/connectors/windows_acl.py +0 -0
  240. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/default_fonts.py +0 -0
  241. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/deliverable_spec.py +0 -0
  242. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/delivery_checks.py +0 -0
  243. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/demo.py +0 -0
  244. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/document_export.py +0 -0
  245. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/document_model.py +0 -0
  246. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/document_workflows.py +0 -0
  247. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/docx_text.py +0 -0
  248. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/draft_checks.py +0 -0
  249. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/draft_completion.py +0 -0
  250. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/duckduckgo.py +0 -0
  251. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/evaluation_reading.py +0 -0
  252. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/evidence.py +0 -0
  253. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/evidence_context.py +0 -0
  254. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/execution_records.py +0 -0
  255. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/execution_timing.py +0 -0
  256. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/export_jobs.py +0 -0
  257. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/export_labeling.py +0 -0
  258. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/exports.py +0 -0
  259. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/external_mcp.py +0 -0
  260. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/external_requests.py +0 -0
  261. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/fact_check.py +0 -0
  262. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/fast_mode.py +0 -0
  263. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/fast_reports.py +0 -0
  264. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/fast_research.py +0 -0
  265. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/feedback_view.py +0 -0
  266. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/figure_support.py +0 -0
  267. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/figure_text.py +0 -0
  268. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/figures.py +0 -0
  269. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/finding_anchors.py +0 -0
  270. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/harness.py +0 -0
  271. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/host_bins.py +0 -0
  272. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/industry_data.py +0 -0
  273. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/industry_export.py +0 -0
  274. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/interactive_runtime.py +0 -0
  275. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/jev.py +0 -0
  276. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/jev_checks.py +0 -0
  277. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/learning.py +0 -0
  278. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/learning_budget.py +0 -0
  279. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/length.py +0 -0
  280. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/market_convention.py +0 -0
  281. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/media.py +0 -0
  282. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/model_budget.py +0 -0
  283. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/native_engine.py +0 -0
  284. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/native_harness.py +0 -0
  285. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/native_providers.py +0 -0
  286. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/native_roles.py +0 -0
  287. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/notifications.py +0 -0
  288. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/office_cli.py +0 -0
  289. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/ooxml_order.py +0 -0
  290. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/opencode_harness.py +0 -0
  291. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/opencode_version.py +0 -0
  292. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/packet_views.py +0 -0
  293. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/parent_watch.py +0 -0
  294. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/plain_isolation.py +0 -0
  295. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/platform_support.py +0 -0
  296. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/previous_report.py +0 -0
  297. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/process_host.py +0 -0
  298. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/projections.py +0 -0
  299. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/core.zh.md +0 -0
  300. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/mode.background.zh.md +0 -0
  301. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/mode.interactive.zh.md +0 -0
  302. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.analyst.zh.md +0 -0
  303. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.chat.zh.md +0 -0
  304. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.evaluator.zh.md +0 -0
  305. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.fact_checker.zh.md +0 -0
  306. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.maintainer.zh.md +0 -0
  307. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.orchestrator.zh.md +0 -0
  308. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.proposer.zh.md +0 -0
  309. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.quick_writer.zh.md +0 -0
  310. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.reviewer.zh.md +0 -0
  311. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/prompt_assets/role.scout.zh.md +0 -0
  312. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/provider_catalog.py +0 -0
  313. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/readers.py +0 -0
  314. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/reconciliation.py +0 -0
  315. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/release.py +0 -0
  316. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/report_browsing.py +0 -0
  317. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/report_profiles.py +0 -0
  318. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/report_time.py +0 -0
  319. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/report_tools.py +0 -0
  320. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/research_budget.py +0 -0
  321. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/research_handoff.py +0 -0
  322. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/research_plan.py +0 -0
  323. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/review.py +0 -0
  324. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/review_capability.py +0 -0
  325. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/review_learning.py +0 -0
  326. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/revision_edits.py +0 -0
  327. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/revision_metadata.py +0 -0
  328. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/revision_policy.py +0 -0
  329. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/rpc_writer.py +0 -0
  330. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/runtime_bridge.py +0 -0
  331. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/runtime_permissions.py +0 -0
  332. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/runtime_reasoning.py +0 -0
  333. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/scout.py +0 -0
  334. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/scout_coverage.py +0 -0
  335. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/scout_evidence.py +0 -0
  336. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/scout_tools.py +0 -0
  337. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/search_credentials.py +0 -0
  338. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/search_policy.py +0 -0
  339. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/skill_assets/briefloop-external/SKILL.md +0 -0
  340. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/skill_assets/duckduckgo/SKILL.md +0 -0
  341. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/skill_assets/multi-search/SKILL.md +0 -0
  342. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/skill_assets/tavily/SKILL.md +0 -0
  343. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/skill_verification.py +0 -0
  344. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/skills.py +0 -0
  345. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/source_context.py +0 -0
  346. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/source_extraction.py +0 -0
  347. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/source_ingestion.py +0 -0
  348. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/source_library_search.py +0 -0
  349. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/source_search.py +0 -0
  350. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/source_updates.py +0 -0
  351. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/sources.py +0 -0
  352. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/frontend-licenses.txt +0 -0
  353. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/native-engine-models.json +0 -0
  354. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-aider.png +0 -0
  355. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-amr.svg +0 -0
  356. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-antigravity.svg +0 -0
  357. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-bridge.LICENSE.txt +0 -0
  358. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-bridge.NOTICE.txt +0 -0
  359. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-bridge.mjs +0 -0
  360. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-briefloop.svg +0 -0
  361. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-claude.svg +0 -0
  362. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-codebuddy.svg +0 -0
  363. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-codex.svg +0 -0
  364. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-copilot.svg +0 -0
  365. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-cursor-agent.svg +0 -0
  366. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-deepseek.svg +0 -0
  367. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-devin.png +0 -0
  368. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-grok-build.svg +0 -0
  369. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-hermes.svg +0 -0
  370. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-kilo.svg +0 -0
  371. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-kimi.svg +0 -0
  372. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-kiro.svg +0 -0
  373. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-mimo.svg +0 -0
  374. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-opencode.svg +0 -0
  375. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-pi.svg +0 -0
  376. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-qoder.svg +0 -0
  377. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-qwen.svg +0 -0
  378. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-reasoning.json +0 -0
  379. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-reasonix.svg +0 -0
  380. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-trae-cli.png +0 -0
  381. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/runtime-vibe.svg +0 -0
  382. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/static/tokens.css +0 -0
  383. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/task_labels.py +0 -0
  384. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/task_notify.py +0 -0
  385. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/tavily.py +0 -0
  386. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t1.docx +0 -0
  387. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t1.spec.json +0 -0
  388. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t2.docx +0 -0
  389. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t2.spec.json +0 -0
  390. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t3.docx +0 -0
  391. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t3.spec.json +0 -0
  392. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t4.docx +0 -0
  393. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t4.spec.json +0 -0
  394. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t5.docx +0 -0
  395. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/academic-paper-zh-t5.spec.json +0 -0
  396. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t1.docx +0 -0
  397. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t1.spec.json +0 -0
  398. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t2.docx +0 -0
  399. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t2.spec.json +0 -0
  400. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t3.docx +0 -0
  401. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t3.spec.json +0 -0
  402. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t4.docx +0 -0
  403. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t4.spec.json +0 -0
  404. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t5.docx +0 -0
  405. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/annual-report-zh-t5.spec.json +0 -0
  406. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t1.docx +0 -0
  407. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t1.spec.json +0 -0
  408. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t2.docx +0 -0
  409. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t2.spec.json +0 -0
  410. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t3.docx +0 -0
  411. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t3.spec.json +0 -0
  412. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t4.docx +0 -0
  413. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t4.spec.json +0 -0
  414. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t5.docx +0 -0
  415. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/business-report-zh-t5.spec.json +0 -0
  416. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t1.docx +0 -0
  417. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t1.spec.json +0 -0
  418. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t2.docx +0 -0
  419. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t2.spec.json +0 -0
  420. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t3.docx +0 -0
  421. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t3.spec.json +0 -0
  422. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t4.docx +0 -0
  423. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t4.spec.json +0 -0
  424. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t5.docx +0 -0
  425. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-en-t5.spec.json +0 -0
  426. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t1.docx +0 -0
  427. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t1.spec.json +0 -0
  428. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t2.docx +0 -0
  429. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t2.spec.json +0 -0
  430. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t3.docx +0 -0
  431. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t3.spec.json +0 -0
  432. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t4.docx +0 -0
  433. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t4.spec.json +0 -0
  434. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t5.docx +0 -0
  435. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/general-report-zh-t5.spec.json +0 -0
  436. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/government-doc-zh-t4.docx +0 -0
  437. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/government-doc-zh-t4.spec.json +0 -0
  438. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t1.docx +0 -0
  439. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t1.spec.json +0 -0
  440. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t2.docx +0 -0
  441. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t2.spec.json +0 -0
  442. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t3.docx +0 -0
  443. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t3.spec.json +0 -0
  444. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t4.docx +0 -0
  445. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t4.spec.json +0 -0
  446. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t5.docx +0 -0
  447. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/legal-contract-zh-t5.spec.json +0 -0
  448. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t1.docx +0 -0
  449. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t1.spec.json +0 -0
  450. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t2.docx +0 -0
  451. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t2.spec.json +0 -0
  452. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t3.docx +0 -0
  453. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t3.spec.json +0 -0
  454. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t4.docx +0 -0
  455. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t4.spec.json +0 -0
  456. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t5.docx +0 -0
  457. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/meeting-minutes-zh-t5.spec.json +0 -0
  458. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t1.docx +0 -0
  459. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t1.spec.json +0 -0
  460. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t2.docx +0 -0
  461. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t2.spec.json +0 -0
  462. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t3.docx +0 -0
  463. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t3.spec.json +0 -0
  464. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t4.docx +0 -0
  465. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t4.spec.json +0 -0
  466. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t5.docx +0 -0
  467. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-en-t5.spec.json +0 -0
  468. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t1.docx +0 -0
  469. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t1.spec.json +0 -0
  470. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t2.docx +0 -0
  471. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t2.spec.json +0 -0
  472. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t3.docx +0 -0
  473. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t3.spec.json +0 -0
  474. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t4.docx +0 -0
  475. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t4.spec.json +0 -0
  476. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t5.docx +0 -0
  477. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_assets/stock-research-zh-t5.spec.json +0 -0
  478. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/template_conversion.py +0 -0
  479. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/templates.py +0 -0
  480. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/user_input.py +0 -0
  481. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/version_execution.py +0 -0
  482. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/websearch.py +0 -0
  483. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/windows_process.py +0 -0
  484. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/word_import.py +0 -0
  485. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workbook_figures.py +0 -0
  486. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/business_report/evaluation.md +0 -0
  487. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/business_report/manifest.json +0 -0
  488. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/business_report/methods/decision_memo.md +0 -0
  489. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/business_report/methods/industry_periodic.md +0 -0
  490. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/business_report/methods/work_progress.md +0 -0
  491. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/business_report/planning.md +0 -0
  492. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/business_report/writing.md +0 -0
  493. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/general_report/evaluation.md +0 -0
  494. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/general_report/manifest.json +0 -0
  495. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/general_report/planning.md +0 -0
  496. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/general_report/writing.md +0 -0
  497. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/meeting_minutes/evaluation.md +0 -0
  498. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/meeting_minutes/manifest.json +0 -0
  499. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/meeting_minutes/planning.md +0 -0
  500. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/meeting_minutes/writing.md +0 -0
  501. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/stock_research/evaluation.md +0 -0
  502. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/stock_research/manifest.json +0 -0
  503. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/stock_research/methods/company_research.md +0 -0
  504. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/stock_research/methods/event_commentary.md +0 -0
  505. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/stock_research/methods/industry_tracking.md +0 -0
  506. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/stock_research/planning.md +0 -0
  507. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workflow_assets/stock_research/writing.md +0 -0
  508. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workspace_profile.py +0 -0
  509. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/workspaces.py +0 -0
  510. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/writer_assembly.py +0 -0
  511. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/writer_input.py +0 -0
  512. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/writing_guidance.py +0 -0
  513. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/xlsx_export.py +0 -0
  514. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop/zhipu.py +0 -0
  515. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop.egg-info/dependency_links.txt +0 -0
  516. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop.egg-info/entry_points.txt +0 -0
  517. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop.egg-info/requires.txt +0 -0
  518. {briefloop-0.28.2 → briefloop-0.28.4}/src/briefloop.egg-info/top_level.txt +0 -0
  519. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/__init__.py +0 -0
  520. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/__main__.py +0 -0
  521. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/_licenses/LICENSE +0 -0
  522. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/_licenses/NOTICE.md +0 -0
  523. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/_licenses/third_party/acorn/LICENSE +0 -0
  524. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/_licenses/third_party/acorn/NOTICE.md +0 -0
  525. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/_licenses/third_party/officeqa/LICENSE-APACHE +0 -0
  526. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/_licenses/third_party/officeqa/NOTICE +0 -0
  527. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/alfworld/__init__.py +0 -0
  528. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/alfworld/act.sh +0 -0
  529. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/alfworld/rollout.py +0 -0
  530. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/alfworld/step.py +0 -0
  531. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/benchmarks/__init__.py +0 -0
  532. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/benchmarks/alfworld.py +0 -0
  533. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/benchmarks/livemath.py +0 -0
  534. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/benchmarks/sealqa.py +0 -0
  535. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/benchmarks/spreadsheet.py +0 -0
  536. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/cli.py +0 -0
  537. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/codex_identity.py +0 -0
  538. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/engine.py +0 -0
  539. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/feedback_loop.py +0 -0
  540. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/isolated/__init__.py +0 -0
  541. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/isolated/audit.py +0 -0
  542. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/isolated/runtime.py +0 -0
  543. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/isolated/tools_server.py +0 -0
  544. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/jsonl.py +0 -0
  545. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/k4_lock.py +0 -0
  546. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/livemath/__init__.py +0 -0
  547. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/livemath/loop.py +0 -0
  548. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/livemath/rollout.py +0 -0
  549. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/native_agents.py +0 -0
  550. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/__init__.py +0 -0
  551. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/dataset.py +0 -0
  552. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/fetch.py +0 -0
  553. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/loop.py +0 -0
  554. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/retrieval.py +0 -0
  555. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/reward.py +0 -0
  556. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/rollout.py +0 -0
  557. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/scoring.py +0 -0
  558. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/officeqa/wiki_agents.py +0 -0
  559. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/paper_alignment/__init__.py +0 -0
  560. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/paper_alignment/contracts.py +0 -0
  561. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/paper_alignment/evidence.py +0 -0
  562. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/product.py +0 -0
  563. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/product_cli.py +0 -0
  564. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/product_install.py +0 -0
  565. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/product_views.py +0 -0
  566. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/id_split/split_manifest.json +0 -0
  567. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/id_split/test.json +0 -0
  568. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/id_split/train.json +0 -0
  569. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/id_split/val.json +0 -0
  570. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/wiki/SKILL-s0.md +0 -0
  571. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/wiki/index.md +0 -0
  572. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/wiki/logs.md +0 -0
  573. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/wiki/prompts/maintainer.md +0 -0
  574. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/wiki/prompts/proposer.md +0 -0
  575. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/alfworld/wiki/skill-impact.md +0 -0
  576. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/isolated/model-catalog-direct.json +0 -0
  577. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/id_split/split_manifest.json +0 -0
  578. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/id_split/test.json +0 -0
  579. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/id_split/train.json +0 -0
  580. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/id_split/val.json +0 -0
  581. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/id_split-v2/split_manifest.json +0 -0
  582. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/id_split-v2/test.json +0 -0
  583. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/id_split-v2/train.json +0 -0
  584. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/id_split-v2/val.json +0 -0
  585. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/protocol.json +0 -0
  586. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/wiki/SKILL-s0.md +0 -0
  587. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/wiki/index.md +0 -0
  588. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/wiki/logs.md +0 -0
  589. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/wiki/prompts/maintainer.md +0 -0
  590. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/wiki/prompts/proposer.md +0 -0
  591. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/livemath/wiki/skill-impact.md +0 -0
  592. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/id_split/split_manifest.json +0 -0
  593. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/id_split/test.json +0 -0
  594. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/id_split/train.json +0 -0
  595. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/id_split/val.json +0 -0
  596. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/protocol.json +0 -0
  597. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/wiki/SKILL-s0.md +0 -0
  598. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/wiki/index.md +0 -0
  599. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/wiki/logs.md +0 -0
  600. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/wiki/prompts/maintainer.md +0 -0
  601. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/wiki/prompts/proposer.md +0 -0
  602. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/officeqa/wiki/skill-impact.md +0 -0
  603. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/paper_alignment/README.md +0 -0
  604. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/paper_alignment/prompts/maintainer.paper.md +0 -0
  605. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/paper_alignment/prompts/officeqa.paper.md +0 -0
  606. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/paper_alignment/prompts/proposer.paper.md +0 -0
  607. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/paper_alignment/prompts/spreadsheet.paper.md +0 -0
  608. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/agents/claude-code/wikiskill-executor.md +0 -0
  609. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/agents/claude-code/wikiskill-maintainer.md +0 -0
  610. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/agents/claude-code/wikiskill-proposer.md +0 -0
  611. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/agents/codex/wikiskill-executor.toml +0 -0
  612. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/agents/codex/wikiskill-maintainer.toml +0 -0
  613. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/agents/codex/wikiskill-proposer.toml +0 -0
  614. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/entry-skill/SKILL.md +0 -0
  615. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/entry-skill/agents/openai.yaml +0 -0
  616. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/entry-skill/references/native-subagents.md +0 -0
  617. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/entry-skill/references/workflow.md +0 -0
  618. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/roles/executor.md +0 -0
  619. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/roles/maintainer.md +0 -0
  620. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/product/roles/proposer.md +0 -0
  621. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/final-20260907/manifest.json +0 -0
  622. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/final-20260907/math-episodes.json +0 -0
  623. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/final-20260907/sealqa-pairs.json +0 -0
  624. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/final-20260907/spreadsheet-SKILL.md +0 -0
  625. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/final-20260907/spreadsheet-pairs.json +0 -0
  626. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/final-20260907/summary.json +0 -0
  627. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/repeatability-20260908/example-provenance.json +0 -0
  628. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/repeatability-20260908/installed-smoke.json +0 -0
  629. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/repeatability-20260908/manifest.json +0 -0
  630. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/repeatability-20260908/repeat1-pairs.json +0 -0
  631. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/repeatability-20260908/repeat2-pairs.json +0 -0
  632. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/repeatability-20260908/repeat3-pairs.json +0 -0
  633. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/repeatability-20260908/summary.json +0 -0
  634. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/repeatability-20260908/wiki-deliver-the-recalculated-workbook.md +0 -0
  635. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/livemath/55.md +0 -0
  636. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/livemath/luna.md +0 -0
  637. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/officeqa/55.md +0 -0
  638. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/officeqa/terra.md +0 -0
  639. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/officeqa-retrieval/55.md +0 -0
  640. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/officeqa-retrieval/sol.md +0 -0
  641. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/sealqa/sol.md +0 -0
  642. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/spreadsheet/55.md +0 -0
  643. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/skills/spreadsheet/sol.md +0 -0
  644. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/snapshot.json +0 -0
  645. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/snapshot.sha256 +0 -0
  646. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260906/livemath-luna-pairs.json +0 -0
  647. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260906/livemath-luna-skill.md +0 -0
  648. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260906/manifest.json +0 -0
  649. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260906/officeqa-luna-skill.md +0 -0
  650. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260906/officeqa-sol-skill.md +0 -0
  651. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260906/officeqa-sol-v2-pairs.json +0 -0
  652. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260906/studies.json +0 -0
  653. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260907/effort-analysis.json +0 -0
  654. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260907/effort-pairs.json +0 -0
  655. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260907/manifest.json +0 -0
  656. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-pairs.json +0 -0
  657. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-skill.md +0 -0
  658. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-pairs.json +0 -0
  659. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-skill.md +0 -0
  660. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/research/update-20260907/studies.json +0 -0
  661. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/runtime/acorn.mjs +0 -0
  662. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/runtime/audit_js.mjs +0 -0
  663. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/id_split/split_manifest.json +0 -0
  664. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/id_split/test.json +0 -0
  665. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/id_split/train.json +0 -0
  666. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/id_split/val.json +0 -0
  667. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/protocol.json +0 -0
  668. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/wiki/SKILL-s0.md +0 -0
  669. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/wiki/index.md +0 -0
  670. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/wiki/logs.md +0 -0
  671. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/wiki/prompts/maintainer.md +0 -0
  672. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/wiki/prompts/proposer.md +0 -0
  673. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/sealqa/wiki/skill-impact.md +0 -0
  674. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/id_split/split_manifest.json +0 -0
  675. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/id_split/test.json +0 -0
  676. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/id_split/train.json +0 -0
  677. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/id_split/val.json +0 -0
  678. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/protocol.json +0 -0
  679. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/wiki/SKILL-s0.md +0 -0
  680. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/wiki/index.md +0 -0
  681. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/wiki/logs.md +0 -0
  682. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/wiki/prompts/maintainer.md +0 -0
  683. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/wiki/prompts/proposer.md +0 -0
  684. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/resources/spreadsheet/wiki/skill-impact.md +0 -0
  685. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/results.py +0 -0
  686. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/score_rules.py +0 -0
  687. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/scorer_trust.py +0 -0
  688. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/sealqa/__init__.py +0 -0
  689. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/sealqa/loop.py +0 -0
  690. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/sealqa/rollout.py +0 -0
  691. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/settings.py +0 -0
  692. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/skill_proposer.py +0 -0
  693. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/spreadsheet/__init__.py +0 -0
  694. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/spreadsheet/loop.py +0 -0
  695. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/spreadsheet/rollout.py +0 -0
  696. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/spreadsheet/study.py +0 -0
  697. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/tool_audit.py +0 -0
  698. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/wiki.py +0 -0
  699. {briefloop-0.28.2 → briefloop-0.28.4}/src/wikiskill/wiki_maintainer.py +0 -0
  700. {briefloop-0.28.2 → briefloop-0.28.4}/start.ps1 +0 -0
  701. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_anchored_popover.mjs +0 -0
  702. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_assessment_checks.mjs +0 -0
  703. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_brand_colors.mjs +0 -0
  704. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_chat_attachments.mjs +0 -0
  705. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_chat_drafts.mjs +0 -0
  706. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_chat_layout.mjs +0 -0
  707. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_chat_polling.mjs +0 -0
  708. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_checkout_eol.mjs +0 -0
  709. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_citation_clipboard.mjs +0 -0
  710. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_citation_edit.mjs +0 -0
  711. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_citation_evidence.mjs +0 -0
  712. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_citation_sources.mjs +0 -0
  713. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_clipboard_fallback.mjs +0 -0
  714. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_excel_export.mjs +0 -0
  715. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_export_menu.mjs +0 -0
  716. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_fact_check_availability.mjs +0 -0
  717. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_fact_check_grants.mjs +0 -0
  718. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_fast_mode.mjs +0 -0
  719. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_feedback_list.mjs +0 -0
  720. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_home_v2.mjs +0 -0
  721. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_job_presentation.mjs +0 -0
  722. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_learning_authorization.mjs +0 -0
  723. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_learning_retry.mjs +0 -0
  724. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_length_controls.mjs +0 -0
  725. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_licenses.mjs +0 -0
  726. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_live_status.mjs +0 -0
  727. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_markdown_import.mjs +0 -0
  728. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_market_convention.mjs +0 -0
  729. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_mcp_selection.mjs +0 -0
  730. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_model_catalog_refresh.mjs +0 -0
  731. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_model_label.mjs +0 -0
  732. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_model_selection.mjs +0 -0
  733. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_native_requests.mjs +0 -0
  734. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_native_runtime.mjs +0 -0
  735. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_office_tools.mjs +0 -0
  736. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_open_brief_status.mjs +0 -0
  737. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_pending_report.mjs +0 -0
  738. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_polling.mjs +0 -0
  739. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_previous_report.mjs +0 -0
  740. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_progress_race.mjs +0 -0
  741. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_provider_capabilities.mjs +0 -0
  742. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_quick_report.mjs +0 -0
  743. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_readers.mjs +0 -0
  744. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_reasoning_controls.mjs +0 -0
  745. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_release_controls.mjs +0 -0
  746. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_release_navigation.mjs +0 -0
  747. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_browsing.mjs +0 -0
  748. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_chat_drawer.mjs +0 -0
  749. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_export.mjs +0 -0
  750. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_language.mjs +0 -0
  751. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_load.mjs +0 -0
  752. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_outline.mjs +0 -0
  753. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_panels.mjs +0 -0
  754. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_report_version_info.mjs +0 -0
  755. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_review_capability.mjs +0 -0
  756. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_review_coverage.mjs +0 -0
  757. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_review_status.mjs +0 -0
  758. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_revision_questions.mjs +0 -0
  759. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_runtime_discovery.mjs +0 -0
  760. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_runtime_feedback.mjs +0 -0
  761. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_runtime_model_picker.mjs +0 -0
  762. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_runtime_permission_panel.mjs +0 -0
  763. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_settings_workspaces.mjs +0 -0
  764. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_skill_verification.mjs +0 -0
  765. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_source_library.mjs +0 -0
  766. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_source_search.mjs +0 -0
  767. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_source_upload.mjs +0 -0
  768. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_startup_recovery.mjs +0 -0
  769. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_task_progress.mjs +0 -0
  770. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_template_groups.mjs +0 -0
  771. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_template_output.mjs +0 -0
  772. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_update_notifications.mjs +0 -0
  773. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_upload_limits.mjs +0 -0
  774. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_version_bodies.mjs +0 -0
  775. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_version_diff.mjs +0 -0
  776. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_welcome_gate.mjs +0 -0
  777. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_workspace_proposal.mjs +0 -0
  778. {briefloop-0.28.2 → briefloop-0.28.4}/tests/frontend_writing_preferences.mjs +0 -0
  779. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_agent_backend.py +0 -0
  780. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_agent_commands.py +0 -0
  781. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_agent_session_budget.py +0 -0
  782. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_analyst_draft_versions.py +0 -0
  783. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_assessment_admission_recovery.py +0 -0
  784. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_assessment_followup.py +0 -0
  785. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_background_no_question.py +0 -0
  786. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_brand_assets.py +0 -0
  787. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_bridge_harness.py +0 -0
  788. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_builtin_templates.py +0 -0
  789. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_chat_dispatch.py +0 -0
  790. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_chat_execution.py +0 -0
  791. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_chat_model_selection.py +0 -0
  792. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_cli_doctor.py +0 -0
  793. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_codex_idle.py +0 -0
  794. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_connection_test_history.py +0 -0
  795. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_connector_authorization.py +0 -0
  796. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_connector_empty_catalog.py +0 -0
  797. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_connector_materials.py +0 -0
  798. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_connector_tasks.py +0 -0
  799. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_connectors.py +0 -0
  800. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_core.py +0 -0
  801. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_cross_module_regressions.py +0 -0
  802. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_delivery_checks.py +0 -0
  803. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_delivery_consumers.py +0 -0
  804. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_demo.py +0 -0
  805. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_desktop_lifecycle.py +0 -0
  806. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_document_workflows.py +0 -0
  807. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_draft_completion.py +0 -0
  808. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_draft_contract.py +0 -0
  809. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_english_reports.py +0 -0
  810. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_entrypoint.py +0 -0
  811. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_evidence.py +0 -0
  812. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_evidence_parse_failures.py +0 -0
  813. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_execution_records.py +0 -0
  814. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_execution_timing.py +0 -0
  815. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_export_admission.py +0 -0
  816. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_export_labeling.py +0 -0
  817. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_export_layout_swap.py +0 -0
  818. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_export_xlsx.py +0 -0
  819. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_external_mcp.py +0 -0
  820. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_external_requests.py +0 -0
  821. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fact_check_contract.py +0 -0
  822. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fact_check_orchestration.py +0 -0
  823. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fact_check_phase.py +0 -0
  824. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fact_check_review.py +0 -0
  825. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fact_status_tool.py +0 -0
  826. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fast_evidence.py +0 -0
  827. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fast_mode.py +0 -0
  828. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fast_qualifier_checks.py +0 -0
  829. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fast_reports.py +0 -0
  830. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_fast_research.py +0 -0
  831. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_feedback_view.py +0 -0
  832. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_figure_exports.py +0 -0
  833. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_figure_flow.py +0 -0
  834. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_figure_text.py +0 -0
  835. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_figures.py +0 -0
  836. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_finding_anchors.py +0 -0
  837. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_generation_schema_guidance.py +0 -0
  838. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_harness.py +0 -0
  839. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_host_bins.py +0 -0
  840. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_human_learning.py +0 -0
  841. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_industry_export.py +0 -0
  842. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_industry_flow.py +0 -0
  843. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_industry_research.py +0 -0
  844. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_interactive_runtime.py +0 -0
  845. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_jev_checks.py +0 -0
  846. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_learning_authorization.py +0 -0
  847. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_learning_integrity.py +0 -0
  848. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_length.py +0 -0
  849. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_length_policy.py +0 -0
  850. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_markdown_download.py +0 -0
  851. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_market_convention.py +0 -0
  852. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_media_sources.py +0 -0
  853. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_model_catalog_defaults.py +0 -0
  854. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_monthly_research.py +0 -0
  855. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_multimodal_harness.py +0 -0
  856. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_multimodal_http.py +0 -0
  857. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_analyst.py +0 -0
  858. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_evaluator.py +0 -0
  859. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_harness.py +0 -0
  860. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_learning.py +0 -0
  861. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_orchestrator.py +0 -0
  862. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_provider_storage.py +0 -0
  863. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_providers.py +0 -0
  864. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_research_closeout.py +0 -0
  865. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_review_contract.py +0 -0
  866. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_native_scout.py +0 -0
  867. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_notifications.py +0 -0
  868. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_npm_native_shim.py +0 -0
  869. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_numeric_occurrence_review.py +0 -0
  870. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_office_cli.py +0 -0
  871. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_office_source_structure.py +0 -0
  872. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_office_surfaces.py +0 -0
  873. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_ooxml_order.py +0 -0
  874. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_harness.py +0 -0
  875. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_idle.py +0 -0
  876. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_prompt_versions.py +0 -0
  877. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_provider.py +0 -0
  878. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_questions.py +0 -0
  879. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_reasoning.py +0 -0
  880. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_review_version.py +0 -0
  881. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_search_prompt.py +0 -0
  882. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_server_stdin.py +0 -0
  883. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_v2.py +0 -0
  884. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_opencode_version_probe.py +0 -0
  885. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_plain_isolation.py +0 -0
  886. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_posix_process_tree.py +0 -0
  887. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_pr593_roundtrip.py +0 -0
  888. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_previous_report.py +0 -0
  889. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_product_summary_consistency.py +0 -0
  890. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_progress.py +0 -0
  891. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_progress_pipeline.py +0 -0
  892. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_provider_catalog.py +0 -0
  893. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_public_research.py +0 -0
  894. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_quality_reading_context.py +0 -0
  895. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_reader_contract.py +0 -0
  896. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_reader_profiles.py +0 -0
  897. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_reader_source_export.py +0 -0
  898. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_reader_workflow.py +0 -0
  899. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_reconciliation.py +0 -0
  900. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_release.py +0 -0
  901. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_release_identity.py +0 -0
  902. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_report_browsing.py +0 -0
  903. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_report_concurrency.py +0 -0
  904. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_report_deletion.py +0 -0
  905. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_report_length_feedback.py +0 -0
  906. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_report_path_regressions.py +0 -0
  907. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_report_time.py +0 -0
  908. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_research_budget.py +0 -0
  909. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_research_gap_updates.py +0 -0
  910. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_research_handoff.py +0 -0
  911. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_research_plan.py +0 -0
  912. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_research_response_admission.py +0 -0
  913. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_resume_in_place.py +0 -0
  914. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review.py +0 -0
  915. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_finding_consistency.py +0 -0
  916. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_learning.py +0 -0
  917. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_modes.py +0 -0
  918. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_packet_paths.py +0 -0
  919. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_packet_utf8.py +0 -0
  920. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_public_metadata.py +0 -0
  921. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_schema_drift.py +0 -0
  922. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_snapshot.py +0 -0
  923. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_review_visual_input.py +0 -0
  924. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_revision_citations.py +0 -0
  925. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_revision_edits.py +0 -0
  926. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_revision_policy.py +0 -0
  927. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_rich_document.py +0 -0
  928. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_role_models.py +0 -0
  929. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_bridge.py +0 -0
  930. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_bridge_idle.py +0 -0
  931. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_concurrency.py +0 -0
  932. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_json_bom.py +0 -0
  933. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_liveness.py +0 -0
  934. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_names.py +0 -0
  935. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_permissions.py +0 -0
  936. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_propagation.py +0 -0
  937. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_retry.py +0 -0
  938. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_runtime_settlement.py +0 -0
  939. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_schedules.py +0 -0
  940. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_scout_experiment.py +0 -0
  941. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_search_credentials.py +0 -0
  942. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_search_policy.py +0 -0
  943. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_semantic_experiment.py +0 -0
  944. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_semantic_governance.py +0 -0
  945. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_server_boundary.py +0 -0
  946. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_settings_transactions.py +0 -0
  947. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_skill_verification.py +0 -0
  948. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_software_version.py +0 -0
  949. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_source_ingestion.py +0 -0
  950. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_source_library_search.py +0 -0
  951. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_source_recovery_regressions.py +0 -0
  952. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_source_updates.py +0 -0
  953. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_sources_provenance.py +0 -0
  954. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_store_sqlite_benchmark.py +0 -0
  955. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_store_wal.py +0 -0
  956. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_table_citation_advisory.py +0 -0
  957. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_task_labels.py +0 -0
  958. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_task_notify.py +0 -0
  959. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_task_progress.py +0 -0
  960. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_tavily.py +0 -0
  961. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_template_conversion.py +0 -0
  962. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_template_conversion_http.py +0 -0
  963. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_template_saved_state.py +0 -0
  964. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_templates.py +0 -0
  965. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_user_input.py +0 -0
  966. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_user_source_refresh.py +0 -0
  967. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_version_consistency.py +0 -0
  968. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_version_execution.py +0 -0
  969. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_websearch.py +0 -0
  970. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_websearch_singleflight.py +0 -0
  971. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_wikiskill_engine_windows.py +0 -0
  972. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_antigravity_permissions.py +0 -0
  973. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_connector_acl.py +0 -0
  974. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_distribution.py +0 -0
  975. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_mcp_supervisor.py +0 -0
  976. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_platform.py +0 -0
  977. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_release_paths.py +0 -0
  978. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_review_paths.py +0 -0
  979. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_runtime_bundle.py +0 -0
  980. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_windows_xlsx_paths.py +0 -0
  981. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_word_import.py +0 -0
  982. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_word_source_locators.py +0 -0
  983. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_word_toc.py +0 -0
  984. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_worker_idle.py +0 -0
  985. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_workspace_action_errors.py +0 -0
  986. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_workspace_profile.py +0 -0
  987. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_workspaces.py +0 -0
  988. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_writer_assembly.py +0 -0
  989. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_writer_cli_guidance.py +0 -0
  990. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_writer_context.py +0 -0
  991. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_writer_input.py +0 -0
  992. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_xlsx_officecli_integration.py +0 -0
  993. {briefloop-0.28.2 → briefloop-0.28.4}/tests/test_xlsx_preview.py +0 -0
  994. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/LICENSE +0 -0
  995. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/NOTICE.md +0 -0
  996. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/acp/constants.ts +0 -0
  997. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/acp/json.ts +0 -0
  998. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/acp/models.ts +0 -0
  999. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/acp/rpc.ts +0 -0
  1000. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/acp/session-params.ts +0 -0
  1001. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/acp/types.ts +0 -0
  1002. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/byok-reference/byok-opencode.ts +0 -0
  1003. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/byok-reference/provider-models.ts +0 -0
  1004. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/core/index.ts +0 -0
  1005. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/core/json-line-stream.ts +0 -0
  1006. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/runtime-models/codex-models.ts +0 -0
  1007. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/runtime-models/mmd-routes.ts +0 -0
  1008. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/runtime-models/models.ts +0 -0
  1009. {briefloop-0.28.2 → briefloop-0.28.4}/third_party/open-design/runtime-models/opencode-models.ts +0 -0
@@ -4,6 +4,7 @@
4
4
  /src/wikiskill/** text=auto eol=lf
5
5
 
6
6
  # Build checks compare these generated artifacts byte-for-byte on every platform.
7
+ /native-engine/models.json text eol=lf
7
8
  /src/briefloop/static/app.js text eol=lf
8
9
  /src/briefloop/static/frontend-licenses.txt text eol=lf
9
10
  /frontend/ui-system.css text eol=lf
@@ -1,5 +1,23 @@
1
1
  # 变更记录
2
2
 
3
+ ## 0.28.4 — 2026-10-02
4
+
5
+ - 对话 Agent 可以通过正在运行的服务停止指定任务及子任务,保留已保存稿件,并返回实际停止状态。
6
+ - 新工作区的联网完整报告默认启用独立事实核查;已有选择、单报告覆盖、离线和快速模式保持各自规则。
7
+ - Native Scout 沿用已登记的轮次结果路径,在冻结上限内恢复可用并行容量,显示真实开始与结束时间。
8
+ - 后续研究轮次声明任务时同步保存计划,避免上一轮任务残留导致无法结束研究。
9
+ - 支持从已保存报告准备下一期:复用写作约定,重新确认本期日期和材料;不继承旧证据、评分或联网授权。
10
+ - 点击“基于此报告开始下一期”直接准备表单,不再弹出确认框;页面保留说明与取消跨期关联入口,取消时保留已填内容。
11
+
12
+ ## 0.28.3 — 2026-10-02
13
+
14
+ - 内置 BriefLoop Agent 升级至 Pi 1.0.0,适配压缩指令的新 transcript 接口,保留角色工具隔离及失败后的会话恢复。
15
+ - 随包提供图像解码 worker 与 WASM,使报告图片在独立 wheel 和桌面后端中可实际解码、缩放和发送;增加旧版会话迁移与 Mac/Windows 引擎回归。
16
+ - 修复极窄图片缩放被遗漏的问题,关闭长子任务期间未计入用量的默认缓存预热,并更新内置依赖以消除已知漏洞版本。
17
+ - 版本与更新设置直接显示当前版本及可用更新的改动说明,保留检查、下载和安装状态;当前版本说明随包提供,离线也能查看。
18
+ - 增加定期报告实验的离线预检,核对时间范围、材料哈希及输入与参考答案隔离;预检本身不代表报告质量提升。
19
+ - 修复桌面正常停止后端时 Python 等待 stdin 导致异常退出的问题;忙任务拒绝停止时保留服务与管道。
20
+
3
21
  ## 0.28.2 — 2026-10-01
4
22
 
5
23
  - 延续设计 v3.1 的品牌、引用与来源卡、过程折叠和 Word / Excel 涨跌惯例与 AI 来源标识。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: briefloop
3
- Version: 0.28.2
3
+ Version: 0.28.4
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
@@ -0,0 +1 @@
1
+ 0.28.4
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.28.2",
3
+ "version": "0.28.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "briefloop-desktop",
9
- "version": "0.28.2",
9
+ "version": "0.28.4",
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.28.2",
3
+ "version": "0.28.4",
4
4
  "private": true,
5
5
  "description": "BriefLoop local desktop workspace",
6
6
  "author": "Stahl-G",
@@ -0,0 +1,13 @@
1
+ # BriefLoop 0.28.3
2
+
3
+ 本次发行包含 Pi 1.0.0 升级与兼容修复 #888、版本说明页 #887、定期报告实验离线预检 #873。下一期报告 #870 及评分实验 #855 / #857 保留在各自分支,尚未通过的验收不作为本版质量承诺。
4
+
5
+ 原生引擎保留角色工具隔离和旧会话恢复,适配压缩指令的 transcript 接口,随包提供图像 worker 与 Photon WASM。修复 5000×1 / 1×5000 图片缩放被遗漏的问题,关闭长子任务期间默认缓存预热,保证请求与用量事件一致。原生引擎使用固定 pnpm 锁及修复后的 brace-expansion;前端和桌面继续使用 npm。
6
+
7
+ 三个 PR 的组合已通过 1283 项 Python 测试(65 跳过)、246 项前端测试(3 跳过)、构建与 design:check,47 项原生引擎回归和依赖审计零告警。版本说明页的 1440px 和 768px 实际浏览器截图已核验;检查更新可用,当前说明与 wheel / sdist 中的资源一致。Pi 升级最终提交的 Linux、macOS、Windows 六项 CI 全通过。
8
+
9
+ 用户已授权合并、GitHub Release、PyPI、官网及可访问的本机安装更新,保留旧版回退。发行从干净冻结提交构建,共用后端 wheel 仅构建一次,所有渠道复用相同字节。发行工件哈希、平台验收和发布后渠道状态随本版验证记录披露。
10
+
11
+ 发行验收另复现并修复了桌面正常停止后端的 stdin 交接问题:原行为使 Python 以 SIGABRT 退出;收到正式停止接口的成功回执后关闭 owner 管道,实际 Python / Electron 组合恢复正常退出。忙任务拒绝停止时保留管道及服务。安装包验收脚本直接加载实际 ASAR 模块,检查随包环境、Pi 1.0、版本说明、正常退出,以及两种涨跌惯例和 agent / user 合成稿的八份 Word / Excel 产物;不调用模型、不替代原生窗口或办公软件操作验收。
12
+
13
+ 延续现有未签名桌面发行路径,不声称 Developer ID 签名或公证。缺少的原生窗口、Finder 或办公软件操作证据必须标为未核验,不能以 CI、源码版本或旧版结果替代。AI 来源标识不代表完整法律合规保证;离线预检不证明模型输出质量提升。
@@ -0,0 +1,9 @@
1
+ # BriefLoop 0.28.4
2
+
3
+ 整合 #891、#892、#893 与 #870。修复对话停止任务、Native Scout 多轮路径、并行容量及计划同步;支持从已保存报告准备下一期,并按用户要求移除反复弹出的确认框。
4
+
5
+ 旧报告的正文、来源和评分保留;下一期只复用写作约定,需重新指定日期、材料和联网选择。修复复用时旧日期预览短暂残留的问题。完成实现与页面验收不代表连续多期返工率已改善,#865/#866/#858 的效果验收继续保持独立。
6
+
7
+ #855 与 #857 的实验工具和评价候选不纳入本次发行;已有开发集结果不当作人工答案、留出集结果或稳定收益。
8
+
9
+ 从干净冻结提交构建一次共享 wheel,Mac、Windows、PyPI 复用同一字节。平台随包后端、合成 Word/Excel 导出、更新及实际安装结果记录在发行附件;缺少的 GUI 验证明确列出,不由 CI 代替。延续未签名桌面发行,不声称公证。发布后替换本机正式入口,不新增日常 App 安装副本。
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## 生成后的独立事实核查
20
20
 
21
- 在新建报告中勾选「生成后独立核查公开主张」。默认关闭;未允许联网时不能启用。任务保存实际开关,之后改工作区设置不会追溯改变旧任务。
21
+ 在新建报告中勾选「生成后独立核查公开主张」。新工作区的联网完整报告默认开启;已有工作区保留已保存的选择,单份报告可关闭。离线及快速模式默认不启用,未允许联网时不能显式开启。任务保存实际开关,之后改工作区设置不会追溯改变旧任务。
22
22
 
23
23
  执行顺序为:保存可编辑草稿 → 独立核查公开主张 → 独立审阅 → 按设置自动修订一次并复核。核查需要正文中已经登记并绑定的主张;没有可核查主张、研究阶段仍未收束或无法接纳预算时,会记录原因,不能显示为已完成核查。
24
24
 
@@ -2,18 +2,51 @@
2
2
  import {$} from './dom.js';
3
3
  export function appUpdatesUI({api,notice}){
4
4
  let appUpdateState=null,softwareInfo=null,appUpdatePending=false,appUpdateLastAction='check';
5
+ const releaseNotes=new Map();
6
+ function showNotes(id,title,value){
7
+ $(`${id}-title`).textContent=title;
8
+ $(id).textContent=value?.state==='loaded'?value.notes:value?.state==='empty'?'该版本未提供发布说明。':value?.message||'正在读取发布说明…';
9
+ }
10
+ function renderNotes(value){
11
+ const current=softwareInfo?.version;
12
+ const installed=value?.currentAppVersion||current;
13
+ if(current)showNotes('app-update-current-notes',`${current===installed?'当前版本':'当前后端'} v${current} 的改动`,releaseNotes.get(current)||softwareInfo.release_notes);
14
+ const latest=value?.releaseVersion;
15
+ // A failed check may retain the old download target; do not call it latest.
16
+ const known=latest&&value?.state!=='checking'&&!(value?.state==='error'&&(value.error?.operation||appUpdateLastAction)==='check');
17
+ $('app-update-latest-version').textContent=known?`最近检查的发布版本 v${latest}`:value?.state==='checking'?'正在检查可用版本…':value?.state==='error'?'可用版本检查未完成':'尚未检查可用版本';
18
+ $('app-update-notes-box').hidden=!known||latest===current;
19
+ if(known&&latest!==current)showNotes('app-update-notes',`${['available','downloading','downloaded'].includes(value.state)?'可用更新':'发布版本'} v${latest} 的改动`,value.source==='local-test'?{state:value.notes?'loaded':'empty',notes:value.notes}:releaseNotes.get(latest));
20
+ }
21
+ async function loadNotes(version,force=false){
22
+ if(!version||releaseNotes.get(version)?.state==='loading'||(!force&&releaseNotes.has(version)))return;
23
+ releaseNotes.set(version,{state:'loading'});renderNotes(appUpdateState);
24
+ try{
25
+ const result=await api('software-release-notes',{version});
26
+ releaseNotes.set(version,result?.version===version?result:{state:'error',message:'发布说明版本不匹配,请重新检查。'});
27
+ }catch{releaseNotes.set(version,{state:'error',message:'无法获取该版本的发布说明,请检查网络后重试。'})}
28
+ renderNotes(appUpdateState);
29
+ }
30
+ function refreshNotes(force=false){
31
+ const current=softwareInfo?.version;
32
+ if(current&&!softwareInfo.release_notes)void loadNotes(current,force);
33
+ const target=appUpdateState?.releaseVersion;
34
+ if(target&&target!==current&&appUpdateState.source!=='local-test')void loadNotes(target,force);
35
+ }
5
36
  function renderAppUpdates(value=appUpdateState){
6
37
  const box=$('settings-view-updates');if(!box)return;
7
38
  const desktop=typeof window.briefloopDesktop?.updateStatus==='function';
8
39
  $('app-update-controls').hidden=false;
9
- $('app-update-version').textContent=softwareInfo?`BriefLoop v${softwareInfo.version}${softwareInfo.build?` · 构建 ${softwareInfo.build}`:''}${desktop?` · 桌面 App v${value?.currentAppVersion||'读取中'}`:''}`:'正在读取实际运行版本…';
40
+ $('app-update-version').textContent=desktop?`当前 App v${value?.currentAppVersion||'读取中'}`:softwareInfo?`当前版本 v${softwareInfo.version}`:'正在读取实际运行版本…';
10
41
  const installations={desktop:'桌面管理的后端 · App 与 CLI 共用',source:'开发源码',pip:'Python 包安装',pipx:'pipx 安装',uv:'uv 工具安装'};
11
- $('app-update-installation').textContent=softwareInfo?installations[softwareInfo.installation]||'独立安装':'';
42
+ $('app-update-installation').textContent=softwareInfo?`${installations[softwareInfo.installation]||'独立安装'} · 后端 v${softwareInfo.version}${softwareInfo.build?` · 构建 ${softwareInfo.build}`:''}`:'';
12
43
  $('app-update-command').hidden=!softwareInfo?.update_command;
13
44
  $('app-update-command').textContent=softwareInfo?.update_command||'';
14
- $('app-update-source').textContent=value?.source==='local-test'?'本地测试更新源 · 仅验证流程,不代表官方发布':desktop?'官方稳定来源:Stahl-G/briefloop · GitHub Releases':'Python 包稳定来源:PyPI · briefloop';
45
+ $('app-update-source').textContent=value?.source==='local-test'?'本地测试更新源 · 仅验证流程,不代表官方发布':desktop?'官方稳定来源:Stahl-G/briefloop · GitHub Releases':'版本检查:PyPI · 发布说明:GitHub Releases';
46
+ $('app-update-test-source').hidden=value?.source!=='local-test';
15
47
  const reinstall=value?.source==='local-test'&&value?.reinstall===true;
16
- $('app-update-guidance').textContent=!desktop?(softwareInfo?.guidance||'正在读取安装来源…'):value?.installMode==='zip'?'下载完成后,点击下方按钮保存并退出。Finder 会打开新版 App 和“安装位置”:将 App 拖入并替换,再打开 BriefLoop。报告与工作区会保留。':value?.installMode==='dmg'?`下载后会先保存编辑并处理忙任务,再退出 App、打开 DMG;请在 Finder 中${reinstall?'重新安装当前版本':'手动安装新版本'}。`:'下载后会先保存编辑并处理忙任务,再退出 App 并交给原生安装器更新。';
48
+ $('app-update-guidance').textContent=!desktop?(softwareInfo?.guidance||'正在读取安装来源…'):value?.installMode==='zip'?'安装前会保存编辑并处理忙任务。退出后,在 Finder 中将新版 App 拖入“安装位置”并替换,再打开 BriefLoop;工作区保留。':value?.installMode==='dmg'?`安装前会保存编辑并处理忙任务,再退出并打开 DMG;请在 Finder 中${reinstall?'重新安装当前版本':'手动安装新版本'}。`:'安装前会保存编辑并处理忙任务,再退出并交给安装器更新;工作区保留。';
49
+ $('app-update-guidance').hidden=desktop&&!['available','downloading','downloaded','error'].includes(value?.state);
17
50
  const errorOperation=value?.error?.operation||(value?.error?.code==='open_failed'?'install':appUpdateLastAction);
18
51
  const errorLabel={check:'更新检查失败(当前安装不受影响)',download:'更新包下载未完成',install:'更新安装未完成'}[errorOperation]||'更新检查失败(当前安装不受影响)';
19
52
  const labels={idle:'尚未检查更新',checking:'正在检查更新…',available:'发现可用更新',current:'当前 App 无需更新',downloading:'正在下载更新…',downloaded:'下载完成,等待安装',error:errorLabel};
@@ -31,8 +64,9 @@ export function appUpdatesUI({api,notice}){
31
64
  $('app-update-progress-box').hidden=!progress;
32
65
  $('app-update-progress').value=progress?.percent||0;
33
66
  $('app-update-progress-text').textContent=progress?`${Math.round(progress.percent||0)}% · ${(Math.max(0,progress.transferred||0)/1048576).toFixed(1)} / ${(Math.max(0,progress.total||0)/1048576).toFixed(1)} MiB`:'';
34
- if(progress?.mode==='differential')$('app-update-progress-text').textContent+=` · 增量下载,复用 ${(Math.max(0,progress.reused||0)/1048576).toFixed(1)} MiB`;
35
- else if(progress?.mode==='full')$('app-update-progress-text').textContent+=' · '+({
67
+ $('app-update-progress-detail').textContent='';
68
+ if(progress?.mode==='differential')$('app-update-progress-detail').textContent=`增量下载,复用 ${(Math.max(0,progress.reused||0)/1048576).toFixed(1)} MiB`;
69
+ else if(progress?.mode==='full')$('app-update-progress-detail').textContent=({
36
70
  no_baseline:'无有效基准缓存,完整下载并建立缓存',
37
71
  little_reuse:'本次可复用内容较少,完整下载',
38
72
  range_unavailable:'下载服务不支持分段传输,完整下载',
@@ -41,13 +75,13 @@ export function appUpdatesUI({api,notice}){
41
75
  differential_unavailable:'增量不可用,已回退完整下载',
42
76
  blockmap_unavailable:'此版本无可用增量信息,完整下载'
43
77
  }[progress.fallback]||'完整下载');
44
- $('app-update-notes-box').hidden=!value?.notes;$('app-update-notes').textContent=value?.notes||'';
78
+ renderNotes(value);
45
79
  }
46
80
  async function refreshAppUpdates(){
47
81
  renderAppUpdates();
48
82
  try{softwareInfo=await api('software-version');
49
83
  if(typeof window.briefloopDesktop?.updateStatus==='function')appUpdateState=await window.briefloopDesktop.updateStatus();
50
- renderAppUpdates()}
84
+ renderAppUpdates();refreshNotes()}
51
85
  catch{notice('无法读取 App 更新状态,请重新打开设置。',true)}
52
86
  }
53
87
  async function runAppUpdate(command){
@@ -58,7 +92,7 @@ export function appUpdatesUI({api,notice}){
58
92
  appUpdatePending=true;appUpdateState={state:'checking'};renderAppUpdates();
59
93
  try{appUpdateState=await api('software-update-check',{});softwareInfo=appUpdateState}
60
94
  catch(error){appUpdateState={state:'error',retryable:true,error:{message:error.message||'版本检查未完成'}}}
61
- finally{appUpdatePending=false;renderAppUpdates()}
95
+ finally{appUpdatePending=false;renderAppUpdates();refreshNotes(command==='check')}
62
96
  return;
63
97
  }
64
98
  appUpdatePending=true;appUpdateLastAction=command;renderAppUpdates();
@@ -72,7 +106,7 @@ export function appUpdatesUI({api,notice}){
72
106
  }catch(error){
73
107
  notice(error.message||'更新操作未完成,请重试。',true);
74
108
  try{appUpdateState=await desktop.updateStatus()}catch{}
75
- }finally{appUpdatePending=false;renderAppUpdates()}
109
+ }finally{appUpdatePending=false;renderAppUpdates();refreshNotes(command==='check')}
76
110
  }
77
111
  function init(){
78
112
  if($('settings-view-updates')){
@@ -81,7 +115,7 @@ export function appUpdatesUI({api,notice}){
81
115
  $('app-update-install').onclick=()=>runAppUpdate('install');
82
116
  // A temporary DMG open error can retry the saved asset through the same gate.
83
117
  $('app-update-retry').onclick=()=>runAppUpdate(appUpdateState?.error?.code==='open_failed'?'install':(appUpdateState?.error?.operation||appUpdateLastAction)==='install'?'download':appUpdateState?.error?.operation||appUpdateLastAction);
84
- window.briefloopDesktop?.onUpdateStatus?.(value=>{appUpdateState=value;renderAppUpdates()});
118
+ window.briefloopDesktop?.onUpdateStatus?.(value=>{appUpdateState=value;renderAppUpdates();refreshNotes()});
85
119
  renderAppUpdates();
86
120
  }
87
121
  }
@@ -53,6 +53,7 @@ import {createFeedbackList} from './feedback-list.js';
53
53
  import {readersUI} from './readers.js';
54
54
  import {verificationBadge} from './skill-verification.js';
55
55
  import {previousReportUI} from './previous-report.js';
56
+ import {nextReportUI} from './next-report.js';
56
57
  import {learningRetry} from './learning-retry.js';
57
58
  import {templatesUI,GENRE_META,ICONS,splitTemplateName} from './templates.js';
58
59
  import {createTemplateOutput} from './template-output.js';
@@ -187,6 +188,8 @@ function acceptCommand(){
187
188
  // Only editorial preferences lack a form control. Runtime/template snapshots are
188
189
  // deliberately rebuilt by the server and must never be copied from a prior run.
189
190
  let writingPreferencesOverride;
191
+ const nextReport=nextReportUI({$,api,savedVersion,getTemplate:id=>{const t=state?.templates?.find(t=>t.id===id);return t?{...t,sections:parse(t.spec).sections||[]}:null},getCurrent:()=>current,applyRequirements,refreshTime:()=>previewReportTime(),notice,clearSources:()=>{selected.clear();referenceSelected.clear();document.querySelectorAll('[data-check],[data-reference-source]').forEach(input=>input.checked=false);renderReferenceSources()}});
192
+ nextReport.bind();
190
193
  function preserveWritingPreferences(req,previous,override){
191
194
  if(!Object.prototype.hasOwnProperty.call(req,'writing_preferences'))req.writing_preferences=[...(Array.isArray(override)?override:Array.isArray(previous?.writing_preferences)?previous.writing_preferences:[])];
192
195
  return req;
@@ -562,10 +565,12 @@ let reportTimePreviewTicket=0;
562
565
  async function previewReportTime(){
563
566
  const ticket=++reportTimePreviewTicket;
564
567
  const form=$('requirements'),box=$('report-system-clock');
568
+ if(form.elements.previous_report_version_id?.value&&!['period','period_start','period_end'].some(key=>form.elements[key].value.trim())){box.textContent='请填写并确认本期时间范围;不会沿用上期日期。';return}
569
+ box.textContent='正在核对本期时间范围…';
565
570
  try{const requirements={title:form.elements.title.value||'预览',objective:form.elements.objective.value||'预览'};for(const key of ['period','period_start','period_end','report_timezone'])requirements[key]=form.elements[key].value;const t=await api('report-time-preview',{requirements});if(ticket!==reportTimePreviewTicket)return;reportFormDefaults.setWindow(t,requirements);box.textContent=`系统日期:${t.today} · ${t.timezone};报告范围:${t.start} 至 ${t.end_exclusive}(不含结束时刻)。提交时冻结。`;}catch(e){if(ticket===reportTimePreviewTicket)box.textContent=e.message}
566
571
  }
567
572
  for(const key of ['period','period_start','period_end','report_timezone'])$('requirements').elements[key].addEventListener('change',previewReportTime);
568
- $('requirements').onsubmit=e=>{e.preventDefault();action(async()=>{const f=new FormData(e.target),req=Object.fromEntries(f.entries());if(!['fast','fast_web'].includes(req.completion_mode)&&req.writing_mode==='internal_report'&&state.settings.company_context_enabled==null){$('company-choice-dialog').showModal();return}req.allow_web=f.has('allow_web');req.fact_check=f.has('fact_check');req.target_words=Number(req.target_words);req.max_words=Number(req.max_words);Object.assign(req,lengthControls.read(),quickReport.read());req.research_budget=readResearchBudget();reportFormDefaults.prepare(req);reportMarket.prepare(req);req.search_policy=readSearchPolicy();Object.assign(req,readWorkflowChoice());req.reference_source_ids=[...referenceSelected];req.template_id=req.template_id||null;req.sections=readTemplateSections();req.key_questions=(req.key_questions_text||'').split('\n').map(x=>x.trim()).filter(Boolean);delete req.key_questions_text;req.manual_sections=(req.manual_sections_text||'').split('\n').map(x=>x.trim()).filter(Boolean);for(const title of req.manual_sections){const found=req.sections.find(s=>s.title===title);if(found){found.mode='manual';found.placeholder='待填充'}}delete req.manual_sections_text;preserveWritingPreferences(req,state.requirements,writingPreferencesOverride);if(!req.reader_id)delete req.reader_id;req.raw_input=req.objective;delete req.runtime_model;delete req.runtime_effort;await saveModel();if(current)await savedVersion();const connector_selection=reportMcpSelection.selection();const job=await api('generate',{...(connector_selection?{connector_selection}:{}),requirements:req,session_id:chat.id||undefined,source_ids:[...selected].filter(id=>!req.reference_source_ids.includes(id))});showPendingReport(parse(job.payload).run_id);page('report');notice('任务已排队,后台会生成简报')})};
573
+ $('requirements').onsubmit=e=>{e.preventDefault();action(async()=>{const f=new FormData(e.target),req=Object.fromEntries(f.entries());if(!['fast','fast_web'].includes(req.completion_mode)&&req.writing_mode==='internal_report'&&state.settings.company_context_enabled==null){$('company-choice-dialog').showModal();return}req.allow_web=f.has('allow_web');req.fact_check=f.has('fact_check');req.target_words=Number(req.target_words);req.max_words=Number(req.max_words);Object.assign(req,lengthControls.read(),quickReport.read());req.research_budget=readResearchBudget();reportFormDefaults.prepare(req);reportMarket.prepare(req);req.search_policy=readSearchPolicy();Object.assign(req,readWorkflowChoice());req.reference_source_ids=[...referenceSelected];req.template_id=req.template_id||null;req.sections=readTemplateSections();req.key_questions=(req.key_questions_text||'').split('\n').map(x=>x.trim()).filter(Boolean);delete req.key_questions_text;req.manual_sections=(req.manual_sections_text||'').split('\n').map(x=>x.trim()).filter(Boolean);for(const title of req.manual_sections){const found=req.sections.find(s=>s.title===title);if(found){found.mode='manual';found.placeholder='待填充'}}delete req.manual_sections_text;preserveWritingPreferences(req,state.requirements,writingPreferencesOverride);if(!req.reader_id)delete req.reader_id;req.raw_input=req.objective;delete req.runtime_model;delete req.runtime_effort;await saveModel();if(current)await savedVersion();const connector_selection=reportMcpSelection.selection();const job=await api('generate',{...(connector_selection?{connector_selection}:{}),requirements:req,session_id:chat.id||undefined,source_ids:[...selected].filter(id=>!req.reference_source_ids.includes(id))});nextReport.clear();showPendingReport(parse(job.payload).run_id);page('report');notice('任务已排队,后台会生成简报')})};
569
574
  $('upload').onchange=e=>action(async()=>{preflightSources(e.target.files,getUploadLimits());for(const f of e.target.files){const s=await uploadSource(f);if(s.status==='ready')selected.add(s.id)}e.target.value=''},'来源已保存');
570
575
  $('add-url').onclick=()=>action(async()=>{const s=await api('source-url',{url:$('source-url').value});if(s.status==='ready')selected.add(s.id);$('source-url').value='';notice(s.status==='ready'?'网页已读取':'来源已保存,但读取失败:'+s.error,s.status!=='ready')});
571
576
  $('rescore').onclick=()=>action(async()=>{await savedVersion();await api('assess',{version_id:current.id,session_id:chat.id||undefined})},'已提交评分');
@@ -1820,7 +1825,8 @@ function readTemplateSections(){
1820
1825
  // Never submit a report whose chosen template is not ready; falling back to the
1821
1826
  // general layout would silently change the deliverable.
1822
1827
  if(template&&template.status&&template.status!=='ready')throw Error('所选模板尚未就绪:'+template.name+';请改用通用模板,或等模板准备完成后再提交');
1823
- const saved=templateId&&state.requirements?.template_id===templateId?state.requirements.sections||[]:[];
1828
+ const reused=nextReport.requirementsForTemplate(templateId);
1829
+ const saved=reused?.sections||(templateId&&state.requirements?.template_id===templateId?state.requirements.sections||[]:[]);
1824
1830
  return [...$('template-sections').querySelectorAll('[data-section-id]')].map(row=>{
1825
1831
  const base=original.find(s=>s.section_id===row.dataset.sectionId)||{},requirement=saved.find(s=>s.section_id===row.dataset.sectionId);
1826
1832
  return {section_id:row.dataset.sectionId,title:row.querySelector('[data-title]').value,purpose:row.querySelector('[data-purpose]')?.value??requirement?.purpose??base.purpose??'',mode:row.querySelector('select').value,placeholder:'待填充'};
@@ -1832,8 +1838,9 @@ function templateSections(){
1832
1838
  }
1833
1839
  function applyTemplateSectionEdits(){
1834
1840
  const templateId=$('template-select').value;
1835
- if(!templateId||state?.requirements?.template_id!==templateId)return;
1836
- for(const section of state.requirements.sections||[]){const row=[...$('template-sections').querySelectorAll('[data-section-id]')].find(r=>r.dataset.sectionId===section.section_id);if(row){row.querySelector('[data-title]').value=section.title;row.querySelector('select').value=section.mode||'required'}}
1841
+ const reused=nextReport.requirementsForTemplate(templateId);
1842
+ if(!templateId||(!reused&&state?.requirements?.template_id!==templateId))return;
1843
+ for(const section of (reused||state.requirements).sections||[]){const row=[...$('template-sections').querySelectorAll('[data-section-id]')].find(r=>r.dataset.sectionId===section.section_id);if(row){row.querySelector('[data-title]').value=section.title;row.querySelector('select').value=section.mode||'required'}}
1837
1844
  }
1838
1845
  function unreadyTemplate(id){const template=(state?.templates||[]).find(t=>t.id===id);return template&&template.status&&template.status!=='ready'?template:null}
1839
1846
  function renderTemplates(first=false){
@@ -0,0 +1,53 @@
1
+ // Reuse the saved contract, not old facts, reviews or runtime authorizations.
2
+ export function nextReportUI({$,api,savedVersion,getCurrent,applyRequirements,clearSources,notice,getTemplate,refreshTime=()=>{}}){
3
+ let pending=false,contract=null;
4
+ const form=()=>$('requirements');
5
+ function set(name,value){const field=form()?.elements?.[name];if(!field)return;
6
+ if(field.type==='checkbox')field.checked=!!value;else field.value=value??'';
7
+ field.dispatchEvent?.(new Event('change',{bubbles:true}));
8
+ }
9
+ function clear(){contract=null;set('previous_report_version_id','');set('previous_report_hash','');
10
+ if($('next-report-notice'))$('next-report-notice').hidden=true;
11
+ }
12
+ function requirementsForTemplate(id){return contract&&form()?.elements?.previous_report_version_id?.value&&contract.template_id===id?contract:null}
13
+ async function start(){
14
+ if(pending||!getCurrent())return;
15
+ pending=true;
16
+ try{
17
+ const version=await savedVersion();
18
+ const data=await api('next-report?version_id='+encodeURIComponent(version));
19
+ if(getCurrent()?.id!==version)throw Error('当前报告已切换,请重新选择要复用的版本');
20
+ const candidate=data.requirements;
21
+ if(candidate.template_id){
22
+ const template=getTemplate(candidate.template_id);
23
+ if(!template||template.status!=='ready')throw Error('往期模板已不可用或尚未就绪,请先恢复模板,或手动建立本期需求');
24
+ const sections=template.sections||[];
25
+ if((candidate.sections||[]).some(section=>!sections.some(item=>item.section_id===section.section_id)))
26
+ throw Error('往期模板章节已变化,请核对模板后再复用,避免遗漏人工保留的章节');
27
+ }
28
+ contract=candidate;
29
+ set('completion_mode','standard');
30
+ set('template_id',contract.template_id||'');
31
+ applyRequirements(JSON.stringify(contract));
32
+ for(const key of ['organization','industry','report_date','reader_id','previous_report_version_id','previous_report_hash'])set(key,contract[key]);
33
+ set('allow_web',false);set('fact_check',false);
34
+ clearSources();
35
+ const sections=contract.sections||[];
36
+ for(const row of $('template-sections')?.querySelectorAll('[data-section-id]')||[]){
37
+ const section=sections.find(item=>item.section_id===row.dataset.sectionId);
38
+ if(section){row.querySelector('[data-title]').value=section.title;row.querySelector('select').value=section.mode||'required'}
39
+ }
40
+ const box=$('next-report-notice');
41
+ if(box){box.hidden=false;$('next-report-summary').textContent=`基于《${data.previous.title}》的已保存版本开始下一期。${data.notice}`+
42
+ (data.reader?` 当前读者:${data.reader.name};用途:${data.reader.decisions};偏好:${data.reader.preferences}。请确认是否仍适用。`:'');}
43
+ refreshTime();
44
+ form()?.elements?.title?.focus?.();
45
+ notice('已复用约定;请填写本期标题、时间范围并选择材料');
46
+ }finally{pending=false}
47
+ }
48
+ function bind(){const button=$('next-report');if(button)button.onclick=()=>start().catch(error=>notice(error.message,true));
49
+ if($('next-report-cancel'))$('next-report-cancel').onclick=clear;
50
+ form()?.addEventListener?.('reset',clear);
51
+ }
52
+ return {bind,start,clear,requirementsForTemplate};
53
+ }
@@ -17,6 +17,7 @@ function stepState(value,active){
17
17
  return ['running','active'].includes(value)?(active?'active':'pending'):'pending';
18
18
  }
19
19
  function stepTime(step,now){
20
+ if(step.not_started)return '尚未开始';
20
21
  const duration=step.duration_ms??(step.duration_seconds==null?null:Number(step.duration_seconds)*1000);
21
22
  if(duration!==null&&Number.isFinite(Number(duration))&&Number(duration)>=0)return elapsedText('1970-01-01T00:00:00Z',Number(duration));
22
23
  if(step.started&&(step.ended||step.status==='active'))return elapsedText(step.started,step.ended?Date.parse(step.ended):now);
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "briefloop"
7
- version = "0.28.2"
7
+ version = "0.28.4"
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"
@@ -6,11 +6,20 @@ import { collectFrontendLicenses, renderFrontendLicenses } from './build_fronten
6
6
 
7
7
  const root = fileURLToPath(new URL('../', import.meta.url));
8
8
  const check = process.argv.includes('--check');
9
+ // Ship the exact running version's changelog so settings remains useful offline.
10
+ const version = fs.readFileSync(path.join(root, 'pyproject.toml'), 'utf8').match(/^version\s*=\s*"([^"]+)"/m)?.[1];
11
+ if (!version) throw Error('Missing product version in pyproject.toml');
12
+ const changelog = fs.readFileSync(path.join(root, 'CHANGELOG.md'), 'utf8').replaceAll('\r\n', '\n');
13
+ const sections = [...changelog.matchAll(/^## ([^\r\n]+)\r?\n([\s\S]*?)(?=^## |$(?![\s\S]))/gm)];
14
+ const section = sections.find(match => match[1].split(/\s/)[0] === version);
15
+ if (!section) throw Error(`Missing changelog for running version ${version}`);
9
16
  const result = await build({ absWorkingDir: root, entryPoints: ['frontend/app.js'],
10
17
  bundle: true, format: 'esm', minify: true, outfile: 'src/briefloop/static/app.js',
11
18
  metafile: true, write: false });
12
19
  const rows = collectFrontendLicenses(result.metafile, root);
13
20
  const artifacts = [...result.outputFiles.map(file => ({ path: file.path, contents: file.contents })),
21
+ { path: path.join(root, 'src/briefloop/static/release-notes.json'),
22
+ contents: Buffer.from(JSON.stringify({version, notes: section[2].trim()}, null, 2) + '\n') },
14
23
  { path: path.join(root, 'src/briefloop/static/frontend-licenses.txt'),
15
24
  contents: Buffer.from(renderFrontendLicenses(rows)) }];
16
25
  // Retain the legacy layout during migration; the shared component layer is
@@ -0,0 +1 @@
1
+ __version__ = "0.28.4"
@@ -31,7 +31,7 @@ WORKSPACE_ACTIONS = (
31
31
  'profile_read','profile_update',
32
32
  'freeze_research_plan','research_status','begin_research_round','finish_research_round','set_scout_tasks',
33
33
  'reconciliation_candidates','reconciliation_save','reconciliation_read',
34
- 'export_word','inspect','generate','assess','comment','learn',
34
+ 'export_word','inspect','stop_job','generate','assess','comment','learn',
35
35
  )
36
36
 
37
37
 
@@ -198,6 +198,13 @@ def workspace_action(store, request):
198
198
  'runtime':store.runtime_config(),
199
199
  'note':'简要工作区索引;需要原文时使用 read-source --id SOURCE_ID。任务状态和 error 是已记录事实,不代表根因诊断;没有对应日志证据不得声称服务重启、网络故障或权限拒绝。来源已保存不代表已核验其真实性或时效性,研究进度不代表报告已完成。',
200
200
  }
201
+ if action=='stop_job':
202
+ job_id=request.get('job_id')
203
+ if not isinstance(job_id,str) or not job_id.strip():raise ValueError('请提供要停止的明确 job_id')
204
+ # Use the live worker, including transport cancellation and child jobs.
205
+ # A CLI Store is a separate process and must never just flip DB status.
206
+ from .external_client import Client
207
+ return Client(store.root).stop_job(job_id)
201
208
  if action=='generate':
202
209
  requirements=Requirements.model_validate(request['requirements'])
203
210
  source_ids=request.get('source_ids',[])
@@ -338,7 +345,9 @@ def chat_instructions(store, runtime, *, internal=False, allow_web=False, backen
338
345
  - {{"action":"read_report","version_id":"稿件ID"}}:读取富文档 JSON、引用和已存正文的 length_stats;revise_document 回执也给出保存后的确定性计数。按 count/rule 核对原始要求、读者约定及当前反馈,不估算字数;over_limit 只比较结构化 max_words,不表示已满足全部篇幅要求。用户明确要求修改内容/章节/图表时,将修改后的 JSON 保存到工作区文件,再用 {{"action":"revise_document","base_version":"刚读取版本ID","document_file":"工作区内JSON绝对路径"}} 保存新版本,不覆盖用户并发编辑。可选 citations 完整替换引用列表(source_id/locator/excerpt,schema 见 capabilities),省略则保留;只修改引用也保存新版本,定位描述不表示已独立核验。
339
346
  - {{"action":"import_word_revision","base_version":"用户指定基础版本","source_id":"DOCX来源ID"}}:导入用户修改的 Word。返回 needs_alignment 时先核对原件和基础版本,向用户说明对齐问题;仅按用户明确选择提供 accept_unaligned=true。用户希望更新模板时另用 template_import 并提供 parent_id。
340
347
  - {{"action":"generate","requirements":{{"title":"标题","objective":"用户目的","audience":"读者","language":"zh|en","extent":"compact|balanced|detailed","research_tier":"quick|standard|deep","allow_web":{str(bool(allow_web)).lower()},"period":"时间范围"}},"source_ids":["真实来源ID"],"runtime":{runtime_json}}}:正式生成可在页面编辑的简报。language 是报告正文语言(默认 zh);用户要英文报告时写 en,不传 target_words 时篇幅按英文词数默认。research_tier 是研究深度档位(默认 standard):quick 单轮检索,deep 预排 4 轮迭代研究;按用户明确要求选,用户未提就不写该字段。scout_limit 是本报告最多可同时派发的 Scout 数(1–16),在提交前按信息量决定:一周左右约 4,月报约 8,跨多个行业或市场的大型报告可到 12–16;不写时系统按期间自动设定(月报 8,其余沿用工作区设置)。
348
+ 联网完整报告的 fact_check 沿用工作区默认(新工作区开启);用户选择关闭时显式传 false,选择开启时传 true。离线或快速模式不自动开启,也不为核查偷偷开启联网。
341
349
  提交 generate 时,必须把本轮已经确认的 key_questions、writing_preferences、章节、期间和篇幅完整写进 requirements,不能只传标题摘要。用户给出的执行约束同样在提交前冻结:target_minutes 是软目标;hard_timeout_minutes=0 表示不设硬截止;research_budget 包含 search_requests、candidate_urls、source_pages;search_policy 沿用已授权设置。不得说“后台稍后配置”而遗漏已指定的额度。并行数要求写入 writing_preferences,供主 Agent 冻结研究计划时选择 structure.parallel;不改变共享预算。提交回执中的实际冻结值与用户要求不一致时明确说明,不宣称已应用。
350
+ - {{"action":"stop_job","job_id":"真实任务ID"}}:用户要求停止任务时,先通过 inspect 确认具体任务,再停止该任务及其子任务,已保存稿件保留。用户要求“停掉旧任务再重新生成”时先取得停止回执,再提交新任务;停止失败时如实说明,不启动重复任务。目标不明确时先问,不猜 ID,不停止整个服务。以回执的实际 status 为准,已经完成的任务不会变成 cancelled。
342
351
  - {{"action":"assess","version_id":"真实简报版本ID"}}:为已有稿件安排评分。
343
352
  - {{"action":"comment","version_id":"真实简报版本ID","text":"用户反馈"}}:记录用户明确提出的反馈。页面自动学习开启时,保存反馈可能稍后自动触发学习,要如实告知。
344
353
  - {{"action":"learn"}}:仅当用户明确要求启动技能学习时调用,会消耗额外模型额度。调用前先告诉用户上限(每轮最多 3 个案例、每案例基线与候选各试写一次,另有整理、提案与比较回合;轮数按学习设置),得到明确同意后再调用;保存反馈本身不需要调用它。
@@ -56,6 +56,12 @@ class Client:
56
56
  raise ValueError(self.info.get('message', '工作区服务尚未就绪'))
57
57
 
58
58
  def request(self, body):
59
+ return self._post('/api/external/action', body)
60
+
61
+ def stop_job(self, job_id):
62
+ return self._post('/api/stop', {'job_id': job_id})
63
+
64
+ def _post(self, path, body):
59
65
  if not isinstance(body, dict):
60
66
  raise ValueError('请求必须是 JSON 对象')
61
67
  wid = body.get('workspace_id', self.info['workspace_id'])
@@ -65,7 +71,7 @@ class Client:
65
71
  endpoint = urlsplit(self.info['url'])
66
72
  connection = http.client.HTTPConnection(endpoint.hostname, endpoint.port, timeout=15)
67
73
  try:
68
- connection.request('POST', '/api/external/action', body=json.dumps({**body, 'workspace_id': wid}, ensure_ascii=False).encode(),
74
+ connection.request('POST', path, body=json.dumps({**body, 'workspace_id': wid}, ensure_ascii=False).encode(),
69
75
  headers={'Content-Type': 'application/json', 'X-BriefLoop-Token': token})
70
76
  response = connection.getresponse()
71
77
  data = response.read(32 * 1024 * 1024 + 1)
@@ -113,6 +113,8 @@ class Requirements(Model):
113
113
  # A saved reader profile (#858); create_run freezes it into reader_profile.
114
114
  reader_id: str | None = Field(default=None, max_length=80)
115
115
  reader_profile: dict | None = None
116
+ previous_report_version_id: str | None = Field(default=None, max_length=100)
117
+ previous_report_hash: str | None = Field(default=None, max_length=64)
116
118
  # Report body language. The interface, internal records and review notes
117
119
  # stay Chinese; only the report text and its length presets follow this.
118
120
  language: Literal["zh", "en"] = "zh"
@@ -362,7 +364,7 @@ class Settings(RoleModel):
362
364
  default_template_id: str | None = None
363
365
  company_context_enabled: bool | None = None
364
366
  # Workspace-wide default for the per-task fact_check switch; tasks may override.
365
- fact_checker: bool = False
367
+ fact_checker: bool = True
366
368
  # Workspace-wide optional local file quality checks via officecli; the
367
369
  # switch has no effect while the binary is not installed.
368
370
  officecli_enabled: bool = False
@@ -9,7 +9,7 @@ import hashlib
9
9
  import json
10
10
  from pathlib import Path
11
11
 
12
- from .store import dump
12
+ from .store import dump, now
13
13
  from .native_roles import ToolError, _atomic, _json_result
14
14
  from .revision_metadata import binding_schema, response_schema, validate_arrays, validate_bindings
15
15
 
@@ -19,7 +19,7 @@ READ_ACTIONS = {'inspect', 'capabilities', 'templates', 'workflows', 'profile_re
19
19
  RUN_ACTIONS = {'set_reader_contract', 'freeze_research_plan', 'begin_research_round',
20
20
  'finish_research_round', 'set_scout_tasks', 'reconciliation_save', 'evidence_span',
21
21
  'claim_create', 'claim_bind', 'company_update', 'company_review_complete'}
22
- CHAT_ACTIONS = READ_ACTIONS | {'generate', 'assess', 'comment', 'export_word', 'profile_update', 'company_config', 'company_resolve', 'revise_document', 'learn', 'template_import', 'template_rebuild', 'import_word_revision'}
22
+ CHAT_ACTIONS = READ_ACTIONS | {'stop_job', 'generate', 'assess', 'comment', 'export_word', 'profile_update', 'company_config', 'company_resolve', 'revise_document', 'learn', 'template_import', 'template_rebuild', 'import_word_revision'}
23
23
 
24
24
 
25
25
  def _save(path, value):
@@ -102,7 +102,8 @@ def action(store, config, args):
102
102
  frozen_req = json.loads(view.one('runs', result['run_id'])['requirements'])
103
103
  result['accepted_requirements'] = {**result.get('accepted_requirements', {}),
104
104
  'length_mode': frozen_req.get('length_mode', 'soft'),
105
- 'length_requirement': frozen_req.get('length_requirement')}
105
+ 'length_requirement': frozen_req.get('length_requirement'),
106
+ 'fact_check': frozen_req.get('fact_check')}
106
107
  else:
107
108
  from .models import Settings, Requirements, runtime_fields
108
109
  settings = Settings.model_validate({**view.settings(), **request['runtime']})
@@ -118,13 +119,28 @@ def action(store, config, args):
118
119
  result = {'job_id': job['id'], 'run_id': run['id'], 'status': 'queued',
119
120
  'accepted_requirements': {key: value for key, value in json.loads(run['requirements']).items()
120
121
  if key in ('title', 'target_minutes', 'hard_timeout_minutes', 'research_budget', 'key_questions',
121
- 'writing_preferences', 'target_words', 'max_words', 'length_mode', 'length_requirement', 'period', 'search_policy')}}
122
+ 'writing_preferences', 'target_words', 'max_words', 'length_mode', 'length_requirement', 'period', 'search_policy', 'fact_check')}}
122
123
  view.set_meta(key, {'fingerprint': fingerprint, 'result': result})
123
124
  store.wake_jobs()
124
125
  from .task_notify import notify
125
126
  notify(store, store.one('jobs', result['job_id']), 'queued')
126
127
  return _json_result(result)
127
128
  result = workspace_action(store, request)
129
+ if name == 'set_scout_tasks' and 'scout_tasks' in request and config.get('packet_root'):
130
+ # A successful declaration is the binding plan for this round. Keep the
131
+ # saved Native plan current; otherwise closeout compares round 2 with
132
+ # round 1 forever. Declaration still rejects dropped/rewritten work.
133
+ from .research_plan import frozen
134
+ research = frozen(store, run_id) or {}
135
+ round_id = request.get('round_id') or research.get('current_round_id') or 'legacy'
136
+ path = _folder(config) / 'plan.json'
137
+ if path.is_file():
138
+ plan = json.loads(path.read_text(encoding='utf-8-sig'))
139
+ plan['scout_tasks'] = [
140
+ {key: task[key] for key in ('slot_id', 'assignment', 'result_file')}
141
+ for task in result['scout_execution'] if task['round_id'] == round_id]
142
+ _save(path, plan)
143
+ _save(Path(config['packet_root']) / 'plan.json', plan)
128
144
  if name == 'reconciliation_save' and config.get('packet_root'):
129
145
  _save(_folder(config) / 'reconciliation.json', result)
130
146
  if name == 'finish_research_round' and config.get('packet_root'):
@@ -174,8 +190,10 @@ def _child(store, config, directory, callback):
174
190
  with harness._lock:
175
191
  path = _folder(config) / 'agents.json'
176
192
  records = json.loads(path.read_text(encoding='utf-8')) if path.exists() else {'agents': []}
193
+ previous = next((a for a in records['agents'] if a['agent_id'] == identity), {})
177
194
  records['agents'] = [a for a in records['agents'] if a['agent_id'] != identity]
178
- records['agents'].append({'agent_id': identity, 'role': role, 'status': status})
195
+ timing = {'started': now()} if status == 'running' else {'started': previous.get('started'), 'ended': now()}
196
+ records['agents'].append({'agent_id': identity, 'role': role, 'status': status, **timing})
179
197
  _save(path, records)
180
198
  with harness.child_runtime(config['session_id'], runtime):
181
199
  _alive(store, config)
@@ -225,13 +243,29 @@ def run_scouts(store, config, args):
225
243
  committed = {task['slot_id']: task for task in view(store, config['run_id'])['scout_execution'] if task['round_id'] == identity}
226
244
  for task in tasks:
227
245
  expected = committed.get(task['slot_id'])
228
- result_file = str((folder / ('round-' + round_id) / task['slot_id'] / 'result.json').resolve())
229
- if not expected or expected['assignment'] != str(task.get('assignment') or '').strip() or expected['result_file'] != result_file:
230
- raise ToolError('实际 Scout 任务必须匹配已保存 scout_tasks 的分工与结果路径;先补全本轮计划')
246
+ scoped = {folder / ('round-' + round_id) / task['slot_id'] / 'result.json',
247
+ store.root / 'research' / config['run_id'] / 'rounds' / round_id / task['slot_id'] / 'result.json'}
248
+ if round_id == '1':
249
+ scoped.add(folder / task['slot_id'] / 'result.json')
250
+ if not expected or expected['assignment'] != str(task.get('assignment') or '').strip():
251
+ raise ToolError('实际 Scout 任务必须匹配已保存 scout_tasks 的分工;先读取 research_status')
252
+ result_file = Path(expected['result_file'])
253
+ if result_file not in scoped or result_file.resolve() != result_file:
254
+ raise ToolError('已登记 Scout 结果路径不属于本任务、本轮与槽位')
255
+ if task.get('result_file') and task['result_file'] != str(result_file):
256
+ raise ToolError('实际 Scout 结果路径须沿用已登记路径:' + str(result_file))
257
+ # A concurrent job may have occupied slots while the initial packet was
258
+ # prepared. Reclaim now-free capacity within the original frozen ceiling.
259
+ budget_for_job = getattr(store, '_scout_budget_for_job', None)
260
+ budget = budget_for_job(job) if budget_for_job else None
261
+ if budget:
262
+ ceiling = min(int((frozen_plan or {}).get('frozen_runtime', {}).get('max_parallel') or limit),
263
+ int((frozen_plan or {}).get('structure', {}).get('parallel') or limit), len(tasks))
264
+ limit = max(1, min(ceiling, budget(ceiling)))
231
265
  update(store, config['run_id'], [{'slot_id': task['slot_id'], 'status': 'dispatched'} for task in tasks])
232
266
  results = []
233
267
  def execute(task):
234
- path = folder / ('round-' + round_id) / task['slot_id']
268
+ path = Path(committed[task['slot_id']]['result_file']).parent
235
269
  path.mkdir(parents=True, exist_ok=True)
236
270
  assignment = path / 'assignment.json'
237
271
  if assignment.exists() and json.loads(assignment.read_text(encoding='utf-8')) != task:
@@ -251,14 +285,15 @@ def run_scouts(store, config, args):
251
285
  with ThreadPoolExecutor(max_workers=min(limit, len(tasks))) as pool:
252
286
  results = list(pool.map(execute, tasks))
253
287
  _alive(store, config)
254
- paths = sorted(folder.glob('round-*/scout-*/result.json'))
288
+ paths = sorted({Path(task['result_file']) for task in view(store, config['run_id'])['scout_execution']
289
+ if Path(task['result_file']).is_file()})
255
290
  # All rounds remain available; replayed slots are not duplicated.
256
291
  joined = join_scouts(store, paths, run_id=config['run_id']) if paths else {'sources': [], 'gaps': []}
257
292
  from .research_handoff import current_research
258
293
  joined = current_research(store, config['run_id'], joined, register=True)
259
294
  _save(folder / 'research.json', joined)
260
295
  _save(Path(config['packet_root']) / 'research.json', joined)
261
- return _json_result({'tasks': results, 'research_file': 'research.json', 'sources': len(joined['sources']), 'gaps': joined['gaps'], 'gap_records': joined.get('gap_records', []), 'gap_history': joined.get('gap_history', []), 'execution_gaps': joined.get('execution_gaps', [])})
296
+ return _json_result({'parallel_limit': limit, 'tasks': results, 'research_file': 'research.json', 'sources': len(joined['sources']), 'gaps': joined['gaps'], 'gap_records': joined.get('gap_records', []), 'gap_history': joined.get('gap_history', []), 'execution_gaps': joined.get('execution_gaps', [])})
262
297
 
263
298
 
264
299
  def _refresh_research(store, config):