metamuse-cli 0.1.0a1__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 (539) hide show
  1. metamuse_cli-0.1.0a1/.gitattributes +2 -0
  2. metamuse_cli-0.1.0a1/.github/workflows/ci.yml +245 -0
  3. metamuse_cli-0.1.0a1/.github/workflows/pages.yml +57 -0
  4. metamuse_cli-0.1.0a1/.github/workflows/publish.yml +176 -0
  5. metamuse_cli-0.1.0a1/.gitignore +17 -0
  6. metamuse_cli-0.1.0a1/.python-version +1 -0
  7. metamuse_cli-0.1.0a1/AGENTS.md +35 -0
  8. metamuse_cli-0.1.0a1/LICENSE +202 -0
  9. metamuse_cli-0.1.0a1/PKG-INFO +258 -0
  10. metamuse_cli-0.1.0a1/README.md +230 -0
  11. metamuse_cli-0.1.0a1/THIRD_PARTY_NOTICES.md +247 -0
  12. metamuse_cli-0.1.0a1/docs/ALPHA_RELEASE.md +120 -0
  13. metamuse_cli-0.1.0a1/docs/CONNECTED_WORKFLOW.md +104 -0
  14. metamuse_cli-0.1.0a1/docs/GETTING_STARTED.md +65 -0
  15. metamuse_cli-0.1.0a1/docs/design/01_PLAN.md +80 -0
  16. metamuse_cli-0.1.0a1/docs/design/02_SPEC.md +1500 -0
  17. metamuse_cli-0.1.0a1/docs/design/03_SDS.md +1749 -0
  18. metamuse_cli-0.1.0a1/docs/design/04_BACKLOG.md +30 -0
  19. metamuse_cli-0.1.0a1/docs/design/05_ACCEPTANCE.md +78 -0
  20. metamuse_cli-0.1.0a1/docs/design/06_SOURCES.md +20 -0
  21. metamuse_cli-0.1.0a1/docs/design/AGENTS.md +15 -0
  22. metamuse_cli-0.1.0a1/docs/design/CODING_AGENT_KICKOFF.md +9 -0
  23. metamuse_cli-0.1.0a1/docs/design/DESIGN_VALIDATION_REPORT.json +19 -0
  24. metamuse_cli-0.1.0a1/docs/design/MANIFEST.json +131 -0
  25. metamuse_cli-0.1.0a1/docs/design/MetaMuse_CLI_Plan_Spec_SDS_v1.1.md +3366 -0
  26. metamuse_cli-0.1.0a1/docs/design/README.md +22 -0
  27. metamuse_cli-0.1.0a1/docs/design/appendices/FEATURE_INVENTORY.md +52 -0
  28. metamuse_cli-0.1.0a1/docs/design/contracts/README.md +77 -0
  29. metamuse_cli-0.1.0a1/docs/design/contracts/acceptance-cases.json +437 -0
  30. metamuse_cli-0.1.0a1/docs/design/contracts/backlog.json +180 -0
  31. metamuse_cli-0.1.0a1/docs/design/contracts/envelope.schema.json +377 -0
  32. metamuse_cli-0.1.0a1/docs/design/contracts/mcp-tools.json +8581 -0
  33. metamuse_cli-0.1.0a1/docs/design/contracts/requirements.json +197 -0
  34. metamuse_cli-0.1.0a1/docs/design/examples/captions.vtt +4 -0
  35. metamuse_cli-0.1.0a1/docs/design/examples/comments.jsonl +1 -0
  36. metamuse_cli-0.1.0a1/docs/design/examples/metamuse.example.toml +17 -0
  37. metamuse_cli-0.1.0a1/docs/design/examples/tool-call.json +24 -0
  38. metamuse_cli-0.1.0a1/docs/design/examples/tool-result.json +15 -0
  39. metamuse_cli-0.1.0a1/docs/design/skills/metamuse/SKILL.md +61 -0
  40. metamuse_cli-0.1.0a1/docs/design/validate_design_pack.py +99 -0
  41. metamuse_cli-0.1.0a1/docs/dev/B01_SOURCES_COMPAT.md +249 -0
  42. metamuse_cli-0.1.0a1/docs/dev/COLLECT.md +828 -0
  43. metamuse_cli-0.1.0a1/docs/dev/CONTENT_API.md +428 -0
  44. metamuse_cli-0.1.0a1/docs/dev/CORE_API.md +1187 -0
  45. metamuse_cli-0.1.0a1/docs/dev/FACEBOOK.md +828 -0
  46. metamuse_cli-0.1.0a1/docs/dev/MCP.md +117 -0
  47. metamuse_cli-0.1.0a1/docs/dev/MUSE.md +982 -0
  48. metamuse_cli-0.1.0a1/docs/dev/MUSE_SPIKE.md +369 -0
  49. metamuse_cli-0.1.0a1/docs/dev/OFFLINE_SLICE.md +163 -0
  50. metamuse_cli-0.1.0a1/docs/dev/PUBLISHING.md +153 -0
  51. metamuse_cli-0.1.0a1/docs/dev/SAFETY_API.md +860 -0
  52. metamuse_cli-0.1.0a1/docs/dev/SITE.md +157 -0
  53. metamuse_cli-0.1.0a1/docs/dev/SKILL.md +23 -0
  54. metamuse_cli-0.1.0a1/docs/dev/STATUS.md +38 -0
  55. metamuse_cli-0.1.0a1/pyproject.toml +67 -0
  56. metamuse_cli-0.1.0a1/scripts/capture_site.py +971 -0
  57. metamuse_cli-0.1.0a1/scripts/check_installed_journeys.sh +35 -0
  58. metamuse_cli-0.1.0a1/scripts/check_site.py +166 -0
  59. metamuse_cli-0.1.0a1/scripts/ci_cohorts.py +212 -0
  60. metamuse_cli-0.1.0a1/scripts/configure_demo_workspace.py +38 -0
  61. metamuse_cli-0.1.0a1/scripts/installed_journeys.py +327 -0
  62. metamuse_cli-0.1.0a1/scripts/mcp_demo.py +147 -0
  63. metamuse_cli-0.1.0a1/scripts/pytest_diagnostics.py +117 -0
  64. metamuse_cli-0.1.0a1/scripts/run_facebook_mutants.py +398 -0
  65. metamuse_cli-0.1.0a1/scripts/site_lib.py +421 -0
  66. metamuse_cli-0.1.0a1/scripts/smoke_wheel.sh +227 -0
  67. metamuse_cli-0.1.0a1/scripts/try_local.py +8 -0
  68. metamuse_cli-0.1.0a1/site/.nojekyll +0 -0
  69. metamuse_cli-0.1.0a1/site/404.html +20 -0
  70. metamuse_cli-0.1.0a1/site/README.md +37 -0
  71. metamuse_cli-0.1.0a1/site/app.js +95 -0
  72. metamuse_cli-0.1.0a1/site/favicon.svg +1 -0
  73. metamuse_cli-0.1.0a1/site/flow.css +495 -0
  74. metamuse_cli-0.1.0a1/site/flow.js +751 -0
  75. metamuse_cli-0.1.0a1/site/images/00-hero.png +0 -0
  76. metamuse_cli-0.1.0a1/site/images/00-hero.txt +9 -0
  77. metamuse_cli-0.1.0a1/site/images/01-setup.png +0 -0
  78. metamuse_cli-0.1.0a1/site/images/01-setup.txt +28 -0
  79. metamuse_cli-0.1.0a1/site/images/02-queue.png +0 -0
  80. metamuse_cli-0.1.0a1/site/images/02-queue.txt +30 -0
  81. metamuse_cli-0.1.0a1/site/images/03-search.png +0 -0
  82. metamuse_cli-0.1.0a1/site/images/03-search.txt +18 -0
  83. metamuse_cli-0.1.0a1/site/images/04-packet.png +0 -0
  84. metamuse_cli-0.1.0a1/site/images/04-packet.txt +22 -0
  85. metamuse_cli-0.1.0a1/site/images/05-approval-preview.png +0 -0
  86. metamuse_cli-0.1.0a1/site/images/05-approval-preview.txt +20 -0
  87. metamuse_cli-0.1.0a1/site/images/06-human-approval.png +0 -0
  88. metamuse_cli-0.1.0a1/site/images/06-human-approval.txt +29 -0
  89. metamuse_cli-0.1.0a1/site/images/07-fixture-discussion.png +0 -0
  90. metamuse_cli-0.1.0a1/site/images/07-fixture-discussion.txt +26 -0
  91. metamuse_cli-0.1.0a1/site/images/08-fixture-follow-up.png +0 -0
  92. metamuse_cli-0.1.0a1/site/images/08-fixture-follow-up.txt +25 -0
  93. metamuse_cli-0.1.0a1/site/images/09-host-draft.png +0 -0
  94. metamuse_cli-0.1.0a1/site/images/09-host-draft.txt +13 -0
  95. metamuse_cli-0.1.0a1/site/images/10-local-export.png +0 -0
  96. metamuse_cli-0.1.0a1/site/images/10-local-export.txt +21 -0
  97. metamuse_cli-0.1.0a1/site/images/11-mcp-worker.png +0 -0
  98. metamuse_cli-0.1.0a1/site/images/11-mcp-worker.txt +25 -0
  99. metamuse_cli-0.1.0a1/site/images/12-skill-export.png +0 -0
  100. metamuse_cli-0.1.0a1/site/images/12-skill-export.txt +19 -0
  101. metamuse_cli-0.1.0a1/site/images/README.md +232 -0
  102. metamuse_cli-0.1.0a1/site/images/manifest.json +619 -0
  103. metamuse_cli-0.1.0a1/site/index.html +59 -0
  104. metamuse_cli-0.1.0a1/site/lang.js +23 -0
  105. metamuse_cli-0.1.0a1/site/logo.svg +1 -0
  106. metamuse_cli-0.1.0a1/site/page.json +812 -0
  107. metamuse_cli-0.1.0a1/site/robots.txt +3 -0
  108. metamuse_cli-0.1.0a1/site/sitemap.xml +4 -0
  109. metamuse_cli-0.1.0a1/site/styles.css +1535 -0
  110. metamuse_cli-0.1.0a1/skills/metamuse/SKILL.md +61 -0
  111. metamuse_cli-0.1.0a1/skills/metamuse/references/degradation.md +73 -0
  112. metamuse_cli-0.1.0a1/skills/metamuse/references/limits.md +29 -0
  113. metamuse_cli-0.1.0a1/skills/metamuse/references/tools.md +155 -0
  114. metamuse_cli-0.1.0a1/spikes/muse/associate.py +576 -0
  115. metamuse_cli-0.1.0a1/spikes/muse/framing.py +541 -0
  116. metamuse_cli-0.1.0a1/spikes/muse/handshake.py +128 -0
  117. metamuse_cli-0.1.0a1/spikes/muse/loop.py +294 -0
  118. metamuse_cli-0.1.0a1/spikes/muse/test_spike.py +779 -0
  119. metamuse_cli-0.1.0a1/src/metamuse/__init__.py +3 -0
  120. metamuse_cli-0.1.0a1/src/metamuse/_browser_egress.py +759 -0
  121. metamuse_cli-0.1.0a1/src/metamuse/_facebook_capture.py +844 -0
  122. metamuse_cli-0.1.0a1/src/metamuse/_facebook_dom.py +135 -0
  123. metamuse_cli-0.1.0a1/src/metamuse/_muse_adapters.py +160 -0
  124. metamuse_cli-0.1.0a1/src/metamuse/_muse_associate.py +584 -0
  125. metamuse_cli-0.1.0a1/src/metamuse/_muse_codec.py +615 -0
  126. metamuse_cli-0.1.0a1/src/metamuse/_muse_components.py +74 -0
  127. metamuse_cli-0.1.0a1/src/metamuse/_muse_fixture.py +183 -0
  128. metamuse_cli-0.1.0a1/src/metamuse/_muse_handshake_payloads.py +106 -0
  129. metamuse_cli-0.1.0a1/src/metamuse/_muse_http.py +658 -0
  130. metamuse_cli-0.1.0a1/src/metamuse/_muse_lifecycle.py +1951 -0
  131. metamuse_cli-0.1.0a1/src/metamuse/_muse_link.py +392 -0
  132. metamuse_cli-0.1.0a1/src/metamuse/_muse_noise.py +249 -0
  133. metamuse_cli-0.1.0a1/src/metamuse/_muse_redact.py +387 -0
  134. metamuse_cli-0.1.0a1/src/metamuse/_muse_research.py +535 -0
  135. metamuse_cli-0.1.0a1/src/metamuse/_muse_trust.py +68 -0
  136. metamuse_cli-0.1.0a1/src/metamuse/app.py +471 -0
  137. metamuse_cli-0.1.0a1/src/metamuse/cli.py +845 -0
  138. metamuse_cli-0.1.0a1/src/metamuse/collect.py +2403 -0
  139. metamuse_cli-0.1.0a1/src/metamuse/config.py +188 -0
  140. metamuse_cli-0.1.0a1/src/metamuse/connect.py +148 -0
  141. metamuse_cli-0.1.0a1/src/metamuse/content.py +1060 -0
  142. metamuse_cli-0.1.0a1/src/metamuse/data/examples/event-comments.jsonl +3 -0
  143. metamuse_cli-0.1.0a1/src/metamuse/data/migrations/001_initial.sql +261 -0
  144. metamuse_cli-0.1.0a1/src/metamuse/data/migrations/002_collect_media.sql +105 -0
  145. metamuse_cli-0.1.0a1/src/metamuse/data/migrations/003_muse_lifecycle.sql +160 -0
  146. metamuse_cli-0.1.0a1/src/metamuse/data/migrations/004_muse_evidence.sql +26 -0
  147. metamuse_cli-0.1.0a1/src/metamuse/data/migrations/005_muse_trust.sql +533 -0
  148. metamuse_cli-0.1.0a1/src/metamuse/data/migrations/006_transcript_removal.sql +4 -0
  149. metamuse_cli-0.1.0a1/src/metamuse/data/migrations/007_publication.sql +95 -0
  150. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Asset.json +61 -0
  151. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/AuthImportRequest.json +43 -0
  152. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Capability.json +61 -0
  153. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Discussion.json +385 -0
  154. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Draft.json +35 -0
  155. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/DraftRevision.json +154 -0
  156. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Event.json +72 -0
  157. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/EvidenceRef.json +52 -0
  158. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Exchange.json +487 -0
  159. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Export.json +112 -0
  160. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Item.json +88 -0
  161. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/ItemAsset.json +35 -0
  162. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/ItemRevision.json +100 -0
  163. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Job.json +184 -0
  164. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/JobResult.json +60 -0
  165. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/JobStep.json +126 -0
  166. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Message.json +128 -0
  167. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/MuseObservation.json +69 -0
  168. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Packet.json +127 -0
  169. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Permit.json +104 -0
  170. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/PermitCreateRequest.json +100 -0
  171. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Project.json +34 -0
  172. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Publication.json +121 -0
  173. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/PublicationAttempt.json +54 -0
  174. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/Source.json +102 -0
  175. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/SourceAsset.json +37 -0
  176. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/TranscriptSegment.json +127 -0
  177. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/envelope.json +377 -0
  178. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/mcp-tools.json +8581 -0
  179. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_collect.input.json +296 -0
  180. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_draft_preview.input.json +23 -0
  181. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_draft_save.input.json +185 -0
  182. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_export.input.json +98 -0
  183. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_inspect.input.json +7 -0
  184. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_job_control.input.json +33 -0
  185. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_job_get.input.json +17 -0
  186. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_job_list.input.json +36 -0
  187. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_muse_close_exchange.input.json +34 -0
  188. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_muse_open.input.json +60 -0
  189. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_muse_read.input.json +48 -0
  190. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_muse_send.input.json +53 -0
  191. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_packet_prepare.input.json +86 -0
  192. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_project_create.input.json +23 -0
  193. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_publication_get.input.json +17 -0
  194. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_publication_preview.input.json +52 -0
  195. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_publication_reconcile.input.json +38 -0
  196. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_publication_submit.input.json +73 -0
  197. metamuse_cli-0.1.0a1/src/metamuse/data/schemas/metamuse_search.input.json +43 -0
  198. metamuse_cli-0.1.0a1/src/metamuse/demo.py +180 -0
  199. metamuse_cli-0.1.0a1/src/metamuse/facebook.py +4663 -0
  200. metamuse_cli-0.1.0a1/src/metamuse/jobs.py +1056 -0
  201. metamuse_cli-0.1.0a1/src/metamuse/mcp.py +377 -0
  202. metamuse_cli-0.1.0a1/src/metamuse/media.py +709 -0
  203. metamuse_cli-0.1.0a1/src/metamuse/models.py +1028 -0
  204. metamuse_cli-0.1.0a1/src/metamuse/muse.py +2234 -0
  205. metamuse_cli-0.1.0a1/src/metamuse/paths.py +83 -0
  206. metamuse_cli-0.1.0a1/src/metamuse/publishing.py +927 -0
  207. metamuse_cli-0.1.0a1/src/metamuse/remote_media.py +3871 -0
  208. metamuse_cli-0.1.0a1/src/metamuse/safe_log.py +122 -0
  209. metamuse_cli-0.1.0a1/src/metamuse/safety.py +5166 -0
  210. metamuse_cli-0.1.0a1/src/metamuse/schemas.py +82 -0
  211. metamuse_cli-0.1.0a1/src/metamuse/skill_export.py +139 -0
  212. metamuse_cli-0.1.0a1/src/metamuse/store.py +2459 -0
  213. metamuse_cli-0.1.0a1/tests/b16a_folded_context.py +49 -0
  214. metamuse_cli-0.1.0a1/tests/b16a_folded_headers.py +104 -0
  215. metamuse_cli-0.1.0a1/tests/b16a_folded_measure.py +99 -0
  216. metamuse_cli-0.1.0a1/tests/b16a_r3_complexity.py +129 -0
  217. metamuse_cli-0.1.0a1/tests/b16a_r3_corpus.py +1588 -0
  218. metamuse_cli-0.1.0a1/tests/b16a_r3_mutations.py +832 -0
  219. metamuse_cli-0.1.0a1/tests/b16a_r4_complexity.py +176 -0
  220. metamuse_cli-0.1.0a1/tests/b16a_r4_corpus.py +166 -0
  221. metamuse_cli-0.1.0a1/tests/b16a_r4_evidence.py +196 -0
  222. metamuse_cli-0.1.0a1/tests/b16a_r4_mutations.py +500 -0
  223. metamuse_cli-0.1.0a1/tests/b16a_r5_complexity.py +81 -0
  224. metamuse_cli-0.1.0a1/tests/b16a_r5_corpus.py +367 -0
  225. metamuse_cli-0.1.0a1/tests/b16a_r5_memory.py +68 -0
  226. metamuse_cli-0.1.0a1/tests/b16a_r5_mutations.py +303 -0
  227. metamuse_cli-0.1.0a1/tests/b16a_r6_complexity.py +61 -0
  228. metamuse_cli-0.1.0a1/tests/b16a_r6_context.py +275 -0
  229. metamuse_cli-0.1.0a1/tests/b16a_r6_counterexamples.py +59 -0
  230. metamuse_cli-0.1.0a1/tests/b16a_r6_measure.py +53 -0
  231. metamuse_cli-0.1.0a1/tests/b16a_r6_memory.py +68 -0
  232. metamuse_cli-0.1.0a1/tests/b16a_r6_mutation_run.py +174 -0
  233. metamuse_cli-0.1.0a1/tests/b16a_r6_mutations.py +767 -0
  234. metamuse_cli-0.1.0a1/tests/b16a_r6_neighbours.py +306 -0
  235. metamuse_cli-0.1.0a1/tests/b16a_r7_budget.py +80 -0
  236. metamuse_cli-0.1.0a1/tests/b16a_r7_class.py +141 -0
  237. metamuse_cli-0.1.0a1/tests/b16a_r7_complexity.py +54 -0
  238. metamuse_cli-0.1.0a1/tests/b16a_r7_context.py +191 -0
  239. metamuse_cli-0.1.0a1/tests/b16a_r7_measure.py +53 -0
  240. metamuse_cli-0.1.0a1/tests/b16a_r7_memory.py +69 -0
  241. metamuse_cli-0.1.0a1/tests/b16a_r7_mutations.py +838 -0
  242. metamuse_cli-0.1.0a1/tests/b16a_r7_orchestrator.py +81 -0
  243. metamuse_cli-0.1.0a1/tests/b16a_r7_probes.py +266 -0
  244. metamuse_cli-0.1.0a1/tests/b16a_r7_rates.py +130 -0
  245. metamuse_cli-0.1.0a1/tests/b16a_r8_cases.py +92 -0
  246. metamuse_cli-0.1.0a1/tests/b16a_r8_complexity.py +44 -0
  247. metamuse_cli-0.1.0a1/tests/b16a_r8_context.py +34 -0
  248. metamuse_cli-0.1.0a1/tests/b16a_r8_faults.py +131 -0
  249. metamuse_cli-0.1.0a1/tests/b16a_r8_measure.py +87 -0
  250. metamuse_cli-0.1.0a1/tests/browser_deadline.py +61 -0
  251. metamuse_cli-0.1.0a1/tests/conftest.py +94 -0
  252. metamuse_cli-0.1.0a1/tests/core3_fixtures.py +115 -0
  253. metamuse_cli-0.1.0a1/tests/cpu_growth.py +56 -0
  254. metamuse_cli-0.1.0a1/tests/facebook_dom_rule.py +154 -0
  255. metamuse_cli-0.1.0a1/tests/facebook_mutants.py +185 -0
  256. metamuse_cli-0.1.0a1/tests/facebook_parity.py +278 -0
  257. metamuse_cli-0.1.0a1/tests/facebook_reviewer8_mutants.py +240 -0
  258. metamuse_cli-0.1.0a1/tests/facebook_reviewer9_mutants.py +186 -0
  259. metamuse_cli-0.1.0a1/tests/facebook_round10_mutants.py +133 -0
  260. metamuse_cli-0.1.0a1/tests/facebook_round11_mutants.py +44 -0
  261. metamuse_cli-0.1.0a1/tests/facebook_round7_mutants.py +129 -0
  262. metamuse_cli-0.1.0a1/tests/facebook_round8_mutants.py +273 -0
  263. metamuse_cli-0.1.0a1/tests/facebook_round9_mutants.py +295 -0
  264. metamuse_cli-0.1.0a1/tests/fixtures/collect/captions.vtt +4 -0
  265. metamuse_cli-0.1.0a1/tests/fixtures/collect/comments.jsonl +1 -0
  266. metamuse_cli-0.1.0a1/tests/fixtures/corpus/README.md +134 -0
  267. metamuse_cli-0.1.0a1/tests/fixtures/corpus/check_corpus.py +426 -0
  268. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/comments_mixed_bad.jsonl +14 -0
  269. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/comments_tree.jsonl +19 -0
  270. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/media_only.jsonl +4 -0
  271. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/notes.txt +16 -0
  272. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/posts.csv +22 -0
  273. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/posts.json +77 -0
  274. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/posts_bom.csv +22 -0
  275. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/posts_zh.jsonl +10 -0
  276. metamuse_cli-0.1.0a1/tests/fixtures/corpus/import/project_b_comments.jsonl +5 -0
  277. metamuse_cli-0.1.0a1/tests/fixtures/corpus/make_media.py +367 -0
  278. metamuse_cli-0.1.0a1/tests/fixtures/corpus/manifest.json +735 -0
  279. metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/html_as.mp4 +1 -0
  280. metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/same_bytes_a.mp4 +0 -0
  281. metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/same_bytes_b.mp4 +0 -0
  282. metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/tiny.mp4 +0 -0
  283. metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/tiny.png +0 -0
  284. metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/tiny.wav +0 -0
  285. metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/truncated.mp4 +0 -0
  286. metamuse_cli-0.1.0a1/tests/fixtures/corpus/media/zero_bytes.mp4 +0 -0
  287. metamuse_cli-0.1.0a1/tests/fixtures/corpus/search/search_corpus.jsonl +260 -0
  288. metamuse_cli-0.1.0a1/tests/fixtures/corpus/security/paths.jsonl +18 -0
  289. metamuse_cli-0.1.0a1/tests/fixtures/corpus/security/prompt_injection.jsonl +8 -0
  290. metamuse_cli-0.1.0a1/tests/fixtures/corpus/security/secrets.jsonl +8 -0
  291. metamuse_cli-0.1.0a1/tests/fixtures/corpus/security/urls.jsonl +37 -0
  292. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/bom_crlf.srt +7 -0
  293. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/end_before_start.srt +3 -0
  294. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/header_only.vtt +1 -0
  295. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/html_disguised.vtt +11 -0
  296. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/malformed_timestamp.vtt +4 -0
  297. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/negative_time.vtt +4 -0
  298. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/overlap.vtt +7 -0
  299. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/valid.srt +12 -0
  300. metamuse_cli-0.1.0a1/tests/fixtures/corpus/subtitles/valid_zh.vtt +11 -0
  301. metamuse_cli-0.1.0a1/tests/fixtures/facebook/parity/reviewer.json +1614 -0
  302. metamuse_cli-0.1.0a1/tests/fixtures/facebook/parity/round10-nesting.json +22 -0
  303. metamuse_cli-0.1.0a1/tests/fixtures/facebook/parity/vocabulary.json +4642 -0
  304. metamuse_cli-0.1.0a1/tests/test_account_approvals.py +66 -0
  305. metamuse_cli-0.1.0a1/tests/test_approval_cli.py +161 -0
  306. metamuse_cli-0.1.0a1/tests/test_approval_review.py +383 -0
  307. metamuse_cli-0.1.0a1/tests/test_approval_terminal.py +125 -0
  308. metamuse_cli-0.1.0a1/tests/test_at042_evidence.py +281 -0
  309. metamuse_cli-0.1.0a1/tests/test_at042_review_fixes.py +580 -0
  310. metamuse_cli-0.1.0a1/tests/test_at042_slice.py +589 -0
  311. metamuse_cli-0.1.0a1/tests/test_b16a_backslash_scan.py +95 -0
  312. metamuse_cli-0.1.0a1/tests/test_b16a_folded_headers.py +67 -0
  313. metamuse_cli-0.1.0a1/tests/test_b16a_har_form_budget.py +107 -0
  314. metamuse_cli-0.1.0a1/tests/test_b16a_innermost_quotes.py +150 -0
  315. metamuse_cli-0.1.0a1/tests/test_b16a_integration_952.py +88 -0
  316. metamuse_cli-0.1.0a1/tests/test_b16a_key_cache.py +87 -0
  317. metamuse_cli-0.1.0a1/tests/test_b16a_nested_proofs.py +96 -0
  318. metamuse_cli-0.1.0a1/tests/test_b16a_preview_refusal.py +62 -0
  319. metamuse_cli-0.1.0a1/tests/test_b16a_privacy.py +435 -0
  320. metamuse_cli-0.1.0a1/tests/test_b16a_quoted_boundaries.py +96 -0
  321. metamuse_cli-0.1.0a1/tests/test_b16a_quoted_options.py +81 -0
  322. metamuse_cli-0.1.0a1/tests/test_b16a_reconcile_replay.py +46 -0
  323. metamuse_cli-0.1.0a1/tests/test_b16a_round2.py +587 -0
  324. metamuse_cli-0.1.0a1/tests/test_b16a_round3.py +659 -0
  325. metamuse_cli-0.1.0a1/tests/test_b16a_round3_complexity.py +10 -0
  326. metamuse_cli-0.1.0a1/tests/test_b16a_round3_runtime.py +510 -0
  327. metamuse_cli-0.1.0a1/tests/test_b16a_round4.py +277 -0
  328. metamuse_cli-0.1.0a1/tests/test_b16a_round4_auth.py +48 -0
  329. metamuse_cli-0.1.0a1/tests/test_b16a_round4_complexity.py +30 -0
  330. metamuse_cli-0.1.0a1/tests/test_b16a_round4_cookie.py +73 -0
  331. metamuse_cli-0.1.0a1/tests/test_b16a_round4_corpus.py +14 -0
  332. metamuse_cli-0.1.0a1/tests/test_b16a_round4_extents.py +70 -0
  333. metamuse_cli-0.1.0a1/tests/test_b16a_round4_form.py +68 -0
  334. metamuse_cli-0.1.0a1/tests/test_b16a_round4_guidance.py +34 -0
  335. metamuse_cli-0.1.0a1/tests/test_b16a_round4_keys.py +40 -0
  336. metamuse_cli-0.1.0a1/tests/test_b16a_round4_placeholders.py +34 -0
  337. metamuse_cli-0.1.0a1/tests/test_b16a_round4_reconcile.py +148 -0
  338. metamuse_cli-0.1.0a1/tests/test_b16a_round4_runtime.py +85 -0
  339. metamuse_cli-0.1.0a1/tests/test_b16a_round4_syntax.py +112 -0
  340. metamuse_cli-0.1.0a1/tests/test_b16a_round5_blocks.py +50 -0
  341. metamuse_cli-0.1.0a1/tests/test_b16a_round5_complexity.py +20 -0
  342. metamuse_cli-0.1.0a1/tests/test_b16a_round5_corpus.py +31 -0
  343. metamuse_cli-0.1.0a1/tests/test_b16a_round5_exempt.py +39 -0
  344. metamuse_cli-0.1.0a1/tests/test_b16a_round5_har.py +97 -0
  345. metamuse_cli-0.1.0a1/tests/test_b16a_round5_memory.py +28 -0
  346. metamuse_cli-0.1.0a1/tests/test_b16a_round5_quotes.py +63 -0
  347. metamuse_cli-0.1.0a1/tests/test_b16a_round5_reconcile.py +132 -0
  348. metamuse_cli-0.1.0a1/tests/test_b16a_round5_runtime.py +102 -0
  349. metamuse_cli-0.1.0a1/tests/test_b16a_round5_urls.py +76 -0
  350. metamuse_cli-0.1.0a1/tests/test_b16a_round6_complexity.py +35 -0
  351. metamuse_cli-0.1.0a1/tests/test_b16a_round6_context.py +68 -0
  352. metamuse_cli-0.1.0a1/tests/test_b16a_round6_runtime.py +111 -0
  353. metamuse_cli-0.1.0a1/tests/test_b16a_round6_structure.py +407 -0
  354. metamuse_cli-0.1.0a1/tests/test_b16a_round7_class.py +13 -0
  355. metamuse_cli-0.1.0a1/tests/test_b16a_round7_complexity.py +36 -0
  356. metamuse_cli-0.1.0a1/tests/test_b16a_round7_context.py +41 -0
  357. metamuse_cli-0.1.0a1/tests/test_b16a_round7_d10_policy.py +112 -0
  358. metamuse_cli-0.1.0a1/tests/test_b16a_round7_lock.py +124 -0
  359. metamuse_cli-0.1.0a1/tests/test_b16a_round7_orchestrator.py +20 -0
  360. metamuse_cli-0.1.0a1/tests/test_b16a_round7_structure.py +434 -0
  361. metamuse_cli-0.1.0a1/tests/test_b16a_round8_boundaries.py +118 -0
  362. metamuse_cli-0.1.0a1/tests/test_b16a_round8_complexity.py +51 -0
  363. metamuse_cli-0.1.0a1/tests/test_b16a_round8_context.py +27 -0
  364. metamuse_cli-0.1.0a1/tests/test_b16a_span_api.py +422 -0
  365. metamuse_cli-0.1.0a1/tests/test_b16a_structured_mapping.py +249 -0
  366. metamuse_cli-0.1.0a1/tests/test_browser_ci.py +32 -0
  367. metamuse_cli-0.1.0a1/tests/test_ci_b16a_cohort_balance.py +115 -0
  368. metamuse_cli-0.1.0a1/tests/test_ci_cohorts.py +256 -0
  369. metamuse_cli-0.1.0a1/tests/test_ci_privacy_load.py +75 -0
  370. metamuse_cli-0.1.0a1/tests/test_cli.py +159 -0
  371. metamuse_cli-0.1.0a1/tests/test_collect.py +872 -0
  372. metamuse_cli-0.1.0a1/tests/test_collect_corpus.py +444 -0
  373. metamuse_cli-0.1.0a1/tests/test_collect_review.py +769 -0
  374. metamuse_cli-0.1.0a1/tests/test_connect.py +196 -0
  375. metamuse_cli-0.1.0a1/tests/test_connected_workflow.py +216 -0
  376. metamuse_cli-0.1.0a1/tests/test_content.py +964 -0
  377. metamuse_cli-0.1.0a1/tests/test_content_review.py +616 -0
  378. metamuse_cli-0.1.0a1/tests/test_contracts.py +170 -0
  379. metamuse_cli-0.1.0a1/tests/test_core3_review.py +325 -0
  380. metamuse_cli-0.1.0a1/tests/test_core_guards_review.py +298 -0
  381. metamuse_cli-0.1.0a1/tests/test_core_migrations_review.py +129 -0
  382. metamuse_cli-0.1.0a1/tests/test_entrypoint_deadlines.py +137 -0
  383. metamuse_cli-0.1.0a1/tests/test_export_verifier.py +83 -0
  384. metamuse_cli-0.1.0a1/tests/test_facebook.py +2401 -0
  385. metamuse_cli-0.1.0a1/tests/test_facebook_approval.py +237 -0
  386. metamuse_cli-0.1.0a1/tests/test_facebook_byte_stop.py +175 -0
  387. metamuse_cli-0.1.0a1/tests/test_facebook_cutoff_observation.py +79 -0
  388. metamuse_cli-0.1.0a1/tests/test_facebook_cutoff_precedence.py +257 -0
  389. metamuse_cli-0.1.0a1/tests/test_facebook_guard_failures.py +161 -0
  390. metamuse_cli-0.1.0a1/tests/test_facebook_popups.py +134 -0
  391. metamuse_cli-0.1.0a1/tests/test_facebook_r10_click.py +36 -0
  392. metamuse_cli-0.1.0a1/tests/test_facebook_r10_composed.py +128 -0
  393. metamuse_cli-0.1.0a1/tests/test_facebook_r10_expansion.py +166 -0
  394. metamuse_cli-0.1.0a1/tests/test_facebook_r10_extractor.py +135 -0
  395. metamuse_cli-0.1.0a1/tests/test_facebook_r10_fixture.py +146 -0
  396. metamuse_cli-0.1.0a1/tests/test_facebook_r10_measure.py +39 -0
  397. metamuse_cli-0.1.0a1/tests/test_facebook_r10_survivors.py +47 -0
  398. metamuse_cli-0.1.0a1/tests/test_facebook_r11_budget.py +97 -0
  399. metamuse_cli-0.1.0a1/tests/test_facebook_r11_closure.py +164 -0
  400. metamuse_cli-0.1.0a1/tests/test_facebook_r11_display.py +39 -0
  401. metamuse_cli-0.1.0a1/tests/test_facebook_r8_capture.py +569 -0
  402. metamuse_cli-0.1.0a1/tests/test_facebook_r8_cutoff.py +425 -0
  403. metamuse_cli-0.1.0a1/tests/test_facebook_r8_workers.py +104 -0
  404. metamuse_cli-0.1.0a1/tests/test_facebook_r9_capture.py +477 -0
  405. metamuse_cli-0.1.0a1/tests/test_facebook_r9_parity.py +117 -0
  406. metamuse_cli-0.1.0a1/tests/test_facebook_r9_survivors.py +99 -0
  407. metamuse_cli-0.1.0a1/tests/test_facebook_review.py +1035 -0
  408. metamuse_cli-0.1.0a1/tests/test_facebook_round5.py +705 -0
  409. metamuse_cli-0.1.0a1/tests/test_facebook_round6.py +128 -0
  410. metamuse_cli-0.1.0a1/tests/test_facebook_share.py +160 -0
  411. metamuse_cli-0.1.0a1/tests/test_facebook_snapshot_case.py +57 -0
  412. metamuse_cli-0.1.0a1/tests/test_facebook_target_shutdown.py +92 -0
  413. metamuse_cli-0.1.0a1/tests/test_facebook_transport_stop.py +52 -0
  414. metamuse_cli-0.1.0a1/tests/test_facebook_visibility.py +152 -0
  415. metamuse_cli-0.1.0a1/tests/test_facebook_xhr.py +84 -0
  416. metamuse_cli-0.1.0a1/tests/test_feature_seam.py +912 -0
  417. metamuse_cli-0.1.0a1/tests/test_getting_started.py +86 -0
  418. metamuse_cli-0.1.0a1/tests/test_installed_journeys.py +262 -0
  419. metamuse_cli-0.1.0a1/tests/test_jobs.py +460 -0
  420. metamuse_cli-0.1.0a1/tests/test_journey.py +569 -0
  421. metamuse_cli-0.1.0a1/tests/test_journey_startup.py +215 -0
  422. metamuse_cli-0.1.0a1/tests/test_mcp.py +702 -0
  423. metamuse_cli-0.1.0a1/tests/test_mcp_worker.py +333 -0
  424. metamuse_cli-0.1.0a1/tests/test_media.py +760 -0
  425. metamuse_cli-0.1.0a1/tests/test_muse_associate.py +518 -0
  426. metamuse_cli-0.1.0a1/tests/test_muse_findings.py +862 -0
  427. metamuse_cli-0.1.0a1/tests/test_muse_folded_context.py +299 -0
  428. metamuse_cli-0.1.0a1/tests/test_muse_lifecycle.py +955 -0
  429. metamuse_cli-0.1.0a1/tests/test_muse_research.py +744 -0
  430. metamuse_cli-0.1.0a1/tests/test_muse_research_integration.py +83 -0
  431. metamuse_cli-0.1.0a1/tests/test_muse_research_replay.py +240 -0
  432. metamuse_cli-0.1.0a1/tests/test_muse_research_write_lock.py +188 -0
  433. metamuse_cli-0.1.0a1/tests/test_muse_review3.py +345 -0
  434. metamuse_cli-0.1.0a1/tests/test_muse_round10_handoff.py +292 -0
  435. metamuse_cli-0.1.0a1/tests/test_muse_round11_retry.py +78 -0
  436. metamuse_cli-0.1.0a1/tests/test_muse_round12_curl_ownership.py +835 -0
  437. metamuse_cli-0.1.0a1/tests/test_muse_round3_deadlines.py +51 -0
  438. metamuse_cli-0.1.0a1/tests/test_muse_round3_hints.py +43 -0
  439. metamuse_cli-0.1.0a1/tests/test_muse_round3_redact.py +63 -0
  440. metamuse_cli-0.1.0a1/tests/test_muse_round3_sizes.py +109 -0
  441. metamuse_cli-0.1.0a1/tests/test_muse_round3_status.py +57 -0
  442. metamuse_cli-0.1.0a1/tests/test_muse_round3_trust.py +488 -0
  443. metamuse_cli-0.1.0a1/tests/test_muse_round4_barrier.py +52 -0
  444. metamuse_cli-0.1.0a1/tests/test_muse_round4_bind.py +119 -0
  445. metamuse_cli-0.1.0a1/tests/test_muse_round4_checks.py +70 -0
  446. metamuse_cli-0.1.0a1/tests/test_muse_round4_deadlines.py +39 -0
  447. metamuse_cli-0.1.0a1/tests/test_muse_round4_hints.py +177 -0
  448. metamuse_cli-0.1.0a1/tests/test_muse_round4_listeners.py +50 -0
  449. metamuse_cli-0.1.0a1/tests/test_muse_round4_provenance.py +36 -0
  450. metamuse_cli-0.1.0a1/tests/test_muse_round4_redact.py +108 -0
  451. metamuse_cli-0.1.0a1/tests/test_muse_round4_sources.py +22 -0
  452. metamuse_cli-0.1.0a1/tests/test_muse_round4_sql.py +157 -0
  453. metamuse_cli-0.1.0a1/tests/test_muse_round4_status.py +68 -0
  454. metamuse_cli-0.1.0a1/tests/test_muse_round4_storage.py +207 -0
  455. metamuse_cli-0.1.0a1/tests/test_muse_round5_cost.py +83 -0
  456. metamuse_cli-0.1.0a1/tests/test_muse_round5_growth.py +32 -0
  457. metamuse_cli-0.1.0a1/tests/test_muse_round5_hints.py +108 -0
  458. metamuse_cli-0.1.0a1/tests/test_muse_round5_identity.py +96 -0
  459. metamuse_cli-0.1.0a1/tests/test_muse_round5_keys.py +60 -0
  460. metamuse_cli-0.1.0a1/tests/test_muse_round5_markers.py +43 -0
  461. metamuse_cli-0.1.0a1/tests/test_muse_round5_page.py +36 -0
  462. metamuse_cli-0.1.0a1/tests/test_muse_round5_redact.py +87 -0
  463. metamuse_cli-0.1.0a1/tests/test_muse_round5_storage.py +160 -0
  464. metamuse_cli-0.1.0a1/tests/test_muse_round5_strength.py +56 -0
  465. metamuse_cli-0.1.0a1/tests/test_muse_round6_cost.py +92 -0
  466. metamuse_cli-0.1.0a1/tests/test_muse_round6_growth.py +53 -0
  467. metamuse_cli-0.1.0a1/tests/test_muse_round6_oracle.py +101 -0
  468. metamuse_cli-0.1.0a1/tests/test_muse_round6_redact.py +193 -0
  469. metamuse_cli-0.1.0a1/tests/test_muse_round6_session.py +276 -0
  470. metamuse_cli-0.1.0a1/tests/test_muse_round6_storage.py +240 -0
  471. metamuse_cli-0.1.0a1/tests/test_muse_round7_notary.py +158 -0
  472. metamuse_cli-0.1.0a1/tests/test_muse_round7_scans.py +38 -0
  473. metamuse_cli-0.1.0a1/tests/test_muse_round8_notifications.py +186 -0
  474. metamuse_cli-0.1.0a1/tests/test_muse_round8b_listeners.py +176 -0
  475. metamuse_cli-0.1.0a1/tests/test_muse_round8c_registration.py +208 -0
  476. metamuse_cli-0.1.0a1/tests/test_muse_round8d_core_busy.py +376 -0
  477. metamuse_cli-0.1.0a1/tests/test_muse_round9_pending.py +497 -0
  478. metamuse_cli-0.1.0a1/tests/test_muse_schema.py +440 -0
  479. metamuse_cli-0.1.0a1/tests/test_muse_standard.py +1260 -0
  480. metamuse_cli-0.1.0a1/tests/test_muse_transport.py +1154 -0
  481. metamuse_cli-0.1.0a1/tests/test_muse_trust.py +459 -0
  482. metamuse_cli-0.1.0a1/tests/test_publishing.py +913 -0
  483. metamuse_cli-0.1.0a1/tests/test_pytest_diagnostics.py +423 -0
  484. metamuse_cli-0.1.0a1/tests/test_r2_core_review.py +335 -0
  485. metamuse_cli-0.1.0a1/tests/test_readme_walkthrough.py +92 -0
  486. metamuse_cli-0.1.0a1/tests/test_redaction.py +116 -0
  487. metamuse_cli-0.1.0a1/tests/test_remote_approval.py +505 -0
  488. metamuse_cli-0.1.0a1/tests/test_remote_media.py +3890 -0
  489. metamuse_cli-0.1.0a1/tests/test_remote_normalize.py +52 -0
  490. metamuse_cli-0.1.0a1/tests/test_remote_r10_derived.py +48 -0
  491. metamuse_cli-0.1.0a1/tests/test_remote_r10_login.py +108 -0
  492. metamuse_cli-0.1.0a1/tests/test_remote_r10_metadata.py +179 -0
  493. metamuse_cli-0.1.0a1/tests/test_remote_r10_removal.py +226 -0
  494. metamuse_cli-0.1.0a1/tests/test_remote_r10_scan.py +65 -0
  495. metamuse_cli-0.1.0a1/tests/test_remote_r8.py +230 -0
  496. metamuse_cli-0.1.0a1/tests/test_remote_r8_unit.py +364 -0
  497. metamuse_cli-0.1.0a1/tests/test_remote_r9.py +72 -0
  498. metamuse_cli-0.1.0a1/tests/test_remote_r9_caps.py +42 -0
  499. metamuse_cli-0.1.0a1/tests/test_remote_r9_docs.py +29 -0
  500. metamuse_cli-0.1.0a1/tests/test_remote_r9_hosts.py +30 -0
  501. metamuse_cli-0.1.0a1/tests/test_remote_r9_html.py +28 -0
  502. metamuse_cli-0.1.0a1/tests/test_remote_r9_scan.py +82 -0
  503. metamuse_cli-0.1.0a1/tests/test_remote_r9_transport.py +130 -0
  504. metamuse_cli-0.1.0a1/tests/test_remote_r9_wire.py +187 -0
  505. metamuse_cli-0.1.0a1/tests/test_remote_review.py +532 -0
  506. metamuse_cli-0.1.0a1/tests/test_remote_review_unit.py +156 -0
  507. metamuse_cli-0.1.0a1/tests/test_restore_versions.py +176 -0
  508. metamuse_cli-0.1.0a1/tests/test_review.py +832 -0
  509. metamuse_cli-0.1.0a1/tests/test_safe_exception_log.py +247 -0
  510. metamuse_cli-0.1.0a1/tests/test_safety_paths.py +110 -0
  511. metamuse_cli-0.1.0a1/tests/test_safety_permits.py +1026 -0
  512. metamuse_cli-0.1.0a1/tests/test_safety_secrets.py +419 -0
  513. metamuse_cli-0.1.0a1/tests/test_safety_url.py +267 -0
  514. metamuse_cli-0.1.0a1/tests/test_schema2_core.py +197 -0
  515. metamuse_cli-0.1.0a1/tests/test_site_capture.py +559 -0
  516. metamuse_cli-0.1.0a1/tests/test_site_check.py +357 -0
  517. metamuse_cli-0.1.0a1/tests/test_skill.py +496 -0
  518. metamuse_cli-0.1.0a1/tests/test_skill_export.py +125 -0
  519. metamuse_cli-0.1.0a1/tests/test_sql_policy.py +82 -0
  520. metamuse_cli-0.1.0a1/tests/test_storage_busy.py +424 -0
  521. metamuse_cli-0.1.0a1/tests/test_storage_busy_availability.py +64 -0
  522. metamuse_cli-0.1.0a1/tests/test_storage_busy_boundaries.py +131 -0
  523. metamuse_cli-0.1.0a1/tests/test_storage_busy_diagnostics.py +104 -0
  524. metamuse_cli-0.1.0a1/tests/test_storage_busy_idle.py +58 -0
  525. metamuse_cli-0.1.0a1/tests/test_storage_busy_mcp.py +230 -0
  526. metamuse_cli-0.1.0a1/tests/test_storage_busy_migration.py +53 -0
  527. metamuse_cli-0.1.0a1/tests/test_storage_busy_readers.py +80 -0
  528. metamuse_cli-0.1.0a1/tests/test_storage_busy_reproduction.py +209 -0
  529. metamuse_cli-0.1.0a1/tests/test_storage_busy_stops.py +169 -0
  530. metamuse_cli-0.1.0a1/tests/test_store.py +1177 -0
  531. metamuse_cli-0.1.0a1/tests/test_store_exports.py +159 -0
  532. metamuse_cli-0.1.0a1/tests/test_store_repeated_sidecars.py +66 -0
  533. metamuse_cli-0.1.0a1/tests/test_store_sidecar_race.py +28 -0
  534. metamuse_cli-0.1.0a1/tests/test_store_submission_contention.py +59 -0
  535. metamuse_cli-0.1.0a1/tests/test_store_unlinked_sidecars.py +132 -0
  536. metamuse_cli-0.1.0a1/tests/test_transcript_removal.py +148 -0
  537. metamuse_cli-0.1.0a1/tests/test_workspace_keys.py +120 -0
  538. metamuse_cli-0.1.0a1/tools/measure_content_search.py +110 -0
  539. metamuse_cli-0.1.0a1/uv.lock +1009 -0
