@zerwiz/ymir 0.1.4 → 0.1.7

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 (865) hide show
  1. package/.agents/README.md +291 -0
  2. package/.agents/agents/bragi-marketer.md +111 -0
  3. package/.agents/agents/brokk.md +352 -0
  4. package/.agents/agents/forseti-reviewer.md +93 -0
  5. package/.agents/agents/frigg-consent.md +77 -0
  6. package/.agents/agents/groa-update.md +77 -0
  7. package/.agents/agents/hnoss-designer.md +69 -0
  8. package/.agents/agents/huginn-researcher.md +99 -0
  9. package/.agents/agents/jord-projects.md +78 -0
  10. package/.agents/agents/kvasir-scout.md +91 -0
  11. package/.agents/agents/mimir-planner.md +92 -0
  12. package/.agents/agents/muninn-stow.md +77 -0
  13. package/.agents/agents/saga-bearings.md +78 -0
  14. package/.agents/agents/sindri-developer.md +114 -0
  15. package/.agents/agents/snotra-documenter.md +105 -0
  16. package/.agents/agents/syn-recovery.md +78 -0
  17. package/.agents/agents/tyr-check.md +78 -0
  18. package/.agents/agents/urdh-hold.md +77 -0
  19. package/.agents/agents/volundr-smith.md +80 -0
  20. package/.agents/agents/vor-diagnostics.md +77 -0
  21. package/.agents/assets/agents/naming.md +50 -0
  22. package/.agents/assets/agents/registry.md +93 -0
  23. package/.agents/assets/agents/runtime.md +36 -0
  24. package/.agents/assets/agents/toon-tasks-cli.md +42 -0
  25. package/.agents/assets/templates/company_entity.template.md +37 -0
  26. package/.agents/backend/README.md +74 -0
  27. package/.agents/backend/backends/cmux.sh +649 -0
  28. package/.agents/backend/backends/herdr-eventwait.py +157 -0
  29. package/.agents/backend/backends/herdr-workspace-move.py +114 -0
  30. package/.agents/backend/backends/herdr.sh +3386 -0
  31. package/.agents/backend/backends/orca.sh +290 -0
  32. package/.agents/backend/backends/tmux.sh +357 -0
  33. package/.agents/backend/backends/zellij.sh +700 -0
  34. package/.agents/backend/fm-afk-launch.sh +654 -0
  35. package/.agents/backend/fm-afk-return.sh +241 -0
  36. package/.agents/backend/fm-afk-start.sh +172 -0
  37. package/.agents/backend/fm-arm-command-policy.mjs +960 -0
  38. package/.agents/backend/fm-arm-pretool-check.sh +200 -0
  39. package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
  40. package/.agents/backend/fm-backend.sh +981 -0
  41. package/.agents/backend/fm-backlog-handoff.sh +909 -0
  42. package/.agents/backend/fm-backlog-receive.sh +187 -0
  43. package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
  44. package/.agents/backend/fm-bearings-board.sh +204 -0
  45. package/.agents/backend/fm-bearings-snapshot.sh +546 -0
  46. package/.agents/backend/fm-bootstrap.sh +1568 -0
  47. package/.agents/backend/fm-branch-outcome.sh +203 -0
  48. package/.agents/backend/fm-branch-prompt.sh +101 -0
  49. package/.agents/backend/fm-brief.sh +452 -0
  50. package/.agents/backend/fm-busy-event.sh +234 -0
  51. package/.agents/backend/fm-busy-lib.sh +986 -0
  52. package/.agents/backend/fm-captain-hold.sh +1001 -0
  53. package/.agents/backend/fm-cd-command-policy.mjs +153 -0
  54. package/.agents/backend/fm-cd-pretool-check.sh +190 -0
  55. package/.agents/backend/fm-check-lib.sh +74 -0
  56. package/.agents/backend/fm-check-register.sh +42 -0
  57. package/.agents/backend/fm-check-unregister.sh +52 -0
  58. package/.agents/backend/fm-classify-lib.sh +1770 -0
  59. package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
  60. package/.agents/backend/fm-composer-lib.sh +1416 -0
  61. package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
  62. package/.agents/backend/fm-config-push.sh +254 -0
  63. package/.agents/backend/fm-control-lib.sh +251 -0
  64. package/.agents/backend/fm-control.sh +878 -0
  65. package/.agents/backend/fm-crew-state.sh +625 -0
  66. package/.agents/backend/fm-cursor-lib.sh +243 -0
  67. package/.agents/backend/fm-decision-hold.sh +232 -0
  68. package/.agents/backend/fm-doc-audience-check.sh +269 -0
  69. package/.agents/backend/fm-dod-lib.sh +67 -0
  70. package/.agents/backend/fm-ensure-agents-md.sh +253 -0
  71. package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
  72. package/.agents/backend/fm-extension.mjs +2577 -0
  73. package/.agents/backend/fm-extension.sh +16 -0
  74. package/.agents/backend/fm-ff-lib.sh +420 -0
  75. package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
  76. package/.agents/backend/fm-fleet-sync.sh +458 -0
  77. package/.agents/backend/fm-fleet-view.sh +96 -0
  78. package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
  79. package/.agents/backend/fm-guard.sh +242 -0
  80. package/.agents/backend/fm-harness.sh +195 -0
  81. package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
  82. package/.agents/backend/fm-herdr-lab.sh +346 -0
  83. package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
  84. package/.agents/backend/fm-home-seed.sh +984 -0
  85. package/.agents/backend/fm-home-summary-refresh.sh +255 -0
  86. package/.agents/backend/fm-hook-host-lib.sh +36 -0
  87. package/.agents/backend/fm-inactive-reconcile.sh +531 -0
  88. package/.agents/backend/fm-inbox.sh +399 -0
  89. package/.agents/backend/fm-install-actionlint.sh +84 -0
  90. package/.agents/backend/fm-install-herdr.sh +96 -0
  91. package/.agents/backend/fm-install-shellcheck.sh +84 -0
  92. package/.agents/backend/fm-install-treehouse.sh +95 -0
  93. package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
  94. package/.agents/backend/fm-lease-lib.sh +218 -0
  95. package/.agents/backend/fm-lease.sh +189 -0
  96. package/.agents/backend/fm-line-cap-lib.sh +51 -0
  97. package/.agents/backend/fm-lint-workflows.sh +137 -0
  98. package/.agents/backend/fm-lint.sh +591 -0
  99. package/.agents/backend/fm-lock-lib.sh +104 -0
  100. package/.agents/backend/fm-lock.sh +107 -0
  101. package/.agents/backend/fm-marker-lib.sh +12 -0
  102. package/.agents/backend/fm-merge-local.sh +74 -0
  103. package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
  104. package/.agents/backend/fm-nm-run-lib.sh +124 -0
  105. package/.agents/backend/fm-on.sh +125 -0
  106. package/.agents/backend/fm-operational-input.sh +253 -0
  107. package/.agents/backend/fm-peek.sh +46 -0
  108. package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
  109. package/.agents/backend/fm-pr-check.sh +135 -0
  110. package/.agents/backend/fm-pr-lib.sh +1016 -0
  111. package/.agents/backend/fm-pr-merge.sh +707 -0
  112. package/.agents/backend/fm-pr-poll.sh +110 -0
  113. package/.agents/backend/fm-primary-scope-lib.sh +33 -0
  114. package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
  115. package/.agents/backend/fm-procevent-lavish.sh +628 -0
  116. package/.agents/backend/fm-procevent-lib.sh +892 -0
  117. package/.agents/backend/fm-procevent-quota.sh +290 -0
  118. package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
  119. package/.agents/backend/fm-procevent-when.sh +504 -0
  120. package/.agents/backend/fm-procevent.sh +1466 -0
  121. package/.agents/backend/fm-project-mode.sh +92 -0
  122. package/.agents/backend/fm-project-origin-lib.sh +180 -0
  123. package/.agents/backend/fm-promote.sh +282 -0
  124. package/.agents/backend/fm-public-followup-emit.sh +260 -0
  125. package/.agents/backend/fm-public-followup-lib.sh +398 -0
  126. package/.agents/backend/fm-public-followup.sh +1330 -0
  127. package/.agents/backend/fm-push-transition-lib.sh +168 -0
  128. package/.agents/backend/fm-quota-axi-lib.sh +93 -0
  129. package/.agents/backend/fm-quota-choose.sh +384 -0
  130. package/.agents/backend/fm-remote-delta-read.sh +189 -0
  131. package/.agents/backend/fm-remote-doctor.sh +800 -0
  132. package/.agents/backend/fm-remote-entrypoint.sh +193 -0
  133. package/.agents/backend/fm-remote-file.sh +234 -0
  134. package/.agents/backend/fm-remote-home-provision.sh +259 -0
  135. package/.agents/backend/fm-remote-home-seed.sh +259 -0
  136. package/.agents/backend/fm-remote-inherit-push.sh +90 -0
  137. package/.agents/backend/fm-remote-inherit.sh +179 -0
  138. package/.agents/backend/fm-remote-job-lib.sh +1241 -0
  139. package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
  140. package/.agents/backend/fm-remote-job-worker.sh +1124 -0
  141. package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
  142. package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
  143. package/.agents/backend/fm-review-diff.sh +158 -0
  144. package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
  145. package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
  146. package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
  147. package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
  148. package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
  149. package/.agents/backend/fm-secondmate-report.sh +88 -0
  150. package/.agents/backend/fm-send.sh +1059 -0
  151. package/.agents/backend/fm-session-lock-lib.sh +176 -0
  152. package/.agents/backend/fm-session-start.sh +970 -0
  153. package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
  154. package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
  155. package/.agents/backend/fm-sessionstart-run.sh +145 -0
  156. package/.agents/backend/fm-spawn.sh +3153 -0
  157. package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
  158. package/.agents/backend/fm-startup-memory-budget.sh +94 -0
  159. package/.agents/backend/fm-startup-network.sh +642 -0
  160. package/.agents/backend/fm-stow-cascade.sh +251 -0
  161. package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
  162. package/.agents/backend/fm-supervise-daemon.sh +1732 -0
  163. package/.agents/backend/fm-supervision-instructions.sh +215 -0
  164. package/.agents/backend/fm-supervision-lib.sh +90 -0
  165. package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
  166. package/.agents/backend/fm-tangle-lib.sh +53 -0
  167. package/.agents/backend/fm-task-inbox-lib.sh +402 -0
  168. package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
  169. package/.agents/backend/fm-teardown.sh +2922 -0
  170. package/.agents/backend/fm-test-isolation-proof.sh +588 -0
  171. package/.agents/backend/fm-test-run.sh +2191 -0
  172. package/.agents/backend/fm-timeout-lib.sh +141 -0
  173. package/.agents/backend/fm-timing-lib.sh +179 -0
  174. package/.agents/backend/fm-tmux-lib.sh +291 -0
  175. package/.agents/backend/fm-tool-update-check.sh +898 -0
  176. package/.agents/backend/fm-trace-context-lib.sh +227 -0
  177. package/.agents/backend/fm-transition-lib.sh +103 -0
  178. package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
  179. package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
  180. package/.agents/backend/fm-turnend-guard.sh +432 -0
  181. package/.agents/backend/fm-update.sh +110 -0
  182. package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
  183. package/.agents/backend/fm-voice-client.py +1373 -0
  184. package/.agents/backend/fm-voice-relay.py +1256 -0
  185. package/.agents/backend/fm-wake-drain.sh +592 -0
  186. package/.agents/backend/fm-wake-grant.sh +127 -0
  187. package/.agents/backend/fm-wake-lib.sh +1849 -0
  188. package/.agents/backend/fm-watch-arm.sh +602 -0
  189. package/.agents/backend/fm-watch-checkpoint.sh +109 -0
  190. package/.agents/backend/fm-watch.sh +1962 -0
  191. package/.agents/backend/fm-x-dismiss.sh +116 -0
  192. package/.agents/backend/fm-x-followup.sh +286 -0
  193. package/.agents/backend/fm-x-lib.sh +1000 -0
  194. package/.agents/backend/fm-x-link.sh +234 -0
  195. package/.agents/backend/fm-x-poll.sh +185 -0
  196. package/.agents/backend/fm-x-reply.sh +385 -0
  197. package/.agents/backend/fm_voice_frame.py +166 -0
  198. package/.agents/backend/fm_voice_records.py +574 -0
  199. package/.agents/backend/model-bridge.py +360 -0
  200. package/.agents/backend/opencode-go-bridge.py +30 -0
  201. package/.agents/bus/README.md +12 -0
  202. package/.agents/bus/messages.json +1 -0
  203. package/.agents/config/agents.machine.example.yaml +16 -0
  204. package/.agents/config/agents.yaml.example +72 -0
  205. package/.agents/config/crew-dispatch.json +22 -0
  206. package/.agents/config/cron.yaml +11 -0
  207. package/.agents/config/eindri-dispatch.json +67 -0
  208. package/.agents/config/eindri-harness +1 -0
  209. package/.agents/config/startup-memory-budget +1 -0
  210. package/.agents/filebrowser/.filebrowser.json +6 -0
  211. package/.agents/filebrowser/README.md +11 -0
  212. package/.agents/gateway/README.md +12 -0
  213. package/.agents/github/README.md +15 -0
  214. package/.agents/github/webhooks/.gitkeep +0 -0
  215. package/.agents/github/workflows/.gitkeep +0 -0
  216. package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
  217. package/.agents/harness/opencode/plugins/package.json +4 -0
  218. package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
  219. package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
  220. package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
  221. package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
  222. package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
  223. package/.agents/memory/README.md +46 -0
  224. package/.agents/memory/runes_audit.md +5 -0
  225. package/.agents/migrations/0001-hodd-layout.sh +38 -0
  226. package/.agents/migrations/0002-a2a-mcp.sh +27 -0
  227. package/.agents/migrations/0003-private-data-separation.sh +121 -0
  228. package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
  229. package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
  230. package/.agents/sandbox/Dockerfile.utgard +19 -0
  231. package/.agents/sandbox/README.md +14 -0
  232. package/.agents/sandbox/utgard.config.json +14 -0
  233. package/.agents/skills/README.md +59 -0
  234. package/.agents/skills/bragi-marketing/README.md +3 -0
  235. package/.agents/skills/bragi-marketing/SKILL.md +82 -0
  236. package/.agents/skills/eindri-homes/README.md +3 -0
  237. package/.agents/skills/eindri-homes/SKILL.md +291 -0
  238. package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
  239. package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
  240. package/.agents/skills/frigg-consent/README.md +3 -0
  241. package/.agents/skills/frigg-consent/SKILL.md +56 -0
  242. package/.agents/skills/galdr-ymirsystem/README.md +3 -0
  243. package/.agents/skills/galdr-ymirsystem/SKILL.md +159 -0
  244. package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
  245. package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
  246. package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
  247. package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
  248. package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
  249. package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
  250. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +736 -0
  251. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
  252. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
  253. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
  254. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
  255. package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
  256. package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +539 -0
  257. package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -0
  258. package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
  259. package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
  260. package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +163 -0
  261. package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
  262. package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
  263. package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -0
  264. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
  265. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
  266. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +101 -0
  267. package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
  268. package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
  269. package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
  270. package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
  271. package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
  272. package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
  273. package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
  274. package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
  275. package/.agents/skills/galdr-ymirsystem/assets/smidja.md +180 -0
  276. package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
  277. package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
  278. package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
  279. package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +503 -0
  280. package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
  281. package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
  282. package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
  283. package/.agents/skills/gjallarhorn-relay/README.md +3 -0
  284. package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
  285. package/.agents/skills/groa-update/SKILL.md +90 -0
  286. package/.agents/skills/hamr-adapters/README.md +3 -0
  287. package/.agents/skills/hamr-adapters/SKILL.md +123 -0
  288. package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
  289. package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
  290. package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
  291. package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
  292. package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
  293. package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
  294. package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
  295. package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
  296. package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
  297. package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
  298. package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
  299. package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
  300. package/.agents/skills/herdr-panes/README.md +3 -0
  301. package/.agents/skills/herdr-panes/SKILL.md +92 -0
  302. package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
  303. package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
  304. package/.agents/skills/hnoss-design/DESIGN.md +19 -0
  305. package/.agents/skills/hnoss-design/README.md +3 -0
  306. package/.agents/skills/hnoss-design/SKILL.md +83 -0
  307. package/.agents/skills/hvild-afk/README.md +3 -0
  308. package/.agents/skills/hvild-afk/SKILL.md +241 -0
  309. package/.agents/skills/jord-projects/README.md +3 -0
  310. package/.agents/skills/jord-projects/SKILL.md +92 -0
  311. package/.agents/skills/lifecycle/SKILL.md +56 -0
  312. package/.agents/skills/lifecycle/smoke_test.sh +57 -0
  313. package/.agents/skills/lifecycle/start.sh +21 -0
  314. package/.agents/skills/lifecycle/status.sh +35 -0
  315. package/.agents/skills/lifecycle/stop.sh +16 -0
  316. package/.agents/skills/muninn-stow/README.md +3 -0
  317. package/.agents/skills/muninn-stow/SKILL.md +309 -0
  318. package/.agents/skills/no-mistakes/SKILL.md +379 -0
  319. package/.agents/skills/nornir-schedule/README.md +3 -0
  320. package/.agents/skills/nornir-schedule/SKILL.md +25 -0
  321. package/.agents/skills/nornir-schedule/assets/events.md +137 -0
  322. package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
  323. package/.agents/skills/nsr-compliance/README.md +3 -0
  324. package/.agents/skills/nsr-compliance/SKILL.md +29 -0
  325. package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
  326. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
  327. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
  328. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
  329. package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
  330. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
  331. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
  332. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
  333. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
  334. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
  335. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
  336. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
  337. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
  338. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
  339. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
  340. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
  341. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
  342. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
  343. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
  344. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
  345. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
  346. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
  347. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
  348. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  349. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
  350. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
  351. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
  352. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
  353. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
  354. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
  355. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
  356. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
  357. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
  358. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
  359. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
  360. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
  361. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
  362. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
  363. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
  364. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
  365. package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
  366. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
  367. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
  368. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
  369. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
  370. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
  371. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
  372. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
  373. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
  374. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
  375. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
  376. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
  377. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
  378. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
  379. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
  380. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
  381. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
  382. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
  383. package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
  384. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
  385. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
  386. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
  387. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
  388. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
  389. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
  390. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
  391. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
  392. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
  393. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
  394. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
  395. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
  396. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
  397. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
  398. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
  399. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
  400. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
  401. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
  402. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
  403. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
  404. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
  405. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
  406. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
  407. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
  408. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
  409. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
  410. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
  411. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
  412. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
  413. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
  414. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
  415. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
  416. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
  417. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
  418. package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
  419. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
  420. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
  421. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
  422. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
  423. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
  424. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
  425. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
  426. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
  427. package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
  428. package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
  429. package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
  430. package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
  431. package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
  432. package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
  433. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
  434. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
  435. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
  436. package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
  437. package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
  438. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
  439. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
  440. package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
  441. package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
  442. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
  443. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
  444. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
  445. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
  446. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
  447. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
  448. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
  449. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
  450. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
  451. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
  452. package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
  453. package/.agents/skills/pr-ops/README.md +3 -0
  454. package/.agents/skills/pr-ops/SKILL.md +109 -0
  455. package/.agents/skills/ratatoskr-a2a/README.md +3 -0
  456. package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
  457. package/.agents/skills/rules-check-drift/SKILL.md +81 -0
  458. package/.agents/skills/saga-bearings/README.md +3 -0
  459. package/.agents/skills/saga-bearings/SKILL.md +26 -0
  460. package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
  461. package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
  462. package/.agents/skills/saga-bearings/assets/recap.md +56 -0
  463. package/.agents/skills/syn-recovery/README.md +3 -0
  464. package/.agents/skills/syn-recovery/SKILL.md +54 -0
  465. package/.agents/skills/tyr-check/README.md +3 -0
  466. package/.agents/skills/tyr-check/SKILL.md +218 -0
  467. package/.agents/skills/urdh-hold/README.md +3 -0
  468. package/.agents/skills/urdh-hold/SKILL.md +25 -0
  469. package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
  470. package/.agents/skills/urdh-hold/assets/hold.md +54 -0
  471. package/.agents/skills/vor-diagnostics/README.md +3 -0
  472. package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
  473. package/.agents/skills/ymir-host/README.md +3 -0
  474. package/.agents/skills/ymir-host/SKILL.md +35 -0
  475. package/.agents/skills/ymir-host/assets/desktop.md +36 -0
  476. package/.agents/skills/ymir-host/assets/install.md +69 -0
  477. package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
  478. package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
  479. package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
  480. package/.agents/skills/ymir-host/assets/update.md +64 -0
  481. package/.agents/tests/assets/board-render-harness.mjs +117 -0
  482. package/.agents/tests/cmux-test-safety.sh +51 -0
  483. package/.agents/tests/fixtures.sh +291 -0
  484. package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
  485. package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
  486. package/.agents/tests/fm-afk-launch.test.sh +961 -0
  487. package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
  488. package/.agents/tests/fm-afk-return.test.sh +283 -0
  489. package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
  490. package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
  491. package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
  492. package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
  493. package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
  494. package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
  495. package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
  496. package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
  497. package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
  498. package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
  499. package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
  500. package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
  501. package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
  502. package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
  503. package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
  504. package/.agents/tests/fm-backend-orca.test.sh +1357 -0
  505. package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
  506. package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
  507. package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
  508. package/.agents/tests/fm-backend.test.sh +1142 -0
  509. package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
  510. package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
  511. package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
  512. package/.agents/tests/fm-bearings-board.test.sh +414 -0
  513. package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
  514. package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
  515. package/.agents/tests/fm-bootstrap.test.sh +1178 -0
  516. package/.agents/tests/fm-branch-supervision.test.sh +552 -0
  517. package/.agents/tests/fm-brief.test.sh +785 -0
  518. package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
  519. package/.agents/tests/fm-busy-state.test.sh +465 -0
  520. package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
  521. package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
  522. package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
  523. package/.agents/tests/fm-check-unregister.test.sh +198 -0
  524. package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
  525. package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
  526. package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
  527. package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
  528. package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
  529. package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
  530. package/.agents/tests/fm-composer-ghost.test.sh +716 -0
  531. package/.agents/tests/fm-composer-lib.test.sh +666 -0
  532. package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
  533. package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
  534. package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
  535. package/.agents/tests/fm-control.test.sh +910 -0
  536. package/.agents/tests/fm-crew-state.test.sh +1610 -0
  537. package/.agents/tests/fm-cursor-harness.test.sh +404 -0
  538. package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
  539. package/.agents/tests/fm-cursor-primary.test.sh +708 -0
  540. package/.agents/tests/fm-daemon.test.sh +2740 -0
  541. package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
  542. package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
  543. package/.agents/tests/fm-extension-binding.test.sh +2187 -0
  544. package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
  545. package/.agents/tests/fm-fleet-sync.test.sh +721 -0
  546. package/.agents/tests/fm-gate-refuse.test.sh +356 -0
  547. package/.agents/tests/fm-gitignore-config.test.sh +89 -0
  548. package/.agents/tests/fm-gotmp.test.sh +230 -0
  549. package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
  550. package/.agents/tests/fm-grok-harness.test.sh +117 -0
  551. package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
  552. package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
  553. package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
  554. package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
  555. package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
  556. package/.agents/tests/fm-herdr-lab.test.sh +243 -0
  557. package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
  558. package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
  559. package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
  560. package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
  561. package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
  562. package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
  563. package/.agents/tests/fm-kimi-harness.test.sh +687 -0
  564. package/.agents/tests/fm-lint-workflows.test.sh +532 -0
  565. package/.agents/tests/fm-lint.test.sh +1023 -0
  566. package/.agents/tests/fm-muse-harness.test.sh +932 -0
  567. package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
  568. package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
  569. package/.agents/tests/fm-on.test.sh +507 -0
  570. package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
  571. package/.agents/tests/fm-operational-input.test.sh +160 -0
  572. package/.agents/tests/fm-peek-remote.test.sh +110 -0
  573. package/.agents/tests/fm-pending-reply.test.sh +1288 -0
  574. package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
  575. package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
  576. package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
  577. package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
  578. package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
  579. package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
  580. package/.agents/tests/fm-pr-merge.test.sh +2135 -0
  581. package/.agents/tests/fm-procevent-quota.test.sh +225 -0
  582. package/.agents/tests/fm-procevent-when.test.sh +406 -0
  583. package/.agents/tests/fm-procevent.test.sh +1745 -0
  584. package/.agents/tests/fm-project-origin.test.sh +110 -0
  585. package/.agents/tests/fm-public-followup.test.sh +2272 -0
  586. package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
  587. package/.agents/tests/fm-quota-choose.test.sh +626 -0
  588. package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
  589. package/.agents/tests/fm-remote-doctor.test.sh +625 -0
  590. package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
  591. package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
  592. package/.agents/tests/fm-remote-job.test.sh +768 -0
  593. package/.agents/tests/fm-remote-reply.test.sh +520 -0
  594. package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
  595. package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
  596. package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
  597. package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
  598. package/.agents/tests/fm-review-diff.test.sh +176 -0
  599. package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
  600. package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
  601. package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
  602. package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
  603. package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
  604. package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
  605. package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
  606. package/.agents/tests/fm-send-inbox.test.sh +352 -0
  607. package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
  608. package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
  609. package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
  610. package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
  611. package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
  612. package/.agents/tests/fm-send-settle.test.sh +147 -0
  613. package/.agents/tests/fm-send-strict.test.sh +241 -0
  614. package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
  615. package/.agents/tests/fm-session-start.test.sh +2515 -0
  616. package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
  617. package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
  618. package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
  619. package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
  620. package/.agents/tests/fm-spawn-batch.test.sh +148 -0
  621. package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
  622. package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
  623. package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
  624. package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
  625. package/.agents/tests/fm-startup-network.test.sh +712 -0
  626. package/.agents/tests/fm-stow-cascade.test.sh +370 -0
  627. package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
  628. package/.agents/tests/fm-supervision-events.test.sh +156 -0
  629. package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
  630. package/.agents/tests/fm-tangle-guard.test.sh +277 -0
  631. package/.agents/tests/fm-task-delivery.test.sh +420 -0
  632. package/.agents/tests/fm-task-inbox.test.sh +513 -0
  633. package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
  634. package/.agents/tests/fm-teardown.test.sh +2665 -0
  635. package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
  636. package/.agents/tests/fm-test-fixtures.test.sh +132 -0
  637. package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
  638. package/.agents/tests/fm-test-run.test.sh +1196 -0
  639. package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
  640. package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
  641. package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
  642. package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
  643. package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
  644. package/.agents/tests/fm-transition-lib.test.sh +54 -0
  645. package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
  646. package/.agents/tests/fm-update.test.sh +304 -0
  647. package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
  648. package/.agents/tests/fm-voice-relay.test.sh +4741 -0
  649. package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
  650. package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
  651. package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
  652. package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
  653. package/.agents/tests/fm-wake-queue.test.sh +1224 -0
  654. package/.agents/tests/fm-watch-arm.test.sh +821 -0
  655. package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
  656. package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
  657. package/.agents/tests/fm-watch-triage.test.sh +3889 -0
  658. package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
  659. package/.agents/tests/fm-x-mode.test.sh +3042 -0
  660. package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
  661. package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
  662. package/.agents/tests/herdr-test-safety.sh +42 -0
  663. package/.agents/tests/lib.sh +315 -0
  664. package/.agents/tests/remote-herdr-fixture.sh +125 -0
  665. package/.agents/tests/secondmate-helpers.sh +193 -0
  666. package/.agents/tests/smoke.test.sh +93 -0
  667. package/.agents/tests/wake-helpers.sh +338 -0
  668. package/.agents/tests/zellij-test-safety.sh +60 -0
  669. package/.agents/tools/README.md +10 -0
  670. package/.agents/tools/bin/tasks-cli +267 -0
  671. package/.agents/tools/tasks-cli.ts +216 -0
  672. package/AGENTS.md +498 -0
  673. package/CHANGELOG.md +1913 -0
  674. package/LICENSE +1 -1
  675. package/NOTICE +63 -0
  676. package/README.md +114 -60
  677. package/RULES/01-domains.md +51 -0
  678. package/RULES/02-agents.md +78 -0
  679. package/RULES/03-houses.md +61 -0
  680. package/RULES/04-hoard.md +97 -0
  681. package/RULES/05-platforms.md +67 -0
  682. package/RULES/06-append-only.md +108 -0
  683. package/RULES/07-config.md +101 -0
  684. package/RULES/08-delivery-gate.md +75 -0
  685. package/RULES/09-electron.md +58 -0
  686. package/RULES/README.md +22 -0
  687. package/bin/README.md +107 -0
  688. package/bin/a2a-mcp.sh +133 -0
  689. package/bin/a2a-serve.py +103 -0
  690. package/bin/a2a-serve.sh +8 -0
  691. package/bin/a2a-talk.sh +50 -0
  692. package/bin/a2abridge-ensure.sh +108 -0
  693. package/bin/agent-run.sh +43 -0
  694. package/bin/agents-config.sh +256 -0
  695. package/bin/apodex-smoke-test.sh +105 -0
  696. package/bin/bifrost-bridge.sh +131 -0
  697. package/bin/bifrost-ingress.sh +77 -0
  698. package/bin/bootstrap-macos.sh +112 -0
  699. package/bin/bootstrap-windows.ps1 +112 -0
  700. package/bin/branch-guard.sh +64 -0
  701. package/bin/brokk +73 -0
  702. package/bin/brokk-classify-lib.sh +1770 -0
  703. package/bin/brokk-lease-lib.sh +222 -0
  704. package/bin/brokk-lease.sh +193 -0
  705. package/bin/brokk-lint.sh +65 -0
  706. package/bin/brokk-send.sh +51 -0
  707. package/bin/brokk-update.sh +9 -0
  708. package/bin/brokk-wake-grant.sh +127 -0
  709. package/bin/brokk-wake-lib.sh +1849 -0
  710. package/bin/changelog-assemble.sh +154 -0
  711. package/bin/changelog-guard.sh +197 -0
  712. package/bin/crash-sense.sh +173 -0
  713. package/bin/design-check.sh +80 -0
  714. package/bin/design-icon.sh +153 -0
  715. package/bin/desktop-place.sh +224 -0
  716. package/bin/docs-guard.sh +39 -0
  717. package/bin/editor-place.sh +225 -0
  718. package/bin/eindri-acclaim.sh +47 -0
  719. package/bin/eindri-control.sh +28 -0
  720. package/bin/eindri-role.sh +83 -0
  721. package/bin/eindri-seat.sh +83 -0
  722. package/bin/eindri-seen.sh +54 -0
  723. package/bin/eindri-send.sh +15 -0
  724. package/bin/eindri-start.sh +98 -0
  725. package/bin/eindri-watch.sh +57 -0
  726. package/bin/einherjar-spawn.sh +576 -0
  727. package/bin/eir-doctor.sh +158 -0
  728. package/bin/erindi-brief.sh +271 -0
  729. package/bin/feature-inventory.sh +73 -0
  730. package/bin/fleet-apply.sh +81 -0
  731. package/bin/github-deploy.sh +94 -0
  732. package/bin/gjallarhorn-expose.sh +136 -0
  733. package/bin/gjallarhorn-notify.sh +71 -0
  734. package/bin/gjallarhorn-purge.sh +67 -0
  735. package/bin/gjallarhorn-tunnel.sh +85 -0
  736. package/bin/gleipnir-lock-lib.sh +284 -0
  737. package/bin/groa-update.sh +130 -0
  738. package/bin/hall-snapshot.sh +111 -0
  739. package/bin/hamr-harness.sh +246 -0
  740. package/bin/heimdall-ssh-keys.sh +374 -0
  741. package/bin/herdr-agents.py +44 -0
  742. package/bin/herdr-ensure.sh +104 -0
  743. package/bin/herdr-run.sh +452 -0
  744. package/bin/hermes-ensure.sh +88 -0
  745. package/bin/hlidskjalf-agents.sh +172 -0
  746. package/bin/hlidskjalf-usage.sh +196 -0
  747. package/bin/hoard-guard.sh +135 -0
  748. package/bin/hoard-lib.sh +105 -0
  749. package/bin/hodd.sh +102 -0
  750. package/bin/host-sense.sh +199 -0
  751. package/bin/huginn-research-worker.sh +121 -0
  752. package/bin/local-model-lock.sh +70 -0
  753. package/bin/mimir-bridge.py +259 -0
  754. package/bin/mimir-bridge.sh +100 -0
  755. package/bin/mimir-ingest.sh +131 -0
  756. package/bin/mimir-reflect.sh +27 -0
  757. package/bin/mimir.sh +113 -0
  758. package/bin/mjollnir-webhook.sh +72 -0
  759. package/bin/mjollnir.sh +104 -0
  760. package/bin/model-hardware.sh +96 -0
  761. package/bin/model-resolve.sh +160 -0
  762. package/bin/models-detect.sh +178 -0
  763. package/bin/nornir-cron-start.sh +162 -0
  764. package/bin/nornir-job-daily-briefing.sh +191 -0
  765. package/bin/nornir-job-git-sync.sh +152 -0
  766. package/bin/nornir-job-hall-snapshot.sh +28 -0
  767. package/bin/nornir-job-memory-housekeeping.sh +114 -0
  768. package/bin/nornir-job-nsr-compliance.sh +54 -0
  769. package/bin/nornir-job-observer.sh +166 -0
  770. package/bin/nornir-job-skillopt-sleep.sh +76 -0
  771. package/bin/npm-publish.sh +136 -0
  772. package/bin/omarchy-hook-install.sh +60 -0
  773. package/bin/omarchy-install.sh +161 -0
  774. package/bin/omarchy-plugins.sh +187 -0
  775. package/bin/omarchy-sense.sh +162 -0
  776. package/bin/perm-guard.sh +30 -0
  777. package/bin/pi-agent.sh +68 -0
  778. package/bin/pi-ensure.sh +77 -0
  779. package/bin/pi-local.sh +37 -0
  780. package/bin/pi-model-agnostic.sh +71 -0
  781. package/bin/pi-seat.sh +63 -0
  782. package/bin/prereq-ensure.sh +166 -0
  783. package/bin/private-guard.sh +58 -0
  784. package/bin/project-git.sh +69 -0
  785. package/bin/public-guard.sh +71 -0
  786. package/bin/ratatoskr.sh +49 -0
  787. package/bin/realm-lib.sh +32 -0
  788. package/bin/repo-scrub.sh +62 -0
  789. package/bin/rodd-operational-input.sh +250 -0
  790. package/bin/runes-append.sh +198 -0
  791. package/bin/saga-session-start.sh +172 -0
  792. package/bin/saga-sessionstart-run.sh +79 -0
  793. package/bin/saga-wake-drain.sh +41 -0
  794. package/bin/secret-guard.sh +63 -0
  795. package/bin/sessrumnir-ensure.sh +100 -0
  796. package/bin/sessrumnir-sync.sh +237 -0
  797. package/bin/sessrumnir.sh +104 -0
  798. package/bin/skillopt-setup.sh +76 -0
  799. package/bin/skuld-branch-outcome.sh +203 -0
  800. package/bin/skuld-branch-prompt.sh +101 -0
  801. package/bin/smidja-bootstrap.sh +94 -0
  802. package/bin/smidja-observe.sh +86 -0
  803. package/bin/syn-arm-pretool-check.sh +57 -0
  804. package/bin/syn-asset-pretool-check.sh +89 -0
  805. package/bin/syn-cd-pretool-check.sh +28 -0
  806. package/bin/syn-guard-pretool-check.sh +83 -0
  807. package/bin/syn-spawn-pretool-check.sh +58 -0
  808. package/bin/syn-turnend-guard.sh +36 -0
  809. package/bin/syn-watch-arm.sh +99 -0
  810. package/bin/tailscale-sync.sh +203 -0
  811. package/bin/telegram-bot.sh +82 -0
  812. package/bin/toolchain.sh +74 -0
  813. package/bin/ui-truth-check.sh +75 -0
  814. package/bin/utgard.sh +111 -0
  815. package/bin/valhalla.sh +115 -0
  816. package/bin/valknut-load.sh +298 -0
  817. package/bin/vor-crew-state.sh +124 -0
  818. package/bin/wedge-notify.sh +60 -0
  819. package/bin/workspace-provision.sh +80 -0
  820. package/bin/workspace-rag.sh +163 -0
  821. package/bin/wyrd-db.sh +47 -0
  822. package/bin/yggdrasil.sh +152 -0
  823. package/bin/ymir-edit.sh +145 -0
  824. package/bin/ymir-install.sh +806 -0
  825. package/bin/ymir-invite.sh +93 -0
  826. package/bin/ymir-isolation.sh +88 -0
  827. package/bin/ymir-migrate.sh +61 -0
  828. package/bin/ymir-plan.sh +356 -0
  829. package/bin/ymir-platform.sh +348 -0
  830. package/bin/ymir-say.sh +110 -0
  831. package/bin/ymir-setup-auth.sh +119 -0
  832. package/bin/ymir-validate.sh +193 -0
  833. package/bin/ymir.js +74 -16
  834. package/docs/Architecture.md +339 -0
  835. package/docs/design.md +351 -0
  836. package/docs/installations/README.md +63 -0
  837. package/docs/installations/ymir-home.md +93 -0
  838. package/docs/integration.md +105 -0
  839. package/docs/lore.md +1060 -0
  840. package/docs/research/agent-harnesses.md +290 -0
  841. package/docs/runbooks/README.md +19 -0
  842. package/docs/runbooks/a2a.md +91 -0
  843. package/docs/runbooks/agent-permissions.md +99 -0
  844. package/docs/runbooks/agents.md +57 -0
  845. package/docs/runbooks/models.md +69 -0
  846. package/docs/runbooks/realm-onboarding.md +60 -0
  847. package/docs/runbooks/secrets-and-hoard.md +60 -0
  848. package/docs/runbooks/updates-and-migrations.md +110 -0
  849. package/docs/runbooks/worktrees-isolation.md +72 -0
  850. package/docs/session-start.md +105 -0
  851. package/docs/skillopt-integration.md +321 -0
  852. package/docs/sync-system.md +66 -0
  853. package/docs/workspaces.md +104 -0
  854. package/docs/ymir-rut.md +260 -0
  855. package/package.json +54 -14
  856. package/packaging/build.sh +74 -0
  857. package/packaging/macos/Ymir Installer.command +43 -0
  858. package/packaging/windows/ymir-setup.nsi +74 -0
  859. package/scripts/README.md +22 -0
  860. package/scripts/electron.sh +269 -0
  861. package/scripts/lower.sh +34 -0
  862. package/scripts/raise.sh +42 -0
  863. package/scripts/start.sh +217 -0
  864. package/scripts/stop.sh +113 -0
  865. package/install.sh +0 -35
@@ -0,0 +1,180 @@
1
+ # Smíðja — the smithy (agent factory)
2
+
3
+ Load this when working with the smithy: installing it, configuring its roster,
4
+ running a chain, reading its trace, or wiring it into Hlidskjalf.
5
+
6
+ - **Norse:** **Smíðja** = the smithy (the workshop). Its orchestrator seat is
7
+ **Völundr**, the master smith — *Kaia's seat inside the factory* (Kaia decides
8
+ *what* is forged; Völundr decides *how* the smithy runs). Its trace UI is
9
+ **Smíðja's eye**.
10
+ - **Registry:** `.agents/assets/agents/naming.md`, `docs/lore.md` §XI/§XIII.
11
+ - **Skill (adopted upstream):** `.agents/skills/smidja-factory/` (internals + cookbooks +
12
+ references + `apps/visualizer/` + sibling skills `smidja-launcher`, `smidja-start`,
13
+ `smidja-instructions`, `volundr`).
14
+
15
+ **Two layouts, one smithy — do not confuse them.** A *target* repo the smithy is
16
+ installed into gets the stamped `smidja/` tree (what `install.py` writes). **In
17
+ Ymir itself the instance lives at `apps/smidja/`** — it moved out of the repo root
18
+ so the smithy sits with the other apps, and its runtime data
19
+ (`apps/smidja/smidja_data/`, gitignored) may also live at `$YMIR_HOME/smidja/`,
20
+ which the runtime prefers when it exists. Every path in *this* repo points at
21
+ `apps/smidja/`. The monorepo tracks neither the factory nor the engine: the
22
+ factory is cloned from `zerwiz/smidja` into `apps/smidja-factory` by the
23
+ installer's `apps` step, and the engine is stamped into `apps/smidja` from that
24
+ clone's `templates/smidja` — exactly as `install.py` does for a target repo.
25
+
26
+ ## What it is
27
+
28
+ *Agents plus code*: deterministic Python scripts own sequencing, retries, and
29
+ acceptance; coding agents (Pi) work inside bounded **phases**; typed JSON
30
+ **envelopes** carry context between them; everything streams into **SQLite** so it
31
+ can be watched. *Agent proposes, code disposes.*
32
+
33
+ ## Install into a repo (idempotent)
34
+
35
+ ```bash
36
+ cd <repo-root> # e.g. $YMIR_ROOT
37
+ uv run .agents/skills/smidja-factory/scripts/install.py
38
+ ```
39
+
40
+ Stamps `smidja/` (the starter smithies + `smidja_modules/`), the prompt and harness
41
+ engineering dirs, `smidja/smidja_smidja_config/smidja.config.yaml`, `.env.sample`,
42
+ `justfile`, and `.gitignore` entries. Existing files are skipped unless `--force`.
43
+
44
+ Not writable, it fails plainly: a `PermissionError` never escapes as a traceback —
45
+ the script checks the target and returns exit 1 with the reason, so a failed
46
+ stamp is legible rather than a stack of Python.
47
+
48
+ There is **no separate CLI install**: the launcher `scripts/smidja` belongs to the
49
+ `~/command` provenance repo; in Ymir use the `justfile` recipes or `uv run
50
+ smidja/smidja_*.py` directly.
51
+
52
+ ## Roster & models — through pi's `models.json`
53
+
54
+ - The roster: `smidja/smidja_smidja_config/smidja.config.yaml`. `defaults.model`
55
+ and each agent's `model:` are **`provider/id`**, resolved by **pi** from
56
+ `~/.pi/agent/models.json`. List what resolves with `pi --list-models`.
57
+ - They are written as env-expandable placeholders so one backend can be chosen
58
+ without editing the roster: `${SMIDJA_LOCAL_MODEL:-…}` and per-role
59
+ `${SMIDJA_<ROLE>_MODEL:-…}`. `just` loads `.env` (`set dotenv-load`).
60
+ - Example local model (llama.cpp router on `:8080`):
61
+ `llama-cpp/qwen3.6-35b-a3b@iq3_s`. Verify one-shot:
62
+ `pi -p --no-session --model "llama-cpp/qwen3.6-35b-a3b@iq3_s" "reply OK"`.
63
+ - Keys: the starter roster names cloud providers (`google`, `fireworks`, `openai`)
64
+ → `OPENROUTER_API_KEY` / `FIREWORKS_API_KEY` / `OPENAI_API_KEY` in `.env`. A local
65
+ llama roster needs no key.
66
+
67
+ ## Run
68
+
69
+ ```bash
70
+ # via justfile (repo root)
71
+ just demo # two cheap read-only runs (scout), end to end
72
+ just prompt "summarize this repo"
73
+ just scout "where is auth handled"
74
+ just sdlc "add a /health endpoint"
75
+ just sessions # last 10 runs
76
+ just phases <smidja_id> # phase status in sequence
77
+ just tail <smidja_id> # live event tail
78
+ just procs <smidja_id> # live pids
79
+
80
+ # raw
81
+ uv run apps/smidja/smidja_prompt.py --agent scout "…"
82
+ uv run apps/smidja/smidja_scout.py "…"
83
+ ```
84
+
85
+ The watch recipes use **`python3 -c`** over the SQLite db (the `sqlite3` CLI is not
86
+ installed on this machine) — do not reintroduce `sqlite3`.
87
+
88
+ ## The trace
89
+
90
+ - DB: **`$YMIR_HOME/smidja/smidja.db`** (WAL; read-only readers never block a run).
91
+ `0003-private-data-separation` moved it out of the checkout; an in-repo
92
+ `apps/smidja/smidja_data/smidja.db` is the fallback. Created at the first run
93
+ (`bin/smidja-bootstrap.sh`); `scripts/start.sh` resolves the same pair.
94
+ - Tables: `sessions` (`smidja_id, smidja_name, request, status, engineer,
95
+ started_at, ended_at, total_tokens, total_cost, archived`), `phases`
96
+ (`phase_id, smidja_id, seq, name, kind, owner, description, status, attempt,
97
+ retries, error, …`), `events` (`event_id, smidja_id, phase_id, parent_id, type,
98
+ name, payload_json, tokens, …`), `gate_results`, `envelopes`, `agent_sessions`,
99
+ `processes`.
100
+
101
+ ## Smíðja's eye — the trace visualizer
102
+
103
+ - **Open at `http://127.0.0.1:8437/`.** One Bun server serves both the read-only
104
+ API (`bun:sqlite` over the trace db) **and** the built Vue UI from
105
+ `apps/visualizer/dist`. A Vite dev server on `:8438` is opt-in
106
+ (`SMIDJA_VIZ_DEV=1`) and is not needed for use.
107
+ - **The carved cloth (2026-09-13).** The default theme is **fensalir** — the
108
+ landing page's stone/bone/bronze/blood and its three faces (Cormorant display,
109
+ Newsreader UI, IBM Plex Mono data), cut into `src/style.css` `:root` and into the
110
+ components' role colours (`var(--accent)`, `var(--green)`, `color-mix(…)`). The
111
+ titlebar toggle cycles **fensalir → classic → high-contrast**; `classic` (the
112
+ preserved deep-space look) and `high-contrast` (WCAG AAA) are deliberate
113
+ overrides and **win when chosen** — the cloth is the default, not a cage. A
114
+ saved `neutral` from an older build resolves to fensalir. The categorical
115
+ palettes (event dots, agent lanes in `src/lib/events.ts`) are data, not chrome,
116
+ and were re-cut onto the cloth while staying mutually distinct.
117
+ - `scripts/start.sh` raises it (`CMD_DB=$YMIR_HOME/smidja/smidja.db`, else the
118
+ in-repo fallback; `PORT=8437`); `scripts/stop.sh` lowers it. Port overrides:
119
+ `SMIDJA_VIZ_API_PORT`.
120
+ - Served under Hlidskjalf's **Sessions** gate via **Open visualizer**
121
+ (`VITE_VISUALIZER_URL`, default `http://127.0.0.1:8437`).
122
+ - **Shared login, verified live (added 2026-09-13).** The server exposes
123
+ `GET /api/auth`, which forwards the browser's cookie to the gate's
124
+ `/api/session` and returns `{authed, login}`; `App.vue` shows a "Sign in" link
125
+ (to the gate) or "ᛉ <login>" from that live answer. It **never** reads a
126
+ session file — a token on disk would let a user look logged in when they are not.
127
+ - **The Hall door (added 2026-09-13).** `App.vue`'s topbar carries a **To the
128
+ Hall** pill (rune Othala ᛟ, `.hall-btn`) beside the theme toggle: a new tab to
129
+ the Óðrerir Live Hall — `http://localhost:4322` when
130
+ `window.location.host` starts with `localhost`/`127.0.0.1`, otherwise
131
+ `https://hall.ymir.zerw.org`. It is a **plain anchor, not a `/api/desktop`**
132
+ launcher: the Hall is the landing's live board, not one of the three apps the
133
+ gate raises. Same door in Hlidskjalf's and Sessrúmnir's chrome.
134
+ - See `docs/lore.md` §XIII.
135
+
136
+ ## In Hlidskjalf (the gate API)
137
+
138
+ `apps/hlidskjalf/server` exposes the trace read-only:
139
+ `/api/smidja/health · /api/smidja/sessions · /api/smidja/sessions/:id ·
140
+ /api/smidja/decisions · /api/smidja/stats`. Four gates render it: **Sessions**,
141
+ **Trace**, **Decisions**, **Stats**. Smíðja loads on its own track and is polled
142
+ every 5s, so a finished run appears without a reload.
143
+
144
+ ## The observer (Huginn) — self-contained
145
+
146
+ `bin/nornir-job-observer.sh` runs on the Nornir schedule (06:00). It reads **only
147
+ Ymir's own runtime** — `docs/masterplan.md`, `.agents/agents`, `.agents/memory/well`,
148
+ `workspace/memory/runes_audit.md`, **`$YMIR_HOME/smidja/smidja.db`**, and the
149
+ read-only external worktree root — and writes only `state/observer.log` + Runes.
150
+ There is **no `~/command` connection** anywhere in Ymir. Rune sources:
151
+ `ymir.orders · ymir.agents · ymir.well · ymir.runes · smidja.runs ·
152
+ yggdrasil.worktrees`. See `assets/nornir-jobs.md`.
153
+
154
+ ## Smoke test
155
+
156
+ ```bash
157
+ SMIDJA_LOCAL_MODEL=llama-cpp/qwen3.6-35b-a3b@iq3_s \
158
+ uv run apps/smidja/smidja_prompt.py --agent scout \
159
+ "Reply with a single line: which top-level directories exist in this repo. Change nothing."
160
+ ```
161
+
162
+ Expected: `2/2 phases passed`, a `smidja_id`, and the DB written. Then
163
+ `just sessions` and `just phases <id>` read it, and
164
+ `curl -s localhost:8437/api/health` reports `"sessions": N`.
165
+
166
+ ## Gotchas
167
+
168
+ 1. **`sqlite3` CLI is absent** — use `python3 -c` (the justfile already does).
169
+ 2. **Local models are served by the llama.cpp router `:8080`**, addressed as
170
+ `llama-cpp/<id>`; LM Studio `:1234` may be down. Confirm with `pi --list-models`.
171
+ 3. **The visualizer's local `node_modules` may be a partial bun install** — the API
172
+ still serves the prebuilt `dist/`, so open `:8437`, not `:8438`.
173
+ 4. **Never edit `apps/smidja/smidja_data/sessions/`** — it is the run record.
174
+ 5. **Protected files** (`apps/smidja/smidja_modules/`, `apps/smidja/smidja_*.py`, the config)
175
+ are enforced by `smidja_modules/permissions.py`; agents roll back unauthorized
176
+ changes. The smithy moved from the repo root `smidja/` to `apps/smidja/`
177
+ (Amendment C); `bin/smidja-bootstrap.sh` searches both so a stale layout cannot
178
+ break the DB seed again.
179
+ 6. New skills synthesized for the smithy are validated in Utgard (Gungnir, W0007)
180
+ before production.
@@ -0,0 +1,190 @@
1
+ # Galdr Tool Schemas — TOON Output Formats
2
+
3
+ Galdr references these TOON (Token-Oriented Object Notation) schemas per tool type. All output converts to TOON at the output boundary; internal logic remains on JSON.
4
+
5
+ ## 1. Smíðja Orchestrator Schema
6
+
7
+ ```toon
8
+ smidja:
9
+ status: open|closed|in-progress
10
+ phase: <phase-name>
11
+ progress: integer 0-100
12
+ next_action: string
13
+ utgard_sandbox: boolean
14
+ worktree: string
15
+ phase_complete: boolean
16
+ ```
17
+
18
+ **Usage**: Python smidja scripts (`smidja_*.py`) — status, phase, progress tracking, utgard sandbox flag, worktree branch, phase completion.
19
+
20
+ ## 2. Brokk Crew Schema
21
+
22
+ ```toon
23
+ crew:
24
+ status: active|paused|completed
25
+ agent_role: developer|marketer|researcher
26
+ worktree: string
27
+ utgard: boolean
28
+ sandboxed: boolean
29
+ session_id: string
30
+ ```
31
+
32
+ **Usage**: Brokk Allfather communications — crew status, agent role, worktree branch, utgard flag, sandboxed flag, session identification.
33
+
34
+ ## 3. Galdr Skill Generator Schema
35
+
36
+ ```toon
37
+ skill:
38
+ name: string Norse-skill-name
39
+ category: feature|bug|infrastructure|compliance|system
40
+ toon_output: boolean
41
+ principles: [1,2,3,4,5,6,7,8,9,10]
42
+ compliance_status: validated|pending
43
+ eindri_role: developer|marketer|researcher|none
44
+ utgard_sandbox: true
45
+ ```
46
+
47
+ **Usage**: Galdr-crafter generated skills — skill name with Norse naming, category, TOON output flag, all 10 principles list, compliance status, Eindri role assignment, utgard sandbox flag.
48
+
49
+ ## 4. Eindri Sub-Agent Profile Schemas
50
+
51
+ ### Developer Profile
52
+ ```toon
53
+ eindri:
54
+ role: developer
55
+ capabilities:
56
+ - code_synthesis
57
+ - refactoring
58
+ - test_writing
59
+ - cli_tools
60
+ - package_management
61
+ tools:
62
+ - Yggdrasil
63
+ - herder
64
+ - hermes_runner
65
+ - vector_db
66
+ - supabase
67
+ workspace_patterns:
68
+ - development/
69
+ - .agents/tools/
70
+ - .agents/skills/
71
+ security:
72
+ runs_in_utgard: true
73
+ utgard_network: none
74
+ utgard_resource_caps: true
75
+ yggdrasil_worktree: true
76
+ sandboxed: true
77
+ ```
78
+
79
+ **Usage**: Galdr compliance checking — verifying new skills are compatible with developer Eindri worker profiles.
80
+
81
+ ### Marketer Profile
82
+ ```toon
83
+ eindri:
84
+ role: marketer
85
+ capabilities:
86
+ - content_creation
87
+ - seo_optimization
88
+ - social_copy
89
+ - campaign_planning
90
+ - market_research
91
+ tools:
92
+ - vector_db
93
+ - supabase
94
+ - hermes_runner
95
+ - herder
96
+ - Yggdrasil
97
+ workspace_patterns:
98
+ - marketing/
99
+ - .agents/assets/templates/
100
+ - .agents/skills/
101
+ security:
102
+ runs_in_utgard: true
103
+ utgard_network: none
104
+ utgard_resource_caps: true
105
+ yggdrasil_worktree: true
106
+ sandboxed: true
107
+ ```
108
+
109
+ **Usage**: Galdr compliance checking — verifying new skills compatible with marketer Eindri worker profiles.
110
+
111
+ ### Researcher Profile
112
+ ```toon
113
+ eindri:
114
+ role: researcher
115
+ capabilities:
116
+ - rag_search
117
+ - web_search
118
+ - analysis
119
+ - summarization
120
+ - entity_extraction
121
+ tools:
122
+ - vector_db
123
+ - hermes_runner
124
+ - herder
125
+ - Yggdrasil
126
+ - supabase
127
+ workspace_patterns:
128
+ - development/
129
+ - .agents/memory/
130
+ - .agents/assets/templates/
131
+ security:
132
+ runs_in_utgard: true
133
+ utgard_network: none
134
+ utgard_resource_caps: true
135
+ yggdrasil_worktree: true
136
+ sandboxed: true
137
+ ```
138
+
139
+ **Usage**: Galdr compliance checking — verifying new skills compatible with researcher Eindri worker profiles.
140
+
141
+ ## 5. Norse Aett Naming Schema
142
+
143
+ ```toon
144
+ naming:
145
+ aett: galdr|val|skyr|bifr|heimd|gjallar|mimir|yggd
146
+ pattern: <aett>-<verb|noun|adjective>
147
+ validity: follows_Norse_mythology_convention
148
+ rejection_reason: if_not_following_aett_pattern
149
+ ```
150
+
151
+ **Usage**: Galdr-crafter skill naming — ensuring new skill names follow the Norse aett pattern.
152
+
153
+ ## 6. Session Integration Schema
154
+
155
+ ```toon
156
+ session:
157
+ hook: boolean (primary|secondary|none)
158
+ hook_installed: boolean
159
+ skill_loaded: boolean
160
+ ambient_context: boolean
161
+ context_richness: integer 1-10
162
+ last_session_start: ISO8601-timestamp
163
+ ```
164
+
165
+ **Usage**: Galdr skill integration tracking — whether primary session hook or secondary skill is loaded, ambient context richness score, last session start timestamp.
166
+
167
+ ## 7. Compliance Gate Results Schema
168
+
169
+ ```toon
170
+ compliance:
171
+ toe_output_test: pass|fail (with token_savings_percentage)
172
+ principle_compliance: pass|fail (per_principle)
173
+ norse_name_validity: valid|invalid (with_aett_pattern)
174
+ frame_integration: integrated|pending (with_skill_path)
175
+ mimirsbrunn_observation: observed|pending (with_episode_id)
176
+ eindri_compatibility: compatible|incompatible (with_profile_reference)
177
+ utgard_sandbox: compliant|non-compliant (with_declarations)
178
+ ```
179
+
180
+ **Usage**: Galdr-compliance checker output — all five gate results with detailed per-principle assessment.
181
+
182
+ ## Conversion Rules
183
+
184
+ 1. **JSON → TOON**: At output boundary only; internal logic remains JSON
185
+ 2. **Token savings**: ~40% reduction versus equivalent JSON
186
+ 3. **Minimal schemas**: Default to 3-4 fields, not 10+
187
+ 4. **Empty states**: Always show total size "(truncated, N chars total)"
188
+ 5. **Help hints**: Include "--full" escape hatch reference
189
+ 6. **Error format**: Structured errors in TOON, never raw stack traces
190
+ 7. **Exit codes**: 0 = success (including no-ops), 1 = error, 2 = usage error
@@ -0,0 +1,45 @@
1
+ # Galdr Scripts — compliance and TOON tooling
2
+
3
+ Executable checks for the Galdr/Tyr gates. Both are Galdr-style: TOON output on
4
+ stdout, structured errors, no prompts, `--version` fast path, idempotent.
5
+
6
+ ```
7
+ scripts[2]{file,purpose}:
8
+ "toon-check.py","validate TOON blocks (header count/fields vs rows; ... = elided)"
9
+ "compliance-check.sh","run all gates: toon, naming, mocks, syntax, json, sync"
10
+ ```
11
+
12
+ ## Usage
13
+
14
+ ```
15
+ python3 .agents/skills/galdr-ymirsystem/scripts/toon-check.py <file-or-dir> [...] [--quiet] [--json]
16
+ bash .agents/skills/galdr-ymirsystem/scripts/compliance-check.sh [--quiet] [--json]
17
+ ```
18
+
19
+ Exit codes: `0` success, `1` violations, `2` usage error.
20
+
21
+ ## What compliance-check.sh enforces
22
+
23
+ ```
24
+ checks[8]{id,what}:
25
+ "toon","TOON blocks valid in galdr SKILL.md + assets + tyr SKILL.md + AGENTS.md"
26
+ "naming","no imported terms (Allfather/Yggdrasil/Eindri) in AGENTS.md + bin/ (observer exempt)"
27
+ "mocks","no mock/stub/placeholder/TODO in the shipped runtime (bin/)"
28
+ "syntax","bash -n on bin/*.sh; node --check on .opencode/plugins/*.js"
29
+ "json","every runtime JSON parses"
30
+ "sync","galdr-ymirsystem/assets mirrors tyr-check/assets"
31
+ ```
32
+
33
+ ## TOON block convention
34
+
35
+ ```
36
+ type[count]{field1,field2}:
37
+ "value","value"
38
+ ```
39
+
40
+ A row of `...` marks an elided excerpt and is reported `ELIDED` (not a failure).
41
+
42
+ ## Maintaining this
43
+
44
+ - **Owner:** Brokk. **Router:** `.agents/skills/galdr-ymirsystem/SKILL.md`.
45
+ - Extend a gate by adding to `compliance-check.sh` and a row to its `checks` block.
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env bash
2
+ # bench-one.sh — benchmark ONE local GGUF model, end to end, portably.
3
+ #
4
+ # It starts its OWN throwaway single-model llama-server on a scratch port,
5
+ # measures it, and kills it. It never touches a running service, and it needs
6
+ # nothing from the testing host but a llama-server binary and a .gguf.
7
+ #
8
+ # Usage:
9
+ # bench-one.sh <model.gguf | model-id> [options]
10
+ #
11
+ # Options:
12
+ # --ctx N context to load (default 32768)
13
+ # --kv TYPE KV cache type for BOTH k and v (default f16; q8_0 halves it)
14
+ # --ngl N layers on GPU (default 999 = as many as fit)
15
+ # --batch N batch and ubatch (default 2048)
16
+ # --threads N CPU threads (default: all cores)
17
+ # --device NAME pin a device (CUDA0, Vulkan0, …)
18
+ # --server PATH llama-server binary (default $LLAMA_SERVER, else PATH)
19
+ # --port N scratch port (default: a free one)
20
+ # --prompt FILE request JSON (default: built-in ~2k-token prompt)
21
+ # --max-tokens N completion length (default 128)
22
+ # --keep leave the server running after the run
23
+ # -h, --help this text
24
+ #
25
+ # A bare model-id is only a convenience: if `llama-models` is on PATH (a machine
26
+ # registry from a Ymir host) its gguf/ctx/kv are read READ-ONLY so the bench
27
+ # matches what that host would serve. With no registry, pass a path to a .gguf.
28
+ #
29
+ # The 8 rules this follows are in ../SKILL.md; the measurements you take belong
30
+ # in YOUR host's Hoard (../METHOD.md → "Where the data lives").
31
+ set -euo pipefail
32
+
33
+ CTX=32768; KV=f16; NGL=999; BATCH=2048; THREADS=""; DEVICE=""; SERVER=""
34
+ PORT=""; PROMPT_JSON=""; MAX_TOKENS=128; KEEP=0; MODEL=""
35
+
36
+ while [ $# -gt 0 ]; do
37
+ case "$1" in
38
+ --ctx) CTX=$2; shift 2 ;;
39
+ --kv) KV=$2; shift 2 ;;
40
+ --ngl) NGL=$2; shift 2 ;;
41
+ --batch) BATCH=$2; shift 2 ;;
42
+ --threads) THREADS=$2; shift 2 ;;
43
+ --device) DEVICE=$2; shift 2 ;;
44
+ --server) SERVER=$2; shift 2 ;;
45
+ --port) PORT=$2; shift 2 ;;
46
+ --prompt) PROMPT_JSON=$2; shift 2 ;;
47
+ --max-tokens) MAX_TOKENS=$2; shift 2 ;;
48
+ --keep) KEEP=1; shift ;;
49
+ -h|--help) sed -n '2,30p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
50
+ -*) echo "unknown option: $1 (try --help)" >&2; exit 2 ;;
51
+ *) MODEL=$1; shift ;;
52
+ esac
53
+ done
54
+ [ -n "$MODEL" ] || { echo "usage: bench-one.sh <model.gguf|model-id> [options] (--help)" >&2; exit 2; }
55
+
56
+ # ---- resolve the server --------------------------------------------------
57
+ if [ -z "$SERVER" ]; then SERVER="${LLAMA_SERVER:-$(command -v llama-server || true)}"; fi
58
+ [ -n "$SERVER" ] && [ -x "$SERVER" ] || {
59
+ echo "✗ no llama-server found. Install one, or pass --server PATH (or set \$LLAMA_SERVER)." >&2; exit 1; }
60
+
61
+ # ---- resolve the model ---------------------------------------------------
62
+ GGUF="$MODEL"
63
+ if [ ! -f "$GGUF" ]; then
64
+ if command -v llama-models >/dev/null 2>&1; then
65
+ g=$(llama-models get "$MODEL" gguf 2>/dev/null || true)
66
+ md=$(llama-models defaults 2>/dev/null | cut -d'|' -f2)
67
+ [ -n "$g" ] && GGUF="$md/$g"
68
+ # only adopt registry values the user did not set explicitly
69
+ [ "$CTX" = "32768" ] && { v=$(llama-models get "$MODEL" ctx); [ -n "$v" ] && CTX=$v; }
70
+ [ "$KV" = "f16" ] && { v=$(llama-models get "$MODEL" kv); [ -n "$v" ] && KV=$v; }
71
+ [ "$NGL" = "999" ] && { v=$(llama-models get "$MODEL" ngl); [ -n "$v" ] && NGL=$v; }
72
+ [ -z "$THREADS" ] && { v=$(llama-models get "$MODEL" threads); [ -n "$v" ] && THREADS=$v; }
73
+ fi
74
+ fi
75
+ [ -f "$GGUF" ] || { echo "✗ not a file and not a known model id: $MODEL" >&2; exit 2; }
76
+ # --- portable primitives -----------------------------------------------------
77
+ # This script ships standalone, so it carries its own OS handling rather than
78
+ # depending on a Ymir checkout. macOS/BSD differ on all three counts below.
79
+ cpu_count() {
80
+ if command -v nproc >/dev/null 2>&1; then nproc
81
+ elif command -v sysctl >/dev/null 2>&1 && sysctl -n hw.ncpu >/dev/null 2>&1; then sysctl -n hw.ncpu
82
+ elif command -v getconf >/dev/null 2>&1; then getconf _NPROCESSORS_ONLN 2>/dev/null || printf '4'
83
+ else printf '4'; fi
84
+ }
85
+ now_ns() { # epoch milliseconds*1e6; BSD date has no %N
86
+ local s n
87
+ s=$(date +%s 2>/dev/null) || s=0
88
+ n=$(date +%N 2>/dev/null)
89
+ case "$n" in ''|*[!0-9]*) n=000000000 ;; esac
90
+ printf '%s%s' "$s" "$n"
91
+ }
92
+ gpu_tool() { # nvidia | rocm | none
93
+ if command -v nvidia-smi >/dev/null 2>&1; then printf 'nvidia'
94
+ elif command -v rocm-smi >/dev/null 2>&1; then printf 'rocm'
95
+ else printf 'none'; fi
96
+ }
97
+ gpu_name() {
98
+ case "$(gpu_tool)" in
99
+ nvidia) nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | head -1 ;;
100
+ rocm) rocm-smi --showproductname 2>/dev/null | head -2 | tr '\n' ' ' ;;
101
+ *) uname -s 2>/dev/null | grep -q Darwin && printf 'Apple (unified memory)' || printf 'cpu-only' ;;
102
+ esac
103
+ }
104
+ [ -n "$THREADS" ] || THREADS=$(cpu_count)
105
+ [ -n "$PORT" ] || PORT=$(( (RANDOM % 800) + 9200 ))
106
+
107
+ TMP=$(mktemp -d "${TMPDIR:-/tmp}/bench.XXXXXX")
108
+ LOG="$TMP/server.log"; SRV_PID=""
109
+ cleanup() {
110
+ # Signal ONLY the server this script started — never anyone else's.
111
+ if [ "$KEEP" = "0" ] && [ -n "$SRV_PID" ] && kill -0 "$SRV_PID" 2>/dev/null; then
112
+ kill "$SRV_PID" 2>/dev/null || true
113
+ for _ in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$SRV_PID" 2>/dev/null || break; sleep 1; done
114
+ kill -0 "$SRV_PID" 2>/dev/null && echo " ⚠ bench server pid $SRV_PID ignored SIGTERM" >&2
115
+ fi
116
+ rm -rf "$TMP"
117
+ }
118
+ trap cleanup EXIT
119
+ command -v curl >/dev/null || { echo "✗ curl is required" >&2; exit 1; }
120
+
121
+ gpu_mem() { # device memory in use (MiB), or "?" when the host does not expose it
122
+ case "$(gpu_tool)" in
123
+ nvidia) nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits 2>/dev/null | head -1 || printf '?' ;;
124
+ rocm) rocm-smi --showmemuse 2>/dev/null | grep -oE '[0-9]+' | head -1 || printf '?' ;;
125
+ *) printf '?' ;;
126
+ esac
127
+ }
128
+
129
+ echo "=== [1/7] server ==="
130
+ echo " $SERVER"
131
+ DEVS=$("$SERVER" --list-devices 2>&1 | grep -icE "CUDA|Vulkan|ROCm|Metal" || true)
132
+ if [ "$DEVS" -eq 0 ]; then
133
+ echo " ⚠ this build reports NO GPU device — you are about to measure the CPU."
134
+ echo " That is a valid CPU test; it is not a GPU measurement."
135
+ else
136
+ "$SERVER" --list-devices 2>&1 | grep -iE "CUDA|Vulkan|ROCm|Metal" | sed 's/^/ /'
137
+ fi
138
+ echo "=== [2/7] configuration ==="
139
+ echo " model: $GGUF"
140
+ echo " ctx=$CTX kv=$KV (both K and V) ngl=$NGL batch=$BATCH threads=$THREADS${DEVICE:+ device=$DEVICE}"
141
+ echo " note: keep K and V identical. A build that lacks the kernel for your KV"
142
+ echo " type can silently move attention to the CPU (see ../METHOD.md)."
143
+ echo " VRAM in use before start: $(gpu_mem) MiB"
144
+
145
+ echo "=== [3/7] start a throwaway server on :$PORT ==="
146
+ ARGS=(-m "$GGUF" -ngl "$NGL" --flash-attn on
147
+ --cache-type-k "$KV" --cache-type-v "$KV"
148
+ -c "$CTX" -b "$BATCH" -ub "$BATCH" -t "$THREADS" --jinja --temp 0 --seed 42
149
+ -np 1 --host 127.0.0.1 --port "$PORT")
150
+ [ -n "$DEVICE" ] && ARGS+=(--device "$DEVICE")
151
+ "$SERVER" "${ARGS[@]}" > "$LOG" 2>&1 &
152
+ SRV_PID=$!
153
+ for i in $(seq 1 120); do
154
+ sleep 2
155
+ grep -qE "model loaded|server is listening" "$LOG" 2>/dev/null && { echo " loaded in $((i*2))s (pid $SRV_PID)"; break; }
156
+ grep -qE "out of memory|failed to allocate|error loading model" "$LOG" 2>/dev/null && {
157
+ echo "✗ failed to load — lower --ctx, use a smaller --kv, or lower --ngl. Last lines:" >&2
158
+ tail -6 "$LOG" >&2; exit 1; }
159
+ kill -0 "$SRV_PID" 2>/dev/null || { echo "✗ server exited during load:" >&2; tail -8 "$LOG" >&2; exit 1; }
160
+ done
161
+ grep -qE "model loaded|server is listening" "$LOG" || { echo "✗ timed out waiting for load" >&2; tail -8 "$LOG" >&2; exit 1; }
162
+ echo " VRAM after load: $(gpu_mem) MiB"
163
+
164
+ echo "=== [4/7] verify the loaded context (from the server, not the flags) ==="
165
+ curl -s "http://127.0.0.1:$PORT/props" | python3 -c "
166
+ import sys, json
167
+ try:
168
+ d = json.load(sys.stdin)
169
+ g = d.get('default_generation_settings', {})
170
+ print(' n_ctx:', g.get('n_ctx'))
171
+ except Exception: print(' (/props unreadable — record the configured ctx instead)')" 2>/dev/null || true
172
+
173
+ echo "=== [5/7] build the timed request ==="
174
+ if [ -n "$PROMPT_JSON" ]; then REQ="$PROMPT_JSON"; echo " using $PROMPT_JSON"
175
+ else
176
+ REQ="$TMP/req.json"
177
+ python3 - "$REQ" "$MAX_TOKENS" <<'PYEOF'
178
+ import json, sys
179
+ body = "def f(n):\n return n if n < 2 else f(n-1) + f(n-2)\n"
180
+ text = (body * 330)
181
+ json.dump({"model": "local",
182
+ "messages": [{"role": "user",
183
+ "content": "Explain this code in full detail, including time and space complexity.\n\n" + text}],
184
+ "max_tokens": int(sys.argv[2]), "temperature": 0, "seed": 42, "stream": False},
185
+ open(sys.argv[1], "w"))
186
+ print(" built a prompt of roughly", len(text)//4, "tokens")
187
+ PYEOF
188
+ fi
189
+
190
+ echo "=== [6/7] warm the GPU, then time a cold-context run ==="
191
+ python3 -c "
192
+ import json; json.dump({'model':'local','messages':[{'role':'user','content':'hi'}],'max_tokens':8,'temperature':0}, open('$TMP/warm.json','w'))"
193
+ curl -s "http://127.0.0.1:$PORT/v1/chat/completions" -H 'Content-Type: application/json' -d @"$TMP/warm.json" -o /dev/null
194
+ case "$(gpu_tool)" in
195
+ nvidia) nvidia-smi --query-gpu=clocks.sm,power.draw --format=csv,noheader | sed 's/^/ after warm: /' ;;
196
+ *) echo " (no NVIDIA telemetry on this host — util/power will be omitted)" ;;
197
+ esac
198
+ ( case "$(gpu_tool)" in
199
+ nvidia) for i in $(seq 1 120); do
200
+ nvidia-smi --query-gpu=utilization.gpu,power.draw,memory.used --format=csv,noheader >> "$TMP/gpu.txt"
201
+ sleep 1
202
+ done ;;
203
+ esac ) & SAMPLER=$!
204
+ T0=$(now_ns)
205
+ curl -s -m 1800 "http://127.0.0.1:$PORT/v1/chat/completions" -H 'Content-Type: application/json' -d @"$REQ" -o "$TMP/out.json"
206
+ T1=$(now_ns)
207
+ kill "$SAMPLER" 2>/dev/null || true; wait "$SAMPLER" 2>/dev/null || true
208
+
209
+ echo "=== [7/7] results ==="
210
+ python3 - "$TMP/out.json" "$T1" "$T0" "$CTX" "$KV" "$TMP/gpu.txt" <<'PYEOF'
211
+ import json, os, sys
212
+ out, t1, t0, ctx, kv, gpufile = sys.argv[1:7]
213
+ try:
214
+ d = json.load(open(out))
215
+ except Exception:
216
+ print(" ✗ no parseable response — check the server log"); raise SystemExit(0)
217
+ if "error" in d:
218
+ print(" ✗ server error:", str(d["error"])[:300]); raise SystemExit(0)
219
+ t = d.get("timings", {}) or {}
220
+ wall = (float(t1) - float(t0)) / 1e9
221
+ pt = (d.get("usage") or {}).get("prompt_tokens")
222
+ print(f" wall : {wall:.1f}s")
223
+ print(f" prompt_tokens : {pt}")
224
+ print(f" prefill : {t.get('prompt_per_second', 0):.1f} t/s")
225
+ print(f" decode : {t.get('predicted_per_second', 0):.1f} t/s")
226
+ print(f" cache_n : {t.get('cache_n')} (0 = true cold prefill)")
227
+ if os.path.exists(gpufile):
228
+ rows = [l.strip().split(', ') for l in open(gpufile) if l.strip()]
229
+ if rows:
230
+ util = max(int(r[0].split()[0]) for r in rows)
231
+ vram = max(int(r[2].split()[0]) for r in rows)
232
+ pwr = max(float(r[1].split()[0]) for r in rows)
233
+ print(f" peak GPU : {util}% util, {vram} MiB, {pwr:.0f} W")
234
+ if util < 50:
235
+ print(" ⚠ utilisation stayed under 50% — the GPU never ramped, or the run was CPU-bound.")
236
+ print()
237
+ print(" RECORD THIS (your host's Hoard — see ../METHOD.md):")
238
+ print(f" model=<name> quant=<quant> ctx={ctx} kv={kv} "
239
+ f"prefill={t.get('prompt_per_second',0):.1f} decode={t.get('predicted_per_second',0):.1f} "
240
+ f"prompt_tokens={pt} wall={wall:.1f}s")
241
+ print(" Always record the context the run was measured at.")
242
+ PYEOF
243
+
244
+ if [ "$KEEP" = "1" ]; then echo "=== --keep: server left running on :$PORT (pid $SRV_PID) ==="; exit 0; fi
245
+ echo "=== teardown ==="
246
+ kill "$SRV_PID" 2>/dev/null || true; wait "$SRV_PID" 2>/dev/null || true; SRV_PID=""
247
+ sleep 1
248
+ echo " VRAM after: $(gpu_mem) MiB"