@zerwiz/ymir 0.1.3 → 0.1.5
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.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +290 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml +50 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +9 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/config/tailscale-sync.yaml +27 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/kaia.engram +0 -0
- package/.agents/memory/kaia.engram-shm +0 -0
- package/.agents/memory/kaia.engram-wal +0 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/memory/well/episodes.jsonl +367 -0
- package/.agents/memory/well/workspace.jsonl +27 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +111 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +70 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +52 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +34 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +454 -0
- package/CHANGELOG.md +881 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +113 -39
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +65 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +58 -0
- package/RULES/07-config.md +45 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/README.md +20 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +98 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +233 -0
- package/bin/apodex-smoke-test.sh +92 -0
- package/bin/bifrost-bridge.sh +112 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +107 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +38 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-guard.sh +165 -0
- package/bin/crash-sense.sh +160 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +207 -0
- package/bin/eindri-acclaim.sh +34 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seen.sh +41 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +85 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +112 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/fleet-apply.sh +68 -0
- package/bin/github-deploy.sh +81 -0
- package/bin/gjallarhorn-expose.sh +102 -0
- package/bin/gjallarhorn-notify.sh +58 -0
- package/bin/gjallarhorn-purge.sh +54 -0
- package/bin/gjallarhorn-tunnel.sh +72 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +122 -0
- package/bin/hall-snapshot.sh +92 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +431 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hoard-lib.sh +25 -0
- package/bin/hodd.sh +78 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +108 -0
- package/bin/local-model-lock.sh +51 -0
- package/bin/mimir-bridge.py +226 -0
- package/bin/mimir-bridge.sh +87 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +59 -0
- package/bin/mjollnir.sh +85 -0
- package/bin/model-hardware.sh +82 -0
- package/bin/model-resolve.sh +147 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +148 -0
- package/bin/omarchy-plugins.sh +174 -0
- package/bin/omarchy-sense.sh +149 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +38 -0
- package/bin/project-git.sh +55 -0
- package/bin/public-guard.sh +70 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +91 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +90 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +76 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +190 -0
- package/bin/telegram-bot.sh +69 -0
- package/bin/toolchain.sh +74 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +260 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +47 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +150 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +641 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +97 -0
- package/bin/ymir-setup-auth.sh +108 -0
- package/bin/ymir-validate.sh +173 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1056 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +44 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +210 -0
- package/scripts/start.sh +167 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,175 @@
|
|
|
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/`.
|
|
22
|
+
|
|
23
|
+
## What it is
|
|
24
|
+
|
|
25
|
+
*Agents plus code*: deterministic Python scripts own sequencing, retries, and
|
|
26
|
+
acceptance; coding agents (Pi) work inside bounded **phases**; typed JSON
|
|
27
|
+
**envelopes** carry context between them; everything streams into **SQLite** so it
|
|
28
|
+
can be watched. *Agent proposes, code disposes.*
|
|
29
|
+
|
|
30
|
+
## Install into a repo (idempotent)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
cd <repo-root> # e.g. $YMIR_ROOT
|
|
34
|
+
uv run .agents/skills/smidja-factory/scripts/install.py
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Stamps `smidja/` (the starter smithies + `smidja_modules/`), the prompt and harness
|
|
38
|
+
engineering dirs, `smidja/smidja_smidja_config/smidja.config.yaml`, `.env.sample`,
|
|
39
|
+
`justfile`, and `.gitignore` entries. Existing files are skipped unless `--force`.
|
|
40
|
+
|
|
41
|
+
Not writable, it fails plainly: a `PermissionError` never escapes as a traceback —
|
|
42
|
+
the script checks the target and returns exit 1 with the reason, so a failed
|
|
43
|
+
stamp is legible rather than a stack of Python.
|
|
44
|
+
|
|
45
|
+
There is **no separate CLI install**: the launcher `scripts/smidja` belongs to the
|
|
46
|
+
`~/command` provenance repo; in Ymir use the `justfile` recipes or `uv run
|
|
47
|
+
smidja/smidja_*.py` directly.
|
|
48
|
+
|
|
49
|
+
## Roster & models — through pi's `models.json`
|
|
50
|
+
|
|
51
|
+
- The roster: `smidja/smidja_smidja_config/smidja.config.yaml`. `defaults.model`
|
|
52
|
+
and each agent's `model:` are **`provider/id`**, resolved by **pi** from
|
|
53
|
+
`~/.pi/agent/models.json`. List what resolves with `pi --list-models`.
|
|
54
|
+
- They are written as env-expandable placeholders so one backend can be chosen
|
|
55
|
+
without editing the roster: `${SMIDJA_LOCAL_MODEL:-…}` and per-role
|
|
56
|
+
`${SMIDJA_<ROLE>_MODEL:-…}`. `just` loads `.env` (`set dotenv-load`).
|
|
57
|
+
- Example local model (llama.cpp router on `:8080`):
|
|
58
|
+
`llama-cpp/qwen3.6-35b-a3b@iq3_s`. Verify one-shot:
|
|
59
|
+
`pi -p --no-session --model "llama-cpp/qwen3.6-35b-a3b@iq3_s" "reply OK"`.
|
|
60
|
+
- Keys: the starter roster names cloud providers (`google`, `fireworks`, `openai`)
|
|
61
|
+
→ `OPENROUTER_API_KEY` / `FIREWORKS_API_KEY` / `OPENAI_API_KEY` in `.env`. A local
|
|
62
|
+
llama roster needs no key.
|
|
63
|
+
|
|
64
|
+
## Run
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# via justfile (repo root)
|
|
68
|
+
just demo # two cheap read-only runs (scout), end to end
|
|
69
|
+
just prompt "summarize this repo"
|
|
70
|
+
just scout "where is auth handled"
|
|
71
|
+
just sdlc "add a /health endpoint"
|
|
72
|
+
just sessions # last 10 runs
|
|
73
|
+
just phases <smidja_id> # phase status in sequence
|
|
74
|
+
just tail <smidja_id> # live event tail
|
|
75
|
+
just procs <smidja_id> # live pids
|
|
76
|
+
|
|
77
|
+
# raw
|
|
78
|
+
uv run apps/smidja/smidja_prompt.py --agent scout "…"
|
|
79
|
+
uv run apps/smidja/smidja_scout.py "…"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The watch recipes use **`python3 -c`** over the SQLite db (the `sqlite3` CLI is not
|
|
83
|
+
installed on this machine) — do not reintroduce `sqlite3`.
|
|
84
|
+
|
|
85
|
+
## The trace
|
|
86
|
+
|
|
87
|
+
- DB: **`apps/smidja/smidja_data/smidja.db`** (WAL; read-only readers never block a run).
|
|
88
|
+
The runtime prefers `$YMIR_HOME/smidja/smidja.db` when it exists (the data
|
|
89
|
+
belongs outside the repo); the app path is the fallback.
|
|
90
|
+
Created at the first run.
|
|
91
|
+
- Tables: `sessions` (`smidja_id, smidja_name, request, status, engineer,
|
|
92
|
+
started_at, ended_at, total_tokens, total_cost, archived`), `phases`
|
|
93
|
+
(`phase_id, smidja_id, seq, name, kind, owner, description, status, attempt,
|
|
94
|
+
retries, error, …`), `events` (`event_id, smidja_id, phase_id, parent_id, type,
|
|
95
|
+
name, payload_json, tokens, …`), `gate_results`, `envelopes`, `agent_sessions`,
|
|
96
|
+
`processes`.
|
|
97
|
+
|
|
98
|
+
## Smíðja's eye — the trace visualizer
|
|
99
|
+
|
|
100
|
+
- **Open at `http://127.0.0.1:8437/`.** One Bun server serves both the read-only
|
|
101
|
+
API (`bun:sqlite` over the trace db) **and** the built Vue UI from
|
|
102
|
+
`apps/visualizer/dist`. A Vite dev server on `:8438` is opt-in
|
|
103
|
+
(`SMIDJA_VIZ_DEV=1`) and is not needed for use.
|
|
104
|
+
- **The carved cloth (2026-09-13).** The default theme is **fensalir** — the
|
|
105
|
+
landing page's stone/bone/bronze/blood and its three faces (Cormorant display,
|
|
106
|
+
Newsreader UI, IBM Plex Mono data), cut into `src/style.css` `:root` and into the
|
|
107
|
+
components' role colours (`var(--accent)`, `var(--green)`, `color-mix(…)`). The
|
|
108
|
+
titlebar toggle cycles **fensalir → classic → high-contrast**; `classic` (the
|
|
109
|
+
preserved deep-space look) and `high-contrast` (WCAG AAA) are deliberate
|
|
110
|
+
overrides and **win when chosen** — the cloth is the default, not a cage. A
|
|
111
|
+
saved `neutral` from an older build resolves to fensalir. The categorical
|
|
112
|
+
palettes (event dots, agent lanes in `src/lib/events.ts`) are data, not chrome,
|
|
113
|
+
and were re-cut onto the cloth while staying mutually distinct.
|
|
114
|
+
- `scripts/start.sh` raises it (`CMD_DB=<repo>/apps/smidja/smidja_data/smidja.db`,
|
|
115
|
+
`PORT=8437`); `scripts/stop.sh` lowers it. Port overrides:
|
|
116
|
+
`SMIDJA_VIZ_API_PORT`.
|
|
117
|
+
- Served under Hlidskjalf's **Sessions** gate via **Open visualizer**
|
|
118
|
+
(`VITE_VISUALIZER_URL`, default `http://127.0.0.1:8437`).
|
|
119
|
+
- **Shared login, verified live (added 2026-09-13).** The server exposes
|
|
120
|
+
`GET /api/auth`, which forwards the browser's cookie to the gate's
|
|
121
|
+
`/api/session` and returns `{authed, login}`; `App.vue` shows a "Sign in" link
|
|
122
|
+
(to the gate) or "ᛉ <login>" from that live answer. It **never** reads a
|
|
123
|
+
session file — a token on disk would let a user look logged in when they are not.
|
|
124
|
+
- **The Hall door (added 2026-09-13).** `App.vue`'s topbar carries a **To the
|
|
125
|
+
Hall** pill (rune Othala ᛟ, `.hall-btn`) beside the theme toggle: a new tab to
|
|
126
|
+
the Óðrerir Live Hall — `http://localhost:4322` when
|
|
127
|
+
`window.location.host` starts with `localhost`/`127.0.0.1`, otherwise
|
|
128
|
+
`https://hall.ymir.zerw.org`. It is a **plain anchor, not a `/api/desktop`**
|
|
129
|
+
launcher: the Hall is the landing's live board, not one of the three apps the
|
|
130
|
+
gate raises. Same door in Hlidskjalf's and Sessrúmnir's chrome.
|
|
131
|
+
- See `docs/lore.md` §XIII.
|
|
132
|
+
|
|
133
|
+
## In Hlidskjalf (the gate API)
|
|
134
|
+
|
|
135
|
+
`apps/hlidskjalf/server` exposes the trace read-only:
|
|
136
|
+
`/api/smidja/health · /api/smidja/sessions · /api/smidja/sessions/:id ·
|
|
137
|
+
/api/smidja/decisions · /api/smidja/stats`. Four gates render it: **Sessions**,
|
|
138
|
+
**Trace**, **Decisions**, **Stats**. Smíðja loads on its own track and is polled
|
|
139
|
+
every 5s, so a finished run appears without a reload.
|
|
140
|
+
|
|
141
|
+
## The observer (Huginn) — self-contained
|
|
142
|
+
|
|
143
|
+
`bin/nornir-job-observer.sh` runs on the Nornir schedule (06:00). It reads **only
|
|
144
|
+
Ymir's own runtime** — `docs/masterplan.md`, `.agents/agents`, `.agents/memory/well`,
|
|
145
|
+
`workspace/memory/runes_audit.md`, **`apps/smidja/smidja_data/smidja.db`**, and the
|
|
146
|
+
read-only external worktree root — and writes only `state/observer.log` + Runes.
|
|
147
|
+
There is **no `~/command` connection** anywhere in Ymir. Rune sources:
|
|
148
|
+
`ymir.orders · ymir.agents · ymir.well · ymir.runes · smidja.runs ·
|
|
149
|
+
yggdrasil.worktrees`. See `assets/nornir-jobs.md`.
|
|
150
|
+
|
|
151
|
+
## Smoke test
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
SMIDJA_LOCAL_MODEL=llama-cpp/qwen3.6-35b-a3b@iq3_s \
|
|
155
|
+
uv run apps/smidja/smidja_prompt.py --agent scout \
|
|
156
|
+
"Reply with a single line: which top-level directories exist in this repo. Change nothing."
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Expected: `2/2 phases passed`, a `smidja_id`, and the DB written. Then
|
|
160
|
+
`just sessions` and `just phases <id>` read it, and
|
|
161
|
+
`curl -s localhost:8437/api/health` reports `"sessions": N`.
|
|
162
|
+
|
|
163
|
+
## Gotchas
|
|
164
|
+
|
|
165
|
+
1. **`sqlite3` CLI is absent** — use `python3 -c` (the justfile already does).
|
|
166
|
+
2. **Local models are served by the llama.cpp router `:8080`**, addressed as
|
|
167
|
+
`llama-cpp/<id>`; LM Studio `:1234` may be down. Confirm with `pi --list-models`.
|
|
168
|
+
3. **The visualizer's local `node_modules` may be a partial bun install** — the API
|
|
169
|
+
still serves the prebuilt `dist/`, so open `:8437`, not `:8438`.
|
|
170
|
+
4. **Never edit `smidja/smidja_data/sessions/`** — it is the run record.
|
|
171
|
+
5. **Protected files** (`smidja/smidja_modules/`, `smidja/smidja_*.py`, the config)
|
|
172
|
+
are enforced by `smidja_modules/permissions.py`; agents roll back unauthorized
|
|
173
|
+
changes.
|
|
174
|
+
6. New skills synthesized for the smithy are validated in Utgard (Gungnir, W0007)
|
|
175
|
+
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"
|