@@ -0,0 +1,2 @@
1
+ tests/fixtures/corpus/import/posts.csv whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
2
+ tests/fixtures/corpus/import/posts_bom.csv whitespace=blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
@@ -0,0 +1,245 @@
1
+ name: ci
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ env:
13
+ METAMUSE_REQUIRE_BROWSER_TESTS: "1"
14
+ UV_MANAGED_PYTHON: "true"
15
+
16
+ concurrency:
17
+ group: ci-${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.ref || github.run_id }}
18
+ cancel-in-progress: true
19
+
20
+ jobs:
21
+ static-wheel:
22
+ timeout-minutes: 30
23
+ runs-on: ubuntu-24.04
24
+ steps:
25
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
26
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
27
+ with:
28
+ python-version: "3.12.13"
29
+ - name: Install ffmpeg and ffprobe
30
+ run: |
31
+ sudo apt-get update
32
+ sudo apt-get install -y --no-install-recommends ffmpeg
33
+ - run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
34
+ - name: Verify managed Python runtime
35
+ run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
36
+ - run: uv run ruff check .
37
+ - run: uv run ruff format --check .
38
+ - run: uv run python docs/design/validate_design_pack.py
39
+ - run: |
40
+ uv run python -m metamuse.schemas
41
+ git diff --exit-code
42
+ - run: uv run python tests/fixtures/corpus/check_corpus.py
43
+ - run: scripts/smoke_wheel.sh
44
+ env:
45
+ TMPDIR: ${{ runner.temp }}
46
+
47
+ cohorts:
48
+ timeout-minutes: 30
49
+ runs-on: ubuntu-24.04
50
+ strategy:
51
+ fail-fast: false
52
+ max-parallel: 5
53
+ matrix:
54
+ cohort: [core, muse, media, facebook, privacy]
55
+ steps:
56
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
57
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
58
+ with:
59
+ python-version: "3.12.13"
60
+ - name: Install ffmpeg and ffprobe
61
+ run: |
62
+ sudo apt-get update
63
+ sudo apt-get install -y --no-install-recommends ffmpeg
64
+ - run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
65
+ - name: Verify managed Python runtime
66
+ run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
67
+ - name: Install Chromium from the locked Playwright package
68
+ run: uv run --locked python -m playwright install --with-deps chromium
69
+ - name: Enable Chromium user namespace sandbox on the hosted runner
70
+ run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
71
+ - name: Collect the full suite and run the ordered cohort
72
+ run: |
73
+ pytest_temp_dir="$(mktemp -d "${RUNNER_TEMP}/metamuse-pytest.XXXXXX")"
74
+ trap 'rm -rf "$pytest_temp_dir"' EXIT
75
+ mkdir -p ci-evidence
76
+ set -o pipefail
77
+ uv run --locked python -u -X faulthandler scripts/ci_cohorts.py run \
78
+ --cohort "${{ matrix.cohort }}" \
79
+ --source-sha "$GITHUB_SHA" \
80
+ --manifest "ci-evidence/${{ matrix.cohort }}.json" -- \
81
+ -q --maxfail=1 -o faulthandler_timeout=0 --basetemp "$pytest_temp_dir" \
82
+ 2>&1 | tee "ci-evidence/${{ matrix.cohort }}.log"
83
+ - name: Retain manifest and diagnostic log even on failure
84
+ if: always()
85
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
86
+ with:
87
+ name: ci-${{ github.sha }}-${{ matrix.cohort }}
88
+ path: ci-evidence/
89
+ if-no-files-found: error
90
+ retention-days: 7
91
+
92
+ installed-journeys:
93
+ timeout-minutes: 30
94
+ runs-on: ubuntu-24.04
95
+ steps:
96
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
97
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
98
+ with:
99
+ python-version: "3.12.13"
100
+ - name: Install ffmpeg and ffprobe
101
+ run: |
102
+ sudo apt-get update
103
+ sudo apt-get install -y --no-install-recommends ffmpeg
104
+ - run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
105
+ - name: Verify managed Python runtime
106
+ run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
107
+ - name: Run exact and bounded journeys from the isolated installed wheel
108
+ env:
109
+ CANDIDATE_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
110
+ run: |
111
+ mkdir -p "$RUNNER_TEMP/installed-journey-evidence"
112
+ set -o pipefail
113
+ scripts/check_installed_journeys.sh "$GITHUB_SHA" "$RUNNER_TEMP/installed-journey-evidence" \
114
+ 2>&1 | tee "$RUNNER_TEMP/installed-journey-evidence/installed.log"
115
+ - name: Retain installed provenance and diagnostics even on failure
116
+ if: always()
117
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
118
+ with:
119
+ name: installed-${{ github.sha }}-journeys
120
+ path: ${{ runner.temp }}/installed-journey-evidence/
121
+ if-no-files-found: error
122
+ retention-days: 7
123
+
124
+ privacy-load:
125
+ timeout-minutes: 30
126
+ runs-on: ubuntu-24.04
127
+ steps:
128
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
129
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
130
+ with:
131
+ python-version: "3.12.13"
132
+ - name: Install ffmpeg and ffprobe
133
+ run: |
134
+ sudo apt-get update
135
+ sudo apt-get install -y --no-install-recommends ffmpeg
136
+ - run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
137
+ - name: Verify managed Python runtime
138
+ run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
139
+ - name: Run five serial final-tree privacy measurements
140
+ env:
141
+ CANDIDATE_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
142
+ run: |
143
+ set -euo pipefail
144
+ unset LD_LIBRARY_PATH
145
+ export PATH="$HOME/.local/bin:$PATH"
146
+ evidence="$RUNNER_TEMP/privacy-load-evidence"
147
+ mkdir -p "$evidence"
148
+ printf 'run\tevent\texit_code\n' > "$evidence/results.tsv"
149
+ run=0
150
+ pytest_temp_dir=
151
+ cleanup() {
152
+ status=$?
153
+ printf '%s\tjob_exit\t%s\n' "$run" "$status" >> "$evidence/results.tsv"
154
+ if [ -n "$pytest_temp_dir" ]; then rm -rf -- "$pytest_temp_dir"; fi
155
+ }
156
+ trap cleanup EXIT
157
+ trap 'exit 130' INT
158
+ trap 'exit 143' TERM
159
+ case "$(stat -f -c %T "$RUNNER_TEMP")" in
160
+ tmpfs|ramfs) echo 'Privacy measurements require disk scratch' >&2; exit 1 ;;
161
+ esac
162
+ uv run --locked python -u -X faulthandler - <<'PY' | tee "$evidence/identity.json"
163
+ import hashlib, json, os, subprocess, sys
164
+ from pathlib import Path
165
+ def git(*args):
166
+ return subprocess.check_output(["git", *args], text=True).strip()
167
+ assert sys.version_info[:3] == (3, 12, 13), sys.version
168
+ assert git("rev-parse", "HEAD") == os.environ["GITHUB_SHA"]
169
+ assert not git("status", "--porcelain"), "Privacy measurements require a clean checkout"
170
+ paths = (
171
+ "src/metamuse/safety.py", "src/metamuse/_muse_redact.py", "tests/cpu_growth.py",
172
+ "tests/test_muse_round5_growth.py", "tests/test_muse_round6_growth.py",
173
+ "tests/test_at042_review_fixes.py",
174
+ )
175
+ print(json.dumps({
176
+ "source_commit": git("rev-parse", "HEAD"), "source_tree": git("rev-parse", "HEAD^{tree}"),
177
+ "source_parents": git("show", "-s", "--format=%P", "HEAD").split(),
178
+ "candidate_sha": os.environ["CANDIDATE_SHA"],
179
+ "python_version": sys.version, "python_executable": sys.executable,
180
+ "python_base_prefix": sys.base_prefix,
181
+ "sha256": {path: hashlib.sha256(Path(path).read_bytes()).hexdigest() for path in paths},
182
+ }, sort_keys=True), flush=True)
183
+ PY
184
+ nodes=(
185
+ 'tests/test_muse_round5_growth.py::test_r5_5_ordinary_pairs_core_growth'
186
+ 'tests/test_muse_round6_growth.py::test_r6_2_adversarial_grammars_linear[k=>-False-text]'
187
+ 'tests/test_muse_round6_growth.py::test_r6_2_adversarial_grammars_linear[k=>-True-text]'
188
+ 'tests/test_muse_round6_growth.py::test_r6_2_adversarial_grammars_linear[k=>-False-body]'
189
+ 'tests/test_muse_round6_growth.py::test_r6_2_adversarial_grammars_linear[k=>-True-body]'
190
+ 'tests/test_at042_review_fixes.py::test_b16a_bare_muse_cookie_must_not_leak_into_redacted_bundle'
191
+ )
192
+ for run in 1 2 3 4 5; do
193
+ pytest_temp_dir="$(mktemp -d "$RUNNER_TEMP/metamuse-privacy-load.XXXXXX")"
194
+ printf '%s\tstarted\t\n' "$run" >> "$evidence/results.tsv"
195
+ {
196
+ cat "$evidence/identity.json"
197
+ printf '\nPRIVACY_LOAD_RUN %s\n' "$run"
198
+ uv run --locked python -u -X faulthandler -m pytest -q -s \
199
+ --basetemp "$pytest_temp_dir" "${nodes[@]}"
200
+ } 2>&1 | tee "$evidence/load-$run.log"
201
+ printf '%s\tcompleted\t0\n' "$run" >> "$evidence/results.tsv"
202
+ rm -rf -- "$pytest_temp_dir"
203
+ pytest_temp_dir=
204
+ done
205
+ - name: Retain privacy measurement logs and identity even on failure
206
+ if: always()
207
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
208
+ with:
209
+ name: privacy-load-${{ github.sha }}
210
+ path: ${{ runner.temp }}/privacy-load-evidence/
211
+ if-no-files-found: error
212
+ retention-days: 7
213
+
214
+ check:
215
+ timeout-minutes: 30
216
+ runs-on: ubuntu-24.04
217
+ needs: [static-wheel, cohorts, installed-journeys, privacy-load]
218
+ if: always()
219
+ steps:
220
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
221
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
222
+ with:
223
+ python-version: "3.12.13"
224
+ - run: uv sync --locked --python 3.12.13 --group dev --extra remote --extra facebook
225
+ - name: Verify managed Python runtime
226
+ run: uv run --locked python -c 'import sys; print(sys.version); print(sys.base_prefix); assert sys.version_info[:3] == (3, 12, 13)'
227
+ - name: Download every cohort manifest and log for this source
228
+ uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
229
+ with:
230
+ pattern: ci-${{ github.sha }}-*
231
+ path: ci-evidence
232
+ merge-multiple: true
233
+ - name: Require every job and exact full-suite runtime coverage
234
+ if: always()
235
+ env:
236
+ COHORT_RESULT: ${{ needs.cohorts.result }}
237
+ STATIC_RESULT: ${{ needs.static-wheel.result }}
238
+ INSTALLED_RESULT: ${{ needs.installed-journeys.result }}
239
+ PRIVACY_LOAD_RESULT: ${{ needs.privacy-load.result }}
240
+ run: |
241
+ python3 scripts/ci_cohorts.py verify --manifest-dir ci-evidence --source-sha "$GITHUB_SHA"
242
+ test "$COHORT_RESULT" = success
243
+ test "$STATIC_RESULT" = success
244
+ test "$INSTALLED_RESULT" = success
245
+ test "$PRIVACY_LOAD_RESULT" = success
@@ -0,0 +1,57 @@
1
+ name: Deploy project page to GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "site/**"
8
+ - ".github/workflows/pages.yml"
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+ pages: write
14
+ id-token: write
15
+
16
+ concurrency:
17
+ group: pages
18
+ cancel-in-progress: false
19
+
20
+ jobs:
21
+ deploy:
22
+ name: Deploy static site
23
+ runs-on: ubuntu-latest
24
+ timeout-minutes: 10
25
+ environment:
26
+ name: github-pages
27
+ url: ${{ steps.deployment.outputs.page_url }}
28
+ steps:
29
+ - name: Check out repository
30
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
31
+ with:
32
+ persist-credentials: false
33
+
34
+ - name: Check out page kit
35
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
36
+ with:
37
+ repository: teddashh/teddashh.github.io
38
+ ref: 5e51fb954acef56e9f75b4cfd2b57dc76afcdfd8
39
+ path: .page-kit
40
+ persist-credentials: false
41
+
42
+ - name: Validate site
43
+ env:
44
+ PAGE_KIT_DIR: ${{ github.workspace }}/.page-kit/kit
45
+ run: python3 scripts/check_site.py
46
+
47
+ - name: Configure GitHub Pages
48
+ uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
49
+
50
+ - name: Upload site artifact
51
+ uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
52
+ with:
53
+ path: ./site
54
+
55
+ - name: Deploy to GitHub Pages
56
+ id: deployment
57
+ uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
@@ -0,0 +1,176 @@
1
+ name: Publish Python package
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: Exact reviewed version from pyproject.toml
8
+ required: true
9
+ default: 0.1.0a1
10
+ type: string
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ concurrency:
16
+ group: publish-pypi
17
+ cancel-in-progress: false
18
+
19
+ jobs:
20
+ build:
21
+ if: github.ref == 'refs/heads/main'
22
+ runs-on: ubuntu-24.04
23
+ timeout-minutes: 15
24
+ permissions:
25
+ contents: read
26
+ checks: read
27
+ env:
28
+ RELEASE_VERSION: ${{ inputs.version }}
29
+ steps:
30
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
31
+ - name: Configure isolated demo directories
32
+ run: |
33
+ echo "UV_TOOL_DIR=$RUNNER_TEMP/release-tools" >> "$GITHUB_ENV"
34
+ echo "UV_TOOL_BIN_DIR=$RUNNER_TEMP/release-bin" >> "$GITHUB_ENV"
35
+ echo "XDG_DATA_HOME=$RUNNER_TEMP/release-data" >> "$GITHUB_ENV"
36
+ - name: Require successful CI for this exact source commit
37
+ env:
38
+ GH_TOKEN: ${{ github.token }}
39
+ run: |
40
+ gh api "repos/$GITHUB_REPOSITORY/commits/$GITHUB_SHA/check-runs?per_page=100" > "$RUNNER_TEMP/checks.json"
41
+ python3 - <<'PY'
42
+ import json
43
+ import os
44
+ from pathlib import Path
45
+
46
+ checks = json.loads((Path(os.environ['RUNNER_TEMP']) / 'checks.json').read_text())
47
+ passed = any(
48
+ check['name'] == 'check'
49
+ and check['app']['id'] == 15368
50
+ and check['head_sha'] == os.environ['GITHUB_SHA']
51
+ and check['conclusion'] == 'success'
52
+ for check in checks['check_runs']
53
+ )
54
+ if not passed:
55
+ raise SystemExit('The required Actions check has not passed for this commit.')
56
+ PY
57
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
58
+ with:
59
+ python-version: "3.12.13"
60
+ - name: Check version and build both distributions
61
+ run: |
62
+ python3 - <<'PY'
63
+ import os
64
+ import tomllib
65
+ from pathlib import Path
66
+
67
+ project = tomllib.loads(Path('pyproject.toml').read_text())['project']
68
+ if project['version'] != os.environ['RELEASE_VERSION']:
69
+ raise SystemExit('Requested version differs from pyproject.toml.')
70
+ PY
71
+ uv build --no-sources
72
+ - name: Verify metadata and create artifact hashes
73
+ run: |
74
+ python3 - <<'PY'
75
+ import hashlib
76
+ import os
77
+ import tarfile
78
+ import zipfile
79
+ from email.parser import BytesParser
80
+ from pathlib import Path
81
+
82
+ version = os.environ['RELEASE_VERSION']
83
+ expected = {
84
+ f'metamuse_cli-{version}-py3-none-any.whl',
85
+ f'metamuse_cli-{version}.tar.gz',
86
+ }
87
+ files = sorted(p for p in Path('dist').iterdir() if p.name != '.gitignore')
88
+ if {p.name for p in files} != expected:
89
+ raise SystemExit('Expected exactly one wheel and one source distribution.')
90
+ sums = []
91
+ for path in files:
92
+ if path.suffix == '.whl':
93
+ with zipfile.ZipFile(path) as archive:
94
+ name = next(n for n in archive.namelist() if n.endswith('.dist-info/METADATA'))
95
+ metadata = BytesParser().parsebytes(archive.read(name))
96
+ else:
97
+ with tarfile.open(path) as archive:
98
+ metadata = BytesParser().parsebytes(archive.extractfile(f'metamuse_cli-{version}/PKG-INFO').read())
99
+ if metadata['Name'] != 'metamuse-cli' or metadata['Version'] != version:
100
+ raise SystemExit(f'Unexpected package metadata: {path.name}')
101
+ sums.append(f'{hashlib.sha256(path.read_bytes()).hexdigest()} {path.name}')
102
+ Path('dist/SHA256SUMS').write_text('\n'.join(sums) + '\n')
103
+ print('\n'.join(sums))
104
+ PY
105
+ - name: Install the exact release wheel
106
+ run: uv tool install --python 3.12.13 dist/*.whl
107
+ - name: Run bundled example outside the checkout
108
+ working-directory: ${{ runner.temp }}
109
+ run: '"$UV_TOOL_BIN_DIR/metamuse" demo > "$RUNNER_TEMP/release-demo.log"'
110
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
111
+ with:
112
+ name: pypi-${{ github.sha }}
113
+ path: dist/
114
+ if-no-files-found: error
115
+ retention-days: 90
116
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
117
+ with:
118
+ name: release-demo-${{ github.sha }}
119
+ path: ${{ runner.temp }}/release-demo.log
120
+ if-no-files-found: error
121
+ retention-days: 90
122
+
123
+ publish:
124
+ needs: build
125
+ runs-on: ubuntu-24.04
126
+ timeout-minutes: 10
127
+ environment:
128
+ name: pypi
129
+ url: https://pypi.org/project/metamuse-cli/${{ inputs.version }}/
130
+ permissions:
131
+ contents: read
132
+ id-token: write
133
+ env:
134
+ RELEASE_VERSION: ${{ inputs.version }}
135
+ steps:
136
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
137
+ with:
138
+ name: pypi-${{ github.sha }}
139
+ path: dist/
140
+ - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
141
+ - name: Verify downloaded artifact hashes
142
+ working-directory: dist
143
+ run: sha256sum --check SHA256SUMS
144
+ - name: Publish reviewed artifacts through PyPI OIDC
145
+ run: uv publish --trusted-publishing always dist/*.whl dist/*.tar.gz
146
+ - name: Verify PyPI has these exact bytes
147
+ run: |
148
+ python3 - <<'PY'
149
+ import hashlib
150
+ import json
151
+ import os
152
+ import time
153
+ import urllib.error
154
+ import urllib.request
155
+ from pathlib import Path
156
+
157
+ version = os.environ['RELEASE_VERSION']
158
+ expected = {
159
+ p.name: hashlib.sha256(p.read_bytes()).hexdigest()
160
+ for p in Path('dist').iterdir()
161
+ if p.name.endswith(('.whl', '.tar.gz'))
162
+ }
163
+ for attempt in range(6):
164
+ try:
165
+ with urllib.request.urlopen(f'https://pypi.org/pypi/metamuse-cli/{version}/json', timeout=20) as response:
166
+ release = json.load(response)
167
+ actual = {item['filename']: item['digests']['sha256'] for item in release['urls']}
168
+ if actual == expected:
169
+ print(f'PyPI {version}: both file hashes match the reviewed artifacts.')
170
+ break
171
+ except (urllib.error.URLError, TimeoutError):
172
+ pass
173
+ if attempt == 5:
174
+ raise SystemExit('PyPI hashes are unconfirmed; inspect the index before retrying.')
175
+ time.sleep(5)
176
+ PY
@@ -0,0 +1,17 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .mypy_cache/
7
+ .coverage
8
+ htmlcov/
9
+ dist/
10
+ build/
11
+ *.egg-info/
12
+ *.sqlite3
13
+ *.sqlite3-*
14
+ .env
15
+ .env.*
16
+ /runtime/
17
+ /workspace-data/
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,35 @@
1
+ # AGENTS.md — MetaMuse CLI
2
+
3
+ ## Product contract (binding; copied from docs/design/AGENTS.md)
4
+
5
+ 先讀01_PLAN、02_SPEC、03_SDS,再依04_BACKLOG的B01–B04實作。這是單一工具,不是五個repo launcher。
6
+
7
+ 一package、一store、一jobs、一設定。CLI/MCP共用app;不做submodules、runtime git clone、plugin framework或第二個AI orchestrator。
8
+
9
+ 主Agent產問題與文案;Muse是協作者,不接管harness或當逐點擊模型。不帶作者策略、人設、F公式、CTA或黃金時段。
10
+
11
+ 採用第三方程式先記license/commit/原path;沒授權不可機械翻寫。成熟依賴不重造。public包不含秘密、真實私有內容或部署資料。
12
+
13
+ accepted不等於running;沒worker不得說在背景執行。安全讀取與外部send重試分開,不明送達先對帳。来源保真,partial不冒稱complete,模型內容不能mint permissions。
14
+
15
+ LIVE只在操作者明確授權後執行。缺憑證則fixture+blocked,不編造結果。不因本文件自動建立repo、發布、改visibility或操作帳號。
16
+
17
+ 交付每個PR的FR/B/AT、實際命令/證據類別、migration、notice與限制。先離線縱切片,Muse spike早做;不要先做Dashboard。核心models/store/jobs修改先協調owner。
18
+
19
+ Design baseline: `docs/design/` (01_PLAN, 02_SPEC, 03_SDS, 04_BACKLOG, 05_ACCEPTANCE, 06_SOURCES, contracts/). IDs FR-xxx (requirements), Bxx (backlog), AT-xxx (acceptance) come from there. If code and design disagree, either fix the code or update the design docs/contracts in the same commit and call it out in your report. Never maintain two sources of truth.
20
+
21
+ ## Multi-agent development protocol
22
+
23
+ Several coding agents (Codex, Grok, Gemini) work in parallel, each in its own git worktree on its own branch. An orchestrator assigns tasks, independently re-runs tests, reviews, and merges into `main`.
24
+
25
+ - Work only inside your assigned worktree/branch and commit there. Never push, add remotes, create hosted repos, publish packages, or touch other worktrees or `main`. This repo is public. Only the orchestrator pushes branches, opens PRs and merges. Keys, account settings, real data and LIVE evidence live in a separate private repo; never read, copy or reference it unless your task prompt explicitly grants access.
26
+ - Ownership: `src/metamuse/models.py`, `store.py`, `jobs.py`, migrations and generated schemas belong to the core owner (B02–B04). Other tasks must not edit them unless their task prompt grants it. If you need a core change, build against the existing API and add a "Core change requests" section to your report (what, why, proposed diff).
27
+ - Extension points that other tasks may use without editing core files are documented in `docs/dev/CORE_API.md` once it exists (operation handler registry, AppContext, error/envelope helpers).
28
+ - Toolchain: Python 3.12 managed by uv. `uv sync`, `uv run pytest -q`, `uv run ruff check .`. No system pip. Add dependencies only with `uv add` and justify each (license, why a mature dependency instead of hand-rolled code).
29
+ - Tests never touch the network or real accounts. LIVE work is out of scope unless a task prompt explicitly authorizes it; without credentials the result is fixture + `blocked`, never an invented success.
30
+ - No secrets, cookies, real private content, hostnames, account settings or personal data in the repo. Fixtures are synthetic and redistributable.
31
+ - License: Apache-2.0 (`LICENSE`). Third-party code only under a compatible license, with provenance and an entry in `THIRD_PARTY_NOTICES.md`.
32
+ - Runtime data lives outside the repo (platformdirs private root); tests use temporary directories.
33
+ - Evidence classes: OFFLINE, FIXTURE, INTEGRATION, MEASURE, LIVE. Mock, schema or `--help` success is never LIVE.
34
+ - Done means: tests green, ruff clean, work committed on your branch, and the report written to the path in your task prompt. The report lists FR/B/AT covered, files changed, exact commands with real results, evidence class, migrations, third-party notices, known limitations, and core change requests.
35
+ - Commit messages: imperative summary line; body lists the B/FR/AT IDs; trailer `Agent: <cli>/<model>`.