markspace 0.2.0b0__tar.gz → 0.3.0b0__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 (373) hide show
  1. markspace-0.3.0b0/.gitattributes +5 -0
  2. {markspace-0.2.0b0 → markspace-0.3.0b0}/CITATION.cff +5 -4
  3. {markspace-0.2.0b0 → markspace-0.3.0b0}/PKG-INFO +21 -18
  4. {markspace-0.2.0b0 → markspace-0.3.0b0}/README.md +19 -16
  5. {markspace-0.2.0b0 → markspace-0.3.0b0}/docs/framework.md +36 -22
  6. markspace-0.3.0b0/docs/spec.md +1888 -0
  7. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/composition_stress/analysis.md +1 -1
  8. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/guide.md +25 -4
  9. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/analysis.md +60 -12
  10. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/analyze.py +23 -14
  11. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/animate.py +9 -3
  12. markspace-0.3.0b0/experiments/stress_test/booking_checks.py +196 -0
  13. markspace-0.3.0b0/experiments/stress_test/pacing.py +259 -0
  14. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/agents.jsonl +3 -0
  15. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/deepseek_r2048_paced.log +3 -0
  16. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/limits_raw.json +3 -0
  17. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/manifests.jsonl +3 -0
  18. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/messages.jsonl +3 -0
  19. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/pacer.jsonl +3 -0
  20. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/rounds.jsonl +3 -0
  21. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/smoke_raw_response.json +3 -0
  22. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/steps.jsonl +3 -0
  23. markspace-0.3.0b0/experiments/stress_test/results_deepseek_v4p1_flash_1017_r2048_paced/trial.jsonl +3 -0
  24. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/run.py +336 -79
  25. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/scenario.py +31 -15
  26. markspace-0.3.0b0/experiments/stress_test/stored_run_safety.py +130 -0
  27. markspace-0.3.0b0/experiments/stress_test/test_metrics.py +394 -0
  28. markspace-0.3.0b0/experiments/stress_test/test_pacing.py +851 -0
  29. markspace-0.3.0b0/experiments/stress_test/test_resolution.py +226 -0
  30. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/verify_analysis.py +32 -2
  31. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/analysis.md +23 -23
  32. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/analyze_trials.py +38 -13
  33. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/animate.py +9 -3
  34. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/analysis.md +3 -3
  35. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/verify_analysis.py +17 -7
  36. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/analysis.md +10 -10
  37. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/verify_analysis.py +13 -7
  38. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/analysis.md +15 -15
  39. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/verify_analysis.py +18 -7
  40. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/verify_analysis.py +38 -13
  41. markspace-0.3.0b0/figures/claim_states.svg +58 -0
  42. markspace-0.3.0b0/figures/competing_scopes.svg +41 -0
  43. markspace-0.3.0b0/figures/deferred_resolution.svg +75 -0
  44. markspace-0.3.0b0/figures/guard_flow.svg +53 -0
  45. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/__init__.py +7 -1
  46. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/barrier.py +32 -18
  47. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/core.py +33 -1
  48. markspace-0.3.0b0/markspace/guard.py +2299 -0
  49. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/llm.py +145 -3
  50. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/schedule.py +6 -2
  51. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/space.py +425 -67
  52. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/telemetry.py +3 -0
  53. {markspace-0.2.0b0 → markspace-0.3.0b0}/pyproject.toml +2 -2
  54. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_barrier.py +21 -0
  55. markspace-0.3.0b0/tests/test_guard.py +2391 -0
  56. markspace-0.3.0b0/tests/test_lease_histories.py +333 -0
  57. markspace-0.3.0b0/tests/test_leases.py +833 -0
  58. markspace-0.3.0b0/tests/test_llm.py +294 -0
  59. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_properties.py +325 -1
  60. markspace-0.2.0b0/.gitattributes +0 -3
  61. markspace-0.2.0b0/docs/spec.md +0 -1528
  62. markspace-0.2.0b0/markspace/guard.py +0 -1459
  63. markspace-0.2.0b0/review.md +0 -794
  64. markspace-0.2.0b0/tests/test_guard.py +0 -1326
  65. {markspace-0.2.0b0 → markspace-0.3.0b0}/.devcontainer/devcontainer.json +0 -0
  66. {markspace-0.2.0b0 → markspace-0.3.0b0}/.devcontainer/post_create.sh +0 -0
  67. {markspace-0.2.0b0 → markspace-0.3.0b0}/.env.example +0 -0
  68. {markspace-0.2.0b0 → markspace-0.3.0b0}/.github/workflows/publish.yml +0 -0
  69. {markspace-0.2.0b0 → markspace-0.3.0b0}/.gitignore +0 -0
  70. {markspace-0.2.0b0 → markspace-0.3.0b0}/.pre-commit-config.yaml +0 -0
  71. {markspace-0.2.0b0 → markspace-0.3.0b0}/.secrets.baseline +0 -0
  72. {markspace-0.2.0b0 → markspace-0.3.0b0}/LICENSE-CC-BY-4.0 +0 -0
  73. {markspace-0.2.0b0 → markspace-0.3.0b0}/LICENSE-MIT +0 -0
  74. {markspace-0.2.0b0 → markspace-0.3.0b0}/docs/figures/filter_chain.svg +0 -0
  75. {markspace-0.2.0b0 → markspace-0.3.0b0}/docs/figures/monitor_chain.svg +0 -0
  76. {markspace-0.2.0b0 → markspace-0.3.0b0}/docs/figures/sense_act.svg +0 -0
  77. {markspace-0.2.0b0 → markspace-0.3.0b0}/docs/figures/triage_pipeline.svg +0 -0
  78. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/analysis.md +0 -0
  79. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/analyze.py +0 -0
  80. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/design.md +0 -0
  81. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_42.jsonl +0 -0
  82. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_42_messages.jsonl +0 -0
  83. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_43.jsonl +0 -0
  84. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_43_messages.jsonl +0 -0
  85. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_44.jsonl +0 -0
  86. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_44_messages.jsonl +0 -0
  87. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_45.jsonl +0 -0
  88. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_45_messages.jsonl +0 -0
  89. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_46.jsonl +0 -0
  90. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_46_messages.jsonl +0 -0
  91. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_47.jsonl +0 -0
  92. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_47_messages.jsonl +0 -0
  93. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_48.jsonl +0 -0
  94. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_48_messages.jsonl +0 -0
  95. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_49.jsonl +0 -0
  96. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_49_messages.jsonl +0 -0
  97. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_50.jsonl +0 -0
  98. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_50_messages.jsonl +0 -0
  99. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_51.jsonl +0 -0
  100. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/markspace/seed_51_messages.jsonl +0 -0
  101. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_42.jsonl +0 -0
  102. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_42_messages.jsonl +0 -0
  103. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_43.jsonl +0 -0
  104. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_43_messages.jsonl +0 -0
  105. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_44.jsonl +0 -0
  106. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_44_messages.jsonl +0 -0
  107. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_45.jsonl +0 -0
  108. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_45_messages.jsonl +0 -0
  109. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_46.jsonl +0 -0
  110. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_46_messages.jsonl +0 -0
  111. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_47.jsonl +0 -0
  112. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_47_messages.jsonl +0 -0
  113. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_48.jsonl +0 -0
  114. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_48_messages.jsonl +0 -0
  115. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_49.jsonl +0 -0
  116. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_49_messages.jsonl +0 -0
  117. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_50.jsonl +0 -0
  118. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_50_messages.jsonl +0 -0
  119. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_51.jsonl +0 -0
  120. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/results/messagepassing/seed_51_messages.jsonl +0 -0
  121. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/run_markspace.py +0 -0
  122. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/run_messagepassing.py +0 -0
  123. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/comparison/verify_agentframework.py +0 -0
  124. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/composition_stress/__init__.py +0 -0
  125. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/composition_stress/pipeline.svg +0 -0
  126. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/composition_stress/run.py +0 -0
  127. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/composition_stress/verify_analysis.py +0 -0
  128. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/__init__.py +0 -0
  129. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/design.md +0 -0
  130. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/plot_final.py +0 -0
  131. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/results/agents.jsonl +0 -0
  132. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/results/fig_decay_curves.png +0 -0
  133. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/results/fig_llm_cost_scaling.png +0 -0
  134. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/results/fig_round_progression.png +0 -0
  135. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/results/fig_shared_room_contention.png +0 -0
  136. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/results/rounds.jsonl +0 -0
  137. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/results/steps.jsonl +0 -0
  138. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/stress_test/results/trial.jsonl +0 -0
  139. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/orchestrate.py +0 -0
  140. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/confidence/agents.jsonl +0 -0
  141. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/confidence/manifests.jsonl +0 -0
  142. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/confidence/messages.jsonl +0 -0
  143. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/confidence/rounds.jsonl +0 -0
  144. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/confidence/steps.jsonl +0 -0
  145. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/confidence/trial.jsonl +0 -0
  146. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/flood/agents.jsonl +0 -0
  147. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/flood/manifests.jsonl +0 -0
  148. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/flood/messages.jsonl +0 -0
  149. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/flood/rounds.jsonl +0 -0
  150. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/flood/steps.jsonl +0 -0
  151. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/flood/trial.jsonl +0 -0
  152. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/injection/agents.jsonl +0 -0
  153. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/injection/manifests.jsonl +0 -0
  154. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/injection/messages.jsonl +0 -0
  155. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/injection/rounds.jsonl +0 -0
  156. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/injection/steps.jsonl +0 -0
  157. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/gpt-oss-120b/injection/trial.jsonl +0 -0
  158. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/confidence/agents.jsonl +0 -0
  159. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/confidence/manifests.jsonl +0 -0
  160. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/confidence/messages.jsonl +0 -0
  161. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/confidence/rounds.jsonl +0 -0
  162. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/confidence/steps.jsonl +0 -0
  163. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/confidence/trial.jsonl +0 -0
  164. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/flood/agents.jsonl +0 -0
  165. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/flood/manifests.jsonl +0 -0
  166. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/flood/messages.jsonl +0 -0
  167. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/flood/rounds.jsonl +0 -0
  168. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/flood/steps.jsonl +0 -0
  169. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/flood/trial.jsonl +0 -0
  170. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/injection/agents.jsonl +0 -0
  171. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/injection/manifests.jsonl +0 -0
  172. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/injection/messages.jsonl +0 -0
  173. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/injection/rounds.jsonl +0 -0
  174. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/injection/steps.jsonl +0 -0
  175. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/mercury-2/injection/trial.jsonl +0 -0
  176. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/probe_mercury2_rejection.py +0 -0
  177. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/adversarial/probe_mercury2_results.jsonl +0 -0
  178. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/defense_combined/agents.jsonl +0 -0
  179. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/defense_combined/manifests.jsonl +0 -0
  180. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/defense_combined/messages.jsonl +0 -0
  181. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/defense_combined/rounds.jsonl +0 -0
  182. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/defense_combined/run.log +0 -0
  183. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/defense_combined/steps.jsonl +0 -0
  184. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/defense_combined/trial.jsonl +0 -0
  185. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/escalation/agents.jsonl +0 -0
  186. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/escalation/manifests.jsonl +0 -0
  187. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/escalation/messages.jsonl +0 -0
  188. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/escalation/rounds.jsonl +0 -0
  189. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/escalation/run.log +0 -0
  190. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/escalation/steps.jsonl +0 -0
  191. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/escalation/trial.jsonl +0 -0
  192. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/probe_evasion/agents.jsonl +0 -0
  193. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/probe_evasion/manifests.jsonl +0 -0
  194. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/probe_evasion/messages.jsonl +0 -0
  195. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/probe_evasion/rounds.jsonl +0 -0
  196. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/probe_evasion/run.log +0 -0
  197. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/probe_evasion/steps.jsonl +0 -0
  198. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/probe_evasion/trial.jsonl +0 -0
  199. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/rate_spike/agents.jsonl +0 -0
  200. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/rate_spike/manifests.jsonl +0 -0
  201. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/rate_spike/messages.jsonl +0 -0
  202. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/rate_spike/rounds.jsonl +0 -0
  203. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/rate_spike/run.log +0 -0
  204. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/rate_spike/steps.jsonl +0 -0
  205. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/rate_spike/trial.jsonl +0 -0
  206. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/slow_drift/agents.jsonl +0 -0
  207. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/slow_drift/manifests.jsonl +0 -0
  208. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/slow_drift/messages.jsonl +0 -0
  209. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/slow_drift/rounds.jsonl +0 -0
  210. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/slow_drift/run.log +0 -0
  211. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/slow_drift/steps.jsonl +0 -0
  212. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/slow_drift/trial.jsonl +0 -0
  213. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/type_shift/agents.jsonl +0 -0
  214. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/type_shift/manifests.jsonl +0 -0
  215. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/type_shift/messages.jsonl +0 -0
  216. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/type_shift/rounds.jsonl +0 -0
  217. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/type_shift/run.log +0 -0
  218. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/type_shift/steps.jsonl +0 -0
  219. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/defense/gpt-oss-120b/type_shift/trial.jsonl +0 -0
  220. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_42/agents.jsonl +0 -0
  221. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_42/manifests.jsonl +0 -0
  222. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_42/messages.jsonl +0 -0
  223. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_42/rounds.jsonl +0 -0
  224. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_42/steps.jsonl +0 -0
  225. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_42/trial.jsonl +0 -0
  226. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_43/agents.jsonl +0 -0
  227. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_43/manifests.jsonl +0 -0
  228. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_43/messages.jsonl +0 -0
  229. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_43/rounds.jsonl +0 -0
  230. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_43/steps.jsonl +0 -0
  231. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_43/trial.jsonl +0 -0
  232. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_44/agents.jsonl +0 -0
  233. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_44/manifests.jsonl +0 -0
  234. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_44/messages.jsonl +0 -0
  235. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_44/rounds.jsonl +0 -0
  236. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_44/steps.jsonl +0 -0
  237. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_44/trial.jsonl +0 -0
  238. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_45/agents.jsonl +0 -0
  239. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_45/manifests.jsonl +0 -0
  240. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_45/messages.jsonl +0 -0
  241. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_45/rounds.jsonl +0 -0
  242. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_45/steps.jsonl +0 -0
  243. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_45/trial.jsonl +0 -0
  244. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_46/agents.jsonl +0 -0
  245. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_46/manifests.jsonl +0 -0
  246. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_46/messages.jsonl +0 -0
  247. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_46/rounds.jsonl +0 -0
  248. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_46/steps.jsonl +0 -0
  249. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/gpt-oss-120b/seed_46/trial.jsonl +0 -0
  250. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_42/agents.jsonl +0 -0
  251. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_42/manifests.jsonl +0 -0
  252. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_42/messages.jsonl +0 -0
  253. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_42/rounds.jsonl +0 -0
  254. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_42/steps.jsonl +0 -0
  255. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_42/trial.jsonl +0 -0
  256. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_43/agents.jsonl +0 -0
  257. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_43/manifests.jsonl +0 -0
  258. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_43/messages.jsonl +0 -0
  259. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_43/rounds.jsonl +0 -0
  260. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_43/steps.jsonl +0 -0
  261. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_43/trial.jsonl +0 -0
  262. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_44/agents.jsonl +0 -0
  263. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_44/manifests.jsonl +0 -0
  264. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_44/messages.jsonl +0 -0
  265. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_44/rounds.jsonl +0 -0
  266. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_44/steps.jsonl +0 -0
  267. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_44/trial.jsonl +0 -0
  268. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_45/agents.jsonl +0 -0
  269. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_45/manifests.jsonl +0 -0
  270. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_45/messages.jsonl +0 -0
  271. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_45/rounds.jsonl +0 -0
  272. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_45/steps.jsonl +0 -0
  273. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_45/trial.jsonl +0 -0
  274. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_46/agents.jsonl +0 -0
  275. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_46/manifests.jsonl +0 -0
  276. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_46/messages.jsonl +0 -0
  277. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_46/rounds.jsonl +0 -0
  278. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_46/steps.jsonl +0 -0
  279. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/multi_trial/mercury-2/seed_46/trial.jsonl +0 -0
  280. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_200/agents.jsonl +0 -0
  281. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_200/manifests.jsonl +0 -0
  282. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_200/messages.jsonl +0 -0
  283. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_200/rounds.jsonl +0 -0
  284. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_200/steps.jsonl +0 -0
  285. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_200/trial.jsonl +0 -0
  286. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_500/agents.jsonl +0 -0
  287. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_500/manifests.jsonl +0 -0
  288. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_500/messages.jsonl +0 -0
  289. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_500/rounds.jsonl +0 -0
  290. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_500/steps.jsonl +0 -0
  291. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_contention/gpt-oss-120b/n_500/trial.jsonl +0 -0
  292. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_100/agents.jsonl +0 -0
  293. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_100/manifests.jsonl +0 -0
  294. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_100/messages.jsonl +0 -0
  295. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_100/rounds.jsonl +0 -0
  296. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_100/steps.jsonl +0 -0
  297. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_100/trial.jsonl +0 -0
  298. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_1000/agents.jsonl +0 -0
  299. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_1000/manifests.jsonl +0 -0
  300. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_1000/messages.jsonl +0 -0
  301. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_1000/rounds.jsonl +0 -0
  302. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_1000/steps.jsonl +0 -0
  303. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_1000/trial.jsonl +0 -0
  304. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/agents.jsonl +0 -0
  305. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/manifests.jsonl +0 -0
  306. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/messages.jsonl +0 -0
  307. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/rounds.jsonl +0 -0
  308. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/steps.jsonl +0 -0
  309. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/stress_test.gif +0 -0
  310. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/trial.jsonl +0 -0
  311. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/__init__.py +0 -0
  312. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/analysis.md +0 -0
  313. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/analyze.py +0 -0
  314. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/analyze_pilot.py +0 -0
  315. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/design.md +0 -0
  316. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/heatmap_concurrent_(phase_2b).png +0 -0
  317. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/heatmap_sequential_(pilot).png +0 -0
  318. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/model_performance.png +0 -0
  319. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/safety_cumulative.png +0 -0
  320. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/scaling.png +0 -0
  321. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/seq_vs_concurrent_hidden.png +0 -0
  322. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/steps_by_visibility_concurrent_(phase_2b).png +0 -0
  323. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/steps_by_visibility_sequential_(pilot).png +0 -0
  324. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/temperature_effect.png +0 -0
  325. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/figures/waste_ratio.png +0 -0
  326. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/multi-phase_design.md +0 -0
  327. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_block_self_rebook_20260228_011035.jsonl +0 -0
  328. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_exhaustion_5round_20260228_011047.jsonl +0 -0
  329. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_large_calendar_20260228_011042.jsonl +0 -0
  330. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_mercury2_conc.jsonl +0 -0
  331. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_mercury2_seq.jsonl +0 -0
  332. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_multi_phase_20260228_000031.jsonl +0 -0
  333. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_multi_phase_20260228_002622.jsonl +0 -0
  334. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_multi_phase_20260228_002718.jsonl +0 -0
  335. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_multi_phase_20260228_003006.jsonl +0 -0
  336. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_multi_phase_concurrent_20260228_005619.jsonl +0 -0
  337. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_phase2b_20260227.jsonl +0 -0
  338. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_phase3_20260227.jsonl +0 -0
  339. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_pilot_20260227.jsonl +0 -0
  340. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_test_30slots_20260228_010414.jsonl +0 -0
  341. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_test_5rounds_20260228_010721.jsonl +0 -0
  342. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/results_test_block_rebook_20260228_005941.jsonl +0 -0
  343. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/run.py +0 -0
  344. {markspace-0.2.0b0 → markspace-0.3.0b0}/experiments/validation/verify_analysis.py +0 -0
  345. {markspace-0.2.0b0 → markspace-0.3.0b0}/figures/architecture.svg +0 -0
  346. {markspace-0.2.0b0 → markspace-0.3.0b0}/figures/committee_vs_stigmergic.svg +0 -0
  347. {markspace-0.2.0b0 → markspace-0.3.0b0}/figures/conflict_scenario.svg +0 -0
  348. {markspace-0.2.0b0 → markspace-0.3.0b0}/figures/cross_principal.svg +0 -0
  349. {markspace-0.2.0b0 → markspace-0.3.0b0}/figures/pipeline.svg +0 -0
  350. {markspace-0.2.0b0 → markspace-0.3.0b0}/figures/principal_attention.svg +0 -0
  351. {markspace-0.2.0b0 → markspace-0.3.0b0}/figures/psa.jpg +0 -0
  352. {markspace-0.2.0b0 → markspace-0.3.0b0}/figures/single_agent.svg +0 -0
  353. {markspace-0.2.0b0 → markspace-0.3.0b0}/logo.svg +0 -0
  354. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/budget.py +0 -0
  355. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/compose.py +0 -0
  356. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/envelope.py +0 -0
  357. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/models.py +0 -0
  358. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/probe.py +0 -0
  359. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/py.typed +0 -0
  360. {markspace-0.2.0b0 → markspace-0.3.0b0}/markspace/rate_limit.py +0 -0
  361. {markspace-0.2.0b0 → markspace-0.3.0b0}/poetry.lock +0 -0
  362. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/conftest.py +0 -0
  363. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_budget.py +0 -0
  364. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_composition.py +0 -0
  365. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_concurrent.py +0 -0
  366. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_defense_integration.py +0 -0
  367. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_envelope.py +0 -0
  368. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_hypothesis.py +0 -0
  369. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_probe.py +0 -0
  370. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_rate_limit.py +0 -0
  371. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_scenarios.py +0 -0
  372. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_schedule.py +0 -0
  373. {markspace-0.2.0b0 → markspace-0.3.0b0}/tests/test_telemetry.py +0 -0
