@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.
- 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/README.md +74 -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 +360 -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.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +11 -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/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/runes_audit.md +5 -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 +121 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/migrations/0005-roots-out-of-tree.sh +158 -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 +159 -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 +736 -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 +539 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -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 +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -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 +101 -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 +180 -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 +503 -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 +90 -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 +57 -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 +35 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/install.md +69 -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 +498 -0
- package/CHANGELOG.md +1913 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +114 -60
- 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 +97 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +108 -0
- package/RULES/07-config.md +101 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/09-electron.md +58 -0
- package/RULES/README.md +22 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +133 -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 +256 -0
- package/bin/apodex-smoke-test.sh +105 -0
- package/bin/bifrost-bridge.sh +131 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +112 -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 +51 -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-assemble.sh +154 -0
- package/bin/changelog-guard.sh +197 -0
- package/bin/crash-sense.sh +173 -0
- package/bin/design-check.sh +80 -0
- package/bin/design-icon.sh +153 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +225 -0
- package/bin/eindri-acclaim.sh +47 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seat.sh +83 -0
- package/bin/eindri-seen.sh +54 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +98 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +158 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/feature-inventory.sh +73 -0
- package/bin/fleet-apply.sh +81 -0
- package/bin/github-deploy.sh +94 -0
- package/bin/gjallarhorn-expose.sh +136 -0
- package/bin/gjallarhorn-notify.sh +71 -0
- package/bin/gjallarhorn-purge.sh +67 -0
- package/bin/gjallarhorn-tunnel.sh +85 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +130 -0
- package/bin/hall-snapshot.sh +111 -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 +452 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hlidskjalf-agents.sh +172 -0
- package/bin/hlidskjalf-usage.sh +196 -0
- package/bin/hoard-guard.sh +135 -0
- package/bin/hoard-lib.sh +105 -0
- package/bin/hodd.sh +102 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +121 -0
- package/bin/local-model-lock.sh +70 -0
- package/bin/mimir-bridge.py +259 -0
- package/bin/mimir-bridge.sh +100 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir-reflect.sh +27 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +72 -0
- package/bin/mjollnir.sh +104 -0
- package/bin/model-hardware.sh +96 -0
- package/bin/model-resolve.sh +160 -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-hall-snapshot.sh +28 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-nsr-compliance.sh +54 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/npm-publish.sh +136 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +161 -0
- package/bin/omarchy-plugins.sh +187 -0
- package/bin/omarchy-sense.sh +162 -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-model-agnostic.sh +71 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +58 -0
- package/bin/project-git.sh +69 -0
- package/bin/public-guard.sh +71 -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 +104 -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 +94 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +89 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-spawn-pretool-check.sh +58 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +203 -0
- package/bin/telegram-bot.sh +82 -0
- package/bin/toolchain.sh +74 -0
- package/bin/ui-truth-check.sh +75 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +298 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +60 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +163 -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 +806 -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-plan.sh +356 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +110 -0
- package/bin/ymir-setup-auth.sh +119 -0
- package/bin/ymir-validate.sh +193 -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 +1060 -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 +54 -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 +269 -0
- package/scripts/lower.sh +34 -0
- package/scripts/raise.sh +42 -0
- package/scripts/start.sh +217 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Opt-in development evaluation for the harness-adapters routing instructions.
|
|
3
|
+
# It sends the directly loaded router and a complete scenario set
|
|
4
|
+
# to a local Ollama model, then compares the generated routing plan as normalized
|
|
5
|
+
# JSON.
|
|
6
|
+
# It makes no external-provider or remote CI call and does not claim that an absent or
|
|
7
|
+
# unconfigured native harness loaded the references itself.
|
|
8
|
+
set -u
|
|
9
|
+
|
|
10
|
+
if [ "${FM_HARNESS_ADAPTER_INSTRUCTION_EVAL:-0}" != 1 ]; then
|
|
11
|
+
echo "skip: set FM_HARNESS_ADAPTER_INSTRUCTION_EVAL=1 and FM_HARNESS_ADAPTER_LOCAL_MODEL=<model> to run the local instruction evaluation"
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
# shellcheck source=tests/lib.sh
|
|
16
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
17
|
+
|
|
18
|
+
ROUTER="$ROOT/.agents/skills/harness-adapters/SKILL.md"
|
|
19
|
+
TMP_ROOT=$(fm_test_tmproot fm-harness-adapter-instructions)
|
|
20
|
+
EXPECTED_JSON="$TMP_ROOT/expected.json"
|
|
21
|
+
PROMPT_FILE="$TMP_ROOT/prompt.txt"
|
|
22
|
+
RESPONSE_JSON="$TMP_ROOT/response.json"
|
|
23
|
+
|
|
24
|
+
command -v curl >/dev/null 2>&1 || fail "curl is required for the local instruction evaluation"
|
|
25
|
+
command -v jq >/dev/null 2>&1 || fail "jq is required for the local instruction evaluation"
|
|
26
|
+
curl -fsS --max-time 2 http://127.0.0.1:11434/api/tags > "$TMP_ROOT/tags.json" \
|
|
27
|
+
|| fail "local Ollama is unavailable at 127.0.0.1:11434; no remote provider fallback is allowed"
|
|
28
|
+
|
|
29
|
+
MODEL=${FM_HARNESS_ADAPTER_LOCAL_MODEL:-}
|
|
30
|
+
[ -n "$MODEL" ] || fail "FM_HARNESS_ADAPTER_LOCAL_MODEL must name an explicit local evaluator"
|
|
31
|
+
jq -e --arg model "$MODEL" '.models | any(.name == $model)' "$TMP_ROOT/tags.json" >/dev/null \
|
|
32
|
+
|| fail "requested local Ollama model is unavailable: $MODEL"
|
|
33
|
+
|
|
34
|
+
cat > "$EXPECTED_JSON" <<'JSON'
|
|
35
|
+
{
|
|
36
|
+
"cases": [
|
|
37
|
+
{"id":"start.default","common":["references/common/dispatch.md","references/common/model-and-effort.md"],"harness":"references/harness/claude.md"},
|
|
38
|
+
{"id":"start.trust-dialog","common":["references/common/control-and-recovery.md"],"harness":"references/harness/codex.md"},
|
|
39
|
+
{"id":"trust.default","common":["references/common/control-and-recovery.md"],"harness":"references/harness/opencode.md"},
|
|
40
|
+
{"id":"skill.default","common":["references/common/control-and-recovery.md"],"harness":"references/harness/pi.md"},
|
|
41
|
+
{"id":"interrupt.default","common":["references/common/control-and-recovery.md"],"harness":"references/harness/pi.md"},
|
|
42
|
+
{"id":"exit.default","common":["references/common/control-and-recovery.md"],"harness":"references/harness/grok.md"},
|
|
43
|
+
{"id":"resume.default","common":["references/common/control-and-recovery.md"],"harness":"references/harness/kimi.md"},
|
|
44
|
+
{"id":"recovery.default","common":["references/common/control-and-recovery.md"],"harness":"references/harness/cursor.md"},
|
|
45
|
+
{"id":"recovery.replacement-profile","common":["references/common/control-and-recovery.md","references/common/dispatch.md","references/common/model-and-effort.md"],"harness":"references/harness/muse.md"},
|
|
46
|
+
{"id":"recovery.secondmate","common":["references/common/control-and-recovery.md","references/common/primary-hooks.md"],"harness":"references/harness/claude.md"},
|
|
47
|
+
{"id":"recovery.replacement-secondmate","common":["references/common/control-and-recovery.md","references/common/dispatch.md","references/common/model-and-effort.md","references/common/primary-hooks.md"],"harness":"references/harness/codex.md"},
|
|
48
|
+
{"id":"primary.default","common":["references/common/primary-hooks.md"],"harness":"references/harness/opencode.md"},
|
|
49
|
+
{"id":"model-effort.default","common":["references/common/model-and-effort.md"],"harness":"references/harness/pi.md"},
|
|
50
|
+
{"id":"model-effort.configured-profile","common":["references/common/model-and-effort.md","references/common/dispatch.md"],"harness":"references/harness/pi.md"},
|
|
51
|
+
{"id":"verify.default","common":["references/common/dispatch.md","references/common/control-and-recovery.md","references/common/primary-hooks.md","references/common/model-and-effort.md"],"harness":"references/harness/grok.md"}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
JSON
|
|
55
|
+
|
|
56
|
+
{
|
|
57
|
+
printf '%s\n' 'Act only as an evaluator of the directly loaded harness-adapters router below.'
|
|
58
|
+
printf '%s\n' 'For each requested operation.scenario, copy the common reference list in router order and append the requested harness reference in the harness field.'
|
|
59
|
+
printf '%s\n' 'Copy harness paths literally from the router map; never construct a filename from an identity, including when two identities share one path.'
|
|
60
|
+
printf '%s\n' 'The requests, in output order, are:'
|
|
61
|
+
printf '%s\n' \
|
|
62
|
+
'start.default claude' \
|
|
63
|
+
'start.trust-dialog codex' \
|
|
64
|
+
'trust.default opencode' \
|
|
65
|
+
'skill.default pi' \
|
|
66
|
+
'interrupt.default pi-signed' \
|
|
67
|
+
'exit.default grok' \
|
|
68
|
+
'resume.default kimi' \
|
|
69
|
+
'recovery.default cursor' \
|
|
70
|
+
'recovery.replacement-profile muse' \
|
|
71
|
+
'recovery.secondmate claude' \
|
|
72
|
+
'recovery.replacement-secondmate codex' \
|
|
73
|
+
'primary.default opencode' \
|
|
74
|
+
'model-effort.default pi' \
|
|
75
|
+
'model-effort.configured-profile pi-signed' \
|
|
76
|
+
'verify.default grok'
|
|
77
|
+
printf '%s\n' 'Return only one JSON object with a cases array; each item must have id, common, and harness fields.'
|
|
78
|
+
printf '%s\n' 'ROUTER START'
|
|
79
|
+
cat "$ROUTER"
|
|
80
|
+
printf '%s\n' 'ROUTER END'
|
|
81
|
+
} > "$PROMPT_FILE"
|
|
82
|
+
|
|
83
|
+
PAYLOAD=$(jq -n \
|
|
84
|
+
--arg model "$MODEL" \
|
|
85
|
+
--rawfile prompt "$PROMPT_FILE" \
|
|
86
|
+
'{model:$model,prompt:$prompt,stream:false,format:"json",options:{temperature:0,num_predict:4096}}')
|
|
87
|
+
curl -fsS --max-time "${FM_HARNESS_ADAPTER_EVAL_TIMEOUT_SECONDS:-120}" \
|
|
88
|
+
-H 'Content-Type: application/json' \
|
|
89
|
+
-d "$PAYLOAD" http://127.0.0.1:11434/api/generate \
|
|
90
|
+
| jq -er '.response | fromjson' > "$RESPONSE_JSON" \
|
|
91
|
+
|| fail "local model $MODEL did not return parseable routing JSON"
|
|
92
|
+
jq '(.cases[]?.id) |= split(" ")[0]' "$RESPONSE_JSON" > "$TMP_ROOT/normalized-response.json" \
|
|
93
|
+
|| fail "local model $MODEL returned an invalid routing case shape"
|
|
94
|
+
|
|
95
|
+
if ! diff -u \
|
|
96
|
+
<(jq -S . "$EXPECTED_JSON") \
|
|
97
|
+
<(jq -S . "$TMP_ROOT/normalized-response.json") > "$TMP_ROOT/diff"; then
|
|
98
|
+
fail "local model $MODEL did not follow the routing instructions: $(tr '\n' ' ' < "$TMP_ROOT/diff")"
|
|
99
|
+
fi
|
|
100
|
+
pass "local model $MODEL selected every operation scenario and all nine harness identities"
|
|
101
|
+
|
|
102
|
+
CHECKED=0
|
|
103
|
+
MISSING=
|
|
104
|
+
. "$ROOT/bin/fm-cursor-lib.sh"
|
|
105
|
+
resolve_native_binary() {
|
|
106
|
+
local harness=$1 candidate
|
|
107
|
+
if [ "$harness" = cursor ]; then
|
|
108
|
+
fm_cursor_resolve_binary 2>/dev/null
|
|
109
|
+
return
|
|
110
|
+
fi
|
|
111
|
+
candidate=$(command -v "$harness" 2>/dev/null || true)
|
|
112
|
+
if [ -n "$candidate" ] && [ -x "$candidate" ]; then
|
|
113
|
+
printf '%s\n' "$candidate"
|
|
114
|
+
return 0
|
|
115
|
+
fi
|
|
116
|
+
if [ "$harness" = kimi ] && [ -n "${HOME:-}" ] && [ -x "$HOME/.kimi-code/bin/kimi" ]; then
|
|
117
|
+
printf '%s\n' "$HOME/.kimi-code/bin/kimi"
|
|
118
|
+
return 0
|
|
119
|
+
fi
|
|
120
|
+
return 1
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
for harness in claude codex opencode pi pi-signed grok kimi cursor muse; do
|
|
124
|
+
if binary=$(resolve_native_binary "$harness"); then
|
|
125
|
+
version=$("$binary" --version 2>/dev/null | head -1 | tr -d '\r') || version=unknown
|
|
126
|
+
printf '# native loader not claimed: %s %s is installed, but this harness-neutral evaluation does not exercise its provider transport\n' "$harness" "$version"
|
|
127
|
+
CHECKED=$((CHECKED + 1))
|
|
128
|
+
else
|
|
129
|
+
MISSING="$MISSING $harness"
|
|
130
|
+
printf '# unverified native loader: %s is not installed on this machine\n' "$harness"
|
|
131
|
+
fi
|
|
132
|
+
done
|
|
133
|
+
printf '# installed native tools recorded without overstating loader coverage: %s\n' "$CHECKED"
|
|
134
|
+
[ -z "$MISSING" ] || printf '# unavailable native tools:%s\n' "$MISSING"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Portable structural validation for the harness-adapters routing artifact.
|
|
3
|
+
set -u
|
|
4
|
+
|
|
5
|
+
# shellcheck source=tests/lib.sh
|
|
6
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
7
|
+
|
|
8
|
+
ROUTER="$ROOT/.agents/skills/harness-adapters/SKILL.md"
|
|
9
|
+
TMP_ROOT=$(fm_test_tmproot fm-harness-adapter-references)
|
|
10
|
+
ROUTING_JSON="$TMP_ROOT/routing.json"
|
|
11
|
+
|
|
12
|
+
awk '
|
|
13
|
+
/^```json harness-adapter-routing-v1$/ { capture = 1; next }
|
|
14
|
+
capture && /^```$/ { exit }
|
|
15
|
+
capture { print }
|
|
16
|
+
' "$ROUTER" > "$ROUTING_JSON"
|
|
17
|
+
|
|
18
|
+
jq -e '
|
|
19
|
+
(.operations | type == "object") and
|
|
20
|
+
(.harnesses | type == "object") and
|
|
21
|
+
([.operations[][] | select(type != "array")] | length == 0) and
|
|
22
|
+
([.operations[][][] | select(type != "string")] | length == 0) and
|
|
23
|
+
([.harnesses[] | select(type != "string")] | length == 0)
|
|
24
|
+
' "$ROUTING_JSON" >/dev/null || fail "harness adapter routing artifact is not a normalized operation and harness map"
|
|
25
|
+
|
|
26
|
+
jq -r '.operations[][][], .harnesses[]' "$ROUTING_JSON" | sort -u | while IFS= read -r path; do
|
|
27
|
+
[ -r "$ROOT/.agents/skills/harness-adapters/$path" ] \
|
|
28
|
+
|| fail "harness adapter routing target is unreadable: $path"
|
|
29
|
+
done
|
|
30
|
+
pass "harness adapter routing artifact is normalized and every target is readable"
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tests/fm-harness-liveness-drift-live-e2e.test.sh - opt-in drift guard proving
|
|
3
|
+
# every INSTALLED harness is still classified `alive` by the tmux liveness
|
|
4
|
+
# probe (bin/backends/tmux.sh).
|
|
5
|
+
#
|
|
6
|
+
# Why this file exists: liveness classification depends on how a harness names
|
|
7
|
+
# its own process, which is a surface the harness vendor controls and changes
|
|
8
|
+
# without notice. Claude Code began reporting its version string as its process
|
|
9
|
+
# name and became unattributable, which silently degraded supervision. A
|
|
10
|
+
# regression that only a real harness release can cause needs a check that runs
|
|
11
|
+
# real harnesses; a stubbed agent cannot see it, and neither can a table of
|
|
12
|
+
# names transcribed from a previous release.
|
|
13
|
+
#
|
|
14
|
+
# Each harness is launched bare, with no prompt, so this consumes no model
|
|
15
|
+
# tokens. The launch uses whatever credentials the harness already has; an
|
|
16
|
+
# unauthenticated harness still starts its process, which is all the liveness
|
|
17
|
+
# probe reads.
|
|
18
|
+
#
|
|
19
|
+
# Standard CI has no harness binaries or credentials, so this real-harness guard
|
|
20
|
+
# is opt-in and on-demand. The portable counterpart in
|
|
21
|
+
# tests/fm-tmux-agent-liveness.test.sh pins the classifier logic in CI. Run this
|
|
22
|
+
# guard after any harness upgrade and before trusting refreshed evidence.
|
|
23
|
+
set -u
|
|
24
|
+
|
|
25
|
+
if [ "${FM_HARNESS_LIVENESS_DRIFT:-0}" != 1 ]; then
|
|
26
|
+
echo "skip: set FM_HARNESS_LIVENESS_DRIFT=1 to run the installed-harness liveness drift guard"
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
31
|
+
|
|
32
|
+
fail() { printf 'not ok - %s\n' "$1" >&2; cleanup_all; exit 1; }
|
|
33
|
+
pass() { printf 'ok - %s\n' "$1"; }
|
|
34
|
+
note() { printf '# %s\n' "$1"; }
|
|
35
|
+
|
|
36
|
+
command -v tmux >/dev/null 2>&1 || fail "tmux not found"
|
|
37
|
+
REAL_TMUX=$(command -v tmux)
|
|
38
|
+
SOCKET="fm-liveness-drift-$$"
|
|
39
|
+
LAB=$(mktemp -d "${TMPDIR:-/tmp}/fm-liveness-drift.XXXXXX")
|
|
40
|
+
SESSION=drift
|
|
41
|
+
|
|
42
|
+
cleanup_all() {
|
|
43
|
+
"$REAL_TMUX" -L "$SOCKET" kill-server >/dev/null 2>&1 || true
|
|
44
|
+
[ -n "${LAB:-}" ] && rm -rf "$LAB"
|
|
45
|
+
}
|
|
46
|
+
trap cleanup_all EXIT
|
|
47
|
+
|
|
48
|
+
mkdir -p "$LAB/shim" "$LAB/wt"
|
|
49
|
+
cat > "$LAB/shim/tmux" <<SH
|
|
50
|
+
#!/usr/bin/env bash
|
|
51
|
+
exec "$REAL_TMUX" -L "$SOCKET" "\$@"
|
|
52
|
+
SH
|
|
53
|
+
chmod +x "$LAB/shim/tmux"
|
|
54
|
+
PATH="$LAB/shim:$PATH"
|
|
55
|
+
export PATH
|
|
56
|
+
|
|
57
|
+
# shellcheck source=/dev/null
|
|
58
|
+
. "$ROOT/bin/fm-backend.sh"
|
|
59
|
+
# shellcheck source=/dev/null
|
|
60
|
+
. "$ROOT/bin/fm-cursor-lib.sh"
|
|
61
|
+
fm_backend_source tmux || fail "fm_backend_source tmux failed"
|
|
62
|
+
|
|
63
|
+
"$REAL_TMUX" -L "$SOCKET" new-session -d -s "$SESSION" -n control -c "$LAB/wt" \
|
|
64
|
+
|| fail "could not start the private tmux server"
|
|
65
|
+
|
|
66
|
+
# Kimi is not required to be on PATH; mirror bin/fm-spawn.sh's own resolution
|
|
67
|
+
# order so this guard covers the same binary firstmate would actually launch.
|
|
68
|
+
resolve_harness_binary() { # <harness>
|
|
69
|
+
local harness=$1 candidate
|
|
70
|
+
candidate=$(command -v "$harness" 2>/dev/null || true)
|
|
71
|
+
if [ -n "$candidate" ] && [ -x "$candidate" ]; then
|
|
72
|
+
printf '%s\n' "$candidate"
|
|
73
|
+
return 0
|
|
74
|
+
fi
|
|
75
|
+
if [ "$harness" = kimi ] && [ -n "${HOME:-}" ] && [ -x "$HOME/.kimi-code/bin/kimi" ]; then
|
|
76
|
+
printf '%s\n' "$HOME/.kimi-code/bin/kimi"
|
|
77
|
+
return 0
|
|
78
|
+
fi
|
|
79
|
+
# cursor is never on PATH under the name `cursor`: it installs as
|
|
80
|
+
# `cursor-agent` plus the legacy alias `agent`, and its user-local install is
|
|
81
|
+
# routinely absent from a non-interactive PATH. Resolve it through the same
|
|
82
|
+
# verified owner fm-spawn uses, so an unrelated executable named `agent` is
|
|
83
|
+
# rejected here exactly as it would be at launch.
|
|
84
|
+
if [ "$harness" = cursor ]; then
|
|
85
|
+
fm_cursor_resolve_binary 2>/dev/null && return 0
|
|
86
|
+
return 1
|
|
87
|
+
fi
|
|
88
|
+
return 1
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
CHECKED=0
|
|
92
|
+
SKIPPED=
|
|
93
|
+
|
|
94
|
+
# The verified adapters, in the order the harness-adapters skill router records
|
|
95
|
+
# them. An adapter that gains a verified launch path belongs here too.
|
|
96
|
+
# muse matters most of all here: its launcher execs a VERSION-SUFFIXED binary,
|
|
97
|
+
# so the live process name changes on every auto-update and its install path
|
|
98
|
+
# carries no `muse` component to fall back on. That is precisely the drift this
|
|
99
|
+
# guard exists to catch, and only a real muse release can produce it.
|
|
100
|
+
# cursor matters for the same reason muse does, from the other direction: it
|
|
101
|
+
# runs as a bundled node script, so its pane title is a bare `node` that no name
|
|
102
|
+
# pattern can own, and identity has to come from its install path or argv[0].
|
|
103
|
+
for harness in claude codex opencode pi pi-signed grok kimi cursor muse; do
|
|
104
|
+
if ! bin_path=$(resolve_harness_binary "$harness"); then
|
|
105
|
+
SKIPPED="$SKIPPED $harness"
|
|
106
|
+
note "skip: $harness is not installed on this machine, so its classification is unverified here"
|
|
107
|
+
continue
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
version=$("$bin_path" --version 2>/dev/null | head -1 | tr -d '\r') || version=
|
|
111
|
+
[ -n "$version" ] || version="unknown"
|
|
112
|
+
|
|
113
|
+
target="$SESSION:$harness"
|
|
114
|
+
# cursor blocks on a workspace-trust prompt in a directory it has never seen,
|
|
115
|
+
# which would hang this probe rather than classify anything; --trust is the
|
|
116
|
+
# same flag fm-spawn passes for the same reason.
|
|
117
|
+
launch_args=""
|
|
118
|
+
[ "$harness" = cursor ] && launch_args="--trust"
|
|
119
|
+
# shellcheck disable=SC2086 # deliberate: an empty value must add no argument
|
|
120
|
+
"$REAL_TMUX" -L "$SOCKET" new-window -d -t "$SESSION:" -n "$harness" -c "$LAB/wt" -- "$bin_path" $launch_args \
|
|
121
|
+
|| fail "$harness ($version): could not launch a window for the liveness probe"
|
|
122
|
+
|
|
123
|
+
state=
|
|
124
|
+
for _ in $(seq 1 300); do
|
|
125
|
+
state=$(fm_backend_agent_state tmux "$target")
|
|
126
|
+
[ "$state" = alive ] && break
|
|
127
|
+
sleep 0.2
|
|
128
|
+
done
|
|
129
|
+
|
|
130
|
+
title=$(fm_backend_tmux_current_command "$target")
|
|
131
|
+
comms=$(fm_backend_tmux_foreground_comms "$target" | tr '\n' ' ')
|
|
132
|
+
|
|
133
|
+
[ "$state" = alive ] || fail \
|
|
134
|
+
"LIVENESS DRIFT: $harness $version is running but classifies '$state', not 'alive'. Supervision and lifecycle control treat this endpoint as unattributable. Observed process title '$title'; observed foreground process names [$comms]. Teach bin/backends/tmux.sh's fm_backend_tmux_classify_process_name the identity this release actually reports."
|
|
135
|
+
|
|
136
|
+
note "$harness $version: title='$title' foreground=[$comms]"
|
|
137
|
+
|
|
138
|
+
pass "harness liveness: $harness $version classifies alive"
|
|
139
|
+
CHECKED=$((CHECKED + 1))
|
|
140
|
+
done
|
|
141
|
+
|
|
142
|
+
[ "$CHECKED" -gt 0 ] || fail \
|
|
143
|
+
"no verified harness is installed here, so this run proved nothing; install at least one harness before trusting a pass"
|
|
144
|
+
|
|
145
|
+
if [ -n "$SKIPPED" ]; then
|
|
146
|
+
note "unverified on this machine (not installed):$SKIPPED"
|
|
147
|
+
fi
|
|
148
|
+
note "checked $CHECKED installed harness(es)"
|
|
149
|
+
|
|
150
|
+
cleanup_all
|
|
151
|
+
trap - EXIT
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Behavior tests for bin/fm-herdr-lab.sh using a stateful fake Herdr client.
|
|
3
|
+
set -u
|
|
4
|
+
|
|
5
|
+
# shellcheck source=tests/lib.sh
|
|
6
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
7
|
+
|
|
8
|
+
TMP_ROOT=$(fm_test_tmproot fm-herdr-lab)
|
|
9
|
+
FAKEBIN=$(fm_fakebin "$TMP_ROOT")
|
|
10
|
+
FAKE_STATE="$TMP_ROOT/herdr-state"
|
|
11
|
+
FAKE_LOG="$TMP_ROOT/herdr.log"
|
|
12
|
+
TRIPWIRES="$TMP_ROOT/tripwires"
|
|
13
|
+
REAL_SLEEP=$(command -v sleep)
|
|
14
|
+
mkdir -p "$FAKE_STATE"
|
|
15
|
+
printf '%s\n' '/home/test/.config/herdr/herdr.sock' > "$FAKE_STATE/default-socket"
|
|
16
|
+
: > "$FAKE_LOG"
|
|
17
|
+
|
|
18
|
+
cat > "$FAKEBIN/herdr" <<'SH'
|
|
19
|
+
#!/usr/bin/env bash
|
|
20
|
+
set -eu
|
|
21
|
+
printf '%s\n' "$*" >> "$FM_FAKE_HERDR_LOG"
|
|
22
|
+
state=$FM_FAKE_HERDR_STATE
|
|
23
|
+
last=
|
|
24
|
+
for arg in "$@"; do
|
|
25
|
+
previous=$last
|
|
26
|
+
last=$arg
|
|
27
|
+
done
|
|
28
|
+
[ "${previous:-}" = --session ] || { echo "fake herdr: missing trailing --session" >&2; exit 90; }
|
|
29
|
+
session=$last
|
|
30
|
+
default_socket=$(cat "$state/default-socket")
|
|
31
|
+
lab_state=absent
|
|
32
|
+
[ ! -f "$state/$session" ] || lab_state=$(cat "$state/$session")
|
|
33
|
+
|
|
34
|
+
case "$1 ${2:-}" in
|
|
35
|
+
"session list")
|
|
36
|
+
if [ "$lab_state" = absent ] || [ "$lab_state" = deleted ]; then
|
|
37
|
+
jq -nc --arg socket "$default_socket" '{sessions:[{default:true,name:"default",running:true,socket_path:$socket}]}'
|
|
38
|
+
else
|
|
39
|
+
running=false
|
|
40
|
+
[ "$lab_state" = running ] && running=true
|
|
41
|
+
jq -nc --arg socket "$default_socket" --arg name "$session" --argjson running "$running" \
|
|
42
|
+
'{sessions:[{default:true,name:"default",running:true,socket_path:$socket},{default:false,name:$name,running:$running,socket_path:("/tmp/" + $name + ".sock")}]}'
|
|
43
|
+
fi
|
|
44
|
+
;;
|
|
45
|
+
"server --session")
|
|
46
|
+
if [ "${FM_FAKE_HERDR_SERVER_DELAY:-0}" != 0 ]; then
|
|
47
|
+
"$FM_FAKE_HERDR_REAL_SLEEP" "$FM_FAKE_HERDR_SERVER_DELAY"
|
|
48
|
+
fi
|
|
49
|
+
printf '%s\n' running > "$state/$session"
|
|
50
|
+
;;
|
|
51
|
+
"status --json")
|
|
52
|
+
if [ "$lab_state" = running ]; then
|
|
53
|
+
printf '%s\n' '{"server":{"running":true}}'
|
|
54
|
+
else
|
|
55
|
+
printf '%s\n' '{"server":{"running":false}}'
|
|
56
|
+
fi
|
|
57
|
+
;;
|
|
58
|
+
"session stop")
|
|
59
|
+
[ "$3" = "$session" ] || exit 91
|
|
60
|
+
printf '%s\n' stopped > "$state/$session"
|
|
61
|
+
;;
|
|
62
|
+
"session delete")
|
|
63
|
+
[ "$3" = "$session" ] || exit 92
|
|
64
|
+
[ "${FM_FAKE_HERDR_DELETE_FAIL:-}" != 1 ] || exit 93
|
|
65
|
+
printf '%s\n' deleted > "$state/$session"
|
|
66
|
+
;;
|
|
67
|
+
*)
|
|
68
|
+
printf '%s\n' '{"ok":true}'
|
|
69
|
+
;;
|
|
70
|
+
esac
|
|
71
|
+
SH
|
|
72
|
+
chmod +x "$FAKEBIN/herdr"
|
|
73
|
+
|
|
74
|
+
# shellcheck source=/dev/null
|
|
75
|
+
. "$ROOT/bin/fm-herdr-lab.sh"
|
|
76
|
+
|
|
77
|
+
run_with_fake() {
|
|
78
|
+
PATH="$FAKEBIN:$PATH" \
|
|
79
|
+
FM_FAKE_HERDR_STATE="$FAKE_STATE" \
|
|
80
|
+
FM_FAKE_HERDR_LOG="$FAKE_LOG" \
|
|
81
|
+
FM_FAKE_HERDR_REAL_SLEEP="$REAL_SLEEP" \
|
|
82
|
+
FM_FAKE_HERDR_SERVER_DELAY="${FM_FAKE_HERDR_SERVER_DELAY:-0}" \
|
|
83
|
+
FM_FAKE_HERDR_FAST_POLL="${FM_FAKE_HERDR_FAST_POLL:-}" \
|
|
84
|
+
FM_FAKE_HERDR_DELETE_FAIL="${FM_FAKE_HERDR_DELETE_FAIL:-}" \
|
|
85
|
+
FM_HERDR_LAB_STATE_DIR="$TRIPWIRES" \
|
|
86
|
+
"$@"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
test_refuses_unsafe_names() {
|
|
90
|
+
local status=0 generated
|
|
91
|
+
fm_herdr_lab_validate_name default >/dev/null 2>&1 || status=$?
|
|
92
|
+
expect_code 1 "$status" "literal default must be refused"
|
|
93
|
+
status=0
|
|
94
|
+
fm_herdr_lab_validate_name arbitrary-session >/dev/null 2>&1 || status=$?
|
|
95
|
+
expect_code 1 "$status" "non-lab prefix must be refused"
|
|
96
|
+
fm_herdr_lab_validate_name fm-lab-safe-123 || fail "valid lab session name was refused"
|
|
97
|
+
generated=$(fm_herdr_lab_name fm-autodetect-smoke-concurrency-h3)
|
|
98
|
+
fm_herdr_lab_validate_name "$generated" || fail "generated lab session name was refused"
|
|
99
|
+
[ "${#generated}" -le 40 ] || fail "generated lab session name is too long for Herdr socket paths: $generated"
|
|
100
|
+
pass "fm-herdr-lab: names fail closed and require the lab prefix"
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
test_provision_run_and_guarded_teardown() {
|
|
104
|
+
local name='' line_count status=0 stop_line delete_line
|
|
105
|
+
name="fm-lab-behavior-$$"
|
|
106
|
+
: > "$FAKE_LOG"
|
|
107
|
+
run_with_fake fm_herdr_lab_provision "$name" || fail "provision failed"
|
|
108
|
+
[ "$(cat "$FAKE_STATE/$name")" = running ] || fail "provision did not start the named lab session"
|
|
109
|
+
assert_present "$TRIPWIRES/$name.fleet-state.json" "provision did not record the fleet-state tripwire"
|
|
110
|
+
|
|
111
|
+
run_with_fake fm_herdr_lab_cli "$name" workspace list >/dev/null || fail "safe run command failed"
|
|
112
|
+
run_with_fake fm_herdr_lab_cli "$name" server >/dev/null 2>&1 || status=$?
|
|
113
|
+
expect_code 1 "$status" "bare server start outside provision must be refused"
|
|
114
|
+
status=0
|
|
115
|
+
run_with_fake fm_herdr_lab_cli "$name" server stop >/dev/null 2>&1 || status=$?
|
|
116
|
+
expect_code 1 "$status" "server-global stop must be refused"
|
|
117
|
+
status=0
|
|
118
|
+
run_with_fake fm_herdr_lab_cli "$name" session delete "$name" >/dev/null 2>&1 || status=$?
|
|
119
|
+
expect_code 1 "$status" "direct session delete must be refused"
|
|
120
|
+
status=0
|
|
121
|
+
run_with_fake fm_herdr_lab_cli "$name" status --session default >/dev/null 2>&1 || status=$?
|
|
122
|
+
expect_code 1 "$status" "caller-supplied session flag must be refused"
|
|
123
|
+
status=0
|
|
124
|
+
run_with_fake fm_herdr_lab_cli "$name" status --session=default >/dev/null 2>&1 || status=$?
|
|
125
|
+
expect_code 1 "$status" "caller-supplied equals-form session flag must be refused"
|
|
126
|
+
status=0
|
|
127
|
+
run_with_fake fm_herdr_lab_cli "$name" --handoff server stop >/dev/null 2>&1 || status=$?
|
|
128
|
+
expect_code 1 "$status" "a leading option shifting server stop past the guard must be refused"
|
|
129
|
+
status=0
|
|
130
|
+
run_with_fake fm_herdr_lab_cli "$name" --no-session session delete "$name" >/dev/null 2>&1 || status=$?
|
|
131
|
+
expect_code 1 "$status" "a leading option shifting session delete past the guard must be refused"
|
|
132
|
+
status=0
|
|
133
|
+
run_with_fake fm_herdr_lab_cli "$name" --remote host workspace list >/dev/null 2>&1 || status=$?
|
|
134
|
+
expect_code 1 "$status" "a leading option subverting session isolation must be refused"
|
|
135
|
+
|
|
136
|
+
run_with_fake fm_herdr_lab_teardown "$name" || fail "guarded teardown failed"
|
|
137
|
+
[ "$(cat "$FAKE_STATE/$name")" = deleted ] || fail "teardown did not delete the lab session"
|
|
138
|
+
assert_absent "$TRIPWIRES/$name.fleet-state.json" "successful teardown left its tripwire behind"
|
|
139
|
+
|
|
140
|
+
while IFS= read -r line; do
|
|
141
|
+
case "$line" in
|
|
142
|
+
*"--session $name") : ;;
|
|
143
|
+
*) fail "Herdr call lacks a trailing lab session: $line" ;;
|
|
144
|
+
esac
|
|
145
|
+
done < "$FAKE_LOG"
|
|
146
|
+
line_count=$(wc -l < "$FAKE_LOG" | tr -d ' ')
|
|
147
|
+
stop_line=$(grep -n "^session stop $name --json --session $name$" "$FAKE_LOG" | cut -d: -f1)
|
|
148
|
+
delete_line=$(grep -n "^session delete $name --json --session $name$" "$FAKE_LOG" | cut -d: -f1)
|
|
149
|
+
if [ -z "$stop_line" ] || [ -z "$delete_line" ] || [ "$line_count" -le "$delete_line" ]; then
|
|
150
|
+
fail "teardown did not emit explicit stop/delete followed by the after tripwire"
|
|
151
|
+
fi
|
|
152
|
+
sed -n "$((stop_line - 1))p" "$FAKE_LOG" | grep -F "session list --json --session $name" >/dev/null \
|
|
153
|
+
|| fail "stop was not immediately preceded by a fresh refuse-default session list"
|
|
154
|
+
sed -n "$((delete_line - 1))p" "$FAKE_LOG" | grep -F "session list --json --session $name" >/dev/null \
|
|
155
|
+
|| fail "delete was not immediately preceded by a fresh refuse-default session list"
|
|
156
|
+
pass "fm-herdr-lab: provisioning, scoped calls, guarded teardown, and fleet tripwire are deterministic"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
test_missing_tripwire_blocks_destruction() {
|
|
160
|
+
local name="fm-lab-no-tripwire-$$" status=0 before after
|
|
161
|
+
printf '%s\n' running > "$FAKE_STATE/$name"
|
|
162
|
+
: > "$FAKE_LOG"
|
|
163
|
+
before=$(wc -l < "$FAKE_LOG")
|
|
164
|
+
run_with_fake fm_herdr_lab_teardown "$name" >/dev/null 2>&1 || status=$?
|
|
165
|
+
expect_code 1 "$status" "missing tripwire must refuse teardown"
|
|
166
|
+
after=$(wc -l < "$FAKE_LOG")
|
|
167
|
+
[ "$before" = "$after" ] || fail "missing tripwire reached Herdr instead of refusing before destructive calls"
|
|
168
|
+
pass "fm-herdr-lab: missing tripwire refuses teardown before any Herdr call"
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
test_changed_default_trips_after_teardown() {
|
|
172
|
+
local name="fm-lab-tripwire-change-$$" status=0
|
|
173
|
+
: > "$FAKE_LOG"
|
|
174
|
+
run_with_fake fm_herdr_lab_provision "$name" || fail "tripwire fixture provision failed"
|
|
175
|
+
printf '%s\n' '/changed/default.sock' > "$FAKE_STATE/default-socket"
|
|
176
|
+
run_with_fake fm_herdr_lab_teardown "$name" >/dev/null 2>&1 || status=$?
|
|
177
|
+
expect_code 1 "$status" "changed default fleet state must fail teardown"
|
|
178
|
+
assert_present "$TRIPWIRES/$name.fleet-state.json" "failed tripwire should retain evidence"
|
|
179
|
+
printf '%s\n' '/home/test/.config/herdr/herdr.sock' > "$FAKE_STATE/default-socket"
|
|
180
|
+
rm -f "$TRIPWIRES/$name.fleet-state.json"
|
|
181
|
+
pass "fm-herdr-lab: changed default fleet state is a hard failure"
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
test_stopped_owned_lab_can_reprovision() {
|
|
185
|
+
local name="fm-lab-reprovision-$$"
|
|
186
|
+
: > "$FAKE_LOG"
|
|
187
|
+
run_with_fake fm_herdr_lab_provision "$name" || fail "initial provision failed"
|
|
188
|
+
run_with_fake fm_herdr_lab_stop "$name" || fail "guarded stop failed"
|
|
189
|
+
[ "$(cat "$FAKE_STATE/$name")" = stopped ] || fail "guarded stop did not stop the lab session"
|
|
190
|
+
assert_present "$TRIPWIRES/$name.fleet-state.json" "stop removed the lab ownership tripwire"
|
|
191
|
+
run_with_fake fm_herdr_lab_provision "$name" || fail "re-provision after guarded stop failed"
|
|
192
|
+
[ "$(cat "$FAKE_STATE/$name")" = running ] || fail "re-provision did not restart the stopped lab session"
|
|
193
|
+
assert_present "$TRIPWIRES/$name.fleet-state.json" "re-provision removed the lab ownership tripwire"
|
|
194
|
+
run_with_fake fm_herdr_lab_teardown "$name" || fail "teardown after re-provision failed"
|
|
195
|
+
pass "fm-herdr-lab: an owned stopped lab can re-provision safely"
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
test_failed_delete_retains_tripwire() {
|
|
199
|
+
local name="fm-lab-delete-failure-$$" status=0
|
|
200
|
+
: > "$FAKE_LOG"
|
|
201
|
+
run_with_fake fm_herdr_lab_provision "$name" || fail "delete-failure fixture provision failed"
|
|
202
|
+
FM_FAKE_HERDR_DELETE_FAIL=1 run_with_fake fm_herdr_lab_teardown "$name" >/dev/null 2>&1 || status=$?
|
|
203
|
+
expect_code 1 "$status" "failed delete must fail teardown"
|
|
204
|
+
[ "$(cat "$FAKE_STATE/$name")" = stopped ] || fail "failed delete unexpectedly removed the lab session"
|
|
205
|
+
assert_present "$TRIPWIRES/$name.fleet-state.json" "failed delete removed the ownership tripwire"
|
|
206
|
+
run_with_fake fm_herdr_lab_teardown "$name" || fail "retry after failed delete did not clean up the lab session"
|
|
207
|
+
assert_absent "$TRIPWIRES/$name.fleet-state.json" "successful retry left the ownership tripwire behind"
|
|
208
|
+
pass "fm-herdr-lab: failed deletion retains ownership until absence is confirmed"
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
test_timed_out_provision_cancels_late_launch() {
|
|
212
|
+
local name="fm-lab-late-launch-$$" status=0
|
|
213
|
+
cat > "$FAKEBIN/sleep" <<'SH'
|
|
214
|
+
#!/usr/bin/env bash
|
|
215
|
+
if [ "${FM_FAKE_HERDR_FAST_POLL:-}" = 1 ]; then
|
|
216
|
+
exit 0
|
|
217
|
+
fi
|
|
218
|
+
exec "$FM_FAKE_HERDR_REAL_SLEEP" "$@"
|
|
219
|
+
SH
|
|
220
|
+
chmod +x "$FAKEBIN/sleep"
|
|
221
|
+
: > "$FAKE_LOG"
|
|
222
|
+
FM_FAKE_HERDR_FAST_POLL=1 FM_FAKE_HERDR_SERVER_DELAY=30 \
|
|
223
|
+
run_with_fake fm_herdr_lab_provision "$name" >/dev/null 2>&1 || status=$?
|
|
224
|
+
expect_code 1 "$status" "timed-out provision must fail"
|
|
225
|
+
assert_present "$TRIPWIRES/$name.fleet-state.json" \
|
|
226
|
+
"timed-out provision must retain its tripwire until teardown"
|
|
227
|
+
run_with_fake fm_herdr_lab_teardown "$name" || fail "teardown after timed-out provision failed"
|
|
228
|
+
assert_absent "$TRIPWIRES/$name.fleet-state.json" \
|
|
229
|
+
"teardown after timed-out provision did not remove its tripwire"
|
|
230
|
+
"$REAL_SLEEP" 1.1
|
|
231
|
+
if [ -f "$FAKE_STATE/$name" ] && [ "$(cat "$FAKE_STATE/$name")" = running ]; then
|
|
232
|
+
fail "timed-out provision left a late-starting lab session after teardown"
|
|
233
|
+
fi
|
|
234
|
+
pass "fm-herdr-lab: timed-out provisioning cancels the launch before teardown"
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
test_refuses_unsafe_names
|
|
238
|
+
test_provision_run_and_guarded_teardown
|
|
239
|
+
test_missing_tripwire_blocks_destruction
|
|
240
|
+
test_changed_default_trips_after_teardown
|
|
241
|
+
test_stopped_owned_lab_can_reprovision
|
|
242
|
+
test_failed_delete_retains_tripwire
|
|
243
|
+
test_timed_out_provision_cancels_late_launch
|