briefloop 0.11.12__py3-none-any.whl

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 (424) hide show
  1. briefloop-0.11.12.dist-info/METADATA +473 -0
  2. briefloop-0.11.12.dist-info/RECORD +424 -0
  3. briefloop-0.11.12.dist-info/WHEEL +5 -0
  4. briefloop-0.11.12.dist-info/entry_points.txt +3 -0
  5. briefloop-0.11.12.dist-info/licenses/LICENSE +22 -0
  6. briefloop-0.11.12.dist-info/top_level.txt +1 -0
  7. multi_agent_brief/__init__.py +36 -0
  8. multi_agent_brief/analysis_blocks/__init__.py +11 -0
  9. multi_agent_brief/analysis_blocks/builder.py +206 -0
  10. multi_agent_brief/analysis_blocks/renderer.py +237 -0
  11. multi_agent_brief/analysis_blocks/schemas.py +52 -0
  12. multi_agent_brief/analysis_modules/__init__.py +8 -0
  13. multi_agent_brief/analysis_modules/base.py +87 -0
  14. multi_agent_brief/analysis_modules/market_competitor/__init__.py +68 -0
  15. multi_agent_brief/analysis_modules/market_competitor/auditor.py +290 -0
  16. multi_agent_brief/analysis_modules/market_competitor/config.py +187 -0
  17. multi_agent_brief/analysis_modules/market_competitor/event_builder.py +226 -0
  18. multi_agent_brief/analysis_modules/market_competitor/renderer.py +199 -0
  19. multi_agent_brief/analysis_modules/market_competitor/schemas.py +518 -0
  20. multi_agent_brief/analysis_modules/policy_regulatory/__init__.py +7 -0
  21. multi_agent_brief/analysis_modules/policy_regulatory/audit.py +195 -0
  22. multi_agent_brief/analysis_modules/policy_regulatory/module.py +387 -0
  23. multi_agent_brief/analysis_modules/policy_regulatory/schemas.py +129 -0
  24. multi_agent_brief/analysis_modules/registry.py +73 -0
  25. multi_agent_brief/audience/__init__.py +19 -0
  26. multi_agent_brief/audience/profiles.py +246 -0
  27. multi_agent_brief/audience_memory/__init__.py +23 -0
  28. multi_agent_brief/audience_memory/profile.py +358 -0
  29. multi_agent_brief/audit/__init__.py +36 -0
  30. multi_agent_brief/audit/case_applicability.py +181 -0
  31. multi_agent_brief/audit/deterministic.py +471 -0
  32. multi_agent_brief/audit/editorial_governance.py +404 -0
  33. multi_agent_brief/audit/final_quality.py +764 -0
  34. multi_agent_brief/audit/harness.py +242 -0
  35. multi_agent_brief/audit/interfaces.py +96 -0
  36. multi_agent_brief/audit/limitation_hygiene.py +238 -0
  37. multi_agent_brief/audit/proposal_boundary.py +34 -0
  38. multi_agent_brief/audit/redaction.py +27 -0
  39. multi_agent_brief/audit/rule_packs.py +96 -0
  40. multi_agent_brief/audit/semantic.py +435 -0
  41. multi_agent_brief/capabilities/__init__.py +22 -0
  42. multi_agent_brief/capabilities/catalog.py +215 -0
  43. multi_agent_brief/capabilities/detect.py +199 -0
  44. multi_agent_brief/capabilities/models.py +60 -0
  45. multi_agent_brief/capabilities/recommend.py +206 -0
  46. multi_agent_brief/cli/__init__.py +2 -0
  47. multi_agent_brief/cli/analysis_commands.py +140 -0
  48. multi_agent_brief/cli/approval_commands.py +107 -0
  49. multi_agent_brief/cli/audit_commands.py +59 -0
  50. multi_agent_brief/cli/capability_commands.py +548 -0
  51. multi_agent_brief/cli/claude_commands.py +159 -0
  52. multi_agent_brief/cli/competitors_commands.py +182 -0
  53. multi_agent_brief/cli/controls_commands.py +137 -0
  54. multi_agent_brief/cli/deliver_commands.py +942 -0
  55. multi_agent_brief/cli/eval_cases_commands.py +99 -0
  56. multi_agent_brief/cli/experiments_commands.py +395 -0
  57. multi_agent_brief/cli/feedback_commands.py +192 -0
  58. multi_agent_brief/cli/finalize_commands.py +153 -0
  59. multi_agent_brief/cli/gates_commands.py +174 -0
  60. multi_agent_brief/cli/hermes_commands.py +356 -0
  61. multi_agent_brief/cli/improve_commands.py +224 -0
  62. multi_agent_brief/cli/init_commands.py +564 -0
  63. multi_agent_brief/cli/init_wizard.py +1473 -0
  64. multi_agent_brief/cli/input_commands.py +237 -0
  65. multi_agent_brief/cli/main.py +288 -0
  66. multi_agent_brief/cli/onboard_commands.py +193 -0
  67. multi_agent_brief/cli/product_commands.py +1449 -0
  68. multi_agent_brief/cli/provenance_commands.py +100 -0
  69. multi_agent_brief/cli/release_commands.py +68 -0
  70. multi_agent_brief/cli/repair_commands.py +169 -0
  71. multi_agent_brief/cli/run_commands.py +292 -0
  72. multi_agent_brief/cli/runtime_commands.py +81 -0
  73. multi_agent_brief/cli/secrets_commands.py +232 -0
  74. multi_agent_brief/cli/semantic_support_commands.py +80 -0
  75. multi_agent_brief/cli/sources_commands.py +647 -0
  76. multi_agent_brief/cli/start_commands.py +8 -0
  77. multi_agent_brief/cli/state_commands.py +446 -0
  78. multi_agent_brief/cli/status_commands.py +26 -0
  79. multi_agent_brief/cli/workbuddy_commands.py +103 -0
  80. multi_agent_brief/configs/artifact_contracts.yaml +514 -0
  81. multi_agent_brief/configs/orchestrator_contract.yaml +181 -0
  82. multi_agent_brief/configs/policy_packs/default.yaml +65 -0
  83. multi_agent_brief/configs/policy_profiles/evidence_extract_default.yaml +58 -0
  84. multi_agent_brief/configs/policy_profiles/finance_default.yaml +44 -0
  85. multi_agent_brief/configs/policy_profiles/internet_default.yaml +44 -0
  86. multi_agent_brief/configs/policy_profiles/manufacturing_default.yaml +33 -0
  87. multi_agent_brief/configs/policy_profiles/solar_manufacturing_default.yaml +64 -0
  88. multi_agent_brief/configs/report_packs/evidence_extract.yaml +48 -0
  89. multi_agent_brief/configs/report_packs/management_monthly.yaml +36 -0
  90. multi_agent_brief/configs/report_packs/market_weekly.yaml +36 -0
  91. multi_agent_brief/configs/report_packs/solar_industry_periodic.yaml +50 -0
  92. multi_agent_brief/configs/report_templates/evidence_extract.yaml +55 -0
  93. multi_agent_brief/configs/report_templates/management_monthly.yaml +48 -0
  94. multi_agent_brief/configs/report_templates/market_weekly.yaml +49 -0
  95. multi_agent_brief/configs/report_templates/solar_industry_periodic.yaml +75 -0
  96. multi_agent_brief/configs/stage_specs.yaml +180 -0
  97. multi_agent_brief/contracts/__init__.py +41 -0
  98. multi_agent_brief/contracts/base.py +99 -0
  99. multi_agent_brief/contracts/errors.py +41 -0
  100. multi_agent_brief/contracts/migrations/__init__.py +5 -0
  101. multi_agent_brief/contracts/migrations/claim_v1_to_v2.py +33 -0
  102. multi_agent_brief/contracts/registry.py +159 -0
  103. multi_agent_brief/contracts/role_topology.py +25 -0
  104. multi_agent_brief/contracts/schemas/__init__.py +35 -0
  105. multi_agent_brief/contracts/schemas/analysis_pack.py +135 -0
  106. multi_agent_brief/contracts/schemas/atomic_claim_graph.py +304 -0
  107. multi_agent_brief/contracts/schemas/audit_report.py +80 -0
  108. multi_agent_brief/contracts/schemas/candidate_item.py +51 -0
  109. multi_agent_brief/contracts/schemas/claim.py +197 -0
  110. multi_agent_brief/contracts/schemas/claim_draft.py +386 -0
  111. multi_agent_brief/contracts/schemas/claim_support_matrix.py +334 -0
  112. multi_agent_brief/contracts/schemas/evidence_span_registry.py +270 -0
  113. multi_agent_brief/contracts/schemas/policy_profile.py +247 -0
  114. multi_agent_brief/contracts/schemas/report_spec.py +257 -0
  115. multi_agent_brief/contracts/schemas/semantic_assessment_report.py +480 -0
  116. multi_agent_brief/contracts/schemas/source_evidence_pack_manifest.py +233 -0
  117. multi_agent_brief/contracts/schemas/source_item.py +96 -0
  118. multi_agent_brief/contracts/semantic_assessment_status.py +12 -0
  119. multi_agent_brief/contracts/source_metadata.py +252 -0
  120. multi_agent_brief/contracts/target_contract.py +460 -0
  121. multi_agent_brief/contracts/validator.py +225 -0
  122. multi_agent_brief/controls/__init__.py +23 -0
  123. multi_agent_brief/controls/contract.py +106 -0
  124. multi_agent_brief/controls/switchboard.py +1076 -0
  125. multi_agent_brief/core/__init__.py +2 -0
  126. multi_agent_brief/core/citations.py +14 -0
  127. multi_agent_brief/core/claim_ledger.py +94 -0
  128. multi_agent_brief/core/config.py +191 -0
  129. multi_agent_brief/core/env.py +69 -0
  130. multi_agent_brief/core/previous.py +83 -0
  131. multi_agent_brief/core/schemas.py +181 -0
  132. multi_agent_brief/core/selection.py +189 -0
  133. multi_agent_brief/delivery/__init__.py +6 -0
  134. multi_agent_brief/delivery/base.py +36 -0
  135. multi_agent_brief/delivery/feishu.py +204 -0
  136. multi_agent_brief/delivery/gws.py +237 -0
  137. multi_agent_brief/evaluation_cases/__init__.py +15 -0
  138. multi_agent_brief/evaluation_cases/contract.py +429 -0
  139. multi_agent_brief/evaluation_cases/fixtures/cases/approved_guidance_materialized/workspace/config.yaml +18 -0
  140. multi_agent_brief/evaluation_cases/fixtures/cases/approved_guidance_materialized/workspace/improvement/ledger.jsonl +2 -0
  141. multi_agent_brief/evaluation_cases/fixtures/cases/approved_guidance_materialized/workspace/sources.yaml +2 -0
  142. multi_agent_brief/evaluation_cases/fixtures/cases/approved_guidance_materialized/workspace/user.md +4 -0
  143. multi_agent_brief/evaluation_cases/fixtures/cases/company_event_missing_latest_official_check/workspace/config.yaml +13 -0
  144. multi_agent_brief/evaluation_cases/fixtures/cases/company_event_missing_latest_official_check/workspace/sources.yaml +9 -0
  145. multi_agent_brief/evaluation_cases/fixtures/cases/company_event_missing_latest_official_check/workspace/user.md +4 -0
  146. multi_agent_brief/evaluation_cases/fixtures/cases/control_switchboard_selection_is_not_execution/workspace/config.yaml +12 -0
  147. multi_agent_brief/evaluation_cases/fixtures/cases/control_switchboard_selection_is_not_execution/workspace/sources.yaml +6 -0
  148. multi_agent_brief/evaluation_cases/fixtures/cases/control_switchboard_selection_is_not_execution/workspace/user.md +4 -0
  149. multi_agent_brief/evaluation_cases/fixtures/cases/feedback_triage_required/workspace/config.yaml +6 -0
  150. multi_agent_brief/evaluation_cases/fixtures/cases/feedback_triage_required/workspace/input/human_feedback.md +1 -0
  151. multi_agent_brief/evaluation_cases/fixtures/cases/feedback_triage_required/workspace/sources.yaml +2 -0
  152. multi_agent_brief/evaluation_cases/fixtures/cases/feedback_triage_required/workspace/user.md +3 -0
  153. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/config.yaml +8 -0
  154. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/output/brief.md +14 -0
  155. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/output/intermediate/audit_report.json +1 -0
  156. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/output/intermediate/audited_brief.md +5 -0
  157. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/output/intermediate/candidate_claims.json +1 -0
  158. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/output/intermediate/claim_ledger.json +1 -0
  159. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/output/intermediate/screened_candidates.json +1 -0
  160. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/sources.yaml +2 -0
  161. multi_agent_brief/evaluation_cases/fixtures/cases/final_abstract_quality_warning_surface/workspace/user.md +3 -0
  162. multi_agent_brief/evaluation_cases/fixtures/cases/formal_release_missing_human_approval/workspace/config.yaml +13 -0
  163. multi_agent_brief/evaluation_cases/fixtures/cases/formal_release_missing_human_approval/workspace/sources.yaml +9 -0
  164. multi_agent_brief/evaluation_cases/fixtures/cases/formal_release_missing_human_approval/workspace/user.md +4 -0
  165. multi_agent_brief/evaluation_cases/fixtures/cases/guidance_manifestation_not_observable/workspace/config.yaml +4 -0
  166. multi_agent_brief/evaluation_cases/fixtures/cases/guidance_manifestation_not_observable/workspace/sources.yaml +2 -0
  167. multi_agent_brief/evaluation_cases/fixtures/cases/guidance_manifestation_not_observable/workspace/user.md +3 -0
  168. multi_agent_brief/evaluation_cases/fixtures/cases/media_only_legal_policy_blocks_research_review/workspace/config.yaml +13 -0
  169. multi_agent_brief/evaluation_cases/fixtures/cases/media_only_legal_policy_blocks_research_review/workspace/sources.yaml +9 -0
  170. multi_agent_brief/evaluation_cases/fixtures/cases/media_only_legal_policy_blocks_research_review/workspace/user.md +4 -0
  171. multi_agent_brief/evaluation_cases/fixtures/cases/mixed_metric_scope_support_blocker/workspace/config.yaml +13 -0
  172. multi_agent_brief/evaluation_cases/fixtures/cases/mixed_metric_scope_support_blocker/workspace/sources.yaml +9 -0
  173. multi_agent_brief/evaluation_cases/fixtures/cases/mixed_metric_scope_support_blocker/workspace/user.md +5 -0
  174. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/config.yaml +6 -0
  175. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/output/intermediate/audited_brief.md +3 -0
  176. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/output/intermediate/candidate_claims.json +1 -0
  177. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/output/intermediate/claim_ledger.json +1 -0
  178. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/output/intermediate/feedback_issues.json +25 -0
  179. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/output/intermediate/repair_plan.json +27 -0
  180. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/output/intermediate/screened_candidates.json +1 -0
  181. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/sources.yaml +2 -0
  182. multi_agent_brief/evaluation_cases/fixtures/cases/planned_blocking_issue_cannot_continue/workspace/user.md +3 -0
  183. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/config.yaml +8 -0
  184. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/output/intermediate/audit_report.json +1 -0
  185. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/output/intermediate/audited_brief.md +3 -0
  186. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/output/intermediate/candidate_claims.json +1 -0
  187. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/output/intermediate/claim_ledger.json +11 -0
  188. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/output/intermediate/quality_gate_report.json +22 -0
  189. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/output/intermediate/screened_candidates.json +1 -0
  190. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/sources.yaml +2 -0
  191. multi_agent_brief/evaluation_cases/fixtures/cases/provenance_projection_minimal/workspace/user.md +3 -0
  192. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_source_appendix/workspace/config.yaml +13 -0
  193. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_source_appendix/workspace/output/intermediate/audit_report.json +1 -0
  194. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_source_appendix/workspace/output/intermediate/audited_brief.md +5 -0
  195. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_source_appendix/workspace/output/intermediate/candidate_claims.json +1 -0
  196. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_source_appendix/workspace/output/intermediate/claim_ledger.json +40 -0
  197. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_source_appendix/workspace/output/intermediate/screened_candidates.json +1 -0
  198. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_source_appendix/workspace/sources.yaml +3 -0
  199. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_source_appendix/workspace/user.md +3 -0
  200. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/config.yaml +8 -0
  201. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/output/brief.md +3 -0
  202. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/output/intermediate/audit_report.json +1 -0
  203. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/output/intermediate/audited_brief.md +3 -0
  204. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/output/intermediate/candidate_claims.json +1 -0
  205. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/output/intermediate/claim_ledger.json +13 -0
  206. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/output/intermediate/screened_candidates.json +1 -0
  207. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/sources.yaml +2 -0
  208. multi_agent_brief/evaluation_cases/fixtures/cases/reader_facing_target_relevance/workspace/user.md +3 -0
  209. multi_agent_brief/evaluation_cases/fixtures/cases/release_readiness_forged_event_blocker/workspace/config.yaml +13 -0
  210. multi_agent_brief/evaluation_cases/fixtures/cases/release_readiness_forged_event_blocker/workspace/output/intermediate/release_readiness_report.json +31 -0
  211. multi_agent_brief/evaluation_cases/fixtures/cases/release_readiness_forged_event_blocker/workspace/sources.yaml +9 -0
  212. multi_agent_brief/evaluation_cases/fixtures/cases/release_readiness_forged_event_blocker/workspace/user.md +4 -0
  213. multi_agent_brief/evaluation_cases/fixtures/cases/reverted_entry_removed_from_next_snapshot/workspace/config.yaml +18 -0
  214. multi_agent_brief/evaluation_cases/fixtures/cases/reverted_entry_removed_from_next_snapshot/workspace/improvement/ledger.jsonl +3 -0
  215. multi_agent_brief/evaluation_cases/fixtures/cases/reverted_entry_removed_from_next_snapshot/workspace/improvement/memory.md +3 -0
  216. multi_agent_brief/evaluation_cases/fixtures/cases/reverted_entry_removed_from_next_snapshot/workspace/output/intermediate/improvement_memory_snapshot.md +3 -0
  217. multi_agent_brief/evaluation_cases/fixtures/cases/reverted_entry_removed_from_next_snapshot/workspace/sources.yaml +2 -0
  218. multi_agent_brief/evaluation_cases/fixtures/cases/reverted_entry_removed_from_next_snapshot/workspace/user.md +4 -0
  219. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/config.yaml +12 -0
  220. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/input/sources/source-001.txt +1 -0
  221. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/brief.md +37 -0
  222. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/delivery/brief.md +37 -0
  223. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/atomic_claim_graph.json +17 -0
  224. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/audit_report.json +5 -0
  225. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/audited_brief.md +37 -0
  226. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/claim_ledger.json +20 -0
  227. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/evidence_span_registry.json +20 -0
  228. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/finalize_report.json +40 -0
  229. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/gates/auditor_quality_gate_report.json +42 -0
  230. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/gates/finalize_quality_gate_report.json +42 -0
  231. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/intermediate/screened_candidates.json +33 -0
  232. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/source_appendix.md +12 -0
  233. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/output/source_appendix_trace.md +10 -0
  234. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/report_spec.yaml +24 -0
  235. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/sources.yaml +4 -0
  236. multi_agent_brief/evaluation_cases/fixtures/cases/same_evidence_reader_quality_regression/workspace/user.md +3 -0
  237. multi_agent_brief/evaluation_cases/fixtures/cases/source_evidence_pack_blocks_non_evidence_file/workspace/config.yaml +13 -0
  238. multi_agent_brief/evaluation_cases/fixtures/cases/source_evidence_pack_blocks_non_evidence_file/workspace/input/sources/README.md +4 -0
  239. multi_agent_brief/evaluation_cases/fixtures/cases/source_evidence_pack_blocks_non_evidence_file/workspace/output/intermediate/source_evidence_pack_manifest.json +26 -0
  240. multi_agent_brief/evaluation_cases/fixtures/cases/source_evidence_pack_blocks_non_evidence_file/workspace/sources.yaml +9 -0
  241. multi_agent_brief/evaluation_cases/fixtures/cases/source_evidence_pack_blocks_non_evidence_file/workspace/user.md +4 -0
  242. multi_agent_brief/evaluation_cases/fixtures/cases/stale_current_claim/workspace/config.yaml +9 -0
  243. multi_agent_brief/evaluation_cases/fixtures/cases/stale_current_claim/workspace/output/intermediate/audit_report.json +1 -0
  244. multi_agent_brief/evaluation_cases/fixtures/cases/stale_current_claim/workspace/output/intermediate/audited_brief.md +3 -0
  245. multi_agent_brief/evaluation_cases/fixtures/cases/stale_current_claim/workspace/output/intermediate/candidate_claims.json +1 -0
  246. multi_agent_brief/evaluation_cases/fixtures/cases/stale_current_claim/workspace/output/intermediate/claim_ledger.json +13 -0
  247. multi_agent_brief/evaluation_cases/fixtures/cases/stale_current_claim/workspace/output/intermediate/screened_candidates.json +1 -0
  248. multi_agent_brief/evaluation_cases/fixtures/cases/stale_current_claim/workspace/sources.yaml +2 -0
  249. multi_agent_brief/evaluation_cases/fixtures/cases/stale_current_claim/workspace/user.md +3 -0
  250. multi_agent_brief/evaluation_cases/fixtures/cases/third_party_price_snapshot_formal_block/workspace/config.yaml +13 -0
  251. multi_agent_brief/evaluation_cases/fixtures/cases/third_party_price_snapshot_formal_block/workspace/sources.yaml +9 -0
  252. multi_agent_brief/evaluation_cases/fixtures/cases/third_party_price_snapshot_formal_block/workspace/user.md +4 -0
  253. multi_agent_brief/evaluation_cases/fixtures/cases/trajectory_retry_budget_exhausted/workspace/config.yaml +4 -0
  254. multi_agent_brief/evaluation_cases/fixtures/cases/trajectory_retry_budget_exhausted/workspace/sources.yaml +2 -0
  255. multi_agent_brief/evaluation_cases/fixtures/cases/trajectory_retry_budget_exhausted/workspace/user.md +3 -0
  256. multi_agent_brief/evaluation_cases/fixtures/cases/unapproved_entry_not_materialized/workspace/config.yaml +18 -0
  257. multi_agent_brief/evaluation_cases/fixtures/cases/unapproved_entry_not_materialized/workspace/improvement/ledger.jsonl +1 -0
  258. multi_agent_brief/evaluation_cases/fixtures/cases/unapproved_entry_not_materialized/workspace/sources.yaml +2 -0
  259. multi_agent_brief/evaluation_cases/fixtures/cases/unapproved_entry_not_materialized/workspace/user.md +4 -0
  260. multi_agent_brief/evaluation_cases/fixtures/cases/unauthorized_institution_branding_blocks_release/workspace/config.yaml +18 -0
  261. multi_agent_brief/evaluation_cases/fixtures/cases/unauthorized_institution_branding_blocks_release/workspace/sources.yaml +9 -0
  262. multi_agent_brief/evaluation_cases/fixtures/cases/unauthorized_institution_branding_blocks_release/workspace/user.md +5 -0
  263. multi_agent_brief/evaluation_cases/fixtures/cases/unsupported_material_fact/workspace/config.yaml +8 -0
  264. multi_agent_brief/evaluation_cases/fixtures/cases/unsupported_material_fact/workspace/output/intermediate/audit_report.json +1 -0
  265. multi_agent_brief/evaluation_cases/fixtures/cases/unsupported_material_fact/workspace/output/intermediate/audited_brief.md +8 -0
  266. multi_agent_brief/evaluation_cases/fixtures/cases/unsupported_material_fact/workspace/output/intermediate/candidate_claims.json +1 -0
  267. multi_agent_brief/evaluation_cases/fixtures/cases/unsupported_material_fact/workspace/output/intermediate/claim_ledger.json +1 -0
  268. multi_agent_brief/evaluation_cases/fixtures/cases/unsupported_material_fact/workspace/output/intermediate/screened_candidates.json +1 -0
  269. multi_agent_brief/evaluation_cases/fixtures/cases/unsupported_material_fact/workspace/sources.yaml +2 -0
  270. multi_agent_brief/evaluation_cases/fixtures/cases/unsupported_material_fact/workspace/user.md +3 -0
  271. multi_agent_brief/evaluation_cases/fixtures/manifest.yaml +861 -0
  272. multi_agent_brief/evaluation_cases/fixtures.py +20 -0
  273. multi_agent_brief/evaluation_cases/runner.py +1603 -0
  274. multi_agent_brief/experiments/__init__.py +45 -0
  275. multi_agent_brief/experiments/experiment_080.py +5835 -0
  276. multi_agent_brief/experiments/schemas.py +63 -0
  277. multi_agent_brief/experiments/target_contract.py +10 -0
  278. multi_agent_brief/feedback/__init__.py +17 -0
  279. multi_agent_brief/feedback/feedback_contract.py +482 -0
  280. multi_agent_brief/feedback/feedback_state.py +898 -0
  281. multi_agent_brief/hermes/__init__.py +25 -0
  282. multi_agent_brief/hermes/adapter.py +832 -0
  283. multi_agent_brief/improvement/__init__.py +83 -0
  284. multi_agent_brief/improvement/contract.py +1114 -0
  285. multi_agent_brief/improvement/memory.py +451 -0
  286. multi_agent_brief/improvement/product_definition.py +228 -0
  287. multi_agent_brief/improvement/state.py +961 -0
  288. multi_agent_brief/inputs/__init__.py +2 -0
  289. multi_agent_brief/inputs/classifier.py +322 -0
  290. multi_agent_brief/inputs/contracts.py +59 -0
  291. multi_agent_brief/inputs/extractor.py +310 -0
  292. multi_agent_brief/install/__init__.py +2 -0
  293. multi_agent_brief/install/writer.py +97 -0
  294. multi_agent_brief/onboarding/__init__.py +11 -0
  295. multi_agent_brief/onboarding/io.py +103 -0
  296. multi_agent_brief/onboarding/mapper.py +484 -0
  297. multi_agent_brief/onboarding/schema.py +46 -0
  298. multi_agent_brief/orchestrator/__init__.py +2 -0
  299. multi_agent_brief/orchestrator/fact_layer_import.py +352 -0
  300. multi_agent_brief/orchestrator/handoff.py +2209 -0
  301. multi_agent_brief/orchestrator/role_topology.py +42 -0
  302. multi_agent_brief/orchestrator/run_archive.py +888 -0
  303. multi_agent_brief/orchestrator/run_integrity.py +346 -0
  304. multi_agent_brief/orchestrator/runtime_state/__init__.py +70 -0
  305. multi_agent_brief/orchestrator/runtime_state/_io.py +167 -0
  306. multi_agent_brief/orchestrator/runtime_state/_transactions.py +298 -0
  307. multi_agent_brief/orchestrator/runtime_state/artifact_registry.py +1825 -0
  308. multi_agent_brief/orchestrator/runtime_state/atomic_claim_graph.py +96 -0
  309. multi_agent_brief/orchestrator/runtime_state/claim_ledger_freeze.py +510 -0
  310. multi_agent_brief/orchestrator/runtime_state/claim_metadata_enrichment.py +836 -0
  311. multi_agent_brief/orchestrator/runtime_state/claim_support_matrix.py +582 -0
  312. multi_agent_brief/orchestrator/runtime_state/completion_gates.py +672 -0
  313. multi_agent_brief/orchestrator/runtime_state/contracts_loader.py +66 -0
  314. multi_agent_brief/orchestrator/runtime_state/decisions.py +239 -0
  315. multi_agent_brief/orchestrator/runtime_state/errors.py +61 -0
  316. multi_agent_brief/orchestrator/runtime_state/event_log.py +256 -0
  317. multi_agent_brief/orchestrator/runtime_state/evidence_span_registry.py +233 -0
  318. multi_agent_brief/orchestrator/runtime_state/fact_layer.py +755 -0
  319. multi_agent_brief/orchestrator/runtime_state/identity.py +90 -0
  320. multi_agent_brief/orchestrator/runtime_state/lifecycle.py +675 -0
  321. multi_agent_brief/orchestrator/runtime_state/manifest.py +82 -0
  322. multi_agent_brief/orchestrator/runtime_state/operations.py +224 -0
  323. multi_agent_brief/orchestrator/runtime_state/paths.py +38 -0
  324. multi_agent_brief/orchestrator/runtime_state/repair.py +984 -0
  325. multi_agent_brief/orchestrator/runtime_state/safety_surfaces.py +147 -0
  326. multi_agent_brief/orchestrator/runtime_state/semantic_assessment_report.py +692 -0
  327. multi_agent_brief/orchestrator/runtime_state/semantic_support_acceptance.py +683 -0
  328. multi_agent_brief/orchestrator/runtime_state/source_evidence_pack.py +131 -0
  329. multi_agent_brief/orchestrator/runtime_state/stage_completion.py +1320 -0
  330. multi_agent_brief/orchestrator/runtime_state/trajectory.py +200 -0
  331. multi_agent_brief/orchestrator/runtime_state/workflow.py +350 -0
  332. multi_agent_brief/orchestrator/source_evidence.py +43 -0
  333. multi_agent_brief/orchestrator/timing.py +410 -0
  334. multi_agent_brief/orchestrator_contract.py +96 -0
  335. multi_agent_brief/outputs/__init__.py +2 -0
  336. multi_agent_brief/outputs/atomic_reader_projection.py +288 -0
  337. multi_agent_brief/outputs/docx.py +32 -0
  338. multi_agent_brief/outputs/finalize.py +1036 -0
  339. multi_agent_brief/outputs/ib_docx.py +983 -0
  340. multi_agent_brief/outputs/naming.py +38 -0
  341. multi_agent_brief/outputs/pdf.py +20 -0
  342. multi_agent_brief/outputs/reader_final_gate.py +509 -0
  343. multi_agent_brief/outputs/reader_projection.py +397 -0
  344. multi_agent_brief/outputs/source_appendix.py +753 -0
  345. multi_agent_brief/outputs/templates/__init__.py +112 -0
  346. multi_agent_brief/product/__init__.py +49 -0
  347. multi_agent_brief/product/bundle_projection.py +686 -0
  348. multi_agent_brief/product/citation_profile.py +145 -0
  349. multi_agent_brief/product/guidance_manifestation.py +421 -0
  350. multi_agent_brief/product/materiality_selection.py +472 -0
  351. multi_agent_brief/product/policy_gate_adapter.py +116 -0
  352. multi_agent_brief/product/policy_profile.py +39 -0
  353. multi_agent_brief/product/policy_projection.py +161 -0
  354. multi_agent_brief/product/policy_registry.py +83 -0
  355. multi_agent_brief/product/policy_resolver.py +225 -0
  356. multi_agent_brief/product/quality_closeout.py +188 -0
  357. multi_agent_brief/product/quality_panel.py +2217 -0
  358. multi_agent_brief/product/release_approval.py +1034 -0
  359. multi_agent_brief/product/report_pack.py +130 -0
  360. multi_agent_brief/product/report_pack_aliases.py +68 -0
  361. multi_agent_brief/product/report_registry.py +101 -0
  362. multi_agent_brief/product/report_spec.py +181 -0
  363. multi_agent_brief/product/support_wording.py +525 -0
  364. multi_agent_brief/product/template_conformance.py +516 -0
  365. multi_agent_brief/product/template_projection.py +123 -0
  366. multi_agent_brief/product/template_registry.py +244 -0
  367. multi_agent_brief/product/template_render_plan.py +315 -0
  368. multi_agent_brief/product/template_renderer.py +224 -0
  369. multi_agent_brief/product/trajectory_regulation.py +441 -0
  370. multi_agent_brief/provenance/__init__.py +5 -0
  371. multi_agent_brief/provenance/builder.py +841 -0
  372. multi_agent_brief/provenance/contract.py +21 -0
  373. multi_agent_brief/provenance/io.py +144 -0
  374. multi_agent_brief/provenance/model.py +110 -0
  375. multi_agent_brief/provenance/references.py +43 -0
  376. multi_agent_brief/provenance/validator.py +135 -0
  377. multi_agent_brief/quality_gates/__init__.py +19 -0
  378. multi_agent_brief/quality_gates/contract.py +581 -0
  379. multi_agent_brief/quality_gates/state.py +2498 -0
  380. multi_agent_brief/repair/__init__.py +5 -0
  381. multi_agent_brief/repair/router.py +842 -0
  382. multi_agent_brief/runtime_assets.py +431 -0
  383. multi_agent_brief/sources/__init__.py +16 -0
  384. multi_agent_brief/sources/api_filings.py +236 -0
  385. multi_agent_brief/sources/api_news.py +174 -0
  386. multi_agent_brief/sources/base.py +142 -0
  387. multi_agent_brief/sources/cached_package.py +119 -0
  388. multi_agent_brief/sources/cli_provider.py +263 -0
  389. multi_agent_brief/sources/coverage.py +336 -0
  390. multi_agent_brief/sources/decider.py +756 -0
  391. multi_agent_brief/sources/doctor.py +373 -0
  392. multi_agent_brief/sources/evidence_pack.py +364 -0
  393. multi_agent_brief/sources/feishu_provider.py +326 -0
  394. multi_agent_brief/sources/filing_resolver.py +400 -0
  395. multi_agent_brief/sources/industry_packs.py +130 -0
  396. multi_agent_brief/sources/join.py +206 -0
  397. multi_agent_brief/sources/local_signal.py +81 -0
  398. multi_agent_brief/sources/local_signal_planner.py +636 -0
  399. multi_agent_brief/sources/manual.py +259 -0
  400. multi_agent_brief/sources/mcp_provider.py +309 -0
  401. multi_agent_brief/sources/mineru_provider.py +601 -0
  402. multi_agent_brief/sources/normalizer.py +95 -0
  403. multi_agent_brief/sources/opencli_provider.py +282 -0
  404. multi_agent_brief/sources/planner.py +178 -0
  405. multi_agent_brief/sources/registry.py +367 -0
  406. multi_agent_brief/sources/rss.py +190 -0
  407. multi_agent_brief/sources/search_backends/__init__.py +31 -0
  408. multi_agent_brief/sources/search_backends/base.py +51 -0
  409. multi_agent_brief/sources/search_backends/brave.py +192 -0
  410. multi_agent_brief/sources/search_backends/capabilities.py +94 -0
  411. multi_agent_brief/sources/search_backends/exa.py +180 -0
  412. multi_agent_brief/sources/search_backends/firecrawl.py +164 -0
  413. multi_agent_brief/sources/search_backends/serper.py +241 -0
  414. multi_agent_brief/sources/search_backends/tavily.py +124 -0
  415. multi_agent_brief/sources/sourcehub.py +505 -0
  416. multi_agent_brief/sources/web_search.py +267 -0
  417. multi_agent_brief/status.py +966 -0
  418. multi_agent_brief/tools/__init__.py +3 -0
  419. multi_agent_brief/tools/draft_cleanup.py +198 -0
  420. multi_agent_brief/workbuddy/__init__.py +1 -0
  421. multi_agent_brief/workbuddy/diagnose.py +569 -0
  422. multi_agent_brief/workbuddy/skill_pack.py +309 -0
  423. multi_agent_brief/workspace/__init__.py +1 -0
  424. multi_agent_brief/workspace/init_profile.py +45 -0