@@ -0,0 +1,5 @@
1
+ **/*.jsonl filter=lfs diff=lfs merge=lfs -text
2
+ **/*.png filter=lfs diff=lfs merge=lfs -text
3
+ *.jsonl filter=lfs diff=lfs merge=lfs -text
4
+ experiments/stress_test/results_*/*.log filter=lfs diff=lfs merge=lfs -text
5
+ experiments/stress_test/results_*/*.json filter=lfs diff=lfs merge=lfs -text
@@ -2,8 +2,8 @@ cff-version: 1.2.0
2
2
  title: markspace
3
3
  message: "If you use this work, please cite it using the metadata below."
4
4
  type: software
5
- version: 0.2.0-beta
6
- date-released: 2026-05-08
5
+ version: 0.3.0-beta
6
+ date-released: 2026-11-02
7
7
  doi: 10.5281/zenodo.18990235
8
8
  url: https://github.com/opinionated-systems/markspace
9
9
  abstract: >
@@ -13,9 +13,10 @@ abstract: >
13
13
  boundary enforces identity, scope, and conflict resolution outside
14
14
  the agents, so safety guarantees hold independent of agent behavior.
15
15
  The protocol defines five mark types encoding distinct epistemic
16
- roles, three visibility levels, three conflict policies, and
16
+ roles, three visibility levels, three conflict policies, conflict
17
+ resolution across a scope tree, leases with fencing tokens, and
17
18
  trust-weighted decay. The included Python package is a reference
