tlon-impact 0.0.1a0__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 (428) hide show
  1. tlon_impact-0.0.1a0/.gitignore +68 -0
  2. tlon_impact-0.0.1a0/.python-version +1 -0
  3. tlon_impact-0.0.1a0/PKG-INFO +102 -0
  4. tlon_impact-0.0.1a0/README.md +73 -0
  5. tlon_impact-0.0.1a0/docs/README.md +54 -0
  6. tlon_impact-0.0.1a0/docs/architecture.md +238 -0
  7. tlon_impact-0.0.1a0/docs/decisions/0001-edn-as-dsl.md +53 -0
  8. tlon_impact-0.0.1a0/docs/decisions/0002-mail-as-only-channel.md +35 -0
  9. tlon_impact-0.0.1a0/docs/decisions/0003-mechanism-vs-policy.md +43 -0
  10. tlon_impact-0.0.1a0/docs/decisions/0004-stage-purity.md +41 -0
  11. tlon_impact-0.0.1a0/docs/decisions/0005-sse-over-websocket.md +29 -0
  12. tlon_impact-0.0.1a0/docs/decisions/0006-unified-member-model.md +39 -0
  13. tlon_impact-0.0.1a0/docs/decisions/0007-session-event-sourcing.md +63 -0
  14. tlon_impact-0.0.1a0/docs/decisions/0008-context-pressure.md +60 -0
  15. tlon_impact-0.0.1a0/docs/decisions/0009-working-memory-retirement.md +50 -0
  16. tlon_impact-0.0.1a0/docs/decisions/0010-skills.md +44 -0
  17. tlon_impact-0.0.1a0/docs/decisions/0011-sci-compatible-subset.md +58 -0
  18. tlon_impact-0.0.1a0/docs/decisions/0012-litellm-llm-provider.md +68 -0
  19. tlon_impact-0.0.1a0/docs/decisions/0013-admin-token-auth.md +34 -0
  20. tlon_impact-0.0.1a0/docs/decisions/0014-environment-agent-coevolution.md +52 -0
  21. tlon_impact-0.0.1a0/docs/decisions/0015-prompt-caching.md +53 -0
  22. tlon_impact-0.0.1a0/docs/decisions/0016-member-level-llm-config.md +47 -0
  23. tlon_impact-0.0.1a0/docs/decisions/0017-claim-based-memory.md +104 -0
  24. tlon_impact-0.0.1a0/docs/decisions/0018-dsl-extraction-tlosure.md +66 -0
  25. tlon_impact-0.0.1a0/docs/decisions/0019-runtime-server-client-split.md +55 -0
  26. tlon_impact-0.0.1a0/docs/decisions/0020-bridge-api.md +49 -0
  27. tlon_impact-0.0.1a0/docs/decisions/0021-tlosure-full-functions.md +46 -0
  28. tlon_impact-0.0.1a0/docs/decisions/0022-society-policy-context.md +23 -0
  29. tlon_impact-0.0.1a0/docs/design/arena.md +93 -0
  30. tlon_impact-0.0.1a0/docs/design/bridge-api.md +115 -0
  31. tlon_impact-0.0.1a0/docs/design/capabilities.md +110 -0
  32. tlon_impact-0.0.1a0/docs/design/deepseek-harness-review.md +89 -0
  33. tlon_impact-0.0.1a0/docs/design/dsl.md +157 -0
  34. tlon_impact-0.0.1a0/docs/design/execution-device.md +119 -0
  35. tlon_impact-0.0.1a0/docs/design/mail.md +272 -0
  36. tlon_impact-0.0.1a0/docs/design/memory.md +176 -0
  37. tlon_impact-0.0.1a0/docs/design/prototypes.md +186 -0
  38. tlon_impact-0.0.1a0/docs/design/runtime.md +208 -0
  39. tlon_impact-0.0.1a0/docs/design/server-protocol.md +125 -0
  40. tlon_impact-0.0.1a0/docs/design/skills.md +86 -0
  41. tlon_impact-0.0.1a0/docs/design/society-policy.md +107 -0
  42. tlon_impact-0.0.1a0/docs/design/telegram.md +62 -0
  43. tlon_impact-0.0.1a0/docs/design/unified-member-model.md +110 -0
  44. tlon_impact-0.0.1a0/docs/design/webui.md +117 -0
  45. tlon_impact-0.0.1a0/docs/guides/quickstart.md +96 -0
  46. tlon_impact-0.0.1a0/docs/guides/writing-a-prototype.md +153 -0
  47. tlon_impact-0.0.1a0/docs/reference/api-reference.md +539 -0
  48. tlon_impact-0.0.1a0/docs/reference/config-reference.md +250 -0
  49. tlon_impact-0.0.1a0/docs/reference/dsl-reference.md +522 -0
  50. tlon_impact-0.0.1a0/docs/reference/tlosure-reference.md +168 -0
  51. tlon_impact-0.0.1a0/docs/reference/tools-reference.md +465 -0
  52. tlon_impact-0.0.1a0/docs/vision.md +43 -0
  53. tlon_impact-0.0.1a0/pyproject.toml +328 -0
  54. tlon_impact-0.0.1a0/scripts/build_package.sh +35 -0
  55. tlon_impact-0.0.1a0/scripts/check_all.sh +83 -0
  56. tlon_impact-0.0.1a0/scripts/check_architecture.py +346 -0
  57. tlon_impact-0.0.1a0/scripts/check_device_rules.py +359 -0
  58. tlon_impact-0.0.1a0/scripts/check_no_reexport.py +125 -0
  59. tlon_impact-0.0.1a0/scripts/check_stage_purity.py +136 -0
  60. tlon_impact-0.0.1a0/scripts/eval_memory.py +484 -0
  61. tlon_impact-0.0.1a0/scripts/gen_reference_docs.py +1182 -0
  62. tlon_impact-0.0.1a0/scripts/memory_eval/README.md +83 -0
  63. tlon_impact-0.0.1a0/scripts/memory_eval/scenarios.json +313 -0
  64. tlon_impact-0.0.1a0/scripts/verify_package.sh +61 -0
  65. tlon_impact-0.0.1a0/src/tests/__init__.py +0 -0
  66. tlon_impact-0.0.1a0/src/tests/agents/__init__.py +0 -0
  67. tlon_impact-0.0.1a0/src/tests/agents/capabilities/__init__.py +1 -0
  68. tlon_impact-0.0.1a0/src/tests/agents/capabilities/test_bridge.py +225 -0
  69. tlon_impact-0.0.1a0/src/tests/agents/capabilities/test_spec.py +375 -0
  70. tlon_impact-0.0.1a0/src/tests/agents/capabilities/test_staging.py +259 -0
  71. tlon_impact-0.0.1a0/src/tests/agents/test_adam.py +314 -0
  72. tlon_impact-0.0.1a0/src/tests/agents/test_assembly.py +218 -0
  73. tlon_impact-0.0.1a0/src/tests/agents/test_bootstrap.py +62 -0
  74. tlon_impact-0.0.1a0/src/tests/agents/test_builtin_prototypes.py +175 -0
  75. tlon_impact-0.0.1a0/src/tests/agents/test_completion_gate.py +328 -0
  76. tlon_impact-0.0.1a0/src/tests/agents/test_context_builder.py +798 -0
  77. tlon_impact-0.0.1a0/src/tests/agents/test_context_pressure.py +576 -0
  78. tlon_impact-0.0.1a0/src/tests/agents/test_critique_stage.py +161 -0
  79. tlon_impact-0.0.1a0/src/tests/agents/test_cron.py +346 -0
  80. tlon_impact-0.0.1a0/src/tests/agents/test_executor.py +333 -0
  81. tlon_impact-0.0.1a0/src/tests/agents/test_health.py +308 -0
  82. tlon_impact-0.0.1a0/src/tests/agents/test_lessons.py +179 -0
  83. tlon_impact-0.0.1a0/src/tests/agents/test_loader.py +125 -0
  84. tlon_impact-0.0.1a0/src/tests/agents/test_member_runtime.py +1441 -0
  85. tlon_impact-0.0.1a0/src/tests/agents/test_member_spec.py +462 -0
  86. tlon_impact-0.0.1a0/src/tests/agents/test_near_kin.py +379 -0
  87. tlon_impact-0.0.1a0/src/tests/agents/test_policy.py +363 -0
  88. tlon_impact-0.0.1a0/src/tests/agents/test_prompt_builder.py +12 -0
  89. tlon_impact-0.0.1a0/src/tests/agents/test_propose_behavior.py +243 -0
  90. tlon_impact-0.0.1a0/src/tests/agents/test_propose_capability.py +286 -0
  91. tlon_impact-0.0.1a0/src/tests/agents/test_prototype_lineage.py +198 -0
  92. tlon_impact-0.0.1a0/src/tests/agents/test_prototype_management.py +472 -0
  93. tlon_impact-0.0.1a0/src/tests/agents/test_reaper.py +339 -0
  94. tlon_impact-0.0.1a0/src/tests/agents/test_reflection.py +230 -0
  95. tlon_impact-0.0.1a0/src/tests/agents/test_registry.py +653 -0
  96. tlon_impact-0.0.1a0/src/tests/agents/test_relay.py +71 -0
  97. tlon_impact-0.0.1a0/src/tests/agents/test_reputation.py +189 -0
  98. tlon_impact-0.0.1a0/src/tests/agents/test_retirement.py +410 -0
  99. tlon_impact-0.0.1a0/src/tests/agents/test_review_prototype.py +206 -0
  100. tlon_impact-0.0.1a0/src/tests/agents/test_session_journal.py +988 -0
  101. tlon_impact-0.0.1a0/src/tests/agents/test_skills.py +313 -0
  102. tlon_impact-0.0.1a0/src/tests/agents/test_spawn.py +393 -0
  103. tlon_impact-0.0.1a0/src/tests/agents/test_stage_purity.py +272 -0
  104. tlon_impact-0.0.1a0/src/tests/agents/test_staging_prototype.py +259 -0
  105. tlon_impact-0.0.1a0/src/tests/agents/test_tool_executor.py +51 -0
  106. tlon_impact-0.0.1a0/src/tests/agents/test_tool_timeout.py +167 -0
  107. tlon_impact-0.0.1a0/src/tests/agents/test_vocabulary.py +218 -0
  108. tlon_impact-0.0.1a0/src/tests/arena/__init__.py +0 -0
  109. tlon_impact-0.0.1a0/src/tests/arena/test_corpus.py +114 -0
  110. tlon_impact-0.0.1a0/src/tests/arena/test_facade.py +65 -0
  111. tlon_impact-0.0.1a0/src/tests/arena/test_report.py +433 -0
  112. tlon_impact-0.0.1a0/src/tests/arena/test_runner.py +576 -0
  113. tlon_impact-0.0.1a0/src/tests/base/__init__.py +0 -0
  114. tlon_impact-0.0.1a0/src/tests/base/test_docker_config.py +28 -0
  115. tlon_impact-0.0.1a0/src/tests/base/test_event_bus.py +266 -0
  116. tlon_impact-0.0.1a0/src/tests/base/test_ledger.py +370 -0
  117. tlon_impact-0.0.1a0/src/tests/base/test_llm_client.py +216 -0
  118. tlon_impact-0.0.1a0/src/tests/base/test_llm_config.py +43 -0
  119. tlon_impact-0.0.1a0/src/tests/base/test_logging.py +317 -0
  120. tlon_impact-0.0.1a0/src/tests/base/test_metrics.py +526 -0
  121. tlon_impact-0.0.1a0/src/tests/base/test_paths.py +57 -0
  122. tlon_impact-0.0.1a0/src/tests/base/test_settings_dotenv.py +100 -0
  123. tlon_impact-0.0.1a0/src/tests/base/test_tracing.py +319 -0
  124. tlon_impact-0.0.1a0/src/tests/client/__init__.py +0 -0
  125. tlon_impact-0.0.1a0/src/tests/client/test_sdk.py +941 -0
  126. tlon_impact-0.0.1a0/src/tests/client/test_telegram_bot.py +487 -0
  127. tlon_impact-0.0.1a0/src/tests/integration/__init__.py +1 -0
  128. tlon_impact-0.0.1a0/src/tests/integration/conftest.py +249 -0
  129. tlon_impact-0.0.1a0/src/tests/integration/test_admin_agents.py +111 -0
  130. tlon_impact-0.0.1a0/src/tests/integration/test_admin_auth.py +74 -0
  131. tlon_impact-0.0.1a0/src/tests/integration/test_mail_semantics.py +72 -0
  132. tlon_impact-0.0.1a0/src/tests/integration/test_mail_smoke.py +65 -0
  133. tlon_impact-0.0.1a0/src/tests/integration/test_multi_runtime.py +74 -0
  134. tlon_impact-0.0.1a0/src/tests/integration/test_sessions.py +130 -0
  135. tlon_impact-0.0.1a0/src/tests/integration/test_sse_events.py +120 -0
  136. tlon_impact-0.0.1a0/src/tests/launcher/__init__.py +1 -0
  137. tlon_impact-0.0.1a0/src/tests/launcher/test_commands.py +295 -0
  138. tlon_impact-0.0.1a0/src/tests/launcher/test_main.py +185 -0
  139. tlon_impact-0.0.1a0/src/tests/memory/__init__.py +1 -0
  140. tlon_impact-0.0.1a0/src/tests/memory/test_claim_store.py +225 -0
  141. tlon_impact-0.0.1a0/src/tests/memory/test_conflict_judgment.py +415 -0
  142. tlon_impact-0.0.1a0/src/tests/memory/test_jit_retrieval.py +298 -0
  143. tlon_impact-0.0.1a0/src/tests/memory/test_memory_manager.py +188 -0
  144. tlon_impact-0.0.1a0/src/tests/memory/test_session_distillation.py +359 -0
  145. tlon_impact-0.0.1a0/src/tests/memory/test_vector_index.py +119 -0
  146. tlon_impact-0.0.1a0/src/tests/sandbox/test_device.py +182 -0
  147. tlon_impact-0.0.1a0/src/tests/sandbox/test_docker_runtime.py +683 -0
  148. tlon_impact-0.0.1a0/src/tests/sandbox/test_resource_monitor.py +282 -0
  149. tlon_impact-0.0.1a0/src/tests/server/__init__.py +0 -0
  150. tlon_impact-0.0.1a0/src/tests/server/test_notification_service.py +267 -0
  151. tlon_impact-0.0.1a0/src/tests/server/test_rest_admin_api.py +749 -0
  152. tlon_impact-0.0.1a0/src/tests/server/test_rest_admin_arena.py +355 -0
  153. tlon_impact-0.0.1a0/src/tests/server/test_rest_admin_capabilities.py +359 -0
  154. tlon_impact-0.0.1a0/src/tests/server/test_rest_admin_llm.py +88 -0
  155. tlon_impact-0.0.1a0/src/tests/server/test_rest_agent_reload.py +83 -0
  156. tlon_impact-0.0.1a0/src/tests/server/test_rest_github_webhook.py +174 -0
  157. tlon_impact-0.0.1a0/src/tests/server/test_rest_inbox.py +139 -0
  158. tlon_impact-0.0.1a0/src/tests/server/test_rest_send_message.py +250 -0
  159. tlon_impact-0.0.1a0/src/tests/server/test_rest_sessions_sse.py +635 -0
  160. tlon_impact-0.0.1a0/src/tests/server/test_startup_banner.py +19 -0
  161. tlon_impact-0.0.1a0/src/tests/tasks/test_manager.py +200 -0
  162. tlon_impact-0.0.1a0/src/tests/tasks/test_models.py +114 -0
  163. tlon_impact-0.0.1a0/src/tests/tlosure/__init__.py +0 -0
  164. tlon_impact-0.0.1a0/src/tests/tlosure/test_builtins.py +286 -0
  165. tlon_impact-0.0.1a0/src/tests/tlosure/test_closure_builtin.py +143 -0
  166. tlon_impact-0.0.1a0/src/tests/tlosure/test_edn.py +302 -0
  167. tlon_impact-0.0.1a0/src/tests/tlosure/test_eval.py +634 -0
  168. tlon_impact-0.0.1a0/src/tests/tlosure/test_validate.py +320 -0
  169. tlon_impact-0.0.1a0/src/tests/tools/test_execute_bash.py +264 -0
  170. tlon_impact-0.0.1a0/src/tests/tools/test_filesystem_tools.py +835 -0
  171. tlon_impact-0.0.1a0/src/tests/tools/test_mail_tools.py +261 -0
  172. tlon_impact-0.0.1a0/src/tests/tools/test_observability_tools.py +436 -0
  173. tlon_impact-0.0.1a0/src/tests/tools/test_read_session.py +156 -0
  174. tlon_impact-0.0.1a0/src/tests/tools/test_spill.py +90 -0
  175. tlon_impact-0.0.1a0/src/tests/tools/test_system_tools.py +33 -0
  176. tlon_impact-0.0.1a0/src/tests/tools/test_task_tools.py +417 -0
  177. tlon_impact-0.0.1a0/src/tests/tools/test_tool_base.py +234 -0
  178. tlon_impact-0.0.1a0/src/tests/unit/__init__.py +1 -0
  179. tlon_impact-0.0.1a0/src/tests/unit/test_eval_memory.py +285 -0
  180. tlon_impact-0.0.1a0/src/tests/unit/test_gateways.py +37 -0
  181. tlon_impact-0.0.1a0/src/tests/unit/test_github_adapter.py +501 -0
  182. tlon_impact-0.0.1a0/src/tests/unit/test_guardian_provider.py +94 -0
  183. tlon_impact-0.0.1a0/src/tests/unit/test_human_adapter.py +479 -0
  184. tlon_impact-0.0.1a0/src/tests/unit/test_mail.py +461 -0
  185. tlon_impact-0.0.1a0/src/tests/unit/test_mail_delivery.py +810 -0
  186. tlon_impact-0.0.1a0/src/tests/unit/test_recipient_resolver.py +236 -0
  187. tlon_impact-0.0.1a0/src/tlon/__init__.py +3 -0
  188. tlon_impact-0.0.1a0/src/tlon/agents/__init__.py +1 -0
  189. tlon_impact-0.0.1a0/src/tlon/agents/adam.py +150 -0
  190. tlon_impact-0.0.1a0/src/tlon/agents/agent_registry.py +1127 -0
  191. tlon_impact-0.0.1a0/src/tlon/agents/assembly.py +528 -0
  192. tlon_impact-0.0.1a0/src/tlon/agents/behavior_template.py +242 -0
  193. tlon_impact-0.0.1a0/src/tlon/agents/bootstrap.py +27 -0
  194. tlon_impact-0.0.1a0/src/tlon/agents/capabilities/__init__.py +38 -0
  195. tlon_impact-0.0.1a0/src/tlon/agents/capabilities/bridge.py +96 -0
  196. tlon_impact-0.0.1a0/src/tlon/agents/capabilities/catalog.py +101 -0
  197. tlon_impact-0.0.1a0/src/tlon/agents/capabilities/info.py +100 -0
  198. tlon_impact-0.0.1a0/src/tlon/agents/capabilities/spec.py +450 -0
  199. tlon_impact-0.0.1a0/src/tlon/agents/capabilities/staging.py +206 -0
  200. tlon_impact-0.0.1a0/src/tlon/agents/context_builder.py +452 -0
  201. tlon_impact-0.0.1a0/src/tlon/agents/context_pressure.py +216 -0
  202. tlon_impact-0.0.1a0/src/tlon/agents/cron.py +338 -0
  203. tlon_impact-0.0.1a0/src/tlon/agents/executor.py +222 -0
  204. tlon_impact-0.0.1a0/src/tlon/agents/health.py +371 -0
  205. tlon_impact-0.0.1a0/src/tlon/agents/lessons.py +192 -0
  206. tlon_impact-0.0.1a0/src/tlon/agents/lifecycle.py +60 -0
  207. tlon_impact-0.0.1a0/src/tlon/agents/loader.py +55 -0
  208. tlon_impact-0.0.1a0/src/tlon/agents/loop_driver.py +678 -0
  209. tlon_impact-0.0.1a0/src/tlon/agents/mail_search.py +54 -0
  210. tlon_impact-0.0.1a0/src/tlon/agents/mail_stats.py +140 -0
  211. tlon_impact-0.0.1a0/src/tlon/agents/member_runtime.py +1118 -0
  212. tlon_impact-0.0.1a0/src/tlon/agents/member_spec.py +955 -0
  213. tlon_impact-0.0.1a0/src/tlon/agents/on_complete.py +129 -0
  214. tlon_impact-0.0.1a0/src/tlon/agents/policy.py +371 -0
  215. tlon_impact-0.0.1a0/src/tlon/agents/prompt_builder.py +141 -0
  216. tlon_impact-0.0.1a0/src/tlon/agents/prompt_context.py +24 -0
  217. tlon_impact-0.0.1a0/src/tlon/agents/prompts/reflection_system.md +14 -0
  218. tlon_impact-0.0.1a0/src/tlon/agents/prototypes/__init__.py +50 -0
  219. tlon_impact-0.0.1a0/src/tlon/agents/prototypes/catalog.py +119 -0
  220. tlon_impact-0.0.1a0/src/tlon/agents/prototypes/info.py +153 -0
  221. tlon_impact-0.0.1a0/src/tlon/agents/prototypes/instantiate.py +164 -0
  222. tlon_impact-0.0.1a0/src/tlon/agents/prototypes/lineage.py +98 -0
  223. tlon_impact-0.0.1a0/src/tlon/agents/prototypes/management.py +228 -0
  224. tlon_impact-0.0.1a0/src/tlon/agents/prototypes/near_kin.py +103 -0
  225. tlon_impact-0.0.1a0/src/tlon/agents/prototypes/staging.py +263 -0
  226. tlon_impact-0.0.1a0/src/tlon/agents/reaper.py +139 -0
  227. tlon_impact-0.0.1a0/src/tlon/agents/reflection.py +231 -0
  228. tlon_impact-0.0.1a0/src/tlon/agents/reputation.py +148 -0
  229. tlon_impact-0.0.1a0/src/tlon/agents/retirement.py +364 -0
  230. tlon_impact-0.0.1a0/src/tlon/agents/scheduler.py +392 -0
  231. tlon_impact-0.0.1a0/src/tlon/agents/session.py +158 -0
  232. tlon_impact-0.0.1a0/src/tlon/agents/session_journal.py +415 -0
  233. tlon_impact-0.0.1a0/src/tlon/agents/skills.py +214 -0
  234. tlon_impact-0.0.1a0/src/tlon/agents/spawn.py +478 -0
  235. tlon_impact-0.0.1a0/src/tlon/agents/stages/__init__.py +1 -0
  236. tlon_impact-0.0.1a0/src/tlon/agents/stages/act.py +277 -0
  237. tlon_impact-0.0.1a0/src/tlon/agents/stages/critique.py +108 -0
  238. tlon_impact-0.0.1a0/src/tlon/agents/stages/outcome.py +89 -0
  239. tlon_impact-0.0.1a0/src/tlon/agents/stages/plan.py +57 -0
  240. tlon_impact-0.0.1a0/src/tlon/agents/stages/revise.py +38 -0
  241. tlon_impact-0.0.1a0/src/tlon/agents/stages/services.py +281 -0
  242. tlon_impact-0.0.1a0/src/tlon/agents/stages/think.py +46 -0
  243. tlon_impact-0.0.1a0/src/tlon/agents/tool_executor.py +207 -0
  244. tlon_impact-0.0.1a0/src/tlon/agents/trigger.py +19 -0
  245. tlon_impact-0.0.1a0/src/tlon/agents/vocabulary.py +789 -0
  246. tlon_impact-0.0.1a0/src/tlon/api/__init__.py +7 -0
  247. tlon_impact-0.0.1a0/src/tlon/api/arena.py +159 -0
  248. tlon_impact-0.0.1a0/src/tlon/api/bootstrap.py +314 -0
  249. tlon_impact-0.0.1a0/src/tlon/api/capabilities.py +149 -0
  250. tlon_impact-0.0.1a0/src/tlon/api/config.py +74 -0
  251. tlon_impact-0.0.1a0/src/tlon/api/events.py +142 -0
  252. tlon_impact-0.0.1a0/src/tlon/api/mail.py +115 -0
  253. tlon_impact-0.0.1a0/src/tlon/api/members.py +178 -0
  254. tlon_impact-0.0.1a0/src/tlon/api/observability.py +137 -0
  255. tlon_impact-0.0.1a0/src/tlon/api/prototypes.py +175 -0
  256. tlon_impact-0.0.1a0/src/tlon/arena/__init__.py +6 -0
  257. tlon_impact-0.0.1a0/src/tlon/arena/corpus.py +253 -0
  258. tlon_impact-0.0.1a0/src/tlon/arena/report.py +622 -0
  259. tlon_impact-0.0.1a0/src/tlon/arena/runner.py +570 -0
  260. tlon_impact-0.0.1a0/src/tlon/base/__init__.py +0 -0
  261. tlon_impact-0.0.1a0/src/tlon/base/component.py +167 -0
  262. tlon_impact-0.0.1a0/src/tlon/base/config.py +411 -0
  263. tlon_impact-0.0.1a0/src/tlon/base/device.py +193 -0
  264. tlon_impact-0.0.1a0/src/tlon/base/embedding_client.py +82 -0
  265. tlon_impact-0.0.1a0/src/tlon/base/events/__init__.py +0 -0
  266. tlon_impact-0.0.1a0/src/tlon/base/events/event.py +191 -0
  267. tlon_impact-0.0.1a0/src/tlon/base/events/event_bus.py +307 -0
  268. tlon_impact-0.0.1a0/src/tlon/base/ledger.py +216 -0
  269. tlon_impact-0.0.1a0/src/tlon/base/llm_client.py +575 -0
  270. tlon_impact-0.0.1a0/src/tlon/base/logger.py +144 -0
  271. tlon_impact-0.0.1a0/src/tlon/base/metrics.py +483 -0
  272. tlon_impact-0.0.1a0/src/tlon/base/paths.py +303 -0
  273. tlon_impact-0.0.1a0/src/tlon/base/settings.py +92 -0
  274. tlon_impact-0.0.1a0/src/tlon/base/tracing/__init__.py +5 -0
  275. tlon_impact-0.0.1a0/src/tlon/base/tracing/jsonl_exporter.py +158 -0
  276. tlon_impact-0.0.1a0/src/tlon/base/tracing/otel.py +112 -0
  277. tlon_impact-0.0.1a0/src/tlon/base/tracing/trace_context.py +158 -0
  278. tlon_impact-0.0.1a0/src/tlon/base/tracing/trace_store.py +289 -0
  279. tlon_impact-0.0.1a0/src/tlon/memory/__init__.py +15 -0
  280. tlon_impact-0.0.1a0/src/tlon/memory/claim_store.py +205 -0
  281. tlon_impact-0.0.1a0/src/tlon/memory/distiller.py +305 -0
  282. tlon_impact-0.0.1a0/src/tlon/memory/manager.py +898 -0
  283. tlon_impact-0.0.1a0/src/tlon/memory/models.py +285 -0
  284. tlon_impact-0.0.1a0/src/tlon/memory/vector_index.py +156 -0
  285. tlon_impact-0.0.1a0/src/tlon/organization/__init__.py +0 -0
  286. tlon_impact-0.0.1a0/src/tlon/organization/mail/__init__.py +0 -0
  287. tlon_impact-0.0.1a0/src/tlon/organization/mail/delivery.py +377 -0
  288. tlon_impact-0.0.1a0/src/tlon/organization/mail/gateways.py +73 -0
  289. tlon_impact-0.0.1a0/src/tlon/organization/mail/guardian_provider.py +80 -0
  290. tlon_impact-0.0.1a0/src/tlon/organization/mail/mail.py +257 -0
  291. tlon_impact-0.0.1a0/src/tlon/organization/mail/mailbox.py +392 -0
  292. tlon_impact-0.0.1a0/src/tlon/organization/mail/resolver.py +181 -0
  293. tlon_impact-0.0.1a0/src/tlon/organization/messaging/__init__.py +10 -0
  294. tlon_impact-0.0.1a0/src/tlon/organization/messaging/github_adapter.py +473 -0
  295. tlon_impact-0.0.1a0/src/tlon/organization/messaging/human_adapter.py +577 -0
  296. tlon_impact-0.0.1a0/src/tlon/organization/messaging/member.py +42 -0
  297. tlon_impact-0.0.1a0/src/tlon/organization/messaging/member_info.py +24 -0
  298. tlon_impact-0.0.1a0/src/tlon/prototypes/__init__.py +7 -0
  299. tlon_impact-0.0.1a0/src/tlon/prototypes/archivist/behavior.tlon +18 -0
  300. tlon_impact-0.0.1a0/src/tlon/prototypes/archivist/prototype.tlon +4 -0
  301. tlon_impact-0.0.1a0/src/tlon/prototypes/data-analyst/behavior.tlon +1 -0
  302. tlon_impact-0.0.1a0/src/tlon/prototypes/data-analyst/prototype.tlon +5 -0
  303. tlon_impact-0.0.1a0/src/tlon/prototypes/deep-thinker/behavior.tlon +20 -0
  304. tlon_impact-0.0.1a0/src/tlon/prototypes/deep-thinker/prototype.tlon +4 -0
  305. tlon_impact-0.0.1a0/src/tlon/prototypes/developer/behavior.tlon +1 -0
  306. tlon_impact-0.0.1a0/src/tlon/prototypes/developer/prototype.tlon +5 -0
  307. tlon_impact-0.0.1a0/src/tlon/prototypes/fast-responder/behavior.tlon +15 -0
  308. tlon_impact-0.0.1a0/src/tlon/prototypes/fast-responder/prototype.tlon +4 -0
  309. tlon_impact-0.0.1a0/src/tlon/prototypes/ops/behavior.tlon +1 -0
  310. tlon_impact-0.0.1a0/src/tlon/prototypes/ops/prototype.tlon +5 -0
  311. tlon_impact-0.0.1a0/src/tlon/prototypes/pm/behavior.tlon +1 -0
  312. tlon_impact-0.0.1a0/src/tlon/prototypes/pm/prototype.tlon +5 -0
  313. tlon_impact-0.0.1a0/src/tlon/prototypes/product/behavior.tlon +1 -0
  314. tlon_impact-0.0.1a0/src/tlon/prototypes/product/prototype.tlon +5 -0
  315. tlon_impact-0.0.1a0/src/tlon/prototypes/relay/behavior.tlon +9 -0
  316. tlon_impact-0.0.1a0/src/tlon/prototypes/relay/prototype.tlon +4 -0
  317. tlon_impact-0.0.1a0/src/tlon/prototypes/scribe/behavior.tlon +18 -0
  318. tlon_impact-0.0.1a0/src/tlon/prototypes/scribe/prototype.tlon +4 -0
  319. tlon_impact-0.0.1a0/src/tlon/prototypes/support/behavior.tlon +1 -0
  320. tlon_impact-0.0.1a0/src/tlon/prototypes/support/prototype.tlon +5 -0
  321. tlon_impact-0.0.1a0/src/tlon/sandbox/__init__.py +0 -0
  322. tlon_impact-0.0.1a0/src/tlon/sandbox/device.py +179 -0
  323. tlon_impact-0.0.1a0/src/tlon/sandbox/docker_client.py +57 -0
  324. tlon_impact-0.0.1a0/src/tlon/sandbox/docker_runtime.py +764 -0
  325. tlon_impact-0.0.1a0/src/tlon/sandbox/resource_monitor.py +242 -0
  326. tlon_impact-0.0.1a0/src/tlon/skills/__init__.py +8 -0
  327. tlon_impact-0.0.1a0/src/tlon/skills/explain-decision/SKILL.md +41 -0
  328. tlon_impact-0.0.1a0/src/tlon/tools/__init__.py +1 -0
  329. tlon_impact-0.0.1a0/src/tlon/tools/agents/__init__.py +7 -0
  330. tlon_impact-0.0.1a0/src/tlon/tools/agents/list_agents.py +46 -0
  331. tlon_impact-0.0.1a0/src/tlon/tools/agents/ports.py +83 -0
  332. tlon_impact-0.0.1a0/src/tlon/tools/agents/propose_behavior.py +282 -0
  333. tlon_impact-0.0.1a0/src/tlon/tools/agents/propose_capability.py +264 -0
  334. tlon_impact-0.0.1a0/src/tlon/tools/agents/spawn_agent.py +110 -0
  335. tlon_impact-0.0.1a0/src/tlon/tools/agents/stop_agent.py +78 -0
  336. tlon_impact-0.0.1a0/src/tlon/tools/agents/write_prototype.py +250 -0
  337. tlon_impact-0.0.1a0/src/tlon/tools/base.py +191 -0
  338. tlon_impact-0.0.1a0/src/tlon/tools/filesystem/__init__.py +4 -0
  339. tlon_impact-0.0.1a0/src/tlon/tools/filesystem/archive.py +85 -0
  340. tlon_impact-0.0.1a0/src/tlon/tools/filesystem/edit_file.py +183 -0
  341. tlon_impact-0.0.1a0/src/tlon/tools/filesystem/list_directory.py +159 -0
  342. tlon_impact-0.0.1a0/src/tlon/tools/filesystem/path_guard.py +71 -0
  343. tlon_impact-0.0.1a0/src/tlon/tools/filesystem/read_file.py +162 -0
  344. tlon_impact-0.0.1a0/src/tlon/tools/filesystem/search_files.py +231 -0
  345. tlon_impact-0.0.1a0/src/tlon/tools/filesystem/write_file.py +133 -0
  346. tlon_impact-0.0.1a0/src/tlon/tools/mail/__init__.py +4 -0
  347. tlon_impact-0.0.1a0/src/tlon/tools/mail/ports.py +16 -0
  348. tlon_impact-0.0.1a0/src/tlon/tools/mail/search_mails.py +165 -0
  349. tlon_impact-0.0.1a0/src/tlon/tools/mail/send_email.py +149 -0
  350. tlon_impact-0.0.1a0/src/tlon/tools/mail/silence.py +52 -0
  351. tlon_impact-0.0.1a0/src/tlon/tools/memory/__init__.py +0 -0
  352. tlon_impact-0.0.1a0/src/tlon/tools/memory/forget_memory.py +67 -0
  353. tlon_impact-0.0.1a0/src/tlon/tools/memory/read_session.py +157 -0
  354. tlon_impact-0.0.1a0/src/tlon/tools/memory/remember_fact.py +73 -0
  355. tlon_impact-0.0.1a0/src/tlon/tools/memory/search_memories.py +70 -0
  356. tlon_impact-0.0.1a0/src/tlon/tools/observability/__init__.py +1 -0
  357. tlon_impact-0.0.1a0/src/tlon/tools/observability/get_metrics.py +47 -0
  358. tlon_impact-0.0.1a0/src/tlon/tools/observability/mail_stats.py +56 -0
  359. tlon_impact-0.0.1a0/src/tlon/tools/observability/ports.py +28 -0
  360. tlon_impact-0.0.1a0/src/tlon/tools/observability/reputation.py +68 -0
  361. tlon_impact-0.0.1a0/src/tlon/tools/observability/social_health.py +55 -0
  362. tlon_impact-0.0.1a0/src/tlon/tools/observability/traces.py +151 -0
  363. tlon_impact-0.0.1a0/src/tlon/tools/prototypes/__init__.py +4 -0
  364. tlon_impact-0.0.1a0/src/tlon/tools/prototypes/get_lineage.py +54 -0
  365. tlon_impact-0.0.1a0/src/tlon/tools/prototypes/list_prototypes.py +53 -0
  366. tlon_impact-0.0.1a0/src/tlon/tools/prototypes/list_staging.py +54 -0
  367. tlon_impact-0.0.1a0/src/tlon/tools/prototypes/ports.py +48 -0
  368. tlon_impact-0.0.1a0/src/tlon/tools/prototypes/review_prototype.py +188 -0
  369. tlon_impact-0.0.1a0/src/tlon/tools/shell/__init__.py +0 -0
  370. tlon_impact-0.0.1a0/src/tlon/tools/shell/execute_bash.py +259 -0
  371. tlon_impact-0.0.1a0/src/tlon/tools/spill.py +110 -0
  372. tlon_impact-0.0.1a0/src/tlon/tools/system/__init__.py +1 -0
  373. tlon_impact-0.0.1a0/src/tlon/tools/system/current_time.py +45 -0
  374. tlon_impact-0.0.1a0/src/tlon/tools/tasks/__init__.py +4 -0
  375. tlon_impact-0.0.1a0/src/tlon/tools/tasks/complete_task.py +99 -0
  376. tlon_impact-0.0.1a0/src/tlon/tools/tasks/create_task.py +75 -0
  377. tlon_impact-0.0.1a0/src/tlon/tools/tasks/get_current_task.py +73 -0
  378. tlon_impact-0.0.1a0/src/tlon/tools/tasks/list_tasks.py +82 -0
  379. tlon_impact-0.0.1a0/src/tlon/tools/tasks/manager.py +284 -0
  380. tlon_impact-0.0.1a0/src/tlon/tools/tasks/models.py +123 -0
  381. tlon_impact-0.0.1a0/src/tlon/tools/tasks/pause_task.py +97 -0
  382. tlon_impact-0.0.1a0/src/tlon/tools/tasks/remove_task.py +80 -0
  383. tlon_impact-0.0.1a0/src/tlon/tools/tasks/start_task.py +75 -0
  384. tlon_impact-0.0.1a0/src/tlon_client/__init__.py +1 -0
  385. tlon_impact-0.0.1a0/src/tlon_client/sdk/__init__.py +20 -0
  386. tlon_impact-0.0.1a0/src/tlon_client/sdk/adapter.py +249 -0
  387. tlon_impact-0.0.1a0/src/tlon_client/sdk/base_client.py +765 -0
  388. tlon_impact-0.0.1a0/src/tlon_client/sdk/client.py +455 -0
  389. tlon_impact-0.0.1a0/src/tlon_client/sdk/exceptions.py +56 -0
  390. tlon_impact-0.0.1a0/src/tlon_client/telegram/__init__.py +16 -0
  391. tlon_impact-0.0.1a0/src/tlon_client/telegram/bot.py +336 -0
  392. tlon_impact-0.0.1a0/src/tlon_client/telegram/reply_map.py +153 -0
  393. tlon_impact-0.0.1a0/src/tlon_launcher/__init__.py +1 -0
  394. tlon_impact-0.0.1a0/src/tlon_launcher/commands/__init__.py +7 -0
  395. tlon_impact-0.0.1a0/src/tlon_launcher/commands/dream.py +37 -0
  396. tlon_impact-0.0.1a0/src/tlon_launcher/commands/ops.py +100 -0
  397. tlon_impact-0.0.1a0/src/tlon_launcher/commands/telegram.py +74 -0
  398. tlon_impact-0.0.1a0/src/tlon_launcher/main.py +205 -0
  399. tlon_impact-0.0.1a0/src/tlon_server/__init__.py +4 -0
  400. tlon_impact-0.0.1a0/src/tlon_server/api/__init__.py +4 -0
  401. tlon_impact-0.0.1a0/src/tlon_server/api/rest/__init__.py +25 -0
  402. tlon_impact-0.0.1a0/src/tlon_server/api/rest/admin_agents.py +223 -0
  403. tlon_impact-0.0.1a0/src/tlon_server/api/rest/admin_arena.py +128 -0
  404. tlon_impact-0.0.1a0/src/tlon_server/api/rest/admin_capabilities.py +172 -0
  405. tlon_impact-0.0.1a0/src/tlon_server/api/rest/admin_llm.py +66 -0
  406. tlon_impact-0.0.1a0/src/tlon_server/api/rest/admin_prototypes.py +289 -0
  407. tlon_impact-0.0.1a0/src/tlon_server/api/rest/app.py +544 -0
  408. tlon_impact-0.0.1a0/src/tlon_server/api/rest/common.py +105 -0
  409. tlon_impact-0.0.1a0/src/tlon_server/api/rest/github.py +91 -0
  410. tlon_impact-0.0.1a0/src/tlon_server/api/rest/mail.py +143 -0
  411. tlon_impact-0.0.1a0/src/tlon_server/api/rest/observability.py +149 -0
  412. tlon_impact-0.0.1a0/src/tlon_server/api/rest/sessions.py +436 -0
  413. tlon_impact-0.0.1a0/src/tlon_server/api/send_mail.py +71 -0
  414. tlon_impact-0.0.1a0/src/tlon_server/core/__init__.py +0 -0
  415. tlon_impact-0.0.1a0/src/tlon_server/core/client_gateway.py +282 -0
  416. tlon_impact-0.0.1a0/src/tlon_server/core/member_directory.py +131 -0
  417. tlon_impact-0.0.1a0/src/tlon_server/core/notification_service.py +353 -0
  418. tlon_impact-0.0.1a0/src/tlon_server/core/session_manager.py +177 -0
  419. tlon_impact-0.0.1a0/src/tlon_server/serverapp.py +341 -0
  420. tlon_impact-0.0.1a0/src/tlon_server/webui_dist/assets/index-DG5gqEkb.js +40 -0
  421. tlon_impact-0.0.1a0/src/tlon_server/webui_dist/assets/index-DVtVz4K4.css +1 -0
  422. tlon_impact-0.0.1a0/src/tlon_server/webui_dist/index.html +14 -0
  423. tlon_impact-0.0.1a0/src/tlosure/__init__.py +1 -0
  424. tlon_impact-0.0.1a0/src/tlosure/builtins.py +336 -0
  425. tlon_impact-0.0.1a0/src/tlosure/edn.py +336 -0
  426. tlon_impact-0.0.1a0/src/tlosure/eval.py +451 -0
  427. tlon_impact-0.0.1a0/src/tlosure/validate.py +354 -0
  428. tlon_impact-0.0.1a0/uv.lock +2760 -0
