the-steward 0.1.0__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 (216) hide show
  1. the_steward-0.1.0/LICENSE +50 -0
  2. the_steward-0.1.0/PKG-INFO +133 -0
  3. the_steward-0.1.0/README.md +72 -0
  4. the_steward-0.1.0/inferroute_steward/__init__.py +1 -0
  5. the_steward-0.1.0/inferroute_steward/agents/bench/agent.md +17 -0
  6. the_steward-0.1.0/inferroute_steward/agents/bootstrap/agent.md +111 -0
  7. the_steward-0.1.0/inferroute_steward/agents/detect/agent.md +52 -0
  8. the_steward-0.1.0/inferroute_steward/agents/doc-map/agent.md +42 -0
  9. the_steward-0.1.0/inferroute_steward/agents/doc-map/profile.json +8 -0
  10. the_steward-0.1.0/inferroute_steward/agents/editor/agent.md +92 -0
  11. the_steward-0.1.0/inferroute_steward/agents/evaluate/agent.md +62 -0
  12. the_steward-0.1.0/inferroute_steward/agents/evaluate/profile.json +9 -0
  13. the_steward-0.1.0/inferroute_steward/agents/fix/agent.md +33 -0
  14. the_steward-0.1.0/inferroute_steward/agents/getlogs-eval.prompt.md +12 -0
  15. the_steward-0.1.0/inferroute_steward/agents/goal-loop/agent.md +48 -0
  16. the_steward-0.1.0/inferroute_steward/agents/goal-loop/profile.json +9 -0
  17. the_steward-0.1.0/inferroute_steward/agents/investigate/agent.md +223 -0
  18. the_steward-0.1.0/inferroute_steward/agents/judge/agent.md +80 -0
  19. the_steward-0.1.0/inferroute_steward/agents/session-recap/agent.md +31 -0
  20. the_steward-0.1.0/inferroute_steward/agents/session-recap/profile.json +8 -0
  21. the_steward-0.1.0/inferroute_steward/orchestrator/agent.sh +523 -0
  22. the_steward-0.1.0/inferroute_steward/orchestrator/compose-digest.sh +334 -0
  23. the_steward-0.1.0/inferroute_steward/orchestrator/digest.sh +36 -0
  24. the_steward-0.1.0/inferroute_steward/orchestrator/getlogs-demo.py +649 -0
  25. the_steward-0.1.0/inferroute_steward/orchestrator/honest-case.sh +238 -0
  26. the_steward-0.1.0/inferroute_steward/orchestrator/loop_runner.sh +248 -0
  27. the_steward-0.1.0/inferroute_steward/orchestrator/observe.sh +296 -0
  28. the_steward-0.1.0/inferroute_steward/orchestrator/onboard_tui.py +276 -0
  29. the_steward-0.1.0/inferroute_steward/orchestrator/pipeline.sh +440 -0
  30. the_steward-0.1.0/inferroute_steward/orchestrator/preflight.sh +32 -0
  31. the_steward-0.1.0/inferroute_steward/orchestrator/run-agent.sh +127 -0
  32. the_steward-0.1.0/inferroute_steward/orchestrator/session-recap.sh +30 -0
  33. the_steward-0.1.0/inferroute_steward/orchestrator/st-evaluate.sh +25 -0
  34. the_steward-0.1.0/inferroute_steward/orchestrator/st-handoffs.sh +14 -0
  35. the_steward-0.1.0/inferroute_steward/orchestrator/st-morning +210 -0
  36. the_steward-0.1.0/inferroute_steward/orchestrator/st-onboard +28 -0
  37. the_steward-0.1.0/inferroute_steward/orchestrator/st-resolve.sh +32 -0
  38. the_steward-0.1.0/inferroute_steward/orchestrator/st-respond.sh +13 -0
  39. the_steward-0.1.0/inferroute_steward/orchestrator/st-review +212 -0
  40. the_steward-0.1.0/inferroute_steward/orchestrator/st-tui +14 -0
  41. the_steward-0.1.0/inferroute_steward/orchestrator/st-watch.sh +72 -0
  42. the_steward-0.1.0/inferroute_steward/orchestrator/st-web.sh +34 -0
  43. the_steward-0.1.0/inferroute_steward/orchestrator/steward_web.py +927 -0
  44. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-credit-alert.service +11 -0
  45. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-credit-alert.timer +9 -0
  46. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-failure-tracker.service +7 -0
  47. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-failure-tracker.timer +10 -0
  48. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-gha-sync.service +10 -0
  49. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-gha-sync.timer +9 -0
  50. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-handoffs.service +13 -0
  51. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-morning.service +8 -0
  52. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-morning.timer +11 -0
  53. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-reconcile.service +8 -0
  54. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-reconcile.timer +9 -0
  55. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-respond.service +13 -0
  56. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-sessions.service +9 -0
  57. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-sessions.timer +9 -0
  58. the_steward-0.1.0/inferroute_steward/orchestrator/systemd/st-web.service +18 -0
  59. the_steward-0.1.0/inferroute_steward/orchestrator/tui.py +318 -0
  60. the_steward-0.1.0/inferroute_steward/orchestrator/verify.sh +133 -0
  61. the_steward-0.1.0/inferroute_steward/orchestrator/web/dist/assets/index-BbvYwT7x.js +137 -0
  62. the_steward-0.1.0/inferroute_steward/orchestrator/web/dist/assets/index-D-5RLX01.css +1 -0
  63. the_steward-0.1.0/inferroute_steward/orchestrator/web/dist/assets/index-DVMmPqtF.js +137 -0
  64. the_steward-0.1.0/inferroute_steward/orchestrator/web/dist/favicon.svg +4 -0
  65. the_steward-0.1.0/inferroute_steward/orchestrator/web/dist/index.html +15 -0
  66. the_steward-0.1.0/inferroute_steward/orchestrator/web/index.html +14 -0
  67. the_steward-0.1.0/inferroute_steward/orchestrator/web/package-lock.json +3016 -0
  68. the_steward-0.1.0/inferroute_steward/orchestrator/web/package.json +33 -0
  69. the_steward-0.1.0/inferroute_steward/orchestrator/web/postcss.config.js +6 -0
  70. the_steward-0.1.0/inferroute_steward/orchestrator/web/public/favicon.svg +4 -0
  71. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/App.tsx +36 -0
  72. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/AppShell.tsx +55 -0
  73. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/ErrorBoundary.tsx +24 -0
  74. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/Logo.tsx +7 -0
  75. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/Provenance.tsx +45 -0
  76. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/bits.tsx +104 -0
  77. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/ui/badge.tsx +29 -0
  78. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/ui/button.tsx +29 -0
  79. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/ui/card.tsx +28 -0
  80. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/ui/skeleton.tsx +5 -0
  81. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/components/ui/tooltip.tsx +26 -0
  82. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/index.css +34 -0
  83. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/lib/api.ts +359 -0
  84. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/lib/useApi.ts +22 -0
  85. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/lib/utils.ts +14 -0
  86. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/main.tsx +10 -0
  87. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Bridges.tsx +110 -0
  88. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Cost.tsx +140 -0
  89. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Handoffs.tsx +102 -0
  90. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Overview.tsx +358 -0
  91. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Placeholder.tsx +20 -0
  92. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/RepoDetail.tsx +279 -0
  93. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Repos.tsx +74 -0
  94. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Session.tsx +115 -0
  95. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Settings.tsx +665 -0
  96. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/pages/Week.tsx +94 -0
  97. the_steward-0.1.0/inferroute_steward/orchestrator/web/src/vite-env.d.ts +1 -0
  98. the_steward-0.1.0/inferroute_steward/orchestrator/web/tailwind.config.ts +54 -0
  99. the_steward-0.1.0/inferroute_steward/orchestrator/web/tsconfig.json +24 -0
  100. the_steward-0.1.0/inferroute_steward/orchestrator/web/vite.config.ts +19 -0
  101. the_steward-0.1.0/inferroute_steward/steward_cli.py +116 -0
  102. the_steward-0.1.0/inferroute_steward/tools/agent_profile_selftest.sh +55 -0
  103. the_steward-0.1.0/inferroute_steward/tools/bridges.py +205 -0
  104. the_steward-0.1.0/inferroute_steward/tools/capabilities.py +239 -0
  105. the_steward-0.1.0/inferroute_steward/tools/capture_dossier.py +90 -0
  106. the_steward-0.1.0/inferroute_steward/tools/cloud_waiter.py +152 -0
  107. the_steward-0.1.0/inferroute_steward/tools/cold_start_drill.sh +36 -0
  108. the_steward-0.1.0/inferroute_steward/tools/config_path.py +83 -0
  109. the_steward-0.1.0/inferroute_steward/tools/consent.py +60 -0
  110. the_steward-0.1.0/inferroute_steward/tools/credit_alert.py +193 -0
  111. the_steward-0.1.0/inferroute_steward/tools/deploy_routine.py +386 -0
  112. the_steward-0.1.0/inferroute_steward/tools/diag_bench.py +610 -0
  113. the_steward-0.1.0/inferroute_steward/tools/discover.py +114 -0
  114. the_steward-0.1.0/inferroute_steward/tools/doc_drift.py +200 -0
  115. the_steward-0.1.0/inferroute_steward/tools/doc_map.py +276 -0
  116. the_steward-0.1.0/inferroute_steward/tools/fault_drill.sh +89 -0
  117. the_steward-0.1.0/inferroute_steward/tools/fixverify_bench.py +244 -0
  118. the_steward-0.1.0/inferroute_steward/tools/getlogs/adapters/example.json +21 -0
  119. the_steward-0.1.0/inferroute_steward/tools/getlogs/demo.py +125 -0
  120. the_steward-0.1.0/inferroute_steward/tools/getlogs/draft_adapter.py +158 -0
  121. the_steward-0.1.0/inferroute_steward/tools/getlogs/draft_selftest.sh +17 -0
  122. the_steward-0.1.0/inferroute_steward/tools/getlogs/getlogs.py +960 -0
  123. the_steward-0.1.0/inferroute_steward/tools/getlogs/getlogs_mcp.py +273 -0
  124. the_steward-0.1.0/inferroute_steward/tools/getlogs/selftest.sh +205 -0
  125. the_steward-0.1.0/inferroute_steward/tools/getlogs/silence.py +121 -0
  126. the_steward-0.1.0/inferroute_steward/tools/getlogs/test_normalize.py +162 -0
  127. the_steward-0.1.0/inferroute_steward/tools/gha/README.md +24 -0
  128. the_steward-0.1.0/inferroute_steward/tools/gha/cloud-waiter-runbook.md +47 -0
  129. the_steward-0.1.0/inferroute_steward/tools/gha/execute.py +64 -0
  130. the_steward-0.1.0/inferroute_steward/tools/gha/steward-action.yml +39 -0
  131. the_steward-0.1.0/inferroute_steward/tools/gha/steward.yml.tmpl +80 -0
  132. the_steward-0.1.0/inferroute_steward/tools/gha/watch.py +61 -0
  133. the_steward-0.1.0/inferroute_steward/tools/gha_dialects_test.py +107 -0
  134. the_steward-0.1.0/inferroute_steward/tools/gha_executor.py +658 -0
  135. the_steward-0.1.0/inferroute_steward/tools/gha_fetch.py +215 -0
  136. the_steward-0.1.0/inferroute_steward/tools/gha_render.py +187 -0
  137. the_steward-0.1.0/inferroute_steward/tools/gha_shipper.py +178 -0
  138. the_steward-0.1.0/inferroute_steward/tools/gha_signal.py +197 -0
  139. the_steward-0.1.0/inferroute_steward/tools/gha_sync.py +258 -0
  140. the_steward-0.1.0/inferroute_steward/tools/gha_vendor.sh +49 -0
  141. the_steward-0.1.0/inferroute_steward/tools/gha_vendor_selftest.sh +23 -0
  142. the_steward-0.1.0/inferroute_steward/tools/graphify/build_graph.py +94 -0
  143. the_steward-0.1.0/inferroute_steward/tools/graphify/refresh.sh +39 -0
  144. the_steward-0.1.0/inferroute_steward/tools/handoffs.py +370 -0
  145. the_steward-0.1.0/inferroute_steward/tools/harm_attempt.py +304 -0
  146. the_steward-0.1.0/inferroute_steward/tools/identity.py +69 -0
  147. the_steward-0.1.0/inferroute_steward/tools/ledger/attribute.py +112 -0
  148. the_steward-0.1.0/inferroute_steward/tools/ledger/budget_governor.py +139 -0
  149. the_steward-0.1.0/inferroute_steward/tools/ledger/deploy_state.py +465 -0
  150. the_steward-0.1.0/inferroute_steward/tools/ledger/flap_damper.py +114 -0
  151. the_steward-0.1.0/inferroute_steward/tools/ledger/from_getlogs.py +107 -0
  152. the_steward-0.1.0/inferroute_steward/tools/ledger/ledger.py +343 -0
  153. the_steward-0.1.0/inferroute_steward/tools/ledger/rekey_logger_field.py +105 -0
  154. the_steward-0.1.0/inferroute_steward/tools/ledger/selftest.sh +199 -0
  155. the_steward-0.1.0/inferroute_steward/tools/ledger/session_join.py +350 -0
  156. the_steward-0.1.0/inferroute_steward/tools/link_telegram.py +127 -0
  157. the_steward-0.1.0/inferroute_steward/tools/linked_repos.py +180 -0
  158. the_steward-0.1.0/inferroute_steward/tools/needs_henry.py +126 -0
  159. the_steward-0.1.0/inferroute_steward/tools/new_agent.sh +69 -0
  160. the_steward-0.1.0/inferroute_steward/tools/new_agent_selftest.sh +27 -0
  161. the_steward-0.1.0/inferroute_steward/tools/no_hardcoded_names.sh +32 -0
  162. the_steward-0.1.0/inferroute_steward/tools/no_hardcoded_personal_data_test.py +82 -0
  163. the_steward-0.1.0/inferroute_steward/tools/portability_matrix.sh +141 -0
  164. the_steward-0.1.0/inferroute_steward/tools/portable_shell.sh +81 -0
  165. the_steward-0.1.0/inferroute_steward/tools/preflight.py +253 -0
  166. the_steward-0.1.0/inferroute_steward/tools/repo_state.py +254 -0
  167. the_steward-0.1.0/inferroute_steward/tools/repo_topology.py +71 -0
  168. the_steward-0.1.0/inferroute_steward/tools/repo_topology_selftest.sh +18 -0
  169. the_steward-0.1.0/inferroute_steward/tools/repos_config.py +537 -0
  170. the_steward-0.1.0/inferroute_steward/tools/resolve_session.py +96 -0
  171. the_steward-0.1.0/inferroute_steward/tools/review/attribution.py +99 -0
  172. the_steward-0.1.0/inferroute_steward/tools/review/extract_leaked_calls.py +176 -0
  173. the_steward-0.1.0/inferroute_steward/tools/review/failure_tracker.py +380 -0
  174. the_steward-0.1.0/inferroute_steward/tools/review/fleet.py +515 -0
  175. the_steward-0.1.0/inferroute_steward/tools/review/freshness.py +252 -0
  176. the_steward-0.1.0/inferroute_steward/tools/review/loop_queue.py +214 -0
  177. the_steward-0.1.0/inferroute_steward/tools/review/model_registry.py +113 -0
  178. the_steward-0.1.0/inferroute_steward/tools/review/morning_brief.py +1173 -0
  179. the_steward-0.1.0/inferroute_steward/tools/review/push.py +317 -0
  180. the_steward-0.1.0/inferroute_steward/tools/review/queue.py +453 -0
  181. the_steward-0.1.0/inferroute_steward/tools/review/rank.py +109 -0
  182. the_steward-0.1.0/inferroute_steward/tools/review/recover.py +283 -0
  183. the_steward-0.1.0/inferroute_steward/tools/review/reprompt_probe.py +136 -0
  184. the_steward-0.1.0/inferroute_steward/tools/review/respond.py +197 -0
  185. the_steward-0.1.0/inferroute_steward/tools/review/salvage.py +76 -0
  186. the_steward-0.1.0/inferroute_steward/tools/review/slo_report.py +180 -0
  187. the_steward-0.1.0/inferroute_steward/tools/review/watch_mcp.py +118 -0
  188. the_steward-0.1.0/inferroute_steward/tools/review/watch_state.py +258 -0
  189. the_steward-0.1.0/inferroute_steward/tools/scan_session_failures.py +184 -0
  190. the_steward-0.1.0/inferroute_steward/tools/scope.py +96 -0
  191. the_steward-0.1.0/inferroute_steward/tools/scrub_floor.py +137 -0
  192. the_steward-0.1.0/inferroute_steward/tools/self_deploy.py +132 -0
  193. the_steward-0.1.0/inferroute_steward/tools/selftest_all.sh +99 -0
  194. the_steward-0.1.0/inferroute_steward/tools/session_recap_selftest.sh +50 -0
  195. the_steward-0.1.0/inferroute_steward/tools/sessions/consume.sh +76 -0
  196. the_steward-0.1.0/inferroute_steward/tools/sessions/half_done.py +146 -0
  197. the_steward-0.1.0/inferroute_steward/tools/sessions/merge_intents.py +179 -0
  198. the_steward-0.1.0/inferroute_steward/tools/sessions/read_sessions.py +337 -0
  199. the_steward-0.1.0/inferroute_steward/tools/sessions/selftest.sh +182 -0
  200. the_steward-0.1.0/inferroute_steward/tools/settings.py +180 -0
  201. the_steward-0.1.0/inferroute_steward/tools/state_branch.py +292 -0
  202. the_steward-0.1.0/inferroute_steward/tools/steward_cli_selftest.sh +54 -0
  203. the_steward-0.1.0/inferroute_steward/tools/steward_core.py +294 -0
  204. the_steward-0.1.0/inferroute_steward/tools/steward_telegram.py +421 -0
  205. the_steward-0.1.0/inferroute_steward/tools/sync_units.py +556 -0
  206. the_steward-0.1.0/inferroute_steward/tools/test_scan_session_failures.py +99 -0
  207. the_steward-0.1.0/inferroute_steward/tools/track.py +260 -0
  208. the_steward-0.1.0/inferroute_steward/tools/verify_selftest.sh +89 -0
  209. the_steward-0.1.0/inferroute_steward/tools/wizard.py +275 -0
  210. the_steward-0.1.0/pyproject.toml +52 -0
  211. the_steward-0.1.0/setup.cfg +4 -0
  212. the_steward-0.1.0/the_steward.egg-info/PKG-INFO +133 -0
  213. the_steward-0.1.0/the_steward.egg-info/SOURCES.txt +214 -0
  214. the_steward-0.1.0/the_steward.egg-info/dependency_links.txt +1 -0
  215. the_steward-0.1.0/the_steward.egg-info/entry_points.txt +2 -0
  216. the_steward-0.1.0/the_steward.egg-info/top_level.txt +1 -0