@@ -0,0 +1,129 @@
1
+ """Data structures for Policy & Regulatory Risk Module."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+ from datetime import date
7
+ from typing import Any
8
+
9
+
10
+ @dataclass
11
+ class PolicyEvent:
12
+ """A single policy or regulatory event."""
13
+
14
+ event_id: str
15
+ jurisdiction: str
16
+ authority: str
17
+ instrument_name: str
18
+ publication_date: str = ""
19
+ effective_date: str = ""
20
+ affected_entities: list[str] = field(default_factory=list)
21
+ core_change: str = ""
22
+ compliance_deadline: str = ""
23
+ source_refs: list[str] = field(default_factory=list)
24
+ limitations: list[str] = field(default_factory=list)
25
+ epistemic_type: str = "FACT" # FACT, HYPOTHESIS, TO_VERIFY
26
+
27
+ def to_dict(self) -> dict[str, Any]:
28
+ return {
29
+ "event_id": self.event_id,
30
+ "jurisdiction": self.jurisdiction,
31
+ "authority": self.authority,
32
+ "instrument_name": self.instrument_name,
33
+ "publication_date": self.publication_date,
34
+ "effective_date": self.effective_date,
35
+ "affected_entities": self.affected_entities,
36
+ "core_change": self.core_change,
37
+ "compliance_deadline": self.compliance_deadline,
38
+ "source_refs": self.source_refs,
39
+ "limitations": self.limitations,
40
+ "epistemic_type": self.epistemic_type,
41
+ }
42
+
43
+
44
+ @dataclass
45
+ class RiskItem:
46
+ """A single risk item in the risk register."""
47
+
48
+ risk_id: str
49
+ event_id: str
50
+ risk_type: str # compliance, operational, market_access, reputational
51
+ severity: str # low, medium, high, critical
52
+ likelihood: str # unlikely, possible, likely, certain
53
+ affected_entities: list[str] = field(default_factory=list)
54
+ mitigation_notes: str = ""
55
+ applicability_status: str = "TO_VERIFY" # CONFIRMED, TO_VERIFY, HYPOTHESIS
56
+ source_refs: list[str] = field(default_factory=list)
57
+
58
+ def to_dict(self) -> dict[str, Any]:
59
+ return {
60
+ "risk_id": self.risk_id,
61
+ "event_id": self.event_id,
62
+ "risk_type": self.risk_type,
63
+ "severity": self.severity,
64
+ "likelihood": self.likelihood,
65
+ "affected_entities": self.affected_entities,
66
+ "mitigation_notes": self.mitigation_notes,
67
+ "applicability_status": self.applicability_status,
68
+ "source_refs": self.source_refs,
69
+ }
70
+
71
+
72
+ @dataclass
73
+ class ApplicabilityQuestion:
74
+ """An open question about applicability of a policy event."""
75
+
76
+ question_id: str
77
+ event_id: str
78
+ question: str
79
+ context: str = ""
80
+ priority: str = "medium" # low, medium, high
81
+
82
+ def to_dict(self) -> dict[str, Any]:
83
+ return {
84
+ "question_id": self.question_id,
85
+ "event_id": self.event_id,
86
+ "question": self.question,
87
+ "context": self.context,
88
+ "priority": self.priority,
89
+ }
90
+
91
+
92
+ @dataclass
93
+ class PolicyEvidencePack:
94
+ """Evidence pack for policy & regulatory analysis."""
95
+
96
+ events: list[PolicyEvent] = field(default_factory=list)
97
+ risks: list[RiskItem] = field(default_factory=list)
98
+ applicability_questions: list[ApplicabilityQuestion] = field(default_factory=list)
99
+ metadata: dict[str, Any] = field(default_factory=dict)
100
+
101
+ def to_dict(self) -> dict[str, Any]:
102
+ return {
103
+ "events": [e.to_dict() for e in self.events],
104
+ "risks": [r.to_dict() for r in self.risks],
105
+ "applicability_questions": [q.to_dict() for q in self.applicability_questions],
106
+ "metadata": self.metadata,
107
+ }
108
+
109
+
110
+ @dataclass
111
+ class PolicyCoverageReport:
112
+ """Coverage report for policy & regulatory analysis."""
113
+
114
+ total_events: int = 0
115
+ jurisdictions_covered: list[str] = field(default_factory=list)
116
+ authorities_covered: list[str] = field(default_factory=list)
117
+ risk_types_covered: list[str] = field(default_factory=list)
118
+ coverage_gaps: list[str] = field(default_factory=list)
119
+ metadata: dict[str, Any] = field(default_factory=dict)
120
+
121
+ def to_dict(self) -> dict[str, Any]:
122
+ return {
123
+ "total_events": self.total_events,
124
+ "jurisdictions_covered": self.jurisdictions_covered,
125
+ "authorities_covered": self.authorities_covered,
126
+ "risk_types_covered": self.risk_types_covered,
127
+ "coverage_gaps": self.coverage_gaps,
128
+ "metadata": self.metadata,
129
+ }
@@ -0,0 +1,73 @@
1
+ """Analysis Module Registry — discovers and loads pluggable analysis modules."""
2
+ from __future__ import annotations
3
+
4
+ from typing import Any
5
+
6
+ from multi_agent_brief.analysis_modules.base import AnalysisModule
7
+
8
+ # Global registry: maps module name → module class.
9
+ MODULE_REGISTRY: dict[str, type[AnalysisModule]] = {}
10
+
11
+
12
+ def register_module(name: str, cls: type[AnalysisModule]) -> None:
13
+ """Register an AnalysisModule class."""
14
+ MODULE_REGISTRY[name] = cls
15
+
16
+
17
+ def load_enabled_modules(config: dict[str, Any] | None) -> list[AnalysisModule]:
18
+ """Instantiate analysis modules enabled in config.yaml's ``modules`` section.
19
+
20
+ Args:
21
+ config: Full parsed config.yaml (with optional ``modules`` key).
22
+
23
+ Returns:
24
+ A list of instantiated AnalysisModules, ordered by registration.
25
+ Returns an empty list when ``modules`` is missing or empty.
26
+ """
27
+ if config is None:
28
+ return []
29
+
30
+ modules_config = config.get("modules")
31
+ if not modules_config:
32
+ return []
33
+
34
+ if not isinstance(modules_config, dict):
35
+ return []
36
+
37
+ enabled_modules: list[AnalysisModule] = []
38
+ for module_name, cls in MODULE_REGISTRY.items():
39
+ module_cfg = modules_config.get(module_name, {})
40
+ if not isinstance(module_cfg, dict):
41
+ continue
42
+ if not module_cfg.get("enabled", False):
43
+ continue
44
+
45
+ instance = cls()
46
+ instance.name = getattr(cls, "name", "") or cls.__name__
47
+ enabled_modules.append(instance)
48
+
49
+ return enabled_modules
50
+
51
+
52
+ # ── Auto-registration ───────────────────────────────────────────────────────
53
+
54
+ def _auto_register() -> None:
55
+ """Register built-in analysis modules."""
56
+ try:
57
+ from multi_agent_brief.analysis_modules.market_competitor import (
58
+ MarketCompetitorModule,
59
+ )
60
+ register_module("market_competitor", MarketCompetitorModule)
61
+ except ImportError:
62
+ pass
63
+
64
+ try:
65
+ from multi_agent_brief.analysis_modules.policy_regulatory import (
66
+ PolicyRegulatoryModule,
67
+ )
68
+ register_module("policy_regulatory", PolicyRegulatoryModule)
69
+ except ImportError:
70
+ pass
71
+
72
+
73
+ _auto_register()
@@ -0,0 +1,19 @@
1
+ """Audience Profiles — deterministic configuration for brief structure and quality thresholds.
2
+
3
+ Each profile defines required sections, banned phrases, quality thresholds,
4
+ and default DOCX template. Profiles are mapped conservatively from free-text
5
+ onboarding input.
6
+ """
7
+ from multi_agent_brief.audience.profiles import (
8
+ AudienceProfile,
9
+ get_profile,
10
+ map_audience_to_profile,
11
+ PROFILES,
12
+ )
13
+
14
+ __all__ = [
15
+ "AudienceProfile",
16
+ "get_profile",
17
+ "map_audience_to_profile",
18
+ "PROFILES",
19
+ ]
@@ -0,0 +1,246 @@
1
+ """Audience Profile definitions and mapping logic.
2
+
3
+ Profiles are public-safe and industry-neutral. They define:
4
+ - Required and optional sections
5
+ - Banned phrases and required disclaimers
6
+ - Quality thresholds (min chars, min sections, etc.)
7
+ - Citation and summary bullet policies
8
+ - Default DOCX template
9
+ - Final quality and editorial governance thresholds
10
+ """
11
+ from __future__ import annotations
12
+
13
+ from dataclasses import dataclass, field
14
+
15
+
16
+ @dataclass
17
+ class AudienceProfile:
18
+ """Deterministic configuration for a specific audience type."""
19
+
20
+ profile_id: str
21
+ display_name: str
22
+
23
+ # Section requirements
24
+ required_sections: list[str] = field(default_factory=list)
25
+ optional_sections: list[str] = field(default_factory=list)
26
+
27
+ # Content restrictions
28
+ banned_phrases: list[str] = field(default_factory=list)
29
+ required_disclaimers: list[str] = field(default_factory=list)
30
+
31
+ # Quality thresholds
32
+ min_markdown_chars: int = 8000
33
+ min_main_sections: int = 3
34
+ min_zh_chars: int = 0 # 0 = not enforced
35
+ min_en_words: int = 0 # 0 = not enforced
36
+
37
+ # Policy settings
38
+ summary_bullet_policy: str = "required" # required / optional / none
39
+ citation_policy: str = "required" # required / optional / none
40
+
41
+ # DOCX template default
42
+ docx_template: str = "executive_brief"
43
+
44
+ # Threshold overrides for final quality gate
45
+ final_quality_thresholds: dict = field(default_factory=dict)
46
+
47
+ # Threshold overrides for editorial governance
48
+ editorial_governance_thresholds: dict = field(default_factory=dict)
49
+
50
+
51
+ # ── Profile Registry ──────────────────────────────────────────────────────────
52
+
53
+ PROFILES: dict[str, AudienceProfile] = {
54
+ "management": AudienceProfile(
55
+ profile_id="management",
56
+ display_name="Management / Executive",
57
+ required_sections=["Executive Summary", "Key Developments", "Outlook"],
58
+ optional_sections=["Risk Assessment", "Competitive Landscape"],
59
+ banned_phrases=[
60
+ "investment recommendation",
61
+ "buy",
62
+ "sell",
63
+ "target price",
64
+ "strong buy",
65
+ "strong sell",
66
+ ],
67
+ required_disclaimers=[],
68
+ min_markdown_chars=8000,
69
+ min_main_sections=3,
70
+ min_zh_chars=3000,
71
+ min_en_words=1800,
72
+ summary_bullet_policy="required",
73
+ citation_policy="required",
74
+ docx_template="executive_brief",
75
+ final_quality_thresholds={
76
+ "expected_summary_bullets": 5,
77
+ "min_selected_claims": 20,
78
+ },
79
+ editorial_governance_thresholds={
80
+ "min_factual_density": 0.3,
81
+ },
82
+ ),
83
+ "research": AudienceProfile(
84
+ profile_id="research",
85
+ display_name="Research / Analyst",
86
+ required_sections=["Executive Summary", "Methodology", "Findings", "Data Sources"],
87
+ optional_sections=["Limitations", "Appendix"],
88
+ banned_phrases=[],
89
+ required_disclaimers=[],
90
+ min_markdown_chars=12000,
91
+ min_main_sections=4,
92
+ min_zh_chars=4000,
93
+ min_en_words=2500,
94
+ summary_bullet_policy="required",
95
+ citation_policy="required",
96
+ docx_template="research_note",
97
+ final_quality_thresholds={
98
+ "expected_summary_bullets": 7,
99
+ "min_selected_claims": 30,
100
+ },
101
+ editorial_governance_thresholds={
102
+ "min_factual_density": 0.4,
103
+ },
104
+ ),
105
+ "ir": AudienceProfile(
106
+ profile_id="ir",
107
+ display_name="Investor Relations / Disclosure",
108
+ required_sections=["Executive Summary", "Key Metrics", "Outlook"],
109
+ optional_sections=["Risk Factors", "Regulatory Considerations"],
110
+ banned_phrases=[
111
+ "investment recommendation",
112
+ "buy",
113
+ "sell",
114
+ "target price",
115
+ ],
116
+ required_disclaimers=[
117
+ "This document is for informational purposes only and does not constitute investment advice.",
118
+ ],
119
+ min_markdown_chars=8000,
120
+ min_main_sections=3,
121
+ min_zh_chars=3000,
122
+ min_en_words=1800,
123
+ summary_bullet_policy="required",
124
+ citation_policy="required",
125
+ docx_template="formal_internal_report",
126
+ final_quality_thresholds={
127
+ "expected_summary_bullets": 5,
128
+ "min_selected_claims": 20,
129
+ },
130
+ editorial_governance_thresholds={
131
+ "min_factual_density": 0.35,
132
+ },
133
+ ),
134
+ "legal_compliance": AudienceProfile(
135
+ profile_id="legal_compliance",
136
+ display_name="Legal / Compliance / Regulatory",
137
+ required_sections=["Executive Summary", "Regulatory Changes", "Compliance Impact"],
138
+ optional_sections=["Risk Assessment", "Action Items"],
139
+ banned_phrases=[
140
+ "investment recommendation",
141
+ "buy",
142
+ "sell",
143
+ "target price",
144
+ ],
145
+ required_disclaimers=[
146
+ "This document is for informational purposes only and does not constitute legal advice.",
147
+ ],
148
+ min_markdown_chars=10000,
149
+ min_main_sections=3,
150
+ min_zh_chars=3500,
151
+ min_en_words=2000,
152
+ summary_bullet_policy="required",
153
+ citation_policy="required",
154
+ docx_template="formal_internal_report",
155
+ final_quality_thresholds={
156
+ "expected_summary_bullets": 5,
157
+ "min_selected_claims": 25,
158
+ },
159
+ editorial_governance_thresholds={
160
+ "min_factual_density": 0.4,
161
+ },
162
+ ),
163
+ "default": AudienceProfile(
164
+ profile_id="default",
165
+ display_name="General / Default",
166
+ required_sections=["Executive Summary", "Key Developments"],
167
+ optional_sections=["Outlook", "Risk Assessment"],
168
+ banned_phrases=[],
169
+ required_disclaimers=[],
170
+ min_markdown_chars=8000,
171
+ min_main_sections=3,
172
+ min_zh_chars=3000,
173
+ min_en_words=1800,
174
+ summary_bullet_policy="required",
175
+ citation_policy="required",
176
+ docx_template="executive_brief",
177
+ final_quality_thresholds={
178
+ "expected_summary_bullets": 5,
179
+ "min_selected_claims": 20,
180
+ },
181
+ editorial_governance_thresholds={
182
+ "min_factual_density": 0.3,
183
+ },
184
+ ),
185
+ }
186
+
187
+
188
+ def get_profile(profile_id: str) -> AudienceProfile:
189
+ """Get an AudienceProfile by ID.
190
+
191
+ Returns the 'default' profile if the ID is not found.
192
+ """
193
+ return PROFILES.get(profile_id, PROFILES["default"])
194
+
195
+
196
+ def map_audience_to_profile(audience_text: str) -> str:
197
+ """Conservatively map free-text audience to a profile ID.
198
+
199
+ This mapping is intentionally conservative — unknown audience types
200
+ map to 'default' rather than guessing.
201
+
202
+ Args:
203
+ audience_text: Free-text audience description from onboarding.
204
+
205
+ Returns:
206
+ Profile ID string (management, research, ir, legal_compliance, or default).
207
+ """
208
+ t = audience_text.strip().lower()
209
+ if not t:
210
+ return "default"
211
+
212
+ # Management / Executive mappings
213
+ management_keywords = [
214
+ "management", "executive", "ceo", "cfo", "cto", "board",
215
+ "leadership", "c-suite", "management team", "executive team",
216
+ "管理层", "总裁办", "董事会", "高管", "领导层", "boss",
217
+ ]
218
+ if any(kw in t for kw in management_keywords):
219
+ return "management"
220
+
221
+ # Research / Analyst mappings
222
+ research_keywords = [
223
+ "research", "analyst", "industry research", "research analyst",
224
+ "研究员", "分析员", "行业研究", "研究团队",
225
+ ]
226
+ if any(kw in t for kw in research_keywords):
227
+ return "research"
228
+
229
+ # Investor Relations mappings
230
+ ir_keywords = [
231
+ "investor relations", "ir", "disclosure", "investor",
232
+ "投关", "披露", "投资者关系", "ir部门",
233
+ ]
234
+ if any(kw in t for kw in ir_keywords):
235
+ return "ir"
236
+
237
+ # Legal / Compliance mappings
238
+ legal_keywords = [
239
+ "legal", "compliance", "regulatory", "law", "legal compliance",
240
+ "法务", "合规", "监管", "法律", "法规",
241
+ ]
242
+ if any(kw in t for kw in legal_keywords):
243
+ return "legal_compliance"
244
+
245
+ # Unknown audience → default
246
+ return "default"
@@ -0,0 +1,23 @@
1
+ """Workspace-local audience taste memory runtime surface."""
2
+
3
+ from multi_agent_brief.audience_memory.profile import (
4
+ AUDIENCE_MEMORY_FILES,
5
+ AudienceProfileResult,
6
+ AudienceSnapshotResult,
7
+ build_default_audience_profile,
8
+ create_audience_profile_snapshot,
9
+ ensure_audience_profile,
10
+ profile_data_from_object,
11
+ profile_data_from_workspace_config,
12
+ )
13
+
14
+ __all__ = [
15
+ "AUDIENCE_MEMORY_FILES",
16
+ "AudienceProfileResult",
17
+ "AudienceSnapshotResult",
18
+ "build_default_audience_profile",
19
+ "create_audience_profile_snapshot",
20
+ "ensure_audience_profile",
21
+ "profile_data_from_object",
22
+ "profile_data_from_workspace_config",
23
+ ]