@@ -0,0 +1,68 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments
24
+ .venv
25
+ venv/
26
+ env/
27
+
28
+ # IDEs
29
+ .idea/
30
+ .vscode/
31
+ *.swp
32
+ *.swo
33
+
34
+ # Environment
35
+ .env
36
+ .env.local
37
+
38
+ # Data
39
+ data/agents/
40
+ data/chat_history/
41
+ data/csp/
42
+ !data/.gitkeep
43
+
44
+ # Node
45
+ apps/operator/node_modules/
46
+ apps/operator/dist/
47
+ apps/webui/node_modules/
48
+ apps/webui/dist/
49
+ apps/webui/.vite/
50
+ # WebUI dist synced into the package by scripts/build_package.sh at build time
51
+ src/tlon_server/webui_dist/
52
+ # apps/webui/src/lib/ holds ported pure-logic modules; the Python-template
53
+ # "lib/" rule above would otherwise ignore it.
54
+ !apps/webui/src/lib/
55
+
56
+ # Testing
57
+ .pytest_cache/
58
+ .ruff_cache/
59
+ .coverage
60
+ htmlcov/
61
+
62
+ # OS
63
+ .DS_Store
64
+ Thumbs.db
65
+
66
+ # Claude
67
+ .claude/worktrees/
68
+ .claude/
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,102 @@
1
+ Metadata-Version: 2.5
2
+ Name: tlon-impact
3
+ Version: 0.0.1-alpha
4
+ Summary: Self-evolving agents, towards AGI
5
+ Author-email: Developer <dev@example.com>
6
+ Keywords: agent,ai,chatbot,collaboration,docker
7
+ Classifier: Development Status :: 3 - Alpha
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Requires-Python: >=3.11
13
+ Requires-Dist: aiofiles>=23.0.0
14
+ Requires-Dist: aiohttp>=3.9.0
15
+ Requires-Dist: croniter>=6.2.4
16
+ Requires-Dist: docker>=6.0.0
17
+ Requires-Dist: litellm==1.98.*
18
+ Requires-Dist: opentelemetry-sdk>=1.30
19
+ Requires-Dist: pydantic>=2.0.0
20
+ Requires-Dist: python-dotenv>=1.0.0
21
+ Requires-Dist: pyyaml>=6.0
22
+ Requires-Dist: sqlite-vec>=0.1.9
23
+ Requires-Dist: structlog>=23.0.0
24
+ Provides-Extra: otlp
25
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.30; extra == 'otlp'
26
+ Provides-Extra: telegram
27
+ Requires-Dist: python-telegram-bot>=21; extra == 'telegram'
28
+ Description-Content-Type: text/markdown
29
+
30
+ # Tlon
31
+
32
+ 一个让 **agent 社会自进化**的多智能体协作系统:一组 agent 以邮件为唯一通信方式,模拟一个软件工程团队;人类不是管理员,而是以普通成员身份加入同一个邮件网络。
33
+
34
+ ## 愿景
35
+
36
+ > **让 agent 社会实现自进化**:不依赖人类修改代码,新的行为、新的能力、新的成员从社会内部生长出来,整个社会随时间变得更好。判断标准只有一条——**人类退得越远,社会是否依然进步**。完整愿景见 [docs/vision.md](./docs/vision.md)。
37
+
38
+ 两条哲学支柱:
39
+
40
+ - **行为即数据**——进化要求基因型可写。agent 的行为不是代码,而是用一门受限 DSL(EDN)描述的数据:可解析、可校验、可被 agent 自己阅读、书写、传递。这门语言被**故意**设计得受限——可停机、无副作用、只能组合已有机制——因为只有足够安全,才配交给 agent 自己书写。
41
+ - **书信共和国**——进化不发生在个体内部,而发生在种群之中。成员凭名字相互寻址,信件持久、可检索、可流传,知识在书信中积累而不是随会话蒸发。人类通过同样的信件参与、评价、影响——历史上的学者共同体正是用这套结构让知识社会自我改进的。
42
+
43
+ ## 快速开始
44
+
45
+ ```bash
46
+ # 1. 安装依赖
47
+ uv sync
48
+
49
+ # 2. 配置环境(首次使用)
50
+ # 在 ~/.tlon/.env 按 provider 写 API key(用哪家的模型配哪家的):
51
+ mkdir -p ~/.tlon && 在 ~/.tlon/.env 写 MOONSHOT_API_KEY=...(或 DEEPSEEK_API_KEY=... 等 {PROVIDER}_API_KEY)
52
+ # (或用真实环境变量,.env 仅作便捷层;模型是成员级配置,创建成员时选择)
53
+
54
+ # 3. 运行——两个终端
55
+ uv run tlon dream # 终端 1:服务端(REST + SSE,默认 127.0.0.1:8080)
56
+ # 首次启动是空社会 + 原型库(ADR 0016),不自动建成员
57
+ # 启动 banner 会打印 WebUI 地址(http://127.0.0.1:8080/ui/)
58
+ uv run tlon ops # 终端 2:Operator TUI(人类邮件主界面 + 成员/原型管理)
59
+ # 或者用浏览器 WebUI(cyberpunk 风格,功能与 TUI 对齐 + Logs 视图):
60
+ # cd apps/webui && npm install && npm run build # 首次构建,之后由 dream 托管于 /ui/
61
+ # 在 WebUI 的 AGENTS 视图 CREATE 创建第一个成员(选原型 + 填 provider/model 模型)
62
+
63
+ # 4. 发第一封信:在 TUI 的 Mail 视图按 c,给刚创建的成员写信
64
+
65
+ # 5. Telegram 客户端(可选,手机收发邮件)
66
+ uv sync --extra telegram
67
+ # ~/.tlon/.env 配置:
68
+ # TELEGRAM_BOT_TOKEN=<@BotFather 颁发的 token>
69
+ # TELEGRAM_ALLOWED_USERS=<你的 Telegram user_id,逗号分隔;给 bot 发条消息后访问
70
+ # https://api.telegram.org/bot<token>/getUpdates 可查到自己的 user_id>
71
+ uv run tlon telegram # 白名单外消息一律忽略
72
+ # 真机自验:手机对 bot /send <成员名> <内容> → agent 收到并回信、手机收到推送 →
73
+ # 对推送点「回复」→ agent 收到带 in_reply_to 的回信;/inbox 看未读
74
+ ```
75
+
76
+ 完整走查(含常见问题排查)见 [docs/guides/quickstart.md](./docs/guides/quickstart.md)。
77
+
78
+ ## 架构速览
79
+
80
+ Tlon 的架构围绕三个支柱——**DSL**(行为如何描述)、**Runtime**(行为如何执行)、**邮件**(成员如何通信):
81
+
82
+ **DSL——行为即数据。** 每个成员的全部行为是一份 EDN 规约(`config/behavior.tlon`):规则 = `:on` + `:when` + `:loop` / `:actions`。受限设计——可停机、无副作用、只能组合已有机制——让这份数据安全到足以交给 agent 自己书写;启动集合、唤醒门控全部由 spec 派生,从不存储冗余值。
83
+
84
+ **Runtime——行为如何执行。** `MemberRuntime` 是统一解释器:带 `:loop` 规则的成员挂认知循环(think / plan / act / critique / revise 五个 stage 是纯变换,外部效果声明在 `StageOutcome`、由 `EffectExecutor` 执行,迭代上限保证停机);无 `:loop` 的规则只跑 `:actions`,零 token。`AgentRegistry` 是纯机制,策略只有一个实例 Adam——本身也是一段 spec。
85
+
86
+ **邮件——成员如何通信。** 邮件是唯一通道:agent 发信只有一个出口(`sendEmail` 工具),人类以普通成员身份加入同一网络。邮箱是磁盘文件(`inbox.jsonl` / `sent.jsonl` / `inbox.cursor`),先持久化、后处理;`all@tlon.internal` 广播、退信、离线等待都是书信共和国的机制。
87
+
88
+ 系统是单进程 asyncio:一个服务端(`tlon dream`)暴露一个 aiohttp 端口(REST + SSE,无 WebSocket),组件间只经 `EventBus` 通信(per-subscriber 有界队列)。代码按客户端 / 服务端装配 / 领域 / 基础设施四层组织,详细分层、装配顺序与数据流见 [docs/architecture.md](./docs/architecture.md)。
89
+
90
+ ## 文档地图
91
+
92
+ | 文档 | 内容 |
93
+ |---|---|
94
+ | [docs/vision.md](./docs/vision.md) | 愿景、哲学、路线 |
95
+ | [docs/architecture.md](./docs/architecture.md) | 分层、依赖方向、装配、运行时数据流、存储布局 |
96
+ | [docs/design/](./docs/design) | 各域设计取舍:DSL / 运行时 / 邮件 / 记忆 / 原型 / 协议 |
97
+ | [docs/reference/](./docs/reference) | 参考手册:DSL 语法 / 配置 / 工具 / REST+SSE API |
98
+ | [docs/guides/](./docs/guides) | 操作指南:快速开始 / 手写 prototype |
99
+ | [docs/decisions/](./docs/decisions) | 架构决策记录(ADR) |
100
+
101
+ 完整文件清单与分层原则见 [docs/README.md](./docs/README.md);开发协作规范见 [AGENTS.md](./AGENTS.md)。
102
+
@@ -0,0 +1,73 @@
1
+ # Tlon
2
+
3
+ 一个让 **agent 社会自进化**的多智能体协作系统:一组 agent 以邮件为唯一通信方式,模拟一个软件工程团队;人类不是管理员,而是以普通成员身份加入同一个邮件网络。
4
+
5
+ ## 愿景
6
+
7
+ > **让 agent 社会实现自进化**:不依赖人类修改代码,新的行为、新的能力、新的成员从社会内部生长出来,整个社会随时间变得更好。判断标准只有一条——**人类退得越远,社会是否依然进步**。完整愿景见 [docs/vision.md](./docs/vision.md)。
8
+
9
+ 两条哲学支柱:
10
+
11
+ - **行为即数据**——进化要求基因型可写。agent 的行为不是代码,而是用一门受限 DSL(EDN)描述的数据:可解析、可校验、可被 agent 自己阅读、书写、传递。这门语言被**故意**设计得受限——可停机、无副作用、只能组合已有机制——因为只有足够安全,才配交给 agent 自己书写。
12
+ - **书信共和国**——进化不发生在个体内部,而发生在种群之中。成员凭名字相互寻址,信件持久、可检索、可流传,知识在书信中积累而不是随会话蒸发。人类通过同样的信件参与、评价、影响——历史上的学者共同体正是用这套结构让知识社会自我改进的。
13
+
14
+ ## 快速开始
15
+
16
+ ```bash
17
+ # 1. 安装依赖
18
+ uv sync
19
+
20
+ # 2. 配置环境(首次使用)
21
+ # 在 ~/.tlon/.env 按 provider 写 API key(用哪家的模型配哪家的):
22
+ mkdir -p ~/.tlon && 在 ~/.tlon/.env 写 MOONSHOT_API_KEY=...(或 DEEPSEEK_API_KEY=... 等 {PROVIDER}_API_KEY)
23
+ # (或用真实环境变量,.env 仅作便捷层;模型是成员级配置,创建成员时选择)
24
+
25
+ # 3. 运行——两个终端
26
+ uv run tlon dream # 终端 1:服务端(REST + SSE,默认 127.0.0.1:8080)
27
+ # 首次启动是空社会 + 原型库(ADR 0016),不自动建成员
28
+ # 启动 banner 会打印 WebUI 地址(http://127.0.0.1:8080/ui/)
29
+ uv run tlon ops # 终端 2:Operator TUI(人类邮件主界面 + 成员/原型管理)
30
+ # 或者用浏览器 WebUI(cyberpunk 风格,功能与 TUI 对齐 + Logs 视图):
31
+ # cd apps/webui && npm install && npm run build # 首次构建,之后由 dream 托管于 /ui/
32
+ # 在 WebUI 的 AGENTS 视图 CREATE 创建第一个成员(选原型 + 填 provider/model 模型)
33
+
34
+ # 4. 发第一封信:在 TUI 的 Mail 视图按 c,给刚创建的成员写信
35
+
36
+ # 5. Telegram 客户端(可选,手机收发邮件)
37
+ uv sync --extra telegram
38
+ # ~/.tlon/.env 配置:
39
+ # TELEGRAM_BOT_TOKEN=<@BotFather 颁发的 token>
40
+ # TELEGRAM_ALLOWED_USERS=<你的 Telegram user_id,逗号分隔;给 bot 发条消息后访问
41
+ # https://api.telegram.org/bot<token>/getUpdates 可查到自己的 user_id>
42
+ uv run tlon telegram # 白名单外消息一律忽略
43
+ # 真机自验:手机对 bot /send <成员名> <内容> → agent 收到并回信、手机收到推送 →
44
+ # 对推送点「回复」→ agent 收到带 in_reply_to 的回信;/inbox 看未读
45
+ ```
46
+
47
+ 完整走查(含常见问题排查)见 [docs/guides/quickstart.md](./docs/guides/quickstart.md)。
48
+
49
+ ## 架构速览
50
+
51
+ Tlon 的架构围绕三个支柱——**DSL**(行为如何描述)、**Runtime**(行为如何执行)、**邮件**(成员如何通信):
52
+
53
+ **DSL——行为即数据。** 每个成员的全部行为是一份 EDN 规约(`config/behavior.tlon`):规则 = `:on` + `:when` + `:loop` / `:actions`。受限设计——可停机、无副作用、只能组合已有机制——让这份数据安全到足以交给 agent 自己书写;启动集合、唤醒门控全部由 spec 派生,从不存储冗余值。
54
+
55
+ **Runtime——行为如何执行。** `MemberRuntime` 是统一解释器:带 `:loop` 规则的成员挂认知循环(think / plan / act / critique / revise 五个 stage 是纯变换,外部效果声明在 `StageOutcome`、由 `EffectExecutor` 执行,迭代上限保证停机);无 `:loop` 的规则只跑 `:actions`,零 token。`AgentRegistry` 是纯机制,策略只有一个实例 Adam——本身也是一段 spec。
56
+
57
+ **邮件——成员如何通信。** 邮件是唯一通道:agent 发信只有一个出口(`sendEmail` 工具),人类以普通成员身份加入同一网络。邮箱是磁盘文件(`inbox.jsonl` / `sent.jsonl` / `inbox.cursor`),先持久化、后处理;`all@tlon.internal` 广播、退信、离线等待都是书信共和国的机制。
58
+
59
+ 系统是单进程 asyncio:一个服务端(`tlon dream`)暴露一个 aiohttp 端口(REST + SSE,无 WebSocket),组件间只经 `EventBus` 通信(per-subscriber 有界队列)。代码按客户端 / 服务端装配 / 领域 / 基础设施四层组织,详细分层、装配顺序与数据流见 [docs/architecture.md](./docs/architecture.md)。
60
+
61
+ ## 文档地图
62
+
63
+ | 文档 | 内容 |
64
+ |---|---|
65
+ | [docs/vision.md](./docs/vision.md) | 愿景、哲学、路线 |
66
+ | [docs/architecture.md](./docs/architecture.md) | 分层、依赖方向、装配、运行时数据流、存储布局 |
67
+ | [docs/design/](./docs/design) | 各域设计取舍:DSL / 运行时 / 邮件 / 记忆 / 原型 / 协议 |
68
+ | [docs/reference/](./docs/reference) | 参考手册:DSL 语法 / 配置 / 工具 / REST+SSE API |
69
+ | [docs/guides/](./docs/guides) | 操作指南:快速开始 / 手写 prototype |
70
+ | [docs/decisions/](./docs/decisions) | 架构决策记录(ADR) |
71
+
72
+ 完整文件清单与分层原则见 [docs/README.md](./docs/README.md);开发协作规范见 [AGENTS.md](./AGENTS.md)。
73
+
@@ -0,0 +1,54 @@
1
+ # Tlon 文档地图
2
+
3
+ 语言:全中文;代码标识符、EDN 关键字、API 字段名保持原文。
4
+
5
+ ## 分层原则
6
+
7
+ | 层 | 回答 | 变化频率 | 更新触发 |
8
+ |---|---|---|---|
9
+ | [vision.md](./vision.md) | 为什么做 | 慢 | 方向讨论拍板后 |
10
+ | [architecture.md](./architecture.md) | 系统骨架是什么 | 慢 | 分层/装配/通信结构变化 |
11
+ | [design/](./design) | 各域为什么这样设计 | 中 | 对应域的设计决策变化 |
12
+ | [reference/](./reference) | 怎么写/怎么配/怎么调 | 快 | 代码变化时**必须同步** |
13
+ | [guides/](./guides) | 怎么做某件事 | 中 | 对应流程变化 |
14
+ | [decisions/](./decisions) | 当初为什么这样定(ADR) | 只增不改 | 新决策拍板;废止用删除线或新 ADR 覆盖 |
15
+
16
+ 规则:
17
+
18
+ - 引用代码时写**文件路径 + 符号名**(如 [agents/member_spec.py](../src/tlon/agents/member_spec.py) 的 `MemberSpec`),不写行号——行号会随修改漂移。
19
+ - reference 类文档未来会进 prompt,按精确、自包含的标准写。
20
+ - 不写未实现的规划进 reference;规划只放 [vision.md](./vision.md) 和对应 design 文档的"方向"小节。
21
+ - 文档与代码同步是验收标准的一部分(见根目录 AGENTS.md)。
22
+
23
+ ## 文件清单
24
+
25
+ | 文件 | 内容 | 状态 |
26
+ |---|---|---|
27
+ | [vision.md](./vision.md) | 愿景、哲学、路线 | ✅ |
28
+ | [architecture.md](./architecture.md) | 分层、依赖方向、装配、运行时数据流、存储布局 | ✅ |
29
+ | [design/dsl.md](./design/dsl.md) | DSL 设计哲学:为何 EDN、为何受限、机制/策略分离 | ✅ |
30
+ | [design/runtime.md](./design/runtime.md) | MemberRuntime、认知循环、stage、effects-as-data | ✅ |
31
+ | [design/mail.md](./design/mail.md) | Republic of Letters:投递、线程、唤醒、人类接入 | ✅ |
32
+ | [design/memory.md](./design/memory.md) | 双层记忆与 Summarizer | ✅ |
33
+ | [design/prototypes.md](./design/prototypes.md) | 原型库、spawn、信任分级 | ✅ |
34
+ | [design/unified-member-model.md](./design/unified-member-model.md) | **统一成员模型**(2026-08 拍板并实施):一类成员 + 世代更替,概念、9 条决策与代码锚点 | ✅ |
35
+ | [design/server-protocol.md](./design/server-protocol.md) | REST + SSE 协议 v2 的设计取舍 | ✅ |
36
+ | [design/webui.md](./design/webui.md) | WebUI(apps/webui):React+Vite、/ui/ 静态托管、cyberpunk 视觉规范 | ✅ |
37
+ | [design/deepseek-harness-review.md](./design/deepseek-harness-review.md) | 外部调研:dsh 对 Tlon 的可借鉴点(方向讨论输入材料,非决策) | ✅ |
38
+ | [design/skills.md](./design/skills.md) | Skill 能力:开放标准 SKILL.md、三层目录、progressive disclosure | ✅ |
39
+ | [design/execution-device.md](./design/execution-device.md) | Execution device 设计哲学:能力阶梯、五条宪法、DockerRuntime 现状评估与加固方向 | ✅ |
40
+ | [design/telegram.md](./design/telegram.md) | Telegram 客户端(MVP):单用户白名单、回复式收发、SDK 接入 | ✅ |
41
+ | [design/bridge-api.md](./design/bridge-api.md) | Bridge API:Python 机制底座 ↔ tlosure 策略层的桥——四类端口、版本纪律、四阶段迁移路线 | ✅ |
42
+ | [design/society-policy.md](./design/society-policy.md) | 社会政策语境:policy.tlon、pull 型求值点、数据物化注入、fitness/trust 政策数据化 | ✅ |
43
+ | [design/arena.md](./design/arena.md) | 演武场:staging 原型的动态行为评估——隔离宇宙架构、运行协议、语料、报告、成本界 | ✅ |
44
+ | [design/capabilities.md](./design/capabilities.md) | 能力数据化:复合能力成为 tlosure 函数 artifact——env 契约、纯度分区、staging 复用、词汇桥、退役纪律 | ✅ |
45
+ | [reference/tlosure-reference.md](./reference/tlosure-reference.md) | tlosure 语言核心:EDN 语法、求值器、燃料计量、特殊形式、通用词汇 | ✅ |
46
+ | [reference/dsl-reference.md](./reference/dsl-reference.md) | tlon 宿主侧:MemberSpec 全字段、领域 builtin、stage/section 清单 | ✅ |
47
+ | [reference/config-reference.md](./reference/config-reference.md) | agent.yaml、环境变量、`~/.tlon` 目录布局 | ✅ |
48
+ | [reference/tools-reference.md](./reference/tools-reference.md) | 全部工具的参数与语义 | ✅ |
49
+ | [reference/api-reference.md](./reference/api-reference.md) | REST/SSE 端点与事件帧格式 | ✅ |
50
+ | [guides/quickstart.md](./guides/quickstart.md) | uv sync → dream → ops → 第一封信 | ✅ |
51
+ | [guides/writing-a-prototype.md](./guides/writing-a-prototype.md) | 手写一个 prototype 的完整走查 | ✅ |
52
+ | [decisions/](./decisions) | ADR:0001 EDN、0002 邮件唯一通道、0003 机制/策略分离、0004 stage 纯度、0005 SSE、0006 统一成员模型、0007 session 事件溯源、0008 上下文压力、0009 working memory 退役、0010 skill 能力、0011 SCI 兼容子集、0012 litellm 传输层、0013 admin token 鉴权、0014 环境-agent 协同演化、0015 prompt 缓存、0016 成员级 LLM 配置、0017 claim 记忆、0018 DSL 抽包 tlosure、0019 runtime/server/client 拆分、0020 Bridge API、0021 tlosure 完整函数能力、0022 社会政策语境 | ✅ |
53
+
54
+ ✅ = 已写并与代码同步;📝 = 计划内未写。新增文档先登记进本表。
@@ -0,0 +1,238 @@
1
+ # Tlon 系统架构
2
+
3
+ > 统一成员模型(ADR 0006,2026-08 实施):成员只有一种;排空一律是睡眠、档案归档、成员永不删除。模型总览见 [docs/design/unified-member-model.md](./design/unified-member-model.md)。
4
+
5
+ Tlon 是一个单进程 asyncio 多智能体协作系统:一组 agent 以邮件为唯一通信方式,模拟一个软件工程团队;人类用户以普通成员身份加入同一个邮件网络。本文描述当前实现的整体结构、依赖方向、装配顺序与运行时数据流。
6
+
7
+ ## 总览
8
+
9
+ ```
10
+ ┌──────────────────────────── 客户端层 ────────────────────────────┐
11
+ │ apps/operator TypeScript/Ink TUI(tlon ops 拉起的 Node 进程) │
12
+ │ tlon_client/sdk TlonClient —— 纯协议层 SDK,不依赖 tlon 包 │
13
+ │ 任意 HTTP 客户端(REST + SSE 即可接入) │
14
+ └──────────────┬───────────────────────────────┬───────────────────┘
15
+ │ HTTP REST │ SSE(GET /events)
16
+ ┌──────────────▼───────────────────────────────▼───────────────────┐
17
+ │ 服务端装配层 tlon_server(ADR 0019:只经 tlon.api + tlon.base │
18
+ │ 触达 runtime,import-linter 固话) │
19
+ │ ServerApp —— serving 侧装配(session/notification/HTTP 生命周期)│
20
+ │ api/rest/ RESTServer —— aiohttp,REST + SSE,无 WebSocket │
21
+ │ core/ —— ClientGateway / SessionManager / NotificationService / │
22
+ │ MemberDirectory │
23
+ ├──────────────────── runtime 北向 API(tlon/api)─────────────────┤
24
+ │ members / mail / prototypes / observability / config / events │
25
+ │ 六个 domain facade + build_runtime(runtime 装配,ADR 0019) │
26
+ ├──────────────────────────── 领域层 ──────────────────────────────┤
27
+ │ agents —— AgentRegistry(机制)/ Adam(策略)/ MemberRuntime / │
28
+ │ SessionScheduler / AgentSession / LoopDriver / stages / │
29
+ │ EffectExecutor │
30
+ │ organization —— mail(Mail / Mailbox / MailDelivery / Resolver)、│
31
+ │ messaging(HumanAdapter) │
32
+ │ tools —— mail / filesystem / shell / memory / tasks / agents / │
33
+ │ prototypes / system(经 ports.py 依赖倒置) │
34
+ ├────────────────────────── 基础设施层 ────────────────────────────┤
35
+ │ base —— Component / EventBus / ConfigService / TlonPaths / │
36
+ │ LLMClient / tracing / metrics / logger │
37
+ │ memory —— claim 记忆(MemoryManager + sqlite-vec 索引) │
38
+ │ sandbox —— DockerRuntime │
39
+ └───────────────────────────────────────────────────────────────────┘
40
+ EventBus 横贯各层:组件间通信的唯一通道(发布/订阅)
41
+ ```
42
+
43
+ 整个系统只有一个服务端进程(`tlon dream`),入口 [src/tlon_launcher/main.py](../src/tlon_launcher/main.py) 的 `main`,最终由 [tlon_server/serverapp.py](../src/tlon_server/serverapp.py) 的 `run_server` 创建并运行 `ServerApp`。对外只暴露一个 aiohttp HTTP 端口:REST + SSE,默认 `127.0.0.1:8080`,路由集中在 [tlon_server/api/rest/](../src/tlon_server/api/rest) 包的 `RESTServer`(`rest/app.py` 的 `create_app` 注册全部路由,handler 按域拆在 `rest/` 各模块),没有 WebSocket。
44
+
45
+ REST 接口一览(均在 `rest/app.py` 的 `create_app` 注册):
46
+
47
+ - 消息与邮箱:`POST /messages`(人类发信)、`GET /inbox`(读自己的邮箱)
48
+ - 实时推送:`GET /events`(SSE 长连接)
49
+ - 成员与会话:`GET /agents`、`GET /agents/{agent_id}`、`GET /participants`、`GET /sessions`、`POST /sessions`
50
+ - 配置:`GET /config`、`GET /admin/config/agents`、`POST /admin/config/agents/{agent_id}/reload`(热重载)
51
+ - 可观测性:`GET /traces`、`GET /traces/{trace_id}`、`GET /metrics`、`GET /agents/{agent_id}/logs`、`GET /logs`
52
+ - 其他:`GET /health`;`GET /test/ping`、`POST /test/echo` 仅在 debug 模式注册
53
+
54
+ 客户端侧有两类接入方式:`tlon ops`([tlon_launcher/commands/ops.py](../src/tlon_launcher/commands/ops.py))定位仓库内 [apps/operator/](../apps/operator) 并以 Node 拉起这个 TypeScript/Ink TUI——优先用构建产物 `dist/cli.js`,未构建时回退 tsx 开发模式;TUI 与任意第三方客户端一样,只经 REST + SSE 与服务端通信。[tlon_client/sdk/](../src/tlon_client/sdk) 是给外部 Python 客户端用的 SDK(`client.py` 的客户端、`adapter.py` 的事件适配),契约上不依赖 `tlon` 包(日志直接用 structlog),只经 REST + SSE 与服务端通信。
55
+
56
+ 成员配置的创建与审批走服务端管理面:首启只播种原型库与技能([agents/bootstrap.py](../src/tlon/agents/bootstrap.py)),**空社会不再自动初始化标准团队**(ADR 0016)——成员由人类经管理面创建(创建时选模型,成员级 LLM 配置),成员/原型管理经 ops 的管理 API(`POST/PATCH/DELETE /admin/config/agents`、`/admin/prototypes/staging` 审批),`POST /admin/config/agents/{agent_id}/reload` 热重载单个 agent 配置。
57
+
58
+ ## 分层与依赖方向
59
+
60
+ 依赖方向由两道关卡强制:pyproject.toml 里的 import-linter 契约(`uv run lint-imports`)和 [scripts/](../scripts) 下的静态检查脚本。各包的职责与允许依赖:
61
+
62
+ | 包 | 职责 | 允许依赖 | 强制手段 |
63
+ |---|---|---|---|
64
+ | `tlosure` | DSL 语言核心(ADR 0018):EDN 解析、通用 builtin 词汇、静态校验、fuel 计量求值(tlon 领域词汇在 `tlon/agents/vocabulary.py`) | 不依赖 tlon 的任何层(最底层) | import-linter「tlosure 独立于 tlon」 |
65
+ | `tlon.base` | 组件基类、事件总线、配置、路径、日志、LLM 客户端、tracing/metrics | 不依赖任何上层 | import-linter「base 不依赖任何上层域」 |
66
+ | `tlon.memory` | claim 记忆存储、蒸馏与向量检索 | 仅 base | import-linter |
67
+ | `tlon.organization` | 邮件模型、邮箱、投递、地址解析、人类适配器 | 仅 base | import-linter |
68
+ | `tlon.sandbox` | Docker 沙箱运行时 | 仅 base | import-linter |
69
+ | `tlon.tools` | agent 可用工具(邮件/文件/Shell/记忆/任务/生命周期/原型) | base、sandbox;不依赖 agents/app/prototypes | import-linter;生命周期与原型工具经 [tools/agents/ports.py](../src/tlon/tools/agents/ports.py)、[tools/prototypes/ports.py](../src/tlon/tools/prototypes/ports.py) 声明端口,由装配层注入实现(依赖倒置) |
70
+ | `tlon.agents` | 领域核心:注册表、成员运行时、认知循环 | base/memory/organization/tools/sandbox;不依赖 app/prototypes | import-linter |
71
+ | `tlon.prototypes` | 内置行为原型库(随包携带,启动时播种到 `~/.tlon/prototypes/`) | —(无独立契约) | — |
72
+ | `tlon.api` | runtime 公共北向 API(ADR 0019):六个 domain facade + `build_runtime()` 装配 | runtime 各层;不依赖 server/client/launcher | import-linter「api 不依赖 server/client/launcher」 |
73
+ | `tlon_server` | REST/SSE handlers + 客户端连接管理 + WebUI 静态托管 | 仅 tlon.api + tlon.base(只禁直接 import) | import-linter「server 只依赖 tlon.api + tlon.base」 |
74
+ | `tlon_client` | 客户端包:`sdk/`(外部客户端用的纯协议层 SDK)、`telegram/`(Telegram bot 客户端) | sdk 不依赖 tlon;telegram 仅 sdk/第三方 | import-linter「client.sdk 不依赖 tlon」「client.telegram 只依赖 sdk/第三方」 |
75
+ | `tlon_launcher` | 命令行入口(composition root) | 仅 tlon.base + tlon_server + tlon_client | import-linter「launcher 不直摸 runtime」 |
76
+
77
+ 除 import-linter 外,[scripts/](../scripts) 下还有三个 AST 检查脚本:
78
+
79
+ - [scripts/check_architecture.py](../scripts/check_architecture.py):组件依赖只能构造器注入,禁止 setter/property 注入、运行时替换组件、隐式全局依赖。
80
+ - [scripts/check_no_reexport.py](../scripts/check_no_reexport.py):`__init__.py` 禁止 re-export,防止 IDE 重命名重构跨包静默断裂。
81
+ - [scripts/check_stage_purity.py](../scripts/check_stage_purity.py):认知循环的 stage 模块必须是纯变换,禁止直接改 session 状态(见下文「effects-as-data」)。
82
+
83
+ 组件层的规则本身写在基类文档里:[base/component.py](../src/tlon/base/component.py) 的 `Component` 要求所有依赖构造器注入、组件间只经 EventBus 通信、依赖图必须是 DAG;生命周期分 `__init__`(只存依赖)→ `initialize()`(订阅事件、起后台任务)→ `shutdown()`(反序清理)三段。
84
+
85
+ 事件总线是 [base/events/event_bus.py](../src/tlon/base/events/event_bus.py) 的 `EventBus`:每个订阅者一条有界 `asyncio.Queue`(上限 `SUBSCRIBER_QUEUE_MAX_SIZE = 1000`)加一个长驻消费 task,`publish` 只做入队、从不阻塞;慢订阅者只会积压自己的队列,溢出时丢新事件并记 `event_queue_overflow` 警告。事件类型枚举在 [base/events/event.py](../src/tlon/base/events/event.py) 的 `EventType`。语义细节:单个订阅者内严格按发布顺序逐个处理(FIFO);订阅者之间不保证顺序;处理器抛异常只记日志,不影响本订阅者的后续事件和其他订阅者;`unsubscribe` 会取消消费 task 并丢弃队列里未消费的事件;对未运行的总线 `publish` 直接抛 `RuntimeError`(fail fast)。
86
+
87
+ ## 启动与装配顺序
88
+
89
+ 装配分两段(ADR 0019),此阶段不开任何网络端口:
90
+
91
+ **runtime 段**——`build_runtime()`([api/bootstrap.py](../src/tlon/api/bootstrap.py))按依赖拓扑序构造 runtime 组件,并在其上构造六个 domain facade,返回 `Runtime` 容器:
92
+
93
+ 1. **可观测性先行**:`init_tracing` + `init_metrics`,先于任何 span 创建。
94
+ 2. **基础设施**:`seed_prototypes()`(幂等地把内置原型写入 `~/.tlon/prototypes/`,须在任何 agent 启动前)→ `EventBus` → `ConfigService` → `MetricsService` → `FileTraceStore`。
95
+ 3. **领域组件**:`AgentRegistry`(此时只按 ConfigService 里的配置 `register`,不启动 agent)→ Adam([agents/adam.py](../src/tlon/agents/adam.py) 的 `make_adam`,在注册表之后初始化并随后发出 boot 启动请求)→ `AdapterManager`(人类适配器生命周期)→ `MailDelivery`(邮件投递)→ 可选 `GitHubAdapter`(配了 webhook secret 才存在)。
96
+ 4. **facade 装配**:members / mail / prototypes / observability / config / events([api/](../src/tlon/api) 下的六个小类,构造器注入 runtime 对象,薄透传)。
97
+
98
+ **serving 段**——`ServerApp.initialize()`([tlon_server/serverapp.py](../src/tlon_server/serverapp.py))只装配自己的连接管理与 HTTP 生命周期:
99
+
100
+ 5. **客户端网关**:`SessionManager` → `NotificationService`(经 events facade 订阅 runtime 事件,不直摸 EventBus)→ `MemberDirectory`(成员通讯录,经 members/events facade 聚合)→ `ClientGateway`(协调各组件的门面)。
101
+ 6. **API 层**:构造 `RESTServer`(注入 ClientGateway 及六个 facade),尚未开始监听。
102
+ 7. 发布 `SYSTEM_STARTUP` 事件。
103
+
104
+ 随后 `ServerApp.start()` 调用 `RESTServer.start()` 才真正监听端口,然后阻塞在 shutdown 信号上。`shutdown()` 严格反序:先停 RESTServer 与 ClientGateway,再 `Runtime.shutdown()`(Adam(PID 1)先于它驱动的注册表停,EventBus 几乎最后停,tracing/metrics 收尾)。
105
+
106
+ 装配阶段不开任何端口;装配失败时 `run_server` 返回非零退出码,并在 `finally` 里走一遍 `shutdown()` 做清理。
107
+
108
+ ## 运行时数据流:一封邮件的全链路
109
+
110
+ 以「人类从客户端发一封邮件给 agent,agent 处理后回邮」为例:
111
+
112
+ 1. **人类发信(REST 入口)**。客户端 `POST /messages`,由 `rest/mail.py` 的 `handle_send_message` 处理,字段校验的唯一副本在 [tlon_server/api/send_mail.py](../src/tlon_server/api/send_mail.py) 的 `parse_send_mail_fields`。发件人身份取自请求体的 `username`;handler 经 mail facade([api/mail.py](../src/tlon/api/mail.py) 的 `MailFacade.send`)转发给 `AdapterManager`——若该人类没有在线适配器,`AdapterManager` 会建一个临时的 `HumanAdapter`([organization/messaging/human_adapter.py](../src/tlon/organization/messaging/human_adapter.py))。适配器的 `speak` 要求显式 `to`/`cc`,零可解析收件人的邮件直接拒绝;合法则构造 `Mail`([organization/mail/mail.py](../src/tlon/organization/mail/mail.py))并向 EventBus 发布 `MAIL_NEW`。
113
+
114
+ **agent 发信只有一个出口**:[tools/mail/send_email.py](../src/tlon/tools/mail/send_email.py) 的 `SendEmailTool`。认知循环里 act stage 把工具调用声明进 `StageOutcome`,由 `EffectExecutor`([agents/executor.py](../src/tlon/agents/executor.py))执行其中的 `MailEffect`——构造 `Mail`、发布 `MAIL_NEW`,与人类发信汇入同一条管道。这一步失败(`Mail` 构造被拒绝或 `MAIL_NEW` 发布失败)时,`EffectExecutor` 会把一封来自 `postmaster@tlon.internal` 的发送失败通知直接写进发件 agent 自己的收件箱并发布 `MAIL_DELIVERED`——与投递层退信同风格,但不经过 `MAIL_NEW`(通知路径不能依赖刚刚失败的那次发布),agent 在下一轮认知循环里读到它。
115
+
116
+ 2. **投递落盘**。`MailDelivery`([organization/mail/delivery.py](../src/tlon/organization/mail/delivery.py))订阅 `MAIL_NEW`,对每封邮件:把 `all@tlon.internal` 展开为全部已注册 agent 加全部已知人类;用 [organization/mail/resolver.py](../src/tlon/organization/mail/resolver.py) 的 `RecipientResolver` 把每个地址解析成成员;写入发件人的 `sent.jsonl` 和每个有效收件人的 `inbox.jsonl`(邮箱目录经 [base/paths.py](../src/tlon/base/paths.py) 的 `TlonPaths.member_mail_dir` 解析);最后按收件人逐个发布 `MAIL_DELIVERED`。进程内幂等:重复投递同一 `mail_id` 不会写第二份副本。解析不到任何人的地址会收到一封来自 `postmaster@tlon.internal` 的退信,落在发件人收件箱里——LLM 发件人可以自己读退信改地址。
117
+
118
+ 3. **收件人是 agent:唤醒或入队**。
119
+ - 若收件人未在运行,`AgentRegistry._on_mail_delivered`([agents/agent_registry.py](../src/tlon/agents/agent_registry.py))检查其 spec 是否声明了 `:on :mail-delivered`,是则发布 `AGENT_START_REQUEST{reason="wake"}` 将其唤醒。唤醒不带触发事件——邮件已持久化在收件箱,成员启动时自行扫描未读邮件。
120
+ - 若收件人在运行,`MemberRuntime`([agents/member_runtime.py](../src/tlon/agents/member_runtime.py))收到 `MAIL_DELIVERED`:先过 `:when` 门控,命中认知规则则把邮件排入 `SessionScheduler` 的有界队列(队列满时丢新邮件、保持未读,由重扫任务补拾);自己发给自己的邮件直接标记已读、永不处理。
121
+ - 启动未读扫描对积压邮件做节流:同一 thread 的未读合并为一个 session(线程内最新一封为代表,更早的标记已读、由该 session 的 mail-history 上下文覆盖);有界队列装不下的溢出邮件保持完全未读(确定性规则也一并推迟),由重扫在调度器腾出队列容量后分批补拾,直到无延期为止——积压只排队,不丢信。
122
+ - 每个认知成员有且只有一个后台重扫任务,两种节拍合一:有延期时按 5 秒轮询、随调度器排空分批补拾溢出;无延期时按 `mail_rescan_interval_seconds`(默认 15 分钟)周期重扫未读。boot 成员(`:on :boot`)从不睡眠、从不重新 boot,live 路径被丢的邮件靠这个周期重扫拾起,不用等进程重启。扫描本身幂等且不调 LLM:只 enqueue,`_scan_pending` 跳过已有 session 认领的邮件,无未读时什么都不做。
123
+
124
+ 4. **认知循环**。`SessionScheduler`([agents/scheduler.py](../src/tlon/agents/scheduler.py))把队列里的邮件排成 `AgentSession`([agents/session.py](../src/tlon/agents/session.py)),交给 `LoopDriver`([agents/loop_driver.py](../src/tlon/agents/loop_driver.py))逐步推进:think / plan / act / critique / revise 五个 stage([agents/stages/](../src/tlon/agents/stages) 下各文件)是纯函数 `Session × StageServices → StageOutcome`,循环有 `max_iterations` 硬上限,耗尽时不丢中间成果:引擎用一次额外的 LLM 调用把 session 已完成的工作蒸馏成给发件人的回信(说明做了什么、做到哪、为何没做完),蒸馏失败则回落固定文案。stage 声明的外部效果由 `EffectExecutor` 真正执行:发邮件(回到第 2 步的 `MAIL_NEW`,形成 agent 间多轮通信)、保存交互记忆、推进收件箱 cursor。stage 跑哪些、以什么顺序跑,由 spec 里 loop 规则的 `stages` 向量决定;`act` 只声明工具分发列表,并发(每个工具调用一个后台 task)是引擎的。
125
+
126
+ 一个 agent 同时可以有多个进行中的 session(多封邮件、多个线程),上限 `max_concurrent_sessions`(默认 4),超出的邮件留在有界队列里等 session 完成再逐个补位;`SessionScheduler` 负责逐个推进、回收完成与过期的 session;session 因空闲超时或 stage 异常被终止时,调度器会给触发邮件的发件人回一封固定文案的失败通知(经 `LoopDriver` 的 MailEffect → `EffectExecutor` 管道,与正常回信同一出口),保证「邮件必有回音」。agent 的整体状态在读取时从 session 集合派生,不靠回调维护。反思引擎([agents/reflection.py](../src/tlon/agents/reflection.py) 的 `ReflectionEngine`)按交互计数触发,由调度器在循环间隙经注入的 `check_reflection` 委托检查;反思跑在引擎持有的后台 task 里——进行中计入成员活跃(不会被判空闲 drain 掉),成员 shutdown 时统一取消。
127
+
128
+ 每封邮件开一个新 session,但同一线程的往复不是失忆重逢:`ContextBuilder`([agents/context_builder.py](../src/tlon/agents/context_builder.py))组装上下文时,`(thread-recap)` section 从 session journal(ADR 0007)确定性重建本线程最近一个已完成 session 的简报(触发、调了哪些工具、结论是什么),不调 LLM、不等批触发摘要;与 `mail-history` 的邮件原文互补——原文给「说了什么」,简报给「我做了什么」。只注入最近一轮,成本不随线程长度膨胀。
129
+
130
+ 5. **收件人是人类:推送或拉取**。`HumanAdapter` 与其他成员一样订阅 `MAIL_DELIVERED`,把发给自己成员 id 的邮件 fan-out 给 attach 上来的客户端会话;客户端通过 `GET /events` 的 SSE 长连接实时收信(推送侧由 [tlon_server/core/notification_service.py](../src/tlon_server/core/notification_service.py) 的 `NotificationService` 管理),也可随时 `GET /inbox` 直接读邮箱文件。人类离线时邮件留在其持久邮箱里,上线后再读。
131
+
132
+ 全链路的背压策略一致:EventBus 的 per-subscriber 队列、SessionScheduler 的邮件队列都是有界的,溢出时丢新保旧并保未读,绝不阻塞总线。
133
+
134
+ 链路追踪贯穿全程:发信时注入当前 trace,唤醒请求加入投递的 trace 树(`AgentRegistry._fulfill_wake` 续接同一 trace),span 由 [base/tracing/trace_store.py](../src/tlon/base/tracing/trace_store.py) 的 `FileTraceStore` 落盘到 `~/.tlon/shared/traces/` 的 JSONL 文件,经 `GET /traces` 查询;也可配置 OTLP endpoint 外发(可选依赖 `opentelemetry-exporter-otlp-proto-http`)。
135
+
136
+ ## 关键设计要点
137
+
138
+ ### 策略/机制分离
139
+
140
+ `AgentRegistry`([agents/agent_registry.py](../src/tlon/agents/agent_registry.py))是纯机制:装配与运行表、启动/停止请求的幂等执行(wake lock、`_waking` 去重)、空闲*事实*检测(发布 `AGENT_IDLE`,不决定后果)、成员的 spawn/stop(统一成员模型,ADR 0006:spawn 出的成员与手建成员同构,停止/排空一律是睡眠,永不删除)。spawn 预算是硬编码默认值:全局同时运行上限 `max_activations = 8`、spawn 深度 `max_spawn_depth = 3`、每 (spawner, session) 配额 `session_spawn_quota = 2`。三者只有 (spawner, session) 配额是账本,且落盘在 `~/.tlon/shared/spawn-quota.json`(原子替换写入,损坏时告警并从头开始,绝不阻碍启动):session 本身经 journal 重放跨重启存活(ADR 0007),纯内存账本会让 spawner 靠重启刷满配额,防失控闸失效。`max_activations` 是运行时事实(重启后运行表本来就空,持久化反而把死成员的激活数带进新进程)、`max_spawn_depth` 从成员 `agent.yaml` 里已持久化的 lineage(`spawn_depth`)派生,两者无需也不应落盘。
141
+
142
+ 策略只有一个实例:Adam([agents/adam.py](../src/tlon/agents/adam.py)),agent 世界的内置 init 进程(PID 1)。策略是数据而不是代码——`ADAM_SPEC_EDN` 是一段内置 MemberSpec 文本,五条规则:`:on :boot` 时对候选集合发 `AGENT_START_REQUEST{reason="boot"}`,`:on :agent-idle` 时把空闲事实转成 `AGENT_STOP_REQUEST{reason="drain"}`,`:on :agent-noisy` 时把 PublicHealthMonitor 的噪声事实转成 `AGENT_STOP_REQUEST{reason="noisy-circuit-breaker"}`(熔断:刷屏成员排空为睡眠,监控器自带的每 sender 冷却防重复),`:on :agent-spawned` 时给新成员发出生欢迎信(出生社会化是 spec 描述的行为,不是专门机制——指引新成员自查系统提示词「团队成员」段的人设与 listAgents 名册,惯例是静态文本),`:on :mail-delivered` 时对寄给 Adam 的信回固定确认信(守护者信箱:`:when` 用 `addressed-to-me?` 收窄到本人、用 `from?` 排除 postmaster 防退信循环;Adam 带真实邮箱 `~/.tlon/adam/mail/`,已读标记与 boot 未读重放免费获得)。监控器的另一项事实 `MAIL_ORPHAN_SCAN` 刻意无消费者:它是周期事实,任何无状态反应都会自身变成周期噪声(亚当 docstring 记录了该决策)。Adam 是一个普通的 `MemberRuntime` 实例,不进注册表、不出现在 MemberDirectory;依赖单向(Adam import 注册表,反之永不),DAG 保持无环。
143
+
144
+ wake-on-mail 不是策略线而是机制:注册表从成员 spec 派生唤醒资格(声明了 `:on :mail-delivered` 的睡眠收件人会被唤醒),不需要 Adam 参与。
145
+
146
+ ### spec 是唯一权威
147
+
148
+ 每个成员的行为完全由一份 spec 描述:[agents/member_spec.py](../src/tlon/agents/member_spec.py) 的 `MemberSpec`(规则 = `:on` + `:when` + 可选 `:loop` + `:actions`),落盘为每成员唯一的 `config/behavior.tlon` 文件。[agents/member_runtime.py](../src/tlon/agents/member_runtime.py) 的 `MemberRuntime` 是统一解释器;认知引擎(LoopDriver + SessionScheduler + 记忆 + 反思)只对带 `:loop` 规则的成员挂载,无 `:loop` 的规则只跑 `:actions`。boot 集合、lazy 集合、wake 门控全部从 spec 的 `:on` 规则派生。
149
+
150
+ ### effects-as-data
151
+
152
+ 认知循环里每个 stage 是纯变换,所有对外部状态的意图都声明在返回的 `StageOutcome`([agents/stages/outcome.py](../src/tlon/agents/stages/outcome.py))里。`LoopDriver` 负责应用 session 本地字段,外部效果(`MailEffect` 发信、交互记忆保存、inbox cursor 推进、工具并发分发)由 `EffectExecutor` 执行。stage 不允许碰 session 的 mutator 方法,这条纯度由 [scripts/check_stage_purity.py](../scripts/check_stage_purity.py) 静态强制——引擎与策略的边界是机器可检查的。
153
+
154
+ ### mailbox 即队列
155
+
156
+ 邮箱是磁盘上的三个文件(`inbox.jsonl` 追加写、`sent.jsonl` 追加写、`inbox.cursor` 已读 id 集合),实现见 [organization/mail/mailbox.py](../src/tlon/organization/mail/mailbox.py) 的 `Mailbox`。邮件先持久化、后处理:唤醒不携带事件载荷,成员启动时扫描未读;运行中队列溢出丢的是「新事件的拷贝」,磁盘上的未读事实不变,由成员的后台重扫任务周期补拾(下次启动也会补扫)。同一目录的多个 `Mailbox` 实例(投递缓存、REST `/inbox`、agent 运行时)共享一把按目录的 asyncio 锁(有界 LRU),进程内写互斥。未读扫描是增量的:按目录的扫描缓存(有界 LRU,与锁表同纪律)记住已解析的字节偏移与解析结果,重复扫描只解析追加部分;文件被替换(inode 变化)或截断时回落全量扫描,崩溃留下的半行不消费、下次重试。
157
+
158
+ ### DAG 组件装配
159
+
160
+ 全部组件继承 `Component`,依赖只走构造器,通信只走 EventBus;`ServerApp` 是唯一装配者。这条规则同时由 [base/component.py](../src/tlon/base/component.py) 的约定文档、[scripts/check_architecture.py](../scripts/check_architecture.py) 的静态检查和 import-linter 的依赖方向契约三层维持。
161
+
162
+ ### 记忆与沙箱
163
+
164
+ `tlon.memory` 的 `MemoryManager`([memory/manager.py](../src/tlon/memory/manager.py))为每个 agent 管理长期记忆:claim 存于 [memory/claim_store.py](../src/tlon/memory/claim_store.py)(`claims.jsonl`,append-only),批量蒸馏(journal → claims)由 [memory/distiller.py](../src/tlon/memory/distiller.py) 完成,进度以标量时间戳水位线持久化在 `distillation.json`(ADR 0017)。检索走 [memory/vector_index.py](../src/tlon/memory/vector_index.py) 的 sqlite-vec 索引(`claims_vec.db`,claims 的纯派生视图)+ [base/embedding_client.py](../src/tlon/base/embedding_client.py) 的 embedding 客户端(成员级 `llm.embedding_model_name` 配置;未配置或失败时降级时间序注入)。agent 侧通过 `tlon.tools.memory` 下的工具(`rememberFact`、`searchMemories`、`forget`)读写自己的记忆。`tlon.sandbox` 的 `DockerRuntime`([sandbox/docker_runtime.py](../src/tlon/sandbox/docker_runtime.py))封装 Docker 容器执行,供 Shell 类工具使用。
165
+
166
+ ### 工具层与依赖倒置
167
+
168
+ `tlon.tools` 按域分包:`mail`(`sendEmail`,agent 唯一发信出口)、`filesystem`(读/写/编辑/列目录/检索文件)、`shell`(`execute_bash` 及后台任务查询)、[memory](../src/tlon/memory)(记忆读写)、`tasks`(`TaskManager` 及任务生命周期工具)、[agents](../src/tlon/agents)(`spawnAgent` / `stopAgent` / `listAgents` / `writePrototype`)、`prototypes`(`listPrototypes`)、`system`(`getCurrentTime`,宿主机本地时间,不依赖沙箱)。工具的实例化与注册发生在装配成员能力时([agents/assembly.py](../src/tlon/agents/assembly.py) 的 `assemble_cognitive`,由 `AgentRegistry._start_agent` 调用);声明 `docker.level: L0` 的成员(issue #26,无执行装置)不创建 DockerRuntime,也不注册 shell/filesystem 七个装置工具;`docker.level: L1` 的成员(issue #40,文件层)创建运行时并注册 filesystem 五个工具,但不注册 shell 两个——结构性零代码执行。
169
+
170
+ 生命周期与原型工具天然需要触碰 agents/prototypes 层,但契约禁止 tools 反向依赖;解法是依赖倒置——端口与异常(`SpawnRejectedError`、`StopRejectedError` 等)声明在 [tools/agents/ports.py](../src/tlon/tools/agents/ports.py) 和 [tools/prototypes/ports.py](../src/tlon/tools/prototypes/ports.py),装配层(注册表)把自身实现注入工具实例,import 方向保持 tools → 端口,不倒流。
171
+
172
+ ### 进程级全局状态(2026-09-22 审计)
173
+
174
+ runtime 实例状态零残留:paths 单例注入改造(ADR 0019 收尾)后,文件系统访问、EventBus、注册表、投递全部是实例状态,同进程多实例由 [tests/integration/test_multi_runtime.py](../src/tests/integration/test_multi_runtime.py) 钉住(双向隔离断言是常驻哨兵)。以下进程级共享状态是**全部**存量,各有正当理由:
175
+
176
+ | 状态 | 位置 | 为什么合法 |
177
+ | --- | --- | --- |
178
+ | OTel TracerProvider + `_initialized` 守卫 | [base/tracing/otel.py](../src/tlon/base/tracing/otel.py) | OTel provider 模型本身是进程级;幂等守卫下**首调参数生效**——多实例时后续实例的 `trace_store_dir`/`otlp_endpoint` 被忽略,观测共享进程级管道(已知语义) |
179
+ | MeterProvider + `_initialized`/`_reader` | [base/metrics.py](../src/tlon/base/metrics.py) | 同上 |
180
+ | `_settings` 惰性单例 + `_paths` | [base/settings.py](../src/tlon/base/settings.py) | 进程级 env 配置(admin token、Telegram、OTel endpoint),消费方是 launcher/server 组成根 |
181
+ | `structlog.configure` | [base/logger.py](../src/tlon/base/logger.py) `configure_logging` | 进程级输出格式,仅 launcher 入口调用 |
182
+ | mailbox 锁表 `_LOCKS` 与扫描缓存 `_SCANS` | [organization/mail/mailbox.py](../src/tlon/organization/mail/mailbox.py) | **按目录绝对路径键控**的有界 LRU(cap 4096):多实例因键不同天然隔离;存在意义是同目录多 `Mailbox` 实例的写互斥与增量解析(见「mailbox 即队列」) |
183
+ | structlog contextvars | member_runtime / stages/services / spawn_agent | task-local by design,非共享状态 |
184
+
185
+ 模块级 dict/set(词汇注册表、`_ADAM_CONFIG`、各 `_CAP`)是常量,惯例不可变。审计方法:模块级赋值 + 可变容器 + 单例模式(`lru_cache`/`_instance`/`_initialized`)三轮 grep 扫描;新增全局状态应在 review 时对照本表。
186
+
187
+ ## 存储布局
188
+
189
+ 所有状态落盘在 `~/.tlon/`(可用 `$TLON_HOME` 覆盖),路径的唯一权威是 [base/paths.py](../src/tlon/base/paths.py) 的 `TlonPaths`——无模块级单例,实例在进程入口构造一次后显式注入贯穿各层(同进程可并存多个 runtime,各有独立 home);任何模块不应硬编码目录结构。仓库根目录下的 [data/](../data) 是历史遗留,当前代码不引用它。
190
+
191
+ `$TLON_HOME` 只在指向一个已存在的目录时才生效,否则回落到 `~/.tlon`(不存在则创建)——见 `paths.py` 的 `_resolve_tlon_home`。
192
+
193
+ ```
194
+ ~/.tlon/
195
+ ├── shared/
196
+ │ ├── traces/
197
+ │ │ └── trace-{uuid}.jsonl
198
+ │ └── logs/
199
+ │ └── server-{date}.jsonl
200
+ ├── prototypes/ # 行为原型库(启动时从 tlon.prototypes 播种)
201
+ ├── prototypes-staging/ # LLM 撰写、待审批的原型
202
+ ├── capabilities/ # 受信能力库(能力数据化,design/capabilities.md)
203
+ ├── capabilities-staging/ # LLM 撰写、待审批的能力(与原型同一信任闸模式)
204
+ ├── {agent_id}/
205
+ │ ├── config/
206
+ │ │ ├── agent.yaml
207
+ │ │ ├── behavior.tlon # 成员 spec(唯一权威)
208
+ │ │ ├── IDENTITY.md / SOUL.md / RULES.md
209
+ │ ├── memory/
210
+ │ │ ├── config.json
211
+ │ │ ├── claims.jsonl # 记忆 claim(ADR 0017,append-only)
212
+ │ │ └── distillation.json # 蒸馏水位线
213
+ │ ├── tasks.jsonl
214
+ │ ├── workspace/
215
+ │ └── mail/
216
+ │ ├── inbox.jsonl # 追加写
217
+ │ ├── sent.jsonl # 追加写
218
+ │ └── inbox.cursor # 已读邮件 id,每行一个
219
+ └── human-{username}/
220
+ └── mail/ # 人类的持久邮箱,布局同上
221
+ ```
222
+
223
+ 人类成员 id 为 `human:<username>`,映射到目录时冒号替换为连字符(只发生在 `TlonPaths.member_mail_dir` 一处)。
224
+
225
+ 容器视角:每个成员有两类容器(issue #25,混合方案 D';声明 `docker.level: L0` 的成员无执行装置、没有任何容器,issue #26;`docker.level: L1` 的成员只有文件柜——exec 单元从不存在,issue #40)——**文件柜**(常驻容器 `tlon-agent-{agent_id}`,创建后**从不启动**,只经 get_archive/put_archive 服务文件 I/O,不执行就不会被污染)与**一次性执行单元**(`run()` 每条命令新建 `tlon-agent-{agent_id}-exec-{uuid8}`,跑完取 stdout/stderr 即删;进程泄漏、/tmp 累积、环境污染随容器蒸发)。两类容器的创建参数同源于 [sandbox/docker_runtime.py](../src/tlon/sandbox/docker_runtime.py) 的 `_container_kwargs`:`{agent_id}/workspace/` 以读写方式 bind-mount 为工作目录(默认 `/workspace`),整个 `{agent_id}/` 家目录再以**只读**方式挂载到 `/tlon-home`——agent 经 readFile/listDirectory/searchFiles 读自己的行为定义、记忆与邮箱(行为即数据,自我感知是自进化的前提),写/编辑工具的白名单不含 `/tlon-home`,行为变更走原型提案通道。每个容器只挂自己的家目录,其他成员的家目录从不进入容器,跨 agent 读取在结构上不可能。容器 rootfs 整体只读(`read_only=True`),另有 tmpfs `/tmp`(64m)做 scratch,可写面 = `/workspace` 是内核级事实(issue #22)——跨命令唯一持久状态就是 workspace。文件柜跨睡眠/重启保留(ADR 0006),但 `ensure_running` 会做配置漂移 reconcile:实际配置与期望配置(镜像/挂载/限额/网络/ro rootfs)不符时自动移除重建,旧容器无需手工处理。
226
+
227
+ `config/` 下的三个 Markdown 人格文件(`IDENTITY.md`、`SOUL.md`、`RULES.md`)在构造 prompt 时由 [agents/context_builder.py](../src/tlon/agents/context_builder.py) 的 `ContextBuilder` 读入;`behavior.tlon` 则经 [agents/loader.py](../src/tlon/agents/loader.py) 的 `load_member_spec` 解析为 `MemberSpec` 并在加载时校验。
228
+
229
+ ## 架构约束检查工具
230
+
231
+ | 工具 | 检查内容 |
232
+ |---|---|
233
+ | `uv run lint-imports` | pyproject.toml 中 import-linter 契约:各包依赖方向(base 不依赖上层、memory/organization/sandbox 只依赖 base、tools 不反向依赖 agents/server/client/launcher/prototypes、agents 不依赖 server/client/launcher/prototypes、sdk 只依赖 base、server 只经 api+base、launcher 不直摸 runtime) |
234
+ | `uv run python scripts/check_architecture.py` | 组件 DAG 规则:只许构造器注入,禁止 setter/property 注入与运行时替换 |
235
+ | `uv run python scripts/check_no_reexport.py` | `__init__.py` 禁止 re-export |
236
+ | `uv run python scripts/check_stage_purity.py` | [agents/stages/](../src/tlon/agents/stages) 下 stage 纯度:禁止直接修改 session 状态 |
237
+
238
+ 通用质量工具(ruff、mypy strict、pytest)见 [AGENTS.md](../AGENTS.md) 的验证质量门,不属于架构约束本身。