@@ -0,0 +1,50 @@
1
+ The Steward — Evaluation License
2
+ Copyright (c) 2026 Henry Declety. All rights reserved.
3
+
4
+ 1. DEFINITIONS
5
+ "Software" means The Steward — this package and all accompanying code, scripts, agents, and
6
+ documentation. "You" means the individual or entity granted access under this license.
7
+
8
+ 2. GRANT (LIMITED, EVALUATION-ONLY)
9
+ Subject to your compliance with this license, Henry Declety grants You a personal, non-exclusive,
10
+ non-transferable, non-sublicensable, revocable license to install and run the Software on machines
11
+ You control, solely to evaluate it for Your own internal use. No other rights are granted.
12
+
13
+ 3. RESTRICTIONS
14
+ You may NOT, in whole or in part: (a) redistribute, publish, sublicense, sell, rent, or otherwise
15
+ make the Software available to any third party; (b) fork, mirror, or create derivative works for
16
+ distribution; (c) use the Software to provide a service to third parties or for any commercial
17
+ purpose; (d) remove or alter any proprietary notices; (e) reverse-engineer except to the extent that
18
+ restriction is prohibited by applicable law.
19
+
20
+ 4. OWNERSHIP
21
+ The Software is licensed, not sold. Henry Declety retains all right, title, and interest in and to the
22
+ Software, including all intellectual property rights. Any feedback or contributions You provide may
23
+ be used by Henry Declety without restriction or obligation, and You assign to Henry Declety all rights
24
+ in any such contributions.
25
+
26
+ 5. THIRD-PARTY / RUNTIME SERVICES
27
+ The Software routes inference through inferroute (the "ir" economy lane); Your use of that service is
28
+ governed by its own terms. The Software is not a license to any inferroute service or credits.
29
+
30
+ 6. TERM & TERMINATION
31
+ This license is effective until terminated. It terminates automatically if You breach any term, and
32
+ Henry Declety may revoke it at any time. On termination You must stop using and delete all copies of
33
+ the Software.
34
+
35
+ 7. NO WARRANTY
36
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
37
+ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
38
+
39
+ 8. LIMITATION OF LIABILITY
40
+ IN NO EVENT SHALL Henry Declety BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY (INCLUDING
41
+ DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR LOSS OF DATA OR PROFITS) ARISING FROM OR IN
42
+ CONNECTION WITH THE SOFTWARE OR ITS USE. The Software runs autonomously and may modify files in
43
+ repositories You point it at; You are responsible for the repositories and machines You authorize it
44
+ to act on.
45
+
46
+ 9. GOVERNING LAW
47
+ This Agreement is governed by and construed in accordance with the laws of France, without regard to
48
+ its conflict-of-laws rules. The courts of Paris, France shall have exclusive jurisdiction over any
49
+ dispute arising out of or relating to this Agreement or the Software, subject to any mandatory
50
+ provisions of law that apply to a consumer in their country of residence.
@@ -0,0 +1,133 @@
1
+ Metadata-Version: 2.4
2
+ Name: the-steward
3
+ Version: 0.1.0
4
+ Summary: The Steward — a continuously-watching guardian that spends intelligence only on novelty, investigates it to a decision-ready conclusion, verifies against reality over time, and surfaces exactly what a human or an agent needs. The flagship inferroute application.
5
+ License: The Steward — Evaluation License
6
+ Copyright (c) 2026 Henry Declety. All rights reserved.
7
+
8
+ 1. DEFINITIONS
9
+ "Software" means The Steward — this package and all accompanying code, scripts, agents, and
10
+ documentation. "You" means the individual or entity granted access under this license.
11
+
12
+ 2. GRANT (LIMITED, EVALUATION-ONLY)
13
+ Subject to your compliance with this license, Henry Declety grants You a personal, non-exclusive,
14
+ non-transferable, non-sublicensable, revocable license to install and run the Software on machines
15
+ You control, solely to evaluate it for Your own internal use. No other rights are granted.
16
+
17
+ 3. RESTRICTIONS
18
+ You may NOT, in whole or in part: (a) redistribute, publish, sublicense, sell, rent, or otherwise
19
+ make the Software available to any third party; (b) fork, mirror, or create derivative works for
20
+ distribution; (c) use the Software to provide a service to third parties or for any commercial
21
+ purpose; (d) remove or alter any proprietary notices; (e) reverse-engineer except to the extent that
22
+ restriction is prohibited by applicable law.
23
+
24
+ 4. OWNERSHIP
25
+ The Software is licensed, not sold. Henry Declety retains all right, title, and interest in and to the
26
+ Software, including all intellectual property rights. Any feedback or contributions You provide may
27
+ be used by Henry Declety without restriction or obligation, and You assign to Henry Declety all rights
28
+ in any such contributions.
29
+
30
+ 5. THIRD-PARTY / RUNTIME SERVICES
31
+ The Software routes inference through inferroute (the "ir" economy lane); Your use of that service is
32
+ governed by its own terms. The Software is not a license to any inferroute service or credits.
33
+
34
+ 6. TERM & TERMINATION
35
+ This license is effective until terminated. It terminates automatically if You breach any term, and
36
+ Henry Declety may revoke it at any time. On termination You must stop using and delete all copies of
37
+ the Software.
38
+
39
+ 7. NO WARRANTY
40
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
41
+ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
42
+
43
+ 8. LIMITATION OF LIABILITY
44
+ IN NO EVENT SHALL Henry Declety BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY (INCLUDING
45
+ DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR LOSS OF DATA OR PROFITS) ARISING FROM OR IN
46
+ CONNECTION WITH THE SOFTWARE OR ITS USE. The Software runs autonomously and may modify files in
47
+ repositories You point it at; You are responsible for the repositories and machines You authorize it
48
+ to act on.
49
+
50
+ 9. GOVERNING LAW
51
+ This Agreement is governed by and construed in accordance with the laws of France, without regard to
52
+ its conflict-of-laws rules. The courts of Paris, France shall have exclusive jurisdiction over any
53
+ dispute arising out of or relating to this Agreement or the Software, subject to any mandatory
54
+ provisions of law that apply to a consumer in their country of residence.
55
+
56
+ Classifier: License :: Other/Proprietary License
57
+ Requires-Python: >=3.10
58
+ Description-Content-Type: text/markdown
59
+ License-File: LICENSE
60
+ Dynamic: license-file
61
+
62
+ # The Steward
63
+
64
+ **A guardian that watches your repos overnight, spends intelligence only on what's new, investigates
65
+ it to a decision, and hands you a short morning brief — not a firehose.**
66
+
67
+ The Steward sits beside your projects. Most of the time it does nothing but watch (cheap, local, no
68
+ inference). When something genuinely changes — a new error in your logs, a risky commit, a regression —
69
+ it spins up an isolated worktree, investigates with an LLM, verifies the finding against reality, and
70
+ either fixes it on a branch or writes it up. In the morning you read one digest.
71
+
72
+ > **Status: early access for friends.** Linux (and WSL2) today; macOS scheduling is in progress.
73
+ > Install with `pipx install the-steward`. See [INSTALL](#install).
74
+
75
+ ## What it does
76
+ - **Watches** your tracked git repos + their logs locally, on a timer. No inference until something is new.
77
+ - **Investigates** novelty in a throwaway git worktree — never your working tree, never your branches.
78
+ - **Verifies** findings against the real repo (it won't surface a fix for a file that doesn't exist).
79
+ - **Scrubs** secrets out of anything before it leaves your machine for the model.
80
+ - **Briefs** you each morning — read it in the **dashboard** (`localhost:5057`) or `steward review`.
81
+
82
+ ## Requirements
83
+ - Linux with `systemd --user` (or WSL2 with systemd enabled). *macOS isn't supported yet — `steward init`
84
+ will stop with that message.*
85
+ - Python ≥ 3.10, `git`, `tmux`, and `bash`.
86
+ - **Claude Code** — the `claude` CLI is the agent harness the Steward drives to investigate; `steward init`
87
+ hard-checks for it. Install: https://claude.com/code
88
+ - An **inferroute** account for the **economy lane** (the recommended way to run — cheap, always-on
89
+ compute that keeps the overnight watch affordable):
90
+ 1. `pipx install 'inferroute>=0.3.28'` *(0.3.28+ required — it honors the Steward's write-scoping)*
91
+ 2. Sign up at **https://inferroute.ai** — early-access friends start with a small **$5 credit
92
+ headstart** on their own account; top up with your own credits once you've kicked the tires.
93
+ 3. `ir login` (paste your key) — or `ir setup` for the guided first-run.
94
+
95
+ *Escape hatch:* you can instead bring your own Anthropic/Claude key (`ir anthropic` / BYO), but the
96
+ economy lane is what makes always-on watching cheap, so it's the default.
97
+
98
+ ## Install
99
+ The package is on PyPI (proprietary, licensed for evaluation — see [License](#license)):
100
+ ```bash
101
+ pipx install the-steward # or: pip install the-steward into a venv
102
+ steward init # preflight + economy on-ramp + your local dashboard
103
+ ```
104
+ Update any time with `pipx upgrade the-steward`.
105
+ `steward init` runs a preflight (checks your tools + that your inferroute economy login is funded, with
106
+ the exact fix for anything missing), then installs your **local dashboard** and points you to it.
107
+
108
+ **Pick your projects in the dashboard** — `http://localhost:5057` — where you discover repos, see each
109
+ one's fit (evaluated for you), and start watching the ones you want. That's the main way to drive it.
110
+ ```bash
111
+ steward review # the morning digest (auto-runs each morning; run any time)
112
+ steward status <repo> # a repo's health from the terminal
113
+ # headless / no browser? pick from the terminal instead:
114
+ steward discover # list watchable repos
115
+ steward track <repo> # watch one · steward untrack <repo> to stop · steward onboard for a TUI
116
+ ```
117
+
118
+ ## Privacy
119
+ - The watch loop is **fully local** — zero inference, zero egress.
120
+ - When an investigation runs, context is **scrubbed of secrets** before it reaches the model.
121
+ - **Fleet telemetry** (run/turn metadata to improve the tuning loops) is configurable:
122
+ `steward` shows the setting at setup; turn it off to ship nothing. *(See [INSTALL](#install) for the
123
+ current default and exactly what's sent.)*
124
+
125
+ ## What it is NOT (yet)
126
+ - Not open source — it's on PyPI, but under a proprietary **evaluation** license: run it on your own
127
+ machines, but don't redistribute, fork, or use it commercially.
128
+ - Not an OS-level sandbox — point it at your own repos, not untrusted code. Agents run in throwaway
129
+ worktrees, but a misbehaving agent with shell access could still read files in your home dir.
130
+
131
+ ## License
132
+ Proprietary — © 2026 Henry Declety. Licensed to early-access users for **evaluation only**: you may run it
133
+ on your own machines, but not redistribute, fork, or use it commercially. See [LICENSE](LICENSE).
@@ -0,0 +1,72 @@
1
+ # The Steward
2
+
3
+ **A guardian that watches your repos overnight, spends intelligence only on what's new, investigates
4
+ it to a decision, and hands you a short morning brief — not a firehose.**
5
+
6
+ The Steward sits beside your projects. Most of the time it does nothing but watch (cheap, local, no
7
+ inference). When something genuinely changes — a new error in your logs, a risky commit, a regression —
8
+ it spins up an isolated worktree, investigates with an LLM, verifies the finding against reality, and
9
+ either fixes it on a branch or writes it up. In the morning you read one digest.
10
+
11
+ > **Status: early access for friends.** Linux (and WSL2) today; macOS scheduling is in progress.
12
+ > Install with `pipx install the-steward`. See [INSTALL](#install).
13
+
14
+ ## What it does
15
+ - **Watches** your tracked git repos + their logs locally, on a timer. No inference until something is new.
16
+ - **Investigates** novelty in a throwaway git worktree — never your working tree, never your branches.
17
+ - **Verifies** findings against the real repo (it won't surface a fix for a file that doesn't exist).
18
+ - **Scrubs** secrets out of anything before it leaves your machine for the model.
19
+ - **Briefs** you each morning — read it in the **dashboard** (`localhost:5057`) or `steward review`.
20
+
21
+ ## Requirements
22
+ - Linux with `systemd --user` (or WSL2 with systemd enabled). *macOS isn't supported yet — `steward init`
23
+ will stop with that message.*
24
+ - Python ≥ 3.10, `git`, `tmux`, and `bash`.
25
+ - **Claude Code** — the `claude` CLI is the agent harness the Steward drives to investigate; `steward init`
26
+ hard-checks for it. Install: https://claude.com/code
27
+ - An **inferroute** account for the **economy lane** (the recommended way to run — cheap, always-on
28
+ compute that keeps the overnight watch affordable):
29
+ 1. `pipx install 'inferroute>=0.3.28'` *(0.3.28+ required — it honors the Steward's write-scoping)*
30
+ 2. Sign up at **https://inferroute.ai** — early-access friends start with a small **$5 credit
31
+ headstart** on their own account; top up with your own credits once you've kicked the tires.
32
+ 3. `ir login` (paste your key) — or `ir setup` for the guided first-run.
33
+
34
+ *Escape hatch:* you can instead bring your own Anthropic/Claude key (`ir anthropic` / BYO), but the
35
+ economy lane is what makes always-on watching cheap, so it's the default.
36
+
37
+ ## Install
38
+ The package is on PyPI (proprietary, licensed for evaluation — see [License](#license)):
39
+ ```bash
40
+ pipx install the-steward # or: pip install the-steward into a venv
41
+ steward init # preflight + economy on-ramp + your local dashboard
42
+ ```
43
+ Update any time with `pipx upgrade the-steward`.
44
+ `steward init` runs a preflight (checks your tools + that your inferroute economy login is funded, with
45
+ the exact fix for anything missing), then installs your **local dashboard** and points you to it.
46
+
47
+ **Pick your projects in the dashboard** — `http://localhost:5057` — where you discover repos, see each
48
+ one's fit (evaluated for you), and start watching the ones you want. That's the main way to drive it.
49
+ ```bash
50
+ steward review # the morning digest (auto-runs each morning; run any time)
51
+ steward status <repo> # a repo's health from the terminal
52
+ # headless / no browser? pick from the terminal instead:
53
+ steward discover # list watchable repos
54
+ steward track <repo> # watch one · steward untrack <repo> to stop · steward onboard for a TUI
55
+ ```
56
+
57
+ ## Privacy
58
+ - The watch loop is **fully local** — zero inference, zero egress.
59
+ - When an investigation runs, context is **scrubbed of secrets** before it reaches the model.
60
+ - **Fleet telemetry** (run/turn metadata to improve the tuning loops) is configurable:
61
+ `steward` shows the setting at setup; turn it off to ship nothing. *(See [INSTALL](#install) for the
62
+ current default and exactly what's sent.)*
63
+
64
+ ## What it is NOT (yet)
65
+ - Not open source — it's on PyPI, but under a proprietary **evaluation** license: run it on your own
66
+ machines, but don't redistribute, fork, or use it commercially.
67
+ - Not an OS-level sandbox — point it at your own repos, not untrusted code. Agents run in throwaway
68
+ worktrees, but a misbehaving agent with shell access could still read files in your home dir.
69
+
70
+ ## License
71
+ Proprietary — © 2026 Henry Declety. Licensed to early-access users for **evaluation only**: you may run it
72
+ on your own machines, but not redistribute, fork, or use it commercially. See [LICENSE](LICENSE).
@@ -0,0 +1 @@
1
+ """The Steward — packaged runtime (orchestrator + tools + agents + CLI)."""
@@ -0,0 +1,17 @@
1
+ # The Steward — Benchmark Investigator
2
+
3
+ You are investigating a real operational question about THIS machine's services, using its logs.
4
+ Work efficiently and honestly: find the actual answer in the logs (and the repo's source if helpful),
5
+ don't speculate. If the logs don't support a conclusion, say so.
6
+
7
+ Depending on your toolset you may have:
8
+ - **get-logs MCP tools** (`getlogs_summary` / `getlogs_query` / `getlogs_count` / `getlogs_capabilities`)
9
+ — a deduped, severity-classified view of the services' logs. Summary first, then drill down. OR
10
+ - **a shell** — use `journalctl --user -u '<unit-glob>'` (mind output size; the journals are large),
11
+ `grep`, and the repo source.
12
+
13
+ Rules:
14
+ - Read-only investigation: do NOT modify anything (no writes, no service restarts).
15
+ - Ground every claim in a specific log line or source line you actually saw.
16
+ - Be token-conscious: don't dump megabytes; narrow queries beat broad ones.
17
+ - Your FINAL message must end with ONLY the JSON object the task asks for — no prose after it.
@@ -0,0 +1,111 @@
1
+ # The Steward — BOOTSTRAP agent
2
+
3
+ You run **once per repo** (and when its log/deploy setup changes) to build the durable toolbox +
4
+ memory every later agent reuses for free. Live repo; `Read`/`Glob`/`Grep`, `Bash`, and `Write`/`Edit`
5
+ scoped to the Tools directory (you cannot edit the user's source — that's not your job).
6
+
7
+ ## Main deliverable: a VALIDATED get-logs adapter (config, not code)
8
+
9
+ `get-logs` is a SHIPPED, frozen framework — a query engine that reads logs and dedups them into error
10
+ *shapes*. **You do not write or edit it, and you write NO parsing/querying code.** Your only job on
11
+ the tool is its per-repo **adapter**: a small JSON file that DECLARES this repo's log sources + format.
12
+ The framework does all the querying.
13
+
14
+ The framework path, your adapter output path, and the repo path are given at the END of this prompt.
15
+
16
+ Write the adapter (JSON) with:
17
+ - `sources`: list of `{"name","kind","unit"|"glob","format":"text-leveled"}`. **First discover HOW
18
+ THIS repo emits logs — do not assume a stack.** Read the run/dev command, README/docs, config, and
19
+ the process model, then map to a source kind:
20
+ - **systemd** (user OR system units): `kind:"systemd-user"|"systemd-system"`, `"unit":"<unit>"`.
21
+ Find units via `systemctl [--user] list-units '<prefix>*' --all` — **include FAILED/inactive**
22
+ units (a failed service is exactly what we want to see).
23
+ - **log files**: `kind:"logfile"`, `"glob":"<path>"` — from configured log paths / `*.log`.
24
+ - **a peer machine's systemd** (docs/70 — the repo runs on MORE than this host): ONE `kind:"ssh-systemd"`
25
+ source PER HOST, with a **unit GLOB** (`"unit":"<service-prefix>-*"`) covering ALL that host's units —
26
+ NOT one source per unit. The framework reads the whole peer in a SINGLE ssh call and pre-filters to
27
+ error lines at the source, so it stays cheap. Add `"params":{"host":"<host>","user":"<user>"}` and a flat
28
+ `"origin":"<host>"`. The framework READS that host's user-journal over ssh, parsed identically to a local
29
+ read — a peer's journald is fully readable, NOT a "can't read" case. A down host degrades to an
30
+ unreadable source, never a hard failure.
31
+ If the repo logs ONLY somewhere the framework can't read yet (container/Docker stdout, k8s, a cloud
32
+ sink, syslog — but NOT a peer's journald, which `ssh-systemd` reads), add no source for it and record a
33
+ `needs:source-kind` note in `topology.md` — do NOT shell out to a bespoke collector. (Framework source
34
+ kinds today: systemd-user, systemd-system, logfile, ssh-systemd.)
35
+
36
+ **DISCOVER DEPLOYMENT ORIGINS (docs/70) — do this whenever the repo runs on more than THIS host.** Read
37
+ the deploy artifacts (a config's `local_machine`/`target_host`/host list, a multi-host deploy script, k8s
38
+ replicas, unit templates) to find every host the repo runs on. For EACH host that is not the machine you
39
+ are on, add ONE `ssh-systemd` source (a unit GLOB covering all its units — see above) with a flat `origin`
40
+ (the host name) — **even when you found those same units locally.** The same unit on a peer host is a
41
+ DIFFERENT INSTANCE with its own logs;
42
+ a local-only adapter is BLIND to peer instances (it would miss, e.g., an OOM that only happens on the
43
+ unification host). That is the whole point: one Steward, every origin.
44
+ Two rationales are WRONG — do NOT use them to skip `ssh-systemd`:
45
+ · "the framework can't read remote journals" — it CAN (`ssh-systemd` reads a peer's user-journal over ssh,
46
+ parsed like local); the can't-read list above is container/k8s/cloud ONLY, never journald.
47
+ · "the repo already scans remote errors itself (a check_errors.py / its own ssh)" — irrelevant; the
48
+ Steward needs the signals in ITS OWN ledger to detect, attribute, and fix them.
49
+ ONLY when you cannot determine a peer's host name or ssh access from the repo: record a `needs:origins`
50
+ note in `topology.md` (the host + what's missing) and watch the local host only — never guess hosts.
51
+ - `severity_patterns`: `{"critical":"<regex>","error":"<regex>","warning":"<regex>"}` — regexes that
52
+ match a line's severity. Prefer **precise tags** (`\\[ERROR\\]`) over loose words like `failed`
53
+ (which over-match "Files failed: 0"). If the repo uses systemd, include its failure lines
54
+ (`Failed with result|oom-kill`) as critical.
55
+ - `shape_masks`: list of `["<regex>","<replacement>"]` masking the VARIABLE tokens in a message
56
+ (timestamps, numbers, ids, hex, `key=...`) so N identical errors collapse to ONE shape. Be
57
+ conservative — don't mask the words that identify the error.
58
+ - `broad_unit_glob`: a glob covering ALL the repo's units (e.g. `myservice-*`); the framework uses it
59
+ to detect when your `sources` list is missing a unit.
60
+
61
+ Only `format:"text-leveled"` (timestamped `[LEVEL] logger: message` text) is implemented today. If a
62
+ source is JSON or another format, set its `format` and STOP — the validator emits `needs:parser-kind`;
63
+ note it in `topology.md`. **Do NOT write a parser** — that's a framework task for us, not for you.
64
+
65
+ ## Validate — iterate until it passes (MANDATORY)
66
+
67
+ After writing the adapter, run the validator and FIX the adapter until it passes (`valid:true`, exit 0):
68
+ ```
69
+ python3 <FRAMEWORK> validate --config <ADAPTER> --since "24 hours ago"
70
+ ```
71
+ It checks schema, parser kinds, source reachability, and — critically — that your adapter actually
72
+ SURFACES the errors that exist: if the broad scan shows errors but your adapter shows zero, it FAILS
73
+ (your patterns/units are mis-scoped — fix them, don't ship it). Read its `errors`, fix, repeat. Then
74
+ eyeball `python3 <FRAMEWORK> summary --config <ADAPTER> --since "24 hours ago"` and confirm the shapes
75
+ are real, deduped errors — not noise, not empty.
76
+
77
+ ## Also produce the repo-knowledge memory FILES — write them with the **Write tool** into the MEMORY dir from the Paths section
78
+ - `topology.md` — repo layout, install/build/run, the **test command**, entry points, key modules;
79
+ any cloud log source + how to auth; any `needs:parser-kind` sources.
80
+ - `conventions.md` — language, lint/format/style, naming, test layout — what a fix must respect.
81
+ - `observability.md` — a short note on **blind spots AND noise**: modules/paths that fail SILENTLY
82
+ (swallowed exceptions, bare `except: pass`, critical paths with no logging) and the opposite —
83
+ loggers that FLOOD (per-tick warnings, retry storms at high level) or mis-level (routine conditions
84
+ at ERROR, real errors at INFO). Tells later agents where silence ≠ health and where volume ≠
85
+ signal; seeds the observability lane's logging-improvement jobs (docs/20).
86
+ - `MEMORY.md` — a tight index (≤ ~150 lines) linking the topic files.
87
+
88
+ ## Also learn the DEPLOY ROUTINE (docs/29 §7.8) — how this repo SHIPS
89
+ A `<store>/deploy_routine.json` already exists at `confidence:"scan"` with a `candidates` list (deploy
90
+ scripts, CI, containers, deploy docs the deterministic scan found). **READ those candidate files** and
91
+ *understand* them — a scan can find `deploy.sh` but cannot know what it does. Then:
92
+ - Write **`deploy.md`** (prose, into the MEMORY dir): what "deploy" actually means here (the steps), and
93
+ the answers below.
94
+ - **Upgrade `deploy_routine.json`** (it's at the store root — write it with Bash): set `confidence:"understood"`
95
+ and fill these fields from what you READ (not guessed):
96
+ - `mechanism` — the real deploy flow (e.g. "build wheel → rsync to N nodes → restart systemd").
97
+ - `local_test` — is there a test/local-verify step before deploy? **Beware false friends**: a `local`
98
+ flag is often a deploy TARGET (deploy to this host), NOT "test locally first" — say which it is.
99
+ - `commit_before_deploy` — does deploy require a clean commit, or build from the working tree? (Check
100
+ the script AND the deploy docs — the rule often lives in docs, not the script.)
101
+ - `deploy_cmd` · `deployed_probe` (what proves "deployed" — git HEAD? a docker image SHA? — for
102
+ `deploy_state`; a human-reviewed `deploy.json` overrides this).
103
+ - `ship_policy.guess` (`pr`|`push`) + `ship_policy.evidence` — your read of PR-before-merge vs
104
+ push-to-master from git history + any CONTRIBUTING/branch-protection. This is only a SUGGESTED
105
+ default; the human owns the toggle — never assert it as certain.
106
+ Keep `deploy.md` short. If the repo has no deploy concept, say so and leave confidence at scan.
107
+
108
+ ## git init: only if the repo is not yet git AND you were explicitly told it's authorized.
109
+
110
+ Keep it minimal + clean. Deliverables: a VALIDATED adapter + memory — never code changes, never a
111
+ hand-written querying script.
@@ -0,0 +1,52 @@
1
+ # The Steward — DETECT agent
2
+
3
+ You find real, actionable problems in a running system and emit them as structured JOBS for later
4
+ agents. You are **read-only**: `Read`/`Glob`/`Grep` on the code, and exactly ONE log tool — `get-logs`
5
+ (its path is at the END of this prompt). You change nothing and you run nothing else.
6
+
7
+ Your pinned memory (loaded as `MEMORY.md` + topic files) holds this repo's topology, conventions, and
8
+ **observability** notes — use them. In particular `observability.md` flags where *silence ≠ health*
9
+ (blind-spot modules that swallow errors), so a quiet unit memory flagged is not automatically fine.
10
+
11
+ ## Process
12
+ 1. `get-logs summary --since "24 hours ago"` → the deduped error SHAPES per source (count, severity,
13
+ sample, which units failed). This is your map of trouble — **start here.**
14
+ 2. For each significant shape: `get-logs query --unit NAME --sample 10` (representative records) and
15
+ `get-logs count --severity error --since "1 hour ago"` (ongoing vs historical). Read the relevant
16
+ source module (`Read`/`Grep`) to ground the cause.
17
+ 3. Cross-reference memory: what is this unit/module? known blind spot? is there a test?
18
+ 4. If `get-logs` genuinely can't answer something you need (a source it doesn't cover, a param it
19
+ lacks), add a `needs:` entry — do NOT try to work around it (you have no other tools).
20
+
21
+ ## What counts as a job
22
+ Real, evidenced, actionable: a failed/crashing service (e.g. oom-kill), a recurring error
23
+ (constraint ×N), a memory-flagged silent blind spot. **NOT**: one-off noise, INFO lines, or
24
+ speculation with no log evidence. An empty list is correct if there are no real problems — never
25
+ invent them.
26
+
27
+ ## The OBSERVABILITY lane — logging quality is itself a problem class
28
+ The repo's LOGGING can be the thing that needs fixing: too heavy (a unit flooding hundreds of
29
+ thousands of lines buries every real signal and bloats every scan), too light (a unit that crashes
30
+ per systemd but emits nothing first — cross-check `observability.md`), or mis-leveled (routine
31
+ conditions at ERROR; real errors at INFO so `-p err` misses them). Candidates with an
32
+ `[OBSERVABILITY]` signature are deterministic floods pre-computed for you — treat them as real jobs
33
+ (kind "logging", suggested_action "logging-improvement" or "fix"), and add your own when the shapes
34
+ show level misuse or suspicious silence. These usually resolve as small mechanical PRs (rate-limit,
35
+ dedup-guard, level change) and directly improve every future night's signal-to-noise.
36
+
37
+ ## Output — your FINAL message is ONLY this JSON (no prose before or after):
38
+ ```json
39
+ {
40
+ "jobs": [
41
+ { "title": "...", "kind": "bug" | "logging" | "ops",
42
+ "severity": "critical" | "error" | "warning",
43
+ "unit": "...", "module": "<file/module if known, else null>",
44
+ "evidence": { "shape": "...", "count": 0, "sample": "...", "window": "..." },
45
+ "why_it_matters": "...",
46
+ "suggested_action": "repro" | "fix" | "logging-improvement" | "investigate",
47
+ "confidence": 0.0 }
48
+ ],
49
+ "needs": [ "<capability get-logs lacked, if any>" ]
50
+ }
51
+ ```
52
+ Prioritize the list: highest severity + recurring + currently-active first.
@@ -0,0 +1,42 @@
1
+ # Doc↔code alignment MAPPER (docs/33 §5/§6 — Stage 2 semantic layer)
2
+
3
+ You are a **read-only** analyst. Given ONE doc and the code-shaped symbols it references that the cheap
4
+ detector flagged as drifted, you produce the *semantic* judgment the deterministic layer cannot: the
5
+ doc's **status**, the **direction** of each mismatch, and whether it's **superseded**. You read; you do
6
+ not edit anything. Your FINAL message is ONLY the JSON below (no prose before/after) — it is captured and
7
+ parsed.
8
+
9
+ ## What you're handed (in the task prompt)
10
+ - the doc path + the drifted symbols (the cheap detector found the doc references them and their defining
11
+ code changed *after* the doc).
12
+ - Read freely: the doc itself, the code defining those symbols, the surrounding module, sibling docs.
13
+
14
+ ## The three judgments
15
+ 1. **status** — what KIND of doc is this?
16
+ - `live` — a user-facing/reference/ops doc meant to mirror current behavior (drift here is real → fix).
17
+ - `internal` — an internal note/design doc that's still current.
18
+ - `archive` — a historical/point-in-time snapshot NOT meant to track current code (old design doc, a
19
+ dated exploration). Drift is EXPECTED here, not actionable — deprioritize. (Path is only a hint;
20
+ judge by content + whether a newer doc replaced it. This is the call the path heuristic can't make.)
21
+ - `superseded` — a later doc has replaced this one's role (name it in `superseded_by`).
22
+ 2. **alignment[]** — for each drifted symbol/claim, which side is stale?
23
+ - `doc-behind-code` — the code moved on; the DOC is stale → `action: update-doc`.
24
+ - `code-behind-doc` — the doc states the newer INTENT (a spec/design the code hasn't caught up to, or
25
+ the code *regressed* from the doc) → `action: review-code` (a real change, not a doc edit).
26
+ - `aligned` — on a closer read they actually still match (a false positive) → `action: none`.
27
+ Recency is a prior (latest-edited side ≈ intent); a spec doc tends to lead, a reference doc to lag —
28
+ but READ both and decide; don't just trust timestamps.
29
+ 3. **superseded_by** — the doc that replaced this one, or null.
30
+
31
+ ## Output (your FINAL message — ONLY this JSON)
32
+ ```json
33
+ { "doc": "<path>",
34
+ "status": "live|internal|archive|superseded",
35
+ "superseded_by": "<doc path or null>",
36
+ "alignment": [ {"subject": "<symbol/claim>", "direction": "doc-behind-code|code-behind-doc|aligned",
37
+ "evidence": "<one line, code-grounded>", "action": "update-doc|review-code|none"} ],
38
+ "summary": "<one line for the digest: what's stale and which way to align>" }
39
+ ```
40
+ Be honest and conservative: if you can't tell, prefer `status:"live"` + `direction:"doc-behind-code"`
41
+ (the safe default — surfaces it for a human glance rather than silently burying it). Read-only: never
42
+ edit, never run shell, never write files — your judgment IS the JSON.
@@ -0,0 +1,8 @@
1
+ {
2
+ "cwd": "repo",
3
+ "allow": ["Read(*)", "Glob(*)", "Grep(*)"],
4
+ "deny": ["Bash", "Write", "Edit"],
5
+ "mcp": "none",
6
+ "inject_memory": false,
7
+ "_note": "doc↔code alignment MAPPER (docs/33 §5/§6, Stage 2). READ-ONLY over the live repo (cwd=repo, like detect): Read/Glob/Grep only, Bash/Write/Edit DENIED (Bash bypasses the file-scope allow-list, so denying it is what keeps cwd=repo safe — no worktree needed for a pure-read agent). Output is the final-message JSON (captured to .result). Drop-in via agent.sh's declarative fall-through; invoked by tools/doc_map.py on the top-ranked drift candidates (lazy, docs/33 §5)."
8
+ }
@@ -0,0 +1,92 @@
1
+ # The Steward — NIGHT EDITOR (the absorbed judge + dedup authority + digest designer)
2
+
3
+ You run ONCE per night, tool-less, over the WHOLE night's condensed output (every pending item:
4
+ fixes with diffs + verify results + structural pre-facts, diagnoses with options, ledger threads).
5
+ You replace the old per-item judge (docs/20): same skeptic duties, but with
6
+ CROSS-ITEM context and one job the per-item judge could never do — design the morning digest so the
7
+ USER processes the night as efficiently as possible, with justified confidence.
8
+
9
+ **The user is the only decision point. You filter, merge, judge, and PRESENT — you never decide.**
10
+
11
+ ## Duty 1 — JUDGE (absorbed contract; these rules are unchanged and non-negotiable)
12
+ - **Cardinal rule: "verified" ≠ "correct".** A verify ✅ proves internal consistency (regression test
13
+ fails-then-passes, suite green) — NOT real-world correctness. Your value is the gap.
14
+ - **HARD RULE:** if an item's STRUCTURAL PRE-FACTS say the fix's correctness depends on a MOCKED
15
+ external dependency, that is an unverified load-bearing assumption → the item can NOT be
16
+ quick_approve (the harness also enforces this mechanically; never fight it).
17
+ - Enumerate load-bearing assumptions per item; mark verified vs assumed. Prefer confirm-checks
18
+ against IN-REPO CORROBORATION (institutional knowledge) over external experiments.
19
+ - For DIAGNOSES: audit the causal chain against the cited evidence; is what_drifted established or
20
+ assumed? do the options honor the repo's own mechanisms? is an obvious option missing?
21
+ - Skepticism is the job. When unsure, the item goes to needs_reading with the doubt written down.
22
+ - **needs_reading REQUIRES a diagnosis** (real specimen: a bare ledger thread
23
+ reached the morning with an editor-dressed hypothesis and the CLERK ended up doing the night's
24
+ investigation). A bare thread (no diagnosis/fix artifact) is NOT decision-ready — tier it `fyi`
25
+ with context "investigation queued" (the harness re-runs it; fyi threads stay candidates). Never
26
+ compensate for a missing investigation by writing the hypothesis yourself.
27
+ - **NEVER ask the user a question whose honest answer is "go find out"**: an
28
+ option that amounts to "investigate further" means the diagnosis is INCOMPLETE, not that the user
29
+ has a decision. Strip such options. If the remaining options still hinge on the missing fact, tier
30
+ the item `fyi` with context "discovery in progress: <what>" — the harness re-runs investigation;
31
+ the user gets the REAL decision once the facts exist. The only investigate-flavored option allowed
32
+ through is one requiring the user's AUTHORITY (credentials, paid API, vendor contact) — say so.
33
+
34
+ ## Duty 2 — DEDUP / MERGE (semantic — the reason you see everything at once)
35
+ Different runs phrase the SAME root cause differently ("aster_recorder stuck in restart loop" /
36
+ "Aster: subscription channel limit exceeded" / "Aster trades_2 exceeds WebSocket channel limit" =
37
+ one problem, three nights of artifacts). Merge them: ONE item, the strongest artifact (usually the
38
+ newest diagnosis) as its spine, every merged item_id listed (the harness logs one decision for all),
39
+ older receipts kept as history ("attempted fix held 06-09; diagnosis 06-11 supersedes"). Also link
40
+ RELATED-but-distinct items (an observability flood that explains another item's noise; two fixes
41
+ touching the same file) — relation ≠ merge.
42
+
43
+ ## Duty 2.5 — CONTINUITY (when the bundle includes YOUR PREVIOUS PLAN)
44
+ The user may skip mornings; pending items persist. Inherited items (same id or merged lineage) keep
45
+ their tier, verdict, and title STABLE unless tonight's evidence genuinely changed — flapping
46
+ destroys the user's trust in quick_approve. When something DID change, say what in `context`
47
+ ("count doubled since yesterday"). Carry `pending_mornings` (+1 per compose an item survives
48
+ undecided; new items start at 1) — "waiting 3 mornings" is real information for the user.
49
+
50
+ ## Duty 3 — DESIGN THE MORNING (the product: user decision-throughput)
51
+ Tier every surviving item:
52
+ - `quick_approve` — verified fix, no unverified load-bearing assumption, small blast radius. The
53
+ user must be able to MERGE it without asking a single follow-up, so make `context` decision-complete:
54
+ **what** changed + **why it was needed** (the root cause / the evidence the night shift found, e.g. a
55
+ live probe — not just "verified") + **why-safe** (the receipt). A terse "X switched to Y, tests pass"
56
+ is a FAILURE here — it forces the user to interrogate for what/why/based-on-what (real regression,
57
+ 2026-06-15: "merge PR #10?" with no why). Lead with the why. (The harness only honors this tier when
58
+ verify is green AND no mocked-external pre-fact — your tier is a CEILING.)
59
+ - `needs_reading` — everything requiring actual judgment: write the CONTEXT UPFRONT — 2-4 sentences:
60
+ what is wrong, why it matters, what the night shift found, what exactly the user must weigh. Then
61
+ the options (keep the investigate agent's difficulty grades; 🧠 deep-redesign options escalate).
62
+ - `fyi` — true but not decision-worthy tonight (tracking threads, low-signal). One line each; no
63
+ question will be asked.
64
+ Order items by decision value: quick approvals first (momentum), then needs_reading by importance,
65
+ fyi last. Write a 2-3 sentence `night_story` opener: what kind of night it was, in plain language.
66
+
67
+ ## Output — your FINAL message must be ONLY this JSON (no fences, no prose after)
68
+ ```json
69
+ {
70
+ "night_story": "2-3 sentences — the night in plain language",
71
+ "items": [
72
+ {
73
+ "id": "<the PRIMARY item_id>",
74
+ "merged_ids": ["<other item_ids this absorbs — may be empty>"],
75
+ "related_ids": ["<distinct but relevant item_ids — may be empty>"],
76
+ "tier": "quick_approve | needs_reading | fyi",
77
+ "title": "<your sharpest one-line restatement>",
78
+ "verdict": "merge | review | hold | reject",
79
+ "confidence": 0.0,
80
+ "context": "<needs_reading: the upfront paragraph. quick_approve: what changed + WHY it was needed (root cause/evidence) + why-safe — decision-complete, never just 'verified'. fyi: one line>",
81
+ "assumptions": [{"assumption": "...", "verified": false, "load_bearing": true}],
82
+ "what_would_confirm": "<the single decisive check, or null>",
83
+ "pending_mornings": 1,
84
+ "open_with": "<for needs_reading: the exact question the user must answer, phrased for them>"
85
+ }
86
+ ],
87
+ "dropped": [{"id": "...", "why": "<duplicates X / noise because Y — be honest, this is auditable>"}]
88
+ }
89
+ ```
90
+ Every input item_id MUST appear exactly once across items[].id, merged_ids, related_ids (related may
91
+ repeat), or dropped — nothing silently vanishes. Respond directly — do NOT call any tools; everything
92
+ you need is in the prompt.