@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,559 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tests/fm-secondmate-liveness.test.sh - the session-start secondmate liveness
|
|
3
|
+
# guarantee owned by bin/fm-backend.sh's detailed fm_backend_agent_state and
|
|
4
|
+
# bin/fm-bootstrap.sh's secondmate_liveness_sweep that acts on it.
|
|
5
|
+
#
|
|
6
|
+
# The gap under test (AGENTS.md "Session start"; evidence 2026-07-07): a
|
|
7
|
+
# secondmate agent that has exited leaves its backend endpoint alive as a bare
|
|
8
|
+
# shell. fm_backend_target_exists only checks pane PRESENCE, so it reports
|
|
9
|
+
# that shell "alive"; recovery only respawns endpoints reported dead, and the
|
|
10
|
+
# watcher deliberately exempts secondmates from stale-pane detection (an idle
|
|
11
|
+
# secondmate pane is healthy by design). A dead-shell secondmate was therefore
|
|
12
|
+
# invisible to every existing check and sat dead indefinitely.
|
|
13
|
+
#
|
|
14
|
+
# The guarantees under test:
|
|
15
|
+
# - fm_backend_agent_state is the detailed owner that distinguishes alive,
|
|
16
|
+
# dead, missing, ambiguous, unreadable, and unverified.
|
|
17
|
+
# - The tmux classifier returns missing only after a readable session
|
|
18
|
+
# inventory omits the exact window, regardless of display-message fallback.
|
|
19
|
+
# - The Herdr classifier preserves the proven husk mapping while separating a
|
|
20
|
+
# missing pane from an existing agent-less pane.
|
|
21
|
+
# - fm_backend_agent_alive preserves the older three-state compatibility view.
|
|
22
|
+
# - bin/fm-bootstrap.sh's secondmate_liveness_sweep recovers only dead or
|
|
23
|
+
# missing endpoints, keeps successful recovery and already-live results
|
|
24
|
+
# silent by default, and reports ambiguous and unreadable targets distinctly.
|
|
25
|
+
# - The sweep converges: once a secondmate reads alive, a later run never
|
|
26
|
+
# re-touches it (idempotent by construction, not by remembering what it
|
|
27
|
+
# already did).
|
|
28
|
+
# - The sweep is skipped entirely under FM_BOOTSTRAP_DETECT_ONLY=1 (the
|
|
29
|
+
# read-only session path), matching the other mutating sweeps.
|
|
30
|
+
# - The sweep is naturally scoped to the primary: with no kind=secondmate
|
|
31
|
+
# meta present (a secondmate's own state/ never holds one, since
|
|
32
|
+
# secondmates never spawn secondmates), it is a silent no-op.
|
|
33
|
+
set -u
|
|
34
|
+
|
|
35
|
+
# shellcheck source=tests/lib.sh
|
|
36
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
37
|
+
|
|
38
|
+
BASE_PATH=${FM_TEST_BASE_PATH:-/usr/bin:/bin:/usr/sbin:/sbin}
|
|
39
|
+
fm_git_identity fmtest fmtest@example.com
|
|
40
|
+
|
|
41
|
+
TMP_ROOT=$(fm_test_tmproot fm-secondmate-liveness)
|
|
42
|
+
|
|
43
|
+
# --- unit level: fm_backend_tmux_agent_state --------------------------------
|
|
44
|
+
|
|
45
|
+
# make_probe_tmux <dir> <pane_current_command>: a fake tmux whose
|
|
46
|
+
# #{pane_current_command} display-message query answers with the fixed value;
|
|
47
|
+
# every other subcommand is a silent no-op success.
|
|
48
|
+
make_probe_tmux() {
|
|
49
|
+
local dir=$1 comm=$2 fakebin
|
|
50
|
+
fakebin=$(fm_fakebin "$dir")
|
|
51
|
+
cat > "$fakebin/tmux" <<SH
|
|
52
|
+
#!/usr/bin/env bash
|
|
53
|
+
set -u
|
|
54
|
+
case "\${1:-}" in
|
|
55
|
+
display-message)
|
|
56
|
+
for a in "\$@"; do case "\$a" in *pane_current_command*) printf '%s\n' '$comm'; exit 0 ;; esac; done
|
|
57
|
+
exit 0 ;;
|
|
58
|
+
list-windows) printf '%s\n' win; exit 0 ;;
|
|
59
|
+
esac
|
|
60
|
+
exit 0
|
|
61
|
+
SH
|
|
62
|
+
chmod +x "$fakebin/tmux"
|
|
63
|
+
printf '%s\n' "$fakebin"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# make_failed_probe_tmux <dir> <inventory>: missing and present fail the pane
|
|
67
|
+
# read, while unreadable returns a misleading fallback node process but fails
|
|
68
|
+
# the inventory that must be authoritative.
|
|
69
|
+
make_failed_probe_tmux() {
|
|
70
|
+
local dir=$1 inventory=$2 fakebin
|
|
71
|
+
fakebin=$(fm_fakebin "$dir")
|
|
72
|
+
cat > "$fakebin/tmux" <<SH
|
|
73
|
+
#!/usr/bin/env bash
|
|
74
|
+
set -u
|
|
75
|
+
case "\${1:-}" in
|
|
76
|
+
display-message)
|
|
77
|
+
[ '$inventory' = unreadable ] && { printf '%s\n' node; exit 0; }
|
|
78
|
+
exit 1
|
|
79
|
+
;;
|
|
80
|
+
list-windows)
|
|
81
|
+
case '$inventory' in
|
|
82
|
+
missing) printf '%s\n' main ; exit 0 ;;
|
|
83
|
+
missing-session) printf '%s\n' "can't find session: sess" >&2; exit 1 ;;
|
|
84
|
+
missing-server) printf '%s\n' "no server running on /tmp/tmux-test/default" >&2; exit 1 ;;
|
|
85
|
+
missing-socket) printf '%s\n' "error connecting to /tmp/tmux-test/default (No such file or directory)" >&2; exit 1 ;;
|
|
86
|
+
present) printf '%s\n' fm-sm1 ; exit 0 ;;
|
|
87
|
+
*) printf '%s\n' "permission denied" >&2; exit 1 ;;
|
|
88
|
+
esac
|
|
89
|
+
;;
|
|
90
|
+
esac
|
|
91
|
+
exit 1
|
|
92
|
+
SH
|
|
93
|
+
chmod +x "$fakebin/tmux"
|
|
94
|
+
printf '%s\n' "$fakebin"
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
test_tmux_agent_state_classifies() {
|
|
98
|
+
local fb out
|
|
99
|
+
|
|
100
|
+
for harness in claude codex opencode grok kimi pi pi-signed pi-launcher Pi; do
|
|
101
|
+
fb=$(make_probe_tmux "$TMP_ROOT/tmux-$harness" "$harness")
|
|
102
|
+
out=$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state tmux sess:win' "$ROOT")
|
|
103
|
+
[ "$out" = alive ] || fail "a live $harness foreground process should classify as alive, got '$out'"
|
|
104
|
+
done
|
|
105
|
+
|
|
106
|
+
for shell in zsh bash -zsh; do
|
|
107
|
+
fb=$(make_probe_tmux "$TMP_ROOT/tmux-${shell#-}" "$shell")
|
|
108
|
+
out=$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state tmux sess:win' "$ROOT")
|
|
109
|
+
[ "$out" = dead ] || fail "a bare $shell foreground process should classify as dead, got '$out'"
|
|
110
|
+
done
|
|
111
|
+
|
|
112
|
+
fb=$(make_probe_tmux "$TMP_ROOT/tmux-node" node)
|
|
113
|
+
out=$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state tmux sess:win' "$ROOT")
|
|
114
|
+
[ "$out" = ambiguous ] || fail "an existing node process should classify as ambiguous, got '$out'"
|
|
115
|
+
[ "$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_alive tmux sess:win' "$ROOT")" = unknown ] \
|
|
116
|
+
|| fail "the compatibility view must keep an existing node process unknown"
|
|
117
|
+
|
|
118
|
+
fb=$(make_failed_probe_tmux "$TMP_ROOT/tmux-missing" missing)
|
|
119
|
+
out=$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state tmux sess:fm-sm1' "$ROOT")
|
|
120
|
+
[ "$out" = missing ] || fail "a readable inventory omitting the target should classify as missing, got '$out'"
|
|
121
|
+
[ "$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_alive tmux sess:fm-sm1' "$ROOT")" = dead ] \
|
|
122
|
+
|| fail "the compatibility view should treat an authoritatively missing target as dead"
|
|
123
|
+
|
|
124
|
+
for inventory in present unreadable; do
|
|
125
|
+
fb=$(make_failed_probe_tmux "$TMP_ROOT/tmux-$inventory" "$inventory")
|
|
126
|
+
out=$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state tmux sess:fm-sm1' "$ROOT")
|
|
127
|
+
[ "$out" = unreadable ] || fail "a $inventory inventory case should stay unreadable, got '$out'"
|
|
128
|
+
done
|
|
129
|
+
|
|
130
|
+
for inventory in missing-session missing-server missing-socket; do
|
|
131
|
+
fb=$(make_failed_probe_tmux "$TMP_ROOT/tmux-$inventory" "$inventory")
|
|
132
|
+
out=$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state tmux sess:fm-sm1' "$ROOT")
|
|
133
|
+
[ "$out" = missing ] || fail "a confirmed $inventory inventory failure should classify as missing, got '$out'"
|
|
134
|
+
done
|
|
135
|
+
|
|
136
|
+
pass "fm_backend_tmux_agent_state: separates live, dead, missing, ambiguous, and unreadable"
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
test_tmux_agent_state_rejects_malformed_targets_before_probe() {
|
|
140
|
+
local fakebin marker target out
|
|
141
|
+
fakebin=$(fm_fakebin "$TMP_ROOT/tmux-malformed")
|
|
142
|
+
marker="$TMP_ROOT/tmux-malformed-called"
|
|
143
|
+
cat > "$fakebin/tmux" <<'SH'
|
|
144
|
+
#!/usr/bin/env bash
|
|
145
|
+
printf 'called\n' > "$FM_TEST_TMUX_MARKER"
|
|
146
|
+
printf 'bash\n'
|
|
147
|
+
SH
|
|
148
|
+
chmod +x "$fakebin/tmux"
|
|
149
|
+
|
|
150
|
+
for target in sess sess: :win sess:win:extra; do
|
|
151
|
+
out=$(PATH="$fakebin:$BASE_PATH" FM_TEST_TMUX_MARKER="$marker" \
|
|
152
|
+
bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state tmux "$1"' "$ROOT" "$target")
|
|
153
|
+
[ "$out" = unreadable ] || fail "malformed tmux target '$target' should classify as unreadable, got '$out'"
|
|
154
|
+
[ ! -e "$marker" ] || fail "malformed tmux target '$target' invoked tmux"
|
|
155
|
+
done
|
|
156
|
+
|
|
157
|
+
pass "fm_backend_tmux_agent_state: rejects malformed targets before probing tmux"
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
# --- unit level: fm_backend_herdr_agent_state -------------------------------
|
|
161
|
+
|
|
162
|
+
test_herdr_agent_state_preserves_husk_classifier() {
|
|
163
|
+
local pane_state expected out
|
|
164
|
+
|
|
165
|
+
for row in 'dead missing' 'no-agent dead' 'live alive' 'unknown unreadable'; do
|
|
166
|
+
pane_state=${row%% *}
|
|
167
|
+
expected=${row#* }
|
|
168
|
+
out=$(FM_TEST_PANE_STATE="$pane_state" bash -c '. "$0/bin/backends/herdr.sh"; fm_backend_herdr_pane_agent_state() { printf "%s" "$FM_TEST_PANE_STATE"; }; fm_backend_herdr_agent_state "sess:p1"' "$ROOT")
|
|
169
|
+
[ "$out" = "$expected" ] || fail "Herdr pane state $pane_state should map to $expected, got '$out'"
|
|
170
|
+
done
|
|
171
|
+
|
|
172
|
+
out=$(bash -c '. "$0/bin/backends/herdr.sh"; fm_backend_herdr_agent_state "no-colon-target"' "$ROOT")
|
|
173
|
+
[ "$out" = unreadable ] || fail "an unparseable Herdr target should classify as unreadable, got '$out'"
|
|
174
|
+
|
|
175
|
+
out=$(bash -c '. "$0/bin/backends/herdr.sh"; fm_backend_herdr_pane_agent_state() { printf "no-agent"; }; fm_backend_herdr_agent_alive "sess:p1"' "$ROOT")
|
|
176
|
+
[ "$out" = dead ] || fail "the Herdr compatibility view should keep a no-agent husk dead, got '$out'"
|
|
177
|
+
|
|
178
|
+
pass "fm_backend_herdr_agent_state: preserves missing/no-agent/live/unknown husk behavior"
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
# --- unit level: the generic dispatchers ------------------------------------
|
|
182
|
+
|
|
183
|
+
test_agent_state_dispatcher_and_compatibility() {
|
|
184
|
+
local fb out
|
|
185
|
+
|
|
186
|
+
fb=$(make_probe_tmux "$TMP_ROOT/dispatch-tmux" claude)
|
|
187
|
+
out=$(PATH="$fb:$BASE_PATH" bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state tmux sess:win' "$ROOT")
|
|
188
|
+
[ "$out" = alive ] || fail "detailed dispatcher should route tmux, got '$out'"
|
|
189
|
+
|
|
190
|
+
out=$(bash -c '. "$0/bin/fm-backend.sh"; fm_backend_source herdr; fm_backend_herdr_pane_agent_state() { printf "live"; }; fm_backend_agent_state herdr sess:p1' "$ROOT")
|
|
191
|
+
[ "$out" = alive ] || fail "detailed dispatcher should route Herdr, got '$out'"
|
|
192
|
+
|
|
193
|
+
out=$(bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_state zellij sess:7' "$ROOT")
|
|
194
|
+
[ "$out" = unverified ] || fail "Zellij should remain unverified, got '$out'"
|
|
195
|
+
out=$(bash -c '. "$0/bin/fm-backend.sh"; fm_backend_agent_alive zellij sess:7' "$ROOT")
|
|
196
|
+
[ "$out" = unknown ] || fail "the compatibility dispatcher should map unverified to unknown, got '$out'"
|
|
197
|
+
|
|
198
|
+
pass "fm_backend_agent_state: routes tmux/Herdr and keeps Zellij unverified"
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
# --- sweep level: bin/fm-bootstrap.sh's secondmate_liveness_sweep -----------
|
|
202
|
+
|
|
203
|
+
# make_toolchain <dir>: the fixed set of stubs bin/fm-bootstrap.sh's read-only
|
|
204
|
+
# diagnostics need to stay quiet (mirrors tests/fm-secondmate-sync.test.sh's
|
|
205
|
+
# make_fake_toolchain), MINUS tmux - callers add their own controllable tmux.
|
|
206
|
+
make_toolchain() {
|
|
207
|
+
local dir=$1 fakebin
|
|
208
|
+
fakebin=$(fm_fakebin "$dir")
|
|
209
|
+
fm_fake_exit0 "$fakebin" node chrome-devtools-axi pi-signed
|
|
210
|
+
fm_fake_version_tool "$fakebin" lavish-axi FM_FAKE_LAVISH_AXI_VERSION 0.1.46
|
|
211
|
+
cat > "$fakebin/gh-axi" <<'SH'
|
|
212
|
+
#!/usr/bin/env bash
|
|
213
|
+
if [ "${1:-}" = --version ]; then
|
|
214
|
+
printf '%s\n' '0.1.29'
|
|
215
|
+
exit 0
|
|
216
|
+
fi
|
|
217
|
+
exit 0
|
|
218
|
+
SH
|
|
219
|
+
chmod +x "$fakebin/gh-axi"
|
|
220
|
+
cat > "$fakebin/gh" <<'SH'
|
|
221
|
+
#!/usr/bin/env bash
|
|
222
|
+
exit 0
|
|
223
|
+
SH
|
|
224
|
+
chmod +x "$fakebin/gh"
|
|
225
|
+
cat > "$fakebin/treehouse" <<'SH'
|
|
226
|
+
#!/usr/bin/env bash
|
|
227
|
+
if [ "${1:-}" = get ] && [ "${2:-}" = --help ]; then
|
|
228
|
+
printf '%s\n' 'Usage: treehouse get [--lease]'
|
|
229
|
+
fi
|
|
230
|
+
exit 0
|
|
231
|
+
SH
|
|
232
|
+
chmod +x "$fakebin/treehouse"
|
|
233
|
+
cat > "$fakebin/no-mistakes" <<'SH'
|
|
234
|
+
#!/usr/bin/env bash
|
|
235
|
+
if [ "${1:-}" = --version ]; then
|
|
236
|
+
printf '%s\n' 'no-mistakes version v1.46.0 (fake)'
|
|
237
|
+
exit 0
|
|
238
|
+
fi
|
|
239
|
+
exit 0
|
|
240
|
+
SH
|
|
241
|
+
chmod +x "$fakebin/no-mistakes"
|
|
242
|
+
cat > "$fakebin/tasks-axi" <<'SH'
|
|
243
|
+
#!/usr/bin/env bash
|
|
244
|
+
case "${1:-} ${2:-}" in
|
|
245
|
+
"--version ") printf '%s\n' '0.2.4' ;;
|
|
246
|
+
"update --help") printf '%s\n' 'usage: tasks-axi update <id> [flags]' ' --archive-body' ;;
|
|
247
|
+
"mv --help") printf '%s\n' 'usage: tasks-axi mv <id> [<id>...] --to <path-or-dir>' ;;
|
|
248
|
+
esac
|
|
249
|
+
exit 0
|
|
250
|
+
SH
|
|
251
|
+
chmod +x "$fakebin/tasks-axi"
|
|
252
|
+
cat > "$fakebin/quota-axi" <<'SH'
|
|
253
|
+
#!/usr/bin/env bash
|
|
254
|
+
if [ "${1:-}" = --version ]; then
|
|
255
|
+
printf '%s\n' '0.1.29'
|
|
256
|
+
exit 0
|
|
257
|
+
fi
|
|
258
|
+
exit 0
|
|
259
|
+
SH
|
|
260
|
+
chmod +x "$fakebin/quota-axi"
|
|
261
|
+
printf '%s\n' "$fakebin"
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
# make_liveness_tmux <dir>: a controllable tmux stub. FM_TEST_PANE_CMD may be
|
|
265
|
+
# a foreground command, `missing` (readable inventory omits the window), or
|
|
266
|
+
# `unreadable` (both pane and inventory reads fail).
|
|
267
|
+
make_liveness_tmux() {
|
|
268
|
+
local dir=$1 fakebin
|
|
269
|
+
fakebin=$(fm_fakebin "$dir")
|
|
270
|
+
cat > "$fakebin/tmux" <<'SH'
|
|
271
|
+
#!/usr/bin/env bash
|
|
272
|
+
set -u
|
|
273
|
+
mode=${FM_TEST_PANE_CMD:-zsh}
|
|
274
|
+
case "${1:-}" in
|
|
275
|
+
display-message)
|
|
276
|
+
for a in "$@"; do
|
|
277
|
+
case "$a" in
|
|
278
|
+
*pane_current_command*)
|
|
279
|
+
case "$mode" in
|
|
280
|
+
missing) printf '%s\n' node; exit 0 ;;
|
|
281
|
+
unreadable) exit 1 ;;
|
|
282
|
+
*) printf '%s\n' "$mode"; exit 0 ;;
|
|
283
|
+
esac
|
|
284
|
+
;;
|
|
285
|
+
esac
|
|
286
|
+
done
|
|
287
|
+
exit 0
|
|
288
|
+
;;
|
|
289
|
+
list-windows)
|
|
290
|
+
case "$mode" in
|
|
291
|
+
missing) printf '%s\n' main; exit 0 ;;
|
|
292
|
+
unreadable) exit 1 ;;
|
|
293
|
+
*) [ -e "${FM_TMUX_CALL_LOG:?}.killed" ] || printf '%s\n' fm-sm1; exit 0 ;;
|
|
294
|
+
esac
|
|
295
|
+
;;
|
|
296
|
+
new-window|kill-window)
|
|
297
|
+
printf '%s\n' "$*" >> "${FM_TMUX_CALL_LOG:?}"
|
|
298
|
+
[ "${1:-}" = kill-window ] && : > "${FM_TMUX_CALL_LOG}.killed"
|
|
299
|
+
[ "${FM_TEST_FAIL_NEW_WINDOW:-0}" = 1 ] && [ "${1:-}" = new-window ] && exit 1
|
|
300
|
+
[ "${1:-}" = new-window ] && rm -f "${FM_TMUX_CALL_LOG}.killed"
|
|
301
|
+
exit 0
|
|
302
|
+
;;
|
|
303
|
+
has-session) exit 0 ;;
|
|
304
|
+
esac
|
|
305
|
+
exit 0
|
|
306
|
+
SH
|
|
307
|
+
chmod +x "$fakebin/tmux"
|
|
308
|
+
printf '%s\n' "$fakebin"
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
# new_world <name>: a scratch firstmate HOME (state/, watcher beacon, pinned
|
|
312
|
+
# harness) with no kind=secondmate meta yet. FM_ROOT is left to resolve
|
|
313
|
+
# naturally to the real checkout under test ($ROOT), exactly as production
|
|
314
|
+
# always has it - this sweep's own fm-spawn.sh invocation resolves the
|
|
315
|
+
# secondmate harness through $FM_ROOT/bin/fm-harness.sh, which only exists in
|
|
316
|
+
# the real tree. The harness is pinned because ambient own-harness detection is
|
|
317
|
+
# environment-dependent: interactive harness sessions expose markers or parent
|
|
318
|
+
# process names, while a plain pipeline shell can fall through to "unknown",
|
|
319
|
+
# which has no fm-spawn.sh launch template.
|
|
320
|
+
new_world() {
|
|
321
|
+
local name=$1 w
|
|
322
|
+
w="$TMP_ROOT/$name"
|
|
323
|
+
mkdir -p "$w/home/state" "$w/home/config"
|
|
324
|
+
touch "$w/home/state/.last-watcher-beat"
|
|
325
|
+
printf 'codex\n' > "$w/home/config/crew-harness"
|
|
326
|
+
printf '%s\n' "$w"
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
# add_sm_home <w> <id> <window>: a plain (non-git) secondmate home - the
|
|
330
|
+
# probe/respawn machinery under test never requires the home to be a real
|
|
331
|
+
# worktree; a non-git home just makes the unrelated fast-forward sweep log a
|
|
332
|
+
# harmless "not a git repo" skip.
|
|
333
|
+
add_sm_home() {
|
|
334
|
+
local w=$1 id=$2 window=$3 harness=${4:-claude}
|
|
335
|
+
local home="$w/$id"
|
|
336
|
+
mkdir -p "$home/bin" "$home/data" "$home/state" "$home/config" "$home/projects"
|
|
337
|
+
printf '%s\n' "$id" > "$home/.fm-secondmate-home"
|
|
338
|
+
printf '# Firstmate\n' > "$home/AGENTS.md"
|
|
339
|
+
printf 'charter\n' > "$home/data/charter.md"
|
|
340
|
+
{
|
|
341
|
+
printf 'window=%s\n' "$window"
|
|
342
|
+
printf 'kind=secondmate\n'
|
|
343
|
+
printf 'harness=%s\n' "$harness"
|
|
344
|
+
printf 'home=%s\n' "$home"
|
|
345
|
+
} > "$w/home/state/$id.meta"
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
run_bootstrap() { # <fakebin> <home> <pane-cmd> <call-log> [extra env...] -> stdout
|
|
349
|
+
local fb=$1 home=$2 cmd=$3 log=$4; shift 4
|
|
350
|
+
PATH="$fb:$BASE_PATH" TMUX='' FM_BACKEND=tmux FM_HOME="$home" \
|
|
351
|
+
FM_TEST_PANE_CMD="$cmd" FM_TMUX_CALL_LOG="$log" \
|
|
352
|
+
env "$@" "$ROOT/bin/fm-bootstrap.sh" 2>&1
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
test_sweep_respawns_confirmed_dead_secondmate() {
|
|
356
|
+
local w fb tmuxfb log out
|
|
357
|
+
w=$(new_world sweep-dead)
|
|
358
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1
|
|
359
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
360
|
+
log="$w/calls.log"; : > "$log"
|
|
361
|
+
|
|
362
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" zsh "$log")
|
|
363
|
+
|
|
364
|
+
assert_not_contains "$out" "SECONDMATE_LIVENESS: secondmate sm1: respawned" \
|
|
365
|
+
"a successfully respawned secondmate should be handled silently"
|
|
366
|
+
assert_contains "$(cat "$log")" "kill-window -t =firstmate:=fm-sm1" \
|
|
367
|
+
"the stale endpoint must be killed before respawn (tmux refuses a same-named window over a live one)"
|
|
368
|
+
assert_contains "$(cat "$log")" "new-window" \
|
|
369
|
+
"a confirmed-dead secondmate should actually be relaunched"
|
|
370
|
+
pass "sweep: a confirmed-dead secondmate endpoint is killed and respawned"
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
test_sweep_leaves_alive_secondmate_untouched() {
|
|
374
|
+
local w fb tmuxfb log out
|
|
375
|
+
w=$(new_world sweep-alive)
|
|
376
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1
|
|
377
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
378
|
+
log="$w/calls.log"; : > "$log"
|
|
379
|
+
|
|
380
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" claude "$log")
|
|
381
|
+
|
|
382
|
+
assert_not_contains "$out" "SECONDMATE_LIVENESS: secondmate sm1: already-live" \
|
|
383
|
+
"an already-live secondmate should be handled silently"
|
|
384
|
+
[ ! -s "$log" ] || fail "an already-live secondmate must never be killed or respawned: $(cat "$log")"
|
|
385
|
+
|
|
386
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" claude "$log" FM_BOOTSTRAP_VERBOSE_FACTS=1)
|
|
387
|
+
assert_contains "$out" "BOOTSTRAP_INFO: secondmate sm1 already live (backend=tmux)" \
|
|
388
|
+
"verbose diagnostics should identify the already-live outcome"
|
|
389
|
+
[ ! -s "$log" ] || fail "verbose reporting must not touch an already-live secondmate: $(cat "$log")"
|
|
390
|
+
pass "sweep: an already-live secondmate is untouched and distinguishable in verbose diagnostics"
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
test_sweep_respawns_authoritatively_missing_pi_secondmate() {
|
|
394
|
+
local w fb tmuxfb log out
|
|
395
|
+
w=$(new_world sweep-missing-pi)
|
|
396
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1 pi
|
|
397
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
398
|
+
log="$w/calls.log"; : > "$log"
|
|
399
|
+
|
|
400
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" missing "$log")
|
|
401
|
+
|
|
402
|
+
assert_not_contains "$out" "SECONDMATE_LIVENESS:" "a successful missing-window recovery should stay silent by default"
|
|
403
|
+
assert_contains "$(cat "$log")" "new-window" "an authoritatively missing Pi secondmate should be relaunched"
|
|
404
|
+
assert_not_contains "$(cat "$log")" "kill-window" "an absent window should not need a destructive pre-kill"
|
|
405
|
+
pass "sweep: an authoritatively missing Pi secondmate window is relaunched"
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
test_sweep_respawns_authoritatively_missing_pi_signed_secondmate() {
|
|
409
|
+
local w fb tmuxfb log out
|
|
410
|
+
w=$(new_world sweep-missing-pi-signed)
|
|
411
|
+
printf '%s\n' pi-signed > "$w/home/config/secondmate-harness"
|
|
412
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1 pi-signed
|
|
413
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
414
|
+
log="$w/calls.log"; : > "$log"
|
|
415
|
+
|
|
416
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" missing "$log")
|
|
417
|
+
|
|
418
|
+
assert_not_contains "$out" "unverified for recovery" \
|
|
419
|
+
"a recorded pi-signed secondmate should be verified for recovery"
|
|
420
|
+
assert_contains "$(cat "$log")" "new-window" \
|
|
421
|
+
"an authoritatively missing pi-signed secondmate should be relaunched"
|
|
422
|
+
assert_not_contains "$(cat "$log")" "kill-window" \
|
|
423
|
+
"an absent pi-signed window should not need a destructive pre-kill"
|
|
424
|
+
pass "sweep: an authoritatively missing pi-signed secondmate window is relaunched"
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
test_sweep_never_acts_on_ambiguous_existing_process() {
|
|
428
|
+
local w fb tmuxfb log out
|
|
429
|
+
w=$(new_world sweep-ambiguous)
|
|
430
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1 pi
|
|
431
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
432
|
+
log="$w/calls.log"; : > "$log"
|
|
433
|
+
|
|
434
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" node "$log")
|
|
435
|
+
|
|
436
|
+
assert_contains "$out" "SECONDMATE_LIVENESS: secondmate sm1: skipped: existing endpoint has ambiguous agent process" \
|
|
437
|
+
"an existing Pi-shaped node process should be reported as ambiguous"
|
|
438
|
+
[ ! -s "$log" ] || fail "an ambiguous existing process must never trigger kill or relaunch: $(cat "$log")"
|
|
439
|
+
pass "sweep: an existing ambiguous Pi process prevents duplicate recovery"
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
test_sweep_never_acts_on_transient_unreadability() {
|
|
443
|
+
local w fb tmuxfb log out
|
|
444
|
+
w=$(new_world sweep-unreadable)
|
|
445
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1 pi
|
|
446
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
447
|
+
log="$w/calls.log"; : > "$log"
|
|
448
|
+
|
|
449
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" unreadable "$log")
|
|
450
|
+
|
|
451
|
+
assert_contains "$out" "SECONDMATE_LIVENESS: secondmate sm1: skipped: endpoint probe unreadable" \
|
|
452
|
+
"a transiently unreadable target should be distinguished from an absent one"
|
|
453
|
+
[ ! -s "$log" ] || fail "an unreadable target must never trigger kill or relaunch: $(cat "$log")"
|
|
454
|
+
pass "sweep: transient target unreadability never licenses recovery"
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
test_sweep_reports_missing_endpoint_relaunch_failure() {
|
|
458
|
+
local w fb tmuxfb log out
|
|
459
|
+
w=$(new_world sweep-missing-failure)
|
|
460
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1 pi
|
|
461
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
462
|
+
log="$w/calls.log"; : > "$log"
|
|
463
|
+
|
|
464
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" missing "$log" FM_TEST_FAIL_NEW_WINDOW=1)
|
|
465
|
+
|
|
466
|
+
assert_contains "$out" "SECONDMATE_LIVENESS: secondmate sm1: respawn failed after recorded endpoint confidently missing" \
|
|
467
|
+
"a failed missing-endpoint relaunch should retain its authorizing cause"
|
|
468
|
+
pass "sweep: failed relaunch diagnostics distinguish a confidently missing endpoint"
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
test_sweep_never_acts_on_unverified_harness_dead_reading() {
|
|
472
|
+
local w fb tmuxfb log out
|
|
473
|
+
w=$(new_world sweep-unverified-harness)
|
|
474
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1 custom-agent
|
|
475
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
476
|
+
log="$w/calls.log"; : > "$log"
|
|
477
|
+
|
|
478
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" zsh "$log")
|
|
479
|
+
|
|
480
|
+
assert_contains "$out" "SECONDMATE_LIVENESS: secondmate sm1: skipped: recorded harness 'custom-agent' is unverified for recovery" \
|
|
481
|
+
"an unverified harness should not let a dead endpoint become actionable"
|
|
482
|
+
[ ! -s "$log" ] || fail "an unverified harness must never trigger kill or relaunch: $(cat "$log")"
|
|
483
|
+
pass "sweep: an unverified harness blocks recovery with a concrete diagnostic"
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
test_sweep_converges_no_retouch_once_alive() {
|
|
487
|
+
local w fb tmuxfb log out1 out2
|
|
488
|
+
w=$(new_world sweep-idempotent)
|
|
489
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1
|
|
490
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
491
|
+
log="$w/calls.log"; : > "$log"
|
|
492
|
+
|
|
493
|
+
# Round 1: dead -> respawned silently (kill + new-window logged).
|
|
494
|
+
out1=$(run_bootstrap "$tmuxfb:$fb" "$w/home" zsh "$log")
|
|
495
|
+
assert_not_contains "$out1" "SECONDMATE_LIVENESS: secondmate sm1: respawned" "round 1 should handle the successful respawn silently"
|
|
496
|
+
[ -s "$log" ] || fail "round 1 should have logged the kill+respawn window operations"
|
|
497
|
+
|
|
498
|
+
# Round 2: the (now-respawned) secondmate is genuinely alive - a second
|
|
499
|
+
# sweep must converge to a pure no-op, not respawn again.
|
|
500
|
+
: > "$log"
|
|
501
|
+
out2=$(run_bootstrap "$tmuxfb:$fb" "$w/home" claude "$log")
|
|
502
|
+
assert_not_contains "$out2" "SECONDMATE_LIVENESS: secondmate sm1: already-live" "round 2 should handle the already-live secondmate silently"
|
|
503
|
+
[ ! -s "$log" ] || fail "round 2 must not re-kill or re-respawn an already-live secondmate: $(cat "$log")"
|
|
504
|
+
pass "sweep: idempotent by construction - a live secondmate is never re-touched on a later run"
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
test_sweep_skipped_under_detect_only() {
|
|
508
|
+
local w fb tmuxfb log out
|
|
509
|
+
w=$(new_world sweep-detect-only)
|
|
510
|
+
add_sm_home "$w" sm1 firstmate:fm-sm1
|
|
511
|
+
mkdir -p "$w/home/config"
|
|
512
|
+
printf 'codex\n' > "$w/home/config/crew-harness"
|
|
513
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
514
|
+
log="$w/calls.log"; : > "$log"
|
|
515
|
+
|
|
516
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" zsh "$log" FM_BOOTSTRAP_DETECT_ONLY=1)
|
|
517
|
+
|
|
518
|
+
assert_not_contains "$out" "CREW_HARNESS_OVERRIDE:" \
|
|
519
|
+
"detect-only should keep routine harness facts silent"
|
|
520
|
+
assert_not_contains "$out" "SECONDMATE_LIVENESS:" \
|
|
521
|
+
"the read-only detect-only path must never run the mutating liveness sweep"
|
|
522
|
+
[ ! -s "$log" ] || fail "detect-only must never touch any endpoint: $(cat "$log")"
|
|
523
|
+
pass "sweep: skipped entirely under FM_BOOTSTRAP_DETECT_ONLY=1, exactly like the other mutating sweeps"
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
test_sweep_noop_with_no_secondmate_meta() {
|
|
527
|
+
local w fb tmuxfb log out
|
|
528
|
+
w=$(new_world sweep-no-secondmates)
|
|
529
|
+
# No add_sm_home call: this state/ dir looks exactly like what a
|
|
530
|
+
# secondmate's OWN home always has (secondmates never spawn secondmates),
|
|
531
|
+
# proving the sweep's primary-only scoping falls out naturally.
|
|
532
|
+
fb=$(make_toolchain "$w"); tmuxfb=$(make_liveness_tmux "$w")
|
|
533
|
+
log="$w/calls.log"; : > "$log"
|
|
534
|
+
|
|
535
|
+
out=$(run_bootstrap "$tmuxfb:$fb" "$w/home" zsh "$log")
|
|
536
|
+
|
|
537
|
+
assert_not_contains "$out" "SECONDMATE_LIVENESS:" \
|
|
538
|
+
"with no kind=secondmate meta present, the sweep must print nothing"
|
|
539
|
+
[ ! -s "$log" ] || fail "with no secondmate meta, no endpoint should ever be touched: $(cat "$log")"
|
|
540
|
+
pass "sweep: a silent no-op with no kind=secondmate meta present (a secondmate home's own natural scoping)"
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
test_tmux_agent_state_classifies
|
|
544
|
+
test_tmux_agent_state_rejects_malformed_targets_before_probe
|
|
545
|
+
test_herdr_agent_state_preserves_husk_classifier
|
|
546
|
+
test_agent_state_dispatcher_and_compatibility
|
|
547
|
+
test_sweep_respawns_confirmed_dead_secondmate
|
|
548
|
+
test_sweep_leaves_alive_secondmate_untouched
|
|
549
|
+
test_sweep_respawns_authoritatively_missing_pi_secondmate
|
|
550
|
+
test_sweep_respawns_authoritatively_missing_pi_signed_secondmate
|
|
551
|
+
test_sweep_never_acts_on_ambiguous_existing_process
|
|
552
|
+
test_sweep_never_acts_on_transient_unreadability
|
|
553
|
+
test_sweep_reports_missing_endpoint_relaunch_failure
|
|
554
|
+
test_sweep_never_acts_on_unverified_harness_dead_reading
|
|
555
|
+
test_sweep_converges_no_retouch_once_alive
|
|
556
|
+
test_sweep_skipped_under_detect_only
|
|
557
|
+
test_sweep_noop_with_no_secondmate_meta
|
|
558
|
+
|
|
559
|
+
echo "# all fm-secondmate-liveness tests passed"
|