18
- implementation used to verify 66 formal properties experimentally.
19
+ implementation used to verify 76 formal properties experimentally.
19
20
  authors:
20
21
  - family-names: Loose
21
22
  given-names: Andre
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: markspace
3
- Version: 0.2.0b0
3
+ Version: 0.3.0-beta
4
4
  Summary: Environment-mediated coordination protocol for LLM agent fleets
5
5
  Project-URL: Homepage, https://github.com/opinionated-systems/markspace
6
6
  Project-URL: Repository, https://github.com/opinionated-systems/markspace
@@ -41,7 +41,7 @@ Description-Content-Type: text/markdown
41
41
 
42
42
  If you're coordinating multiple LLM agents, you've likely hit some of these:
43
43
 
44
- - **Prompt injection exposure** - agent identity and permissions are controlled by the LLM, so a compromised prompt can escalate privileges or impersonate other agents
44
+ - **Prompt injection exposure** - agent identity and permissions are controlled by the LLM, so a [compromised prompt](https://role-confusion.github.io/) can escalate privileges or impersonate other agents
45
45
  - **Implicit permissions** - you find out what an agent shouldn't have done after it already did it
46
46
  - **Blind trust** - no standard way to distinguish your fleet's data from API responses or crawled content
47
47
  - **Context drift** - long-running agents lose track of what happened 200 steps ago and repeat or contradict earlier actions
@@ -51,7 +51,7 @@ If you're coordinating multiple LLM agents, you've likely hit some of these:
51
51
 
52
52
  Coordination guarantees should hold independent of agent behavior. Markspace is a [coordination protocol](docs/framework.md) for agent fleets built on [stigmergy](https://en.wikipedia.org/wiki/Stigmergy) - a mechanism by which biological systems coordinate at scale. Agents leave traces in a shared environment rather than messaging each other. A deterministic guard layer at the environment boundary enforces identity, scope, and conflict resolution. These constraints live in infrastructure the agent cannot influence. Coordination emerges without being configured; the fleet adapts as the world changes. Over time, the environment becomes a model of the world the agents operate in.
53
53
 
54
- The protocol defines five mark types, three visibility levels, three conflict policies, trust-weighted decay, and [70 formal properties](docs/spec.md). The included Python package is a reference implementation used to verify those properties experimentally.
54
+ The protocol defines five mark types, three visibility levels, three conflict policies, conflict resolution across a scope tree, leases with fencing tokens, trust-weighted decay, and [76 formal properties](docs/spec.md). The included Python package is a reference implementation used to verify those properties experimentally.
55
55
 
56
56
  ## Motivation
57
57
 
@@ -86,19 +86,19 @@ Each mark type encodes a different epistemic role - a plan, a fact, a belief, a
86
86
  - **Warning**: "X is no longer valid" (spikes then decays)
87
87
  - **Need**: "I need a human decision on X" (persists until resolved)
88
88
 
89
- **Three visibility levels:** OPEN (full access), PROTECTED (structure visible, content redacted), CLASSIFIED (invisible to unauthorized agents).
89
+ **Three visibility levels:** OPEN (full access), PROTECTED (structure visible, content redacted), CLASSIFIED (invisible to unauthorized agents). Each mark keeps its own scope's level, also when it is read through a parent scope, delivered by a subscription, or named in a guard decision.
90
90
 
91
- **Three conflict policies:** HIGHEST_CONFIDENCE (priority wins), FIRST_WRITER (first claim wins), YIELD_ALL (escalate to principal via need marks).
91
+ **Three conflict policies:** HIGHEST_CONFIDENCE (priority wins), FIRST_WRITER (first claim wins), YIELD_ALL (escalate to principal via need marks). Across a scope tree, intents on one resource compete with intents in ancestor and descendant scopes, not in sibling scopes: the outer scope's intent wins, and inside one scope the scope's policy decides.
92
92
 
93
93
  **Trust weighting:** Marks carry a source tag (fleet, external verified, external unverified). Trust weights attenuate effective strength. Fleet marks dominate external ones, and unverified sources are discounted further. Weights are configurable per deployment.
94
94
 
95
95
  **Decay:** Coordination is a dynamical process - the goal is stability against continuous change, not a fixed solution reached once. Observations and warnings lose strength over configurable half-lives. Intent marks expire after TTL. Action marks are permanent. Stale information fades without explicit cleanup.
96
96
 
97
- Full protocol design in [`framework.md`](docs/framework.md). Formal specification (70 properties, conformance checklist) in [`spec.md`](docs/spec.md).
97
+ Full protocol design in [`framework.md`](docs/framework.md). Formal specification (76 properties, conformance checklist) in [`spec.md`](docs/spec.md).
98
98
 
99
99
  ## Composition and isolation
100
100
 
101
- Blocking what a general-purpose agent shouldn't do requires anticipating every failure mode in advance. Composition takes the opposite approach: each agent declares what it can read and write in a manifest, and the guard rejects everything else. Capabilities you didn't grant don't exist.
101
+ Blocking what a general-purpose agent shouldn't do requires anticipating every failure mode in advance. Composition takes the opposite approach: each agent's principal declares what the agent can read and write in a manifest, and the guard rejects everything else. Capabilities you didn't grant don't exist.
102
102
 
103
103
  Watch/subscribe lets agents activate when matching marks appear, forming pipelines without a central orchestrator. Agents can be added, removed, or replaced independently, and need marks let them escalate rather than grow to handle edge cases. The manifest interface is model-agnostic - each agent can run a different backend (cloud API, local open-weights model, or deterministic code), and sensitive scopes can run entirely on-premise.
104
104
 
@@ -130,15 +130,18 @@ The reference implementation and experiments verify that the protocol's properti
130
130
  <p align="center"><img src="experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/stress_test.gif" alt="525-agent stress test visualization"/></p>
131
131
  <p align="center"><sub>525 agents (105 per department, 25 adversarial) coordinating across 7 resource types over 10 simulated rounds. Model: <a href="https://fireworks.ai/models/fireworks/gpt-oss-120b">OpenAI gpt-oss-120b</a> via Fireworks. Left: agent activity by department. Center: marks accumulating in the shared space. Right: per-resource contention.</sub></p>
132
132
 
133
- **Unit tests (325):**
133
+ **Unit tests (563):**
134
134
 
135
135
  - **Core mark operations** - algebra, immutability, uniqueness, ordering
136
136
  - **Protocol mechanics** - decay functions, trust weighting, conflict resolution, deferred resolution
137
- - **Guard enforcement** - scope visibility, trust source enforcement, tool failure handling
137
+ - **Guard enforcement** - scope visibility (also through parent scopes, subscriptions and guard decisions), trust source enforcement, tool failure handling
138
+ - **Conflicts across scope trees** - outer scope first, per-intent competing sets, deferred boundaries, leases and fencing tokens, equal-time intents in write order
138
139
  - **Composition** - agent manifest properties, scheduling
139
140
  - **Robustness** - garbage collection, thread safety under concurrent access
140
141
  - **Property-based ([Hypothesis](https://hypothesis.readthedocs.io/))** - randomized inputs, stateful scheduler fuzzing (register/unregister/update/tick sequences)
141
142
  - **Observability and cost controls** - telemetry sink non-interference, budget tracking accuracy, rate limit enforcement, fleet caps
143
+ - **LLM client and stress-test pacing** - Retry-After handling, cached and reasoning token accounting, arrival-ordered pacing under rate limits (real threads)
144
+ - **Stress-test safety metrics** - double bookings counted from the guard's decisions, recovered bookings apart, scope violations checked on every mark the harness hands an agent
142
145
 
143
146
  **[Stress test:](experiments/stress_test/analysis.md)** AI personal assistants for a simulated office - one per employee, plus adversarial agents that attempt to breach scope boundaries. No central scheduler, all coordination through the shared mark space. The scenario exercises 7 resource types across natural permission boundaries:
144
147
 
@@ -152,17 +155,17 @@ The reference implementation and experiments verify that the protocol's properti
152
155
 
153
156
  Department heads book with elevated priority. External system agents (parking bot, building ops) publish low-trust observations and warnings that decay over configurable half-lives. Adversarial agents with normal permissions but adversarial prompts attempt cross-department bookings and warning injection. All five mark types, all three conflict policies, and all three visibility levels produce non-trivial output in a single trial.
154
157
 
155
- Scenario design in [`design.md`](experiments/stress_test/design.md). Detailed analysis of resource allocation, agent behavior, temporal dynamics, and token economics in the [stress test writeup](experiments/stress_test/analysis.md).
158
+ Scenario design in [`design.md`](experiments/stress_test/design.md). Detailed analysis of resource allocation, agent behavior, temporal dynamics, and token economics in the [stress test writeup](experiments/stress_test/analysis.md). A re-run on DeepSeek V4.1 Flash 1017 with a 2048-token thinking budget (one run, 2026-11-01) allowed no resource twice in one round and denied every cross-department write, with a mean manifest completion of 64.5% across departments against 58.8% for gpt-oss-120b; the two runs also differ in pacing and harness version ([section 9](experiments/stress_test/analysis.md#9-re-run-on-deepseek-v41-flash-1017)).
156
159
 
157
160
  **[Trial experiments:](experiments/trials/analysis.md)** 21 runs of the same scenario across 2 models - [OpenAI gpt-oss-120b](https://fireworks.ai/models/fireworks/gpt-oss-120b) (via Fireworks) and [Mercury 2](https://www.inceptionlabs.ai/blog/introducing-mercury-2), a diffusion-based LLM (via Inception AI). Agent counts from 105 (5 adversarial) to 1,050 (50 adversarial), 4,010 agent instances total.
158
161
 
159
- - **Adversarial** - agents with normal permissions but adversarial prompts attempt three attack modes (confidence manipulation, resource flooding, prompt injection). Zero safety violations on both models
160
- - **Safety** - zero double bookings and zero scope violations across all 21 runs
162
+ - **Adversarial** - agents with normal permissions but adversarial prompts attempt three attack modes (confidence manipulation, resource flooding, prompt injection). No double booking found and every cross-department write denied, on both models
163
+ - **Safety** - no resource allowed twice in one round, no lunch window over capacity, and every cross-department write denied, in all 21 runs (checked from their stored steps; [read leaks were not measured](experiments/trials/analysis.md#6-cross-experiment-safety))
161
164
  - **Repeatability** - 64.7% +/- 0.8% completion on gpt-oss-120b, 66.2% +/- 1.6% on mercury-2 (5 seeds each)
162
- - **Scaling** - up to 1,050 agents with proportionally scaled resources: per-agent step count nearly flat (1.2x at 10x scale), safety invariants hold at every scale point
165
+ - **Scaling** - up to 1,050 agents with proportionally scaled resources: per-agent step count nearly flat (1.2x at 10x scale), no double booking found at any scale point
163
166
  - **Resource contention** - 5x more agents competing for the same resources: completion drops to 13.3% from resource scarcity, not protocol failure
164
167
 
165
- **[Defense stack trials:](experiments/trials/results/defense/analysis.md)** 6 attack modes (rate spike, type shift, privilege escalation, probe evasion, slow drift, combined) against the static enforcement layer + statistical envelope + diagnostic probe. 150 rounds, 105 agents per trial (5 adversarial). Zero safety violations across all attack modes. Full analysis in the [defense writeup](experiments/trials/results/defense/analysis.md).
168
+ **[Defense stack trials:](experiments/trials/results/defense/analysis.md)** 6 attack modes (rate spike, type shift, privilege escalation, probe evasion, slow drift, combined) against the static enforcement layer + statistical envelope + diagnostic probe. 150 rounds, 105 agents per trial (5 adversarial). No double booking found across all attack modes (from the stored steps). Full analysis in the [defense writeup](experiments/trials/results/defense/analysis.md).
166
169
 
167
170
  **[Comparison experiment:](experiments/comparison/analysis.md)** Markspace vs a message-passing framework ([Microsoft Agent Framework](https://github.com/microsoft/agent-framework)) on a shared resource booking scenario. 10 agents, 12 slots, 10 seeds per arm.
168
171
 
@@ -181,7 +184,7 @@ The `markspace` package is a Python 3.11+ reference implementation. The protocol
181
184
 
182
185
  ```bash
183
186
  poetry install # core package
184
- pytest # 325 tests, no API key needed
187
+ pytest # 563 tests, no API key needed
185
188
  ```
186
189
 
187
190
  ### Use the protocol
@@ -268,7 +271,7 @@ See [`experiments/guide.md`](experiments/guide.md) for CLI reference and cost es
268
271
  ## Documentation
269
272
 
270
273
  - [`docs/framework.md`](docs/framework.md) - protocol design, biological foundations, composition, architecture, failure analysis
271
- - [`docs/spec.md`](docs/spec.md) - formal specification (70 properties, conformance checklist)
274
+ - [`docs/spec.md`](docs/spec.md) - formal specification (76 properties, conformance checklist)
272
275
  - [`experiments/guide.md`](experiments/guide.md) - running experiments (setup, CLI reference, analysis, costs)
273
276
  - [`experiments/validation/`](experiments/validation/analysis.md) - safety, visibility, concurrency, scaling
274
277
  - [`experiments/stress_test/`](experiments/stress_test/) - 105-agent stress test ([design](experiments/stress_test/design.md), [analysis](experiments/stress_test/analysis.md))
@@ -294,7 +297,7 @@ Most users interact with `core.py` (types), `guard.py` (enforcement), and `space
294
297
  | [`telemetry.py`](markspace/telemetry.py) | Optional. OpenTelemetry-compatible metrics, structured logs, and trace context. |
295
298
  | [`compose.py`](markspace/compose.py) | Composition validation. Pipeline and manifest-permission checks. Stateless. |
296
299
  | [`schedule.py`](markspace/schedule.py) | Manifest-based scheduling with optional pre-activation budget checks. |
297
- | [`llm.py`](markspace/llm.py) | Provider-agnostic LLM client (OpenAI-compatible). |
300
+ | [`llm.py`](markspace/llm.py) | Provider-agnostic LLM client (OpenAI-compatible), with `reasoning_effort`, cached and reasoning token accounting, and an optional per-request pacing hook (`RequestPacer`). |
298
301
  | [`models.py`](markspace/models.py) | Model registry. |
299
302
 
300
303
  ## Limitations
@@ -6,7 +6,7 @@
6
6
 
7
7
  If you're coordinating multiple LLM agents, you've likely hit some of these:
8
8
 
9
- - **Prompt injection exposure** - agent identity and permissions are controlled by the LLM, so a compromised prompt can escalate privileges or impersonate other agents
9
+ - **Prompt injection exposure** - agent identity and permissions are controlled by the LLM, so a [compromised prompt](https://role-confusion.github.io/) can escalate privileges or impersonate other agents
10
10
  - **Implicit permissions** - you find out what an agent shouldn't have done after it already did it
11
11
  - **Blind trust** - no standard way to distinguish your fleet's data from API responses or crawled content
12
12
  - **Context drift** - long-running agents lose track of what happened 200 steps ago and repeat or contradict earlier actions
@@ -16,7 +16,7 @@ If you're coordinating multiple LLM agents, you've likely hit some of these:
16
16
 
17
17
  Coordination guarantees should hold independent of agent behavior. Markspace is a [coordination protocol](docs/framework.md) for agent fleets built on [stigmergy](https://en.wikipedia.org/wiki/Stigmergy) - a mechanism by which biological systems coordinate at scale. Agents leave traces in a shared environment rather than messaging each other. A deterministic guard layer at the environment boundary enforces identity, scope, and conflict resolution. These constraints live in infrastructure the agent cannot influence. Coordination emerges without being configured; the fleet adapts as the world changes. Over time, the environment becomes a model of the world the agents operate in.
18
18
 
19
- The protocol defines five mark types, three visibility levels, three conflict policies, trust-weighted decay, and [70 formal properties](docs/spec.md). The included Python package is a reference implementation used to verify those properties experimentally.
19
+ The protocol defines five mark types, three visibility levels, three conflict policies, conflict resolution across a scope tree, leases with fencing tokens, trust-weighted decay, and [76 formal properties](docs/spec.md). The included Python package is a reference implementation used to verify those properties experimentally.
20
20
 
21
21
  ## Motivation
22
22
 
@@ -51,19 +51,19 @@ Each mark type encodes a different epistemic role - a plan, a fact, a belief, a
51
51
  - **Warning**: "X is no longer valid" (spikes then decays)
52
52
  - **Need**: "I need a human decision on X" (persists until resolved)
53
53
 
54
- **Three visibility levels:** OPEN (full access), PROTECTED (structure visible, content redacted), CLASSIFIED (invisible to unauthorized agents).
54
+ **Three visibility levels:** OPEN (full access), PROTECTED (structure visible, content redacted), CLASSIFIED (invisible to unauthorized agents). Each mark keeps its own scope's level, also when it is read through a parent scope, delivered by a subscription, or named in a guard decision.
55
55
 
56
- **Three conflict policies:** HIGHEST_CONFIDENCE (priority wins), FIRST_WRITER (first claim wins), YIELD_ALL (escalate to principal via need marks).
56
+ **Three conflict policies:** HIGHEST_CONFIDENCE (priority wins), FIRST_WRITER (first claim wins), YIELD_ALL (escalate to principal via need marks). Across a scope tree, intents on one resource compete with intents in ancestor and descendant scopes, not in sibling scopes: the outer scope's intent wins, and inside one scope the scope's policy decides.
57
57
 
58
58
  **Trust weighting:** Marks carry a source tag (fleet, external verified, external unverified). Trust weights attenuate effective strength. Fleet marks dominate external ones, and unverified sources are discounted further. Weights are configurable per deployment.
59
59
 
60
60
  **Decay:** Coordination is a dynamical process - the goal is stability against continuous change, not a fixed solution reached once. Observations and warnings lose strength over configurable half-lives. Intent marks expire after TTL. Action marks are permanent. Stale information fades without explicit cleanup.
61
61
 
62
- Full protocol design in [`framework.md`](docs/framework.md). Formal specification (70 properties, conformance checklist) in [`spec.md`](docs/spec.md).
62
+ Full protocol design in [`framework.md`](docs/framework.md). Formal specification (76 properties, conformance checklist) in [`spec.md`](docs/spec.md).
63
63
 
64
64
  ## Composition and isolation
65
65
 
66
- Blocking what a general-purpose agent shouldn't do requires anticipating every failure mode in advance. Composition takes the opposite approach: each agent declares what it can read and write in a manifest, and the guard rejects everything else. Capabilities you didn't grant don't exist.
66
+ Blocking what a general-purpose agent shouldn't do requires anticipating every failure mode in advance. Composition takes the opposite approach: each agent's principal declares what the agent can read and write in a manifest, and the guard rejects everything else. Capabilities you didn't grant don't exist.
67
67
 
68
68
  Watch/subscribe lets agents activate when matching marks appear, forming pipelines without a central orchestrator. Agents can be added, removed, or replaced independently, and need marks let them escalate rather than grow to handle edge cases. The manifest interface is model-agnostic - each agent can run a different backend (cloud API, local open-weights model, or deterministic code), and sensitive scopes can run entirely on-premise.
69
69
 
@@ -95,15 +95,18 @@ The reference implementation and experiments verify that the protocol's properti
95
95
  <p align="center"><img src="experiments/trials/results/scaling_proportional/gpt-oss-120b/n_500/stress_test.gif" alt="525-agent stress test visualization"/></p>
96
96
  <p align="center"><sub>525 agents (105 per department, 25 adversarial) coordinating across 7 resource types over 10 simulated rounds. Model: <a href="https://fireworks.ai/models/fireworks/gpt-oss-120b">OpenAI gpt-oss-120b</a> via Fireworks. Left: agent activity by department. Center: marks accumulating in the shared space. Right: per-resource contention.</sub></p>
97
97
 
98
- **Unit tests (325):**
98
+ **Unit tests (563):**
99
99
 
100
100
  - **Core mark operations** - algebra, immutability, uniqueness, ordering
101
101
  - **Protocol mechanics** - decay functions, trust weighting, conflict resolution, deferred resolution
102
- - **Guard enforcement** - scope visibility, trust source enforcement, tool failure handling
102
+ - **Guard enforcement** - scope visibility (also through parent scopes, subscriptions and guard decisions), trust source enforcement, tool failure handling
103
+ - **Conflicts across scope trees** - outer scope first, per-intent competing sets, deferred boundaries, leases and fencing tokens, equal-time intents in write order
103
104
  - **Composition** - agent manifest properties, scheduling
104
105
  - **Robustness** - garbage collection, thread safety under concurrent access
105
106
  - **Property-based ([Hypothesis](https://hypothesis.readthedocs.io/))** - randomized inputs, stateful scheduler fuzzing (register/unregister/update/tick sequences)
106
107
  - **Observability and cost controls** - telemetry sink non-interference, budget tracking accuracy, rate limit enforcement, fleet caps
108
+ - **LLM client and stress-test pacing** - Retry-After handling, cached and reasoning token accounting, arrival-ordered pacing under rate limits (real threads)
109
+ - **Stress-test safety metrics** - double bookings counted from the guard's decisions, recovered bookings apart, scope violations checked on every mark the harness hands an agent
107
110
 
108
111
  **[Stress test:](experiments/stress_test/analysis.md)** AI personal assistants for a simulated office - one per employee, plus adversarial agents that attempt to breach scope boundaries. No central scheduler, all coordination through the shared mark space. The scenario exercises 7 resource types across natural permission boundaries:
109
112
 
@@ -117,17 +120,17 @@ The reference implementation and experiments verify that the protocol's properti
117
120
 
118
121
  Department heads book with elevated priority. External system agents (parking bot, building ops) publish low-trust observations and warnings that decay over configurable half-lives. Adversarial agents with normal permissions but adversarial prompts attempt cross-department bookings and warning injection. All five mark types, all three conflict policies, and all three visibility levels produce non-trivial output in a single trial.
119
122
 
120
- Scenario design in [`design.md`](experiments/stress_test/design.md). Detailed analysis of resource allocation, agent behavior, temporal dynamics, and token economics in the [stress test writeup](experiments/stress_test/analysis.md).
123
+ Scenario design in [`design.md`](experiments/stress_test/design.md). Detailed analysis of resource allocation, agent behavior, temporal dynamics, and token economics in the [stress test writeup](experiments/stress_test/analysis.md). A re-run on DeepSeek V4.1 Flash 1017 with a 2048-token thinking budget (one run, 2026-11-01) allowed no resource twice in one round and denied every cross-department write, with a mean manifest completion of 64.5% across departments against 58.8% for gpt-oss-120b; the two runs also differ in pacing and harness version ([section 9](experiments/stress_test/analysis.md#9-re-run-on-deepseek-v41-flash-1017)).
121
124
 
122
125
  **[Trial experiments:](experiments/trials/analysis.md)** 21 runs of the same scenario across 2 models - [OpenAI gpt-oss-120b](https://fireworks.ai/models/fireworks/gpt-oss-120b) (via Fireworks) and [Mercury 2](https://www.inceptionlabs.ai/blog/introducing-mercury-2), a diffusion-based LLM (via Inception AI). Agent counts from 105 (5 adversarial) to 1,050 (50 adversarial), 4,010 agent instances total.
123
126
 
124
- - **Adversarial** - agents with normal permissions but adversarial prompts attempt three attack modes (confidence manipulation, resource flooding, prompt injection). Zero safety violations on both models
125
- - **Safety** - zero double bookings and zero scope violations across all 21 runs
127
+ - **Adversarial** - agents with normal permissions but adversarial prompts attempt three attack modes (confidence manipulation, resource flooding, prompt injection). No double booking found and every cross-department write denied, on both models
128
+ - **Safety** - no resource allowed twice in one round, no lunch window over capacity, and every cross-department write denied, in all 21 runs (checked from their stored steps; [read leaks were not measured](experiments/trials/analysis.md#6-cross-experiment-safety))
126
129
  - **Repeatability** - 64.7% +/- 0.8% completion on gpt-oss-120b, 66.2% +/- 1.6% on mercury-2 (5 seeds each)
127
- - **Scaling** - up to 1,050 agents with proportionally scaled resources: per-agent step count nearly flat (1.2x at 10x scale), safety invariants hold at every scale point
130
+ - **Scaling** - up to 1,050 agents with proportionally scaled resources: per-agent step count nearly flat (1.2x at 10x scale), no double booking found at any scale point
128
131
  - **Resource contention** - 5x more agents competing for the same resources: completion drops to 13.3% from resource scarcity, not protocol failure
129
132
 
130
- **[Defense stack trials:](experiments/trials/results/defense/analysis.md)** 6 attack modes (rate spike, type shift, privilege escalation, probe evasion, slow drift, combined) against the static enforcement layer + statistical envelope + diagnostic probe. 150 rounds, 105 agents per trial (5 adversarial). Zero safety violations across all attack modes. Full analysis in the [defense writeup](experiments/trials/results/defense/analysis.md).
133
+ **[Defense stack trials:](experiments/trials/results/defense/analysis.md)** 6 attack modes (rate spike, type shift, privilege escalation, probe evasion, slow drift, combined) against the static enforcement layer + statistical envelope + diagnostic probe. 150 rounds, 105 agents per trial (5 adversarial). No double booking found across all attack modes (from the stored steps). Full analysis in the [defense writeup](experiments/trials/results/defense/analysis.md).
131
134
 
132
135
  **[Comparison experiment:](experiments/comparison/analysis.md)** Markspace vs a message-passing framework ([Microsoft Agent Framework](https://github.com/microsoft/agent-framework)) on a shared resource booking scenario. 10 agents, 12 slots, 10 seeds per arm.
133
136
 
@@ -146,7 +149,7 @@ The `markspace` package is a Python 3.11+ reference implementation. The protocol
146
149
 
147
150
  ```bash
148
151
  poetry install # core package
149
- pytest # 325 tests, no API key needed
152
+ pytest # 563 tests, no API key needed
150
153
  ```
151
154
 
152
155
  ### Use the protocol
@@ -233,7 +236,7 @@ See [`experiments/guide.md`](experiments/guide.md) for CLI reference and cost es
233
236
  ## Documentation
234
237
 
235
238
  - [`docs/framework.md`](docs/framework.md) - protocol design, biological foundations, composition, architecture, failure analysis
236
- - [`docs/spec.md`](docs/spec.md) - formal specification (70 properties, conformance checklist)
239
+ - [`docs/spec.md`](docs/spec.md) - formal specification (76 properties, conformance checklist)
237
240
  - [`experiments/guide.md`](experiments/guide.md) - running experiments (setup, CLI reference, analysis, costs)
238
241
  - [`experiments/validation/`](experiments/validation/analysis.md) - safety, visibility, concurrency, scaling
239
242
  - [`experiments/stress_test/`](experiments/stress_test/) - 105-agent stress test ([design](experiments/stress_test/design.md), [analysis](experiments/stress_test/analysis.md))
@@ -259,7 +262,7 @@ Most users interact with `core.py` (types), `guard.py` (enforcement), and `space
259
262
  | [`telemetry.py`](markspace/telemetry.py) | Optional. OpenTelemetry-compatible metrics, structured logs, and trace context. |
260
263
  | [`compose.py`](markspace/compose.py) | Composition validation. Pipeline and manifest-permission checks. Stateless. |
261
264
  | [`schedule.py`](markspace/schedule.py) | Manifest-based scheduling with optional pre-activation budget checks. |
262
- | [`llm.py`](markspace/llm.py) | Provider-agnostic LLM client (OpenAI-compatible). |
265
+ | [`llm.py`](markspace/llm.py) | Provider-agnostic LLM client (OpenAI-compatible), with `reasoning_effort`, cached and reasoning token accounting, and an optional per-request pacing hook (`RequestPacer`). |
263
266
  | [`models.py`](markspace/models.py) | Model registry. |
264
267
 
265
268
  ## Limitations
@@ -154,6 +154,8 @@ Loosely similar to CAS (Compare-And-Swap) in concurrent programming (read state,
154
154
 
155
155
  **What it doesn't do**: Intent marks don't prevent all conflicts. Two agents could write intents simultaneously with high confidence. This creates a race condition resolved by the action mark: whoever writes the action first wins, the other agent reads the action mark and adapts.
156
156
 
157
+ **Across a scope tree**: an intent competes with intents on the same resource in its own scope, its ancestors and its descendants, not in sibling scopes. The intent in the outer scope wins; inside one scope, the scope's policy decides; YIELD_ALL in either scope hands the pair to the principal. Each intent is judged against its own competing set, so no decision allows two competing intents, and the outcome does not depend on which scope's decision computes it ([spec 6.1](spec.md#61-resolution-protocol)). Among waiting claims, an outer-scope intent pre-empts inner-scope intents whatever their order or confidence. A granted claim holds a lease with a fencing token and is not pre-empted, and a successful action written through the guard is recorded only under its lease or as an uncontested direct claim ([Gray & Cheriton, 1989](https://doi.org/10.1145/74850.74870); [Burrows, 2006](https://www.usenix.org/legacy/event/osdi06/tech/burrows.html); [spec 6.5](spec.md#65-grants)). The costs: a crashed holder blocks the resource until its lease expires, and a tool that runs longer than its lease loses it, and its action is not recorded. Equal intents resolve in write order: each intent or action on a resource gets a later `created_at` than every earlier one on that resource in its scope, also when the clock has not moved (spec P32).
158
+
157
159
  **The consistency hybrid.** The protocol uses soft consistency for information sharing (observation marks decay, warnings fade, reinforcement is approximate) and hard consistency for mutual exclusion (the guard acquires a lock during conflict resolution to serialize resource claims). This is deliberate: information can tolerate eventual convergence, but "two agents must not book the same room" requires serialization. The stress test confirms this - HIGHEST_CONFIDENCE degenerates to FIRST_WRITER under the lock because the second agent finds an already-committed action, not a competing intent. The lock makes mutual exclusion reliable at the cost of reducing priority-based policies to first-come-first-served. Deferred resolution ([Spec Section 6.2](spec.md#62-deferred-resolution)) restores priority semantics by separating claim collection from allocation.
158
160
 
159
161
  ### Mark Type 2: Action
@@ -506,7 +508,7 @@ CREATE INDEX idx_mark_resource ON mark(resource_id, mark_type) WHERE resource_id
506
508
 
507
509
  #### Option A': Document database
508
510
 
509
- A document store (MongoDB, DynamoDB) is a natural alternative to PostgreSQL. Marks are document-shaped: varied schemas per type, nested content, queried by scope and time. Scope as partition key, `created_at` as sort key, TTL as native expiry. Trade-off: no schema migration when mark types evolve, but weaker transactional guarantees for atomic conflict checks (scope-partitioned guards sidestep this). Replaces Option A in the hybrid (Option C) if chosen.
511
+ A document store (MongoDB, DynamoDB) is a natural alternative to PostgreSQL. Marks are document-shaped: varied schemas per type, nested content, queried by scope and time. Scope as partition key, `created_at` as sort key, TTL as native expiry. Trade-off: no schema migration when mark types evolve, but weaker transactional guarantees for atomic conflict checks (guards partitioned by scope tree sidestep this). Replaces Option A in the hybrid (Option C) if chosen.
510
512
 
511
513
  #### Option B: Redis streams
512
514
 
@@ -557,7 +559,7 @@ A complementary approach is consolidation: rather than keeping or discarding ind
557
559
 
558
560
  For multi-fleet deployments, synchronized pruning across mark spaces adds further complexity. [Bach (2025)](https://arxiv.org/abs/2506.17338) proposes a consensus-based Co-Forgetting Protocol for coordinated memory pruning in multi-agent systems, though this is heavier machinery than a single-fleet deployment needs.
559
561
 
560
- **Distributed storage.** The spec assumes a single-node mark space with in-process locking. A distributed deployment (multiple mark space nodes) would need to maintain the guard's atomicity guarantees across nodes. The guard's lock-based conflict check requires reading current state and making a decision atomically. A distributed guard would likely need either a [Calvin](https://doi.org/10.1145/2213836.2213838)-style deterministic ordering layer (Thomson et al., 2012) - where all nodes agree on transaction order before execution, so each can execute independently and arrive at the same result without distributed locking - or partitioning by scope (each scope assigned to exactly one node, reducing the problem back to single-node locking).
562
+ **Distributed storage.** The spec assumes a single-node mark space with in-process locking. A distributed deployment (multiple mark space nodes) would need to maintain the guard's atomicity guarantees across nodes. The guard's lock-based conflict check requires reading current state and making a decision atomically. A distributed guard would likely need either a [Calvin](https://doi.org/10.1145/2213836.2213838)-style deterministic ordering layer (Thomson et al., 2012) - where all nodes agree on transaction order before execution, so each can execute independently and arrive at the same result without distributed locking - or partitioning by scope tree (all scopes under one root assigned to exactly one node, reducing the problem back to single-node locking). A partition must hold a whole tree: conflicts span a scope's ancestors and descendants, and the write order of claims is kept per resource within each scope (spec 6.1, P32).
561
563
 
562
564
  **Deferred resolution.** Formalized in [spec.md Section 6.2](spec.md#62-deferred-resolution). The deferred resolution pattern (collect intents, resolve at batch boundary) is used in the stress test for parking and boardroom resources. It is the mechanism that makes HIGHEST_CONFIDENCE meaningful under lock-based serialization ([Section 6.3 of the stress test analysis](../experiments/stress_test/analysis.md#63-lock-based-guards-break-highest_confidence)). The spec defines three phases (claim collection, resolution boundary, batch resolution), three properties (P14-P16), and the relationship between deferred and immediate guard modes. Remaining open question: the resolution boundary trigger is "deployment-defined," so a production implementation would need to decide between timer-based (resolve every N minutes), event-based (resolve when all expected intents are in or activity pauses), or principal-triggered (a human says "resolve now") boundaries - each trading off latency, completeness, and autonomy differently.
563
565
 
@@ -602,6 +604,8 @@ scope: "research/company/{company_id}"
602
604
 
603
605
  Scopes are hierarchical. An agent authorized for `research/company/*` can write marks on any company. An agent authorized for `research/company/ACME` can only write marks about ACME. Authority is scope-bounded, and scope is defined independently of the agents.
604
606
 
607
+ A child scope may define its own visibility, decay and conflict policy. Each mark keeps its own scope's settings, also when read through a parent scope ([spec 7.4](spec.md#74-scope-visibility), [spec 8.2](spec.md#82-read)). Intents on one resource compete across the parent-child line, and the outer scope's intent wins ([Mark Type 1](#mark-type-1-intent)).
608
+
605
609
  ### Why This Decomposes
606
610
 
607
611
  The core claim is that each component can be designed, tested, and validated independently.
@@ -865,11 +869,11 @@ The protocol makes specific claims about what it prevents, mitigates, and delibe
865
869
 
866
870
  | Failure pattern | markspace mitigation | Status |
867
871
  |---|---|---|
868
- | Unauthorized access / scope violations | Scope permissions, guard rejects unauthorized writes | Prevented (0 violations) |
872
+ | Unauthorized access / scope violations | Scope permissions, guard rejects unauthorized writes | Writes prevented: every cross-department write in the stored runs denied; reads not measured |
869
873
  | Cascading state corruption | Intent TTL (2h) prevents stale signal accumulation; decay degrades observations | Prevented (intents expired between every round pair) |
870
874
  | Unconstrained goal pursuit | Fixed manifests per agent, constrained tool space | Prevented (agents completed manifests, didn't improvise) |
871
875
  | Cross-agent propagation | No direct agent-to-agent communication; marks only | Prevented (all coordination through mark space) |
872
- | Resource exhaustion | Guard serialization + conflict resolution policies | Prevented (0 double bookings, 3 policies all functional) |
876
+ | Resource exhaustion | Guard serialization + conflict resolution policies | Prevented: no double booking found in the stored runs (from their steps), 3 policies all functional |
873
877
  | Disproportionate response (CS1) | A protocol-valid action can still be harmful; no action proportionality checks | Not addressed |
874
878
  | Compliance with non-owner instructions (CS2) | Manifest can control whether an agent is authorized to interact with humans at all, but once authorized, what the agent shares is agent-internal | Not addressed |
875
879
  | Sensitive data disclosure (CS3) | Mark visibility controls structure, not content within agent outputs | Not addressed |
@@ -920,7 +924,7 @@ A natural question is what a complete multi-agent delegation system requires and
920
924
  | Trust and reputation | Partial | Three static source levels (fleet, verified, unverified). No dynamic trust updating, reputation, or experience-based trust. Sufficient for LLM non-compliance; insufficient for rational adversaries. |
921
925
  | Permission handling | Partial | Scope-based write authorization, hierarchical scope inheritance, three visibility levels (OPEN/PROTECTED/CLASSIFIED). No just-in-time authorization or privilege attenuation in sub-delegation chains. |
922
926
  | Verifiable task completion | Partial | Action marks record outcomes. Supersession chains track state transitions. No verification that the action's result is correct (the protocol records what happened, not whether it was right). |
923
- | Security | Yes | Guard enforces authorization independent of LLM compliance. Scope visibility prevents information leakage. Trust weighting attenuates untrusted sources. Adversarial robustness validated (171 denied attempts). |
927
+ | Security | Yes | Guard enforces authorization independent of LLM compliance. Scope visibility controls who can read a mark, through reads, subscriptions and guard decisions. It does not control what an authorized reader writes afterwards: markspace has no write-down rule (see [CS3](#failure-mode-coverage)). A monitor can enforce such a rule, at the cost of blocking harmless writes, but not information flow itself ([Schneider, 2000](https://doi.org/10.1145/353323.353382)). Trust weighting attenuates untrusted sources. Adversarial robustness validated (171 denied attempts). |
924
928
 
925
929
  The gaps are intentional. Markspace covers what can be enforced structurally through environment design - shared state, authorization, conflict resolution. The components it omits (task decomposition, assignment, multi-objective optimization) require orchestration-level capabilities or agent-internal mechanisms that operate at a different architectural level.
926
930
 
@@ -932,7 +936,7 @@ Long-running agents accumulate history - tool outputs, observations, reasoning t
932
936
 
933
937
  Stigmergy reframes the problem. The mark space is both the coordination medium and the agents' shared context - agents don't carry private history that diverges, they read a common environment. Decay and TTL are the protocol's native context management: stale observations lose strength, expired intents vanish, warnings fade. This is structurally equivalent to observation masking - old signals attenuate without requiring an explicit compression step. The data itself (action marks, gathered observations, completed work) is valuable output that any system would store regardless of architecture.
934
938
 
935
- This design is structurally input-heavy: agents read the mark space every round but write only a few marks, producing [input-to-output ratios of 15:1 to 62:1](../experiments/trials/results/multi_trial/analysis.md#6-token-economics) depending on model verbosity (stress tests, 100+5 agents, 20 rounds). Input token price is the dominant cost factor, and model output verbosity barely matters. A model producing 5x fewer output tokens costs about the same per trial because output is already a small fraction of total spend.
939
+ This design is structurally input-heavy: agents read the mark space every round but write only a few marks, producing [input-to-output ratios of 15:1 to 62:1](../experiments/trials/results/multi_trial/analysis.md#6-token-economics) depending on model verbosity (stress tests, 100+5 agents, 20 rounds). Input token price is the dominant cost factor, and model output verbosity barely matters. A model producing 5x fewer output tokens costs about the same per trial because output is already a small fraction of total spend. A thinking budget moves cost toward output: DeepSeek V4.1 Flash 1017 with a 2048-token budget ran at 11:1 in the 10-round stress test (gpt-oss-120b: 17.8:1 there), and output was 31% of the run's cost, against 18% for gpt-oss-120b ([stress test, section 9](../experiments/stress_test/analysis.md#9-re-run-on-deepseek-v41-flash-1017)).
936
940
 
937
941
  Mark space size directly drives token cost - every mark in the active read set is tokens an agent consumes each round. Marks below a strength threshold add tokens without adding signal; a fully-decayed observation at 0.01 strength costs the same tokens as a fresh one at full strength. A production system needs a read-path cutoff: marks below a configurable strength threshold are excluded from agent reads but retained in storage. The [hybrid architecture](#option-c-hybrid-recommended) already separates hot state (Redis) from durable record (PostgreSQL) - the read-path cutoff determines what stays in the hot layer. See [Open Questions](#open-questions) for the unbounded growth problem.
938
942
 
@@ -942,22 +946,25 @@ The guard mediates every write and enforces every conflict resolution. Two thing
942
946
 
943
947
  ### Telemetry
944
948
 
945
- The guard emits structured events on every `write_mark()` and `execute()` call. Events go to a telemetry sink, not into the mark space. The interface is [OpenTelemetry](https://opentelemetry.io/)-compatible: metrics as instruments, structured logs as log records, and optional trace context propagation. Implementations SHOULD use the OpenTelemetry SDK when available and MAY fall back to structured JSON logs.
949
+ The guard emits structured events on every `write_mark()` and `execute()` call. Events go to a telemetry sink, not into the mark space. Lease grants, expiries and losses are counted on the call that records them. The interface is [OpenTelemetry](https://opentelemetry.io/)-compatible: metrics as instruments, structured logs as log records, and optional trace context propagation. Implementations SHOULD use the OpenTelemetry SDK when available and MAY fall back to structured JSON logs.
946
950
 
947
951
  **Metrics** (counters, gauges, histograms):
948
952
 
949
- | Metric | Type | Labels | What it tells you |
950
- |--------|------|--------|-------------------|
951
- | `markspace.marks.written` | Counter | `agent_id`, `scope`, `mark_type`, `verdict` | Write volume and rejection rate per agent |
952
- | `markspace.marks.read` | Counter | `agent_id`, `scope` | Read volume per agent per round |
953
- | `markspace.tokens.input` | Counter | `agent_id` | Input tokens consumed per round |
954
- | `markspace.tokens.output` | Counter | `agent_id` | Output tokens generated (LLM responses + mark writes) |
955
- | `markspace.conflicts.resolved` | Counter | `scope`, `policy`, `outcome` | Conflict frequency and resolution distribution |
956
- | `markspace.space.active_marks` | Gauge | `scope`, `mark_type` | Hot-tier mark count (above strength threshold) |
957
- | `markspace.space.total_marks` | Gauge | `scope`, `mark_type` | Total mark count including decayed |
958
- | `markspace.agent.budget.remaining` | Gauge | `agent_id`, `dimension` | Remaining token budget (input/output/total) |
959
- | `markspace.agent.round.duration` | Histogram | `agent_id` | Wall-clock time per agent round |
960
- | `markspace.needs.pending` | Gauge | `scope` | Unresolved need marks awaiting principal review |
953
+ | Metric | Type | Labels | Emitted by | What it tells you |
954
+ |--------|------|--------|------------|-------------------|
955
+ | `markspace.marks.written` | Counter | `agent_id`, `scope`, `mark_type`, `verdict` | guard | Write volume and rejection rate per agent |
956
+ | `markspace.marks.read` | Counter | `agent_id`, `scope` | deployment | Read volume per agent per round |
957
+ | `markspace.tokens.input` | Counter | `agent_id` | guard | Input tokens consumed per round |
958
+ | `markspace.tokens.output` | Counter | `agent_id` | guard | Output tokens generated (LLM responses + mark writes) |
959
+ | `markspace.conflicts.resolved` | Counter | `scope`, `policy`, `outcome` | guard | Conflict frequency and resolution distribution |
960
+ | `markspace.leases.granted` | Counter | `scope`, `resource` | guard | Grants per resource (spec 6.5) |
961
+ | `markspace.leases.expired` | Counter | `scope`, `resource` | guard | Leases that reached their expiry: tools slower than their lease |
962
+ | `markspace.leases.lost` | Counter | `scope`, `resource` | guard | Intents closed as lost: refused or beaten |
963
+ | `markspace.space.active_marks` | Gauge | `scope`, `mark_type` | deployment | Hot-tier mark count (above strength threshold) |
964
+ | `markspace.space.total_marks` | Gauge | `scope`, `mark_type` | deployment | Total mark count including decayed |
965
+ | `markspace.agent.budget.remaining` | Gauge | `agent_id`, `dimension` | deployment | Remaining token budget (input/output/total) |
966
+ | `markspace.agent.round.duration` | Histogram | `agent_id` | deployment | Wall-clock time per agent round |
967
+ | `markspace.needs.pending` | Gauge | `scope` | deployment | Unresolved need marks awaiting principal review |
961
968
 
962
969
  **Structured logs** (one per guard decision):
963
970
 
@@ -975,7 +982,7 @@ The guard emits structured events on every `write_mark()` and `execute()` call.
975
982
  }
976
983
  ```
977
984
 
978
- **Trace context.** Each agent round MAY carry an OpenTelemetry span context. The guard propagates this context to downstream tool calls, so a single trace connects: agent activation - mark space read - LLM call - tool execution - mark write - guard decision.
985
+ **Trace context.** Each agent round MAY carry an OpenTelemetry span context. The guard MAY propagate this context to downstream tool calls, so a single trace connects: agent activation - mark space read - LLM call - tool execution - mark write - guard decision. The reference guard does not propagate it.
979
986
 
980
987
  Telemetry observes the mark space boundary, not agent internals. Reasoning traces, prompt compliance, and hallucination rates require agent-level instrumentation (e.g., LLM provider callbacks) that sits alongside the protocol.
981
988
 
@@ -1002,7 +1009,7 @@ message AgentManifest {
1002
1009
 
1003
1010
  When omitted, the budget is unbounded.
1004
1011
 
1005
- Input and output budgets are separate because they have different cost profiles. Input tokens are the dominant cost factor ([15:1 to 62:1 input-to-output ratio](../experiments/trials/results/multi_trial/analysis.md#6-token-economics)) and are driven by mark space size - something the agent doesn't control. Output tokens reflect agent verbosity and model choice - something the operator controls through model selection and prompting.
1012
+ Input and output budgets are separate because they have different cost profiles. Input tokens are the dominant cost factor ([15:1 to 62:1 input-to-output ratio](../experiments/trials/results/multi_trial/analysis.md#6-token-economics); [11:1](../experiments/stress_test/analysis.md#9-re-run-on-deepseek-v41-flash-1017) for a model with a 2048-token thinking budget, 10 rounds) and are driven by mark space size - something the agent doesn't control. Output tokens reflect agent verbosity and model choice - something the operator controls through model selection and prompting.
1006
1013
 
1007
1014
  **Enforcement.** The scheduler checks remaining budget before activating an agent. The guard tracks cumulative token usage across rounds.
1008
1015
 
@@ -1046,6 +1053,8 @@ Stigmergy isn't new to computer science, though it has seen limited adoption for
1046
1053
 
1047
1054
  **Hoare monitors** ([Hoare, 1974](https://doi.org/10.1145/355620.361161)): the guard layer ([Section 9 of the spec](spec.md#9-guard-deterministic-enforcement-layer)) is a descendant of Hoare's monitor concept. A monitor wraps shared state with procedures that enforce mutual exclusion and preconditions. The guard wraps the mark space: every tool call passes through `pre_action` (precondition check) before execution, with a lock ensuring atomicity. The difference is that Hoare monitors enforce programmer-specified invariants, while the guard enforces protocol-specified invariants that the LLM agent cannot override.
1048
1055
 
1056
+ **Execution monitoring** ([Schneider, 2000](https://doi.org/10.1145/353323.353382); [Hamlen, Morrisett & Schneider, 2006](https://doi.org/10.1145/1111596.1111601)): the theory of what the guard can enforce. A monitor watches each step and stops it before it breaks a policy, so it enforces safety properties whose check on the finite history is decidable (after [Viswanathan, 2000](https://repository.upenn.edu/dissertations/AAI9989666/)). The guard is such a monitor: scope authorization, schema validation, conflict checks and rate limits decide on the mark history and the proposed call before it runs. A content policy or the statistical envelope enforces only the rule its code states, not "observations are true" or "this message causes no harm", which depend on what the guard cannot observe. Scope authorization and schema validation run inside `write()`; the other checks hold only when every call goes through the guard ([spec 9.1](spec.md#91-principle)).
1057
+
1049
1058
  **Bell-LaPadula model** ([Bell & LaPadula, 1973](https://apps.dtic.mil/sti/citations/AD0770768)): the OPEN/PROTECTED/CLASSIFIED visibility levels are a simplified Bell-LaPadula lattice. Bell-LaPadula's "no read up, no write down" becomes our "unauthorized readers see projections (PROTECTED) or nothing (CLASSIFIED)." The simplification is deliberate: the Bell-LaPadula model handles hierarchical security levels combined with compartment categories (related to [Denning's (1976)](https://doi.org/10.1145/360051.360056) lattice model of secure information flow); we need exactly three levels because the use case is coordination visibility, not military classification. The projected read (structure visible, content redacted) is the novel element. Bell-LaPadula has no analogue for "you can see that a mark exists but not what it says."
1050
1059
 
1051
1060
  **Environment as first-class abstraction** ([Weyns et al., 2007](https://doi.org/10.1007/s10458-006-0012-0)): Weyns, Omicini, and Odell argued that multi-agent system environments should be first-class architectural elements with their own responsibilities, not just passive containers. The mark space follows this prescription: it computes strength at read time, enforces visibility, and mediates all agent interaction. Agents do not interact with each other; they interact with the environment.
@@ -1106,7 +1115,7 @@ Recent work has applied coordination protocols to LLM agent fleets, though most
1106
1115
 
1107
1116
  **Agent Identity URI Scheme** ([Rodriguez, 2026](https://arxiv.org/abs/2601.14567)): proposes `agent://` as a stable, topology-independent naming scheme for multi-agent systems, combining an organizational trust root, a hierarchical capability path for semantic discovery, and a sortable unique identifier. The capability path (e.g., `/workflow/approval`) enables agents to locate collaborators by what they can do rather than by pre-configured identity - complementing markspace's static fleet composition with a dynamic discovery layer. Cryptographic attestation via PASETO tokens tied to the trust root provides a structural basis for cross-fleet identity verification. Most directly relevant to the cross-principal surface: attestation could upgrade incoming external marks to `EXTERNAL_VERIFIED` without manual cross-referencing, and capability paths enable runtime discovery of external fleet agents. The scheme assumes the attestation layer is the threat boundary and does not address adversarial agents operating within a legitimate trust root.
1108
1117
 
1109
- **Gap this work addresses.** Shared-state coordination is well-established (blackboard systems, tuple spaces, shared databases). Stigmergic decay and reinforcement have been studied in swarm intelligence since the 1990s. The specific gap is the combination, adapted for LLM agents: (1) a typed mark taxonomy with formal decay/trust semantics designed for probabilistic, exploitable agents, (2) a deterministic enforcement layer independent of LLM compliance, (3) systematic experimental validation across adversarial, concurrent, and multi-resource conditions, and (4) a formal specification with property tests covering normative guarantees. Several of these components draw directly from prior work - decay from pheromone evaporation (Dorigo et al., 1996), trust weighting from reputation models (Granatyr et al., 2015), the enforcement layer from Hoare monitors (1974), visibility from Bell-LaPadula (1973). The mark taxonomy (the specific 5-type decomposition oriented around coordination failure modes), projected reads (structure-visible, content-redacted access that Bell-LaPadula has no analogue for), and the empirical validation at scale under adversarial pressure are new contributions. The broader contribution is their integration into a protocol adapted for agents that are probabilistic, exploitable, and operating in environments where information goes stale - properties that prior shared-state systems did not design for. The attack surfaces documented in 2025-2026 security research - trust-authorization mismatch where static permissions decouple from runtime trustworthiness ([Shi et al., 2025](https://arxiv.org/abs/2512.06914)), prompt injection escalating through multi-stage kill chains ([Brodt et al., 2026](https://arxiv.org/abs/2601.09625)), and peer agents bypassing refusal guardrails that hold against direct prompting ([Lupinacci et al., 2025](https://arxiv.org/abs/2507.06850)) - are instances of these failure modes in deployed systems.
1118
+ **Gap this work addresses.** Shared-state coordination is well-established (blackboard systems, tuple spaces, shared databases). Stigmergic decay and reinforcement have been studied in swarm intelligence since the 1990s. The specific gap is the combination, adapted for LLM agents: (1) a typed mark taxonomy with formal decay/trust semantics designed for probabilistic, exploitable agents, (2) a deterministic enforcement layer independent of LLM compliance, (3) systematic experimental validation across adversarial, concurrent, and multi-resource conditions, and (4) a formal specification with property tests covering normative guarantees. Several of these components draw directly from prior work - decay from pheromone evaporation (Dorigo et al., 1996), trust weighting from reputation models (Granatyr et al., 2015), the enforcement layer from Hoare monitors (1974), visibility from Bell-LaPadula (1973). What the enforcement layer can guarantee follows from execution monitoring theory ([Schneider, 2000](https://doi.org/10.1145/353323.353382); [Hamlen et al., 2006](https://doi.org/10.1145/1111596.1111601)): safety properties with a decidable check, not properties that depend on what the guard cannot observe, such as whether content is true or causes harm. The mark taxonomy (the specific 5-type decomposition oriented around coordination failure modes), projected reads (structure-visible, content-redacted access that Bell-LaPadula has no analogue for), and the empirical validation at scale under adversarial pressure are new contributions. The broader contribution is their integration into a protocol adapted for agents that are probabilistic, exploitable, and operating in environments where information goes stale - properties that prior shared-state systems did not design for. The attack surfaces documented in 2025-2026 security research - trust-authorization mismatch where static permissions decouple from runtime trustworthiness ([Shi et al., 2025](https://arxiv.org/abs/2512.06914)), prompt injection escalating through multi-stage kill chains ([Brodt et al., 2026](https://arxiv.org/abs/2601.09625)), and peer agents bypassing refusal guardrails that hold against direct prompting ([Lupinacci et al., 2025](https://arxiv.org/abs/2507.06850)) - are instances of these failure modes in deployed systems.
1110
1119
 
1111
1120
 
1112
1121
  ## References
@@ -1197,6 +1206,11 @@ Recent work has applied coordination protocols to LLM agent fleets, though most
1197
1206
  - Hoare, C.A.R. (1974). "Monitors: An Operating System Structuring Concept." *Communications of the ACM*, 17(10), 549-557. [doi:10.1145/355620.361161](https://doi.org/10.1145/355620.361161). [Monitors: mutual exclusion + preconditions on shared state. Ancestor of the guard layer.]
1198
1207
  - Bell, D.E. & LaPadula, L.J. (1973). "Secure Computer Systems: Mathematical Foundations." MITRE Technical Report MTR-2547. [DTIC:AD0770768](https://apps.dtic.mil/sti/citations/AD0770768). [Bell-LaPadula model: mandatory access control lattice. Ancestor of OPEN/PROTECTED/CLASSIFIED visibility.]
1199
1208
  - Denning, D.E. (1976). "A Lattice Model of Secure Information Flow." *Communications of the ACM*, 19(5), 236-243. [doi:10.1145/360051.360056](https://doi.org/10.1145/360051.360056). [Lattice model of information flow security.]
1209
+ - Schneider, F.B. (2000). "Enforceable Security Policies." *ACM Transactions on Information and System Security*, 3(1), 30-50. [doi:10.1145/353323.353382](https://doi.org/10.1145/353323.353382). [Execution monitors enforce only safety properties. Access control is one; information flow is not. Monitors in tandem enforce the conjunction of their policies.]
1210
+ - Hamlen, K.W., Morrisett, G., & Schneider, F.B. (2006). "Computability Classes for Enforcement Mechanisms." *ACM Transactions on Programming Languages and Systems*, 28(1), 175-205. [doi:10.1145/1111596.1111601](https://doi.org/10.1145/1111596.1111601). [Static analysis enforces exactly the decidable policies; execution monitors enforce a subset of the co-recursively enumerable (coRE) properties, including policies whose static check is the Halting Problem. A monitor cannot enforce a policy whose critical events it cannot observe.]
1211
+ - Viswanathan, M. (2000). "Foundations for the Run-time Analysis of Software Systems." PhD thesis, University of Pennsylvania. [repository.upenn.edu](https://repository.upenn.edu/dissertations/AAI9989666/). [Adds the condition that an execution monitor's check on each finite prefix be computable; cited after Hamlen et al. (2006).]
1212
+ - Gray, C., & Cheriton, D. (1989). "Leases: An Efficient Fault-Tolerant Mechanism for Distributed File Cache Consistency." *Proceedings of the Twelfth ACM Symposium on Operating Systems Principles (SOSP '89)*, 202-210. [doi:10.1145/74850.74870](https://doi.org/10.1145/74850.74870).
1213
+ - Burrows, M. (2006). "The Chubby lock service for loosely-coupled distributed systems." *7th USENIX Symposium on Operating Systems Design and Implementation (OSDI '06)*. [usenix.org](https://www.usenix.org/conference/osdi-06/presentation/chubby-lock-service-loosely-coupled-distributed-systems).
1200
1214
  - Dorigo, M., Maniezzo, V., & Colorni, A. (1996). "Ant System: Optimization by a colony of cooperating agents." *IEEE Transactions on Systems, Man, and Cybernetics*, 26(1), 29-41. [doi:10.1109/3477.484436](https://doi.org/10.1109/3477.484436). [Ant Colony Optimization.]
1201
1215
  - Brambilla, M., Ferrante, E., Birattari, M., & Dorigo, M. (2013). "Swarm robotics: a review from the swarm engineering perspective." *Swarm Intelligence*, 7(1), 1-41. [doi:10.1007/s11721-012-0075-2](https://doi.org/10.1007/s11721-012-0075-2). [Survey of stigmergic coordination in swarm robotics.]
1202
1216
  - Parunak, H.V.D. (2006). "A survey of environments and mechanisms for human-human stigmergy." *Environments for Multi-Agent Systems II*, LNAI 3830, 163-186. [doi:10.1007/11678809_10](https://doi.org/10.1007/11678809_10). [Stigmergic coordination in human systems.]