@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,536 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tests/fm-afk-inject-herdr-e2e.test.sh - real-herdr end-to-end test for the
|
|
3
|
+
# away-mode daemon's herdr transport (bin/fm-supervise-daemon.sh), the herdr
|
|
4
|
+
# counterpart of tests/fm-afk-inject-e2e.test.sh's private-socket tmux e2e.
|
|
5
|
+
# Mirrors tests/fm-backend-herdr-smoke.test.sh and tests/herdr-test-safety.sh's
|
|
6
|
+
# isolation patterns: everything runs on a throwaway, named, NEVER-default
|
|
7
|
+
# HERDR_SESSION, torn down with herdr_safe_stop_and_delete. Skips cleanly when
|
|
8
|
+
# herdr or jq is not installed.
|
|
9
|
+
#
|
|
10
|
+
# Unlike the tmux e2e (which redirects a bare `tmux` PATH shim to a private
|
|
11
|
+
# socket), herdr already supports named-session isolation via --session, so no
|
|
12
|
+
# PATH redirection is needed for the happy path - the daemon is simply pointed
|
|
13
|
+
# at FM_SUPERVISOR_BACKEND=herdr, FM_SUPERVISOR_TARGET="<session>:<pane-id>",
|
|
14
|
+
# and HERDR_SESSION="<the isolated session>". A thin herdr SHIM is still used,
|
|
15
|
+
# but only to simulate a swallowed Enter (Scenario B) - herdr's real CLI has no
|
|
16
|
+
# built-in way to drop a keystroke, so the shim intercepts exactly one
|
|
17
|
+
# `pane send-keys <pane> enter` call and forwards everything else to the real
|
|
18
|
+
# binary untouched.
|
|
19
|
+
#
|
|
20
|
+
# The "supervisor pane" is a tiny deterministic bash loop (not a real harness
|
|
21
|
+
# binary): it draws a bordered composer row ("│ > <buf> │") that exercises the
|
|
22
|
+
# bordered branch of fm_backend_herdr_composer_state, and logs every submitted
|
|
23
|
+
# line (hex + text + injection/user classification) - the same technique
|
|
24
|
+
# tests/fm-afk-inject-e2e.test.sh uses for its tmux supervisor pane, so this
|
|
25
|
+
# test asserts on submitted CONTENT, not pane appearance. It ALSO registers
|
|
26
|
+
# itself as a real herdr agent via `herdr pane report-agent` and reports an
|
|
27
|
+
# idle/working/idle cycle around each submission, because
|
|
28
|
+
# fm_backend_herdr_send_text_submit's confirmation is native agent-state
|
|
29
|
+
# (agent get), not composer content, since the 2026-07-07 incident fix
|
|
30
|
+
# (docs/herdr-backend.md "Native agent-state submit confirmation") - a pane
|
|
31
|
+
# that only draws composer text without being a registered agent would read
|
|
32
|
+
# agent_not_found forever and never confirm a submission.
|
|
33
|
+
set -u
|
|
34
|
+
|
|
35
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
36
|
+
DAEMON="$ROOT/bin/fm-supervise-daemon.sh"
|
|
37
|
+
|
|
38
|
+
command -v herdr >/dev/null 2>&1 || { echo "skip: herdr not found"; exit 0; }
|
|
39
|
+
command -v jq >/dev/null 2>&1 || { echo "skip: jq not found (required by the herdr adapter)"; exit 0; }
|
|
40
|
+
|
|
41
|
+
# shellcheck source=tests/herdr-test-safety.sh
|
|
42
|
+
. "$ROOT/tests/herdr-test-safety.sh"
|
|
43
|
+
|
|
44
|
+
# This suite runs against its own isolated lab session, so a Herdr pane
|
|
45
|
+
# inherited from the terminal it was launched in must not follow spawn into it
|
|
46
|
+
# as a cross-session parent identity (tests/herdr-test-safety.sh).
|
|
47
|
+
herdr_forget_inherited_pane
|
|
48
|
+
|
|
49
|
+
fail() { printf 'not ok - %s\n' "$1" >&2; cleanup_all; exit 1; }
|
|
50
|
+
pass() { printf 'ok - %s\n' "$1"; }
|
|
51
|
+
|
|
52
|
+
SESSION="fm-lab-afk-herdr-e2e-$$"
|
|
53
|
+
export HERDR_SESSION="$SESSION"
|
|
54
|
+
STATE_DIR=
|
|
55
|
+
HERDR_SHIM_DIR=
|
|
56
|
+
LOG_FILE=
|
|
57
|
+
DAEMON_PID=
|
|
58
|
+
SUPERVISOR_TARGET=
|
|
59
|
+
PANE_ID=
|
|
60
|
+
LOOP_SCRIPT=
|
|
61
|
+
|
|
62
|
+
cleanup_all() {
|
|
63
|
+
if [ -n "${DAEMON_PID:-}" ]; then
|
|
64
|
+
afk_exit "${STATE_DIR:-}" 2>/dev/null || true
|
|
65
|
+
kill "$DAEMON_PID" 2>/dev/null || true
|
|
66
|
+
wait "$DAEMON_PID" 2>/dev/null || true
|
|
67
|
+
fi
|
|
68
|
+
herdr_safe_stop_and_delete "$SESSION" 2>/dev/null || true
|
|
69
|
+
rm -rf "${HERDR_SHIM_DIR:-}" 2>/dev/null || true
|
|
70
|
+
rm -rf "${STATE_DIR:-}" 2>/dev/null || true
|
|
71
|
+
}
|
|
72
|
+
trap cleanup_all EXIT
|
|
73
|
+
fm_herdr_lab_prepare "$SESSION" || fail "could not prepare isolated Herdr lab session"
|
|
74
|
+
|
|
75
|
+
# --- source the daemon (for afk_enter/afk_exit/FM_INJECT_MARK) + the backend -
|
|
76
|
+
# shellcheck source=/dev/null
|
|
77
|
+
. "$DAEMON"
|
|
78
|
+
fm_backend_source herdr || fail "fm_backend_source herdr failed"
|
|
79
|
+
|
|
80
|
+
# --- build the isolated session's supervisor pane ----------------------------
|
|
81
|
+
|
|
82
|
+
fm_backend_herdr_version_check || fail "version_check failed against the real installed herdr"
|
|
83
|
+
|
|
84
|
+
STATE_DIR=$(mktemp -d "${TMPDIR:-/tmp}/fm-afk-herdr-e2e.XXXXXX")
|
|
85
|
+
mkdir -p "$STATE_DIR"
|
|
86
|
+
LOG_FILE="$STATE_DIR/submitted.log"
|
|
87
|
+
: > "$LOG_FILE"
|
|
88
|
+
|
|
89
|
+
CONTAINER_RAW=$(fm_backend_herdr_container_ensure /tmp) || fail "container_ensure failed"
|
|
90
|
+
CONTAINER=${CONTAINER_RAW%%$'\t'*}
|
|
91
|
+
SEEDED_TAB_ID=${CONTAINER_RAW#*$'\t'}
|
|
92
|
+
TASK_IDS=$(fm_backend_herdr_create_task "$CONTAINER" "fm-afk-e2e-supervisor" /tmp "$SEEDED_TAB_ID") \
|
|
93
|
+
|| fail "create_task for the scratch supervisor pane failed"
|
|
94
|
+
read -r _TAB_ID PANE_ID <<EOF
|
|
95
|
+
$TASK_IDS
|
|
96
|
+
EOF
|
|
97
|
+
[ -n "$PANE_ID" ] || fail "create_task did not return a pane id"
|
|
98
|
+
SUPERVISOR_TARGET="$SESSION:$PANE_ID"
|
|
99
|
+
|
|
100
|
+
# Herdr can return the created pane before its interactive shell is ready to
|
|
101
|
+
# receive Enter. Require a stable shell-owned foreground before launching the
|
|
102
|
+
# fixture, or the command can remain typed but unsubmitted in the shell buffer.
|
|
103
|
+
PANE_READY=false
|
|
104
|
+
READY_SAMPLES=0
|
|
105
|
+
for _ in $(seq 1 100); do
|
|
106
|
+
PROCESS_INFO=$(fm_backend_herdr_cli "$SESSION" pane process-info --pane "$PANE_ID" 2>/dev/null || true)
|
|
107
|
+
if printf '%s' "$PROCESS_INFO" | jq -e '
|
|
108
|
+
.result.process_info as $process
|
|
109
|
+
| ($process.foreground_processes | length == 1)
|
|
110
|
+
and ($process.foreground_processes[0].pid == $process.shell_pid)
|
|
111
|
+
' >/dev/null 2>&1; then
|
|
112
|
+
READY_SAMPLES=$((READY_SAMPLES + 1))
|
|
113
|
+
if [ "$READY_SAMPLES" -ge 10 ]; then
|
|
114
|
+
PANE_READY=true
|
|
115
|
+
break
|
|
116
|
+
fi
|
|
117
|
+
else
|
|
118
|
+
READY_SAMPLES=0
|
|
119
|
+
fi
|
|
120
|
+
sleep 0.1
|
|
121
|
+
done
|
|
122
|
+
[ "$PANE_READY" = true ] || fail "the supervisor pane's shell did not become ready"
|
|
123
|
+
|
|
124
|
+
# A second, independent live task tab in the same workspace, mirroring the tmux
|
|
125
|
+
# e2e's fake fm-fake-c1 crewmate window - not required by scan_signals (which
|
|
126
|
+
# only watches state/*.status mtimes, no window/pane dependency), but kept for
|
|
127
|
+
# parity so this test's shape matches the tmux e2e's.
|
|
128
|
+
FAKE_CREW_IDS=$(fm_backend_herdr_create_task "$CONTAINER" "fm-fake-c1" /tmp) \
|
|
129
|
+
|| fail "could not create the fake crewmate scratch tab"
|
|
130
|
+
read -r _FAKE_TAB_ID FAKE_CREW_PANE_ID <<EOF
|
|
131
|
+
$FAKE_CREW_IDS
|
|
132
|
+
EOF
|
|
133
|
+
|
|
134
|
+
# --- deterministic bare-composer loop, drawn in the scratch pane -------------
|
|
135
|
+
# Mirrors tests/fm-afk-inject-e2e.test.sh's supervisor-loop.sh, but draws the
|
|
136
|
+
# shared classifier's positively identified bare-agent shape (`❯ <buf>`). This
|
|
137
|
+
# remains readable under the strict blank-row posture without pretending that
|
|
138
|
+
# one side-bordered row is a complete composer box. ALSO registers itself as a
|
|
139
|
+
# real herdr agent via `herdr pane report-agent` and reports idle/working
|
|
140
|
+
# transitions around each
|
|
141
|
+
# submission: fm_backend_herdr_send_text_submit's confirmation is now native
|
|
142
|
+
# agent-state (agent get), not composer content (docs/herdr-backend.md
|
|
143
|
+
# "Native agent-state submit confirmation"), so a synthetic pane that only
|
|
144
|
+
# draws composer TEXT but is never registered as an agent would report
|
|
145
|
+
# agent_not_found forever - every confirmation attempt would read 'unknown',
|
|
146
|
+
# never 'empty', and the daemon would treat every injection as unconfirmed and
|
|
147
|
+
# keep retyping it on every housekeeping tick (the exact duplicate-send
|
|
148
|
+
# failure mode this whole change exists to prevent) - discovered by this very
|
|
149
|
+
# test regressing when the composer-only version of this fixture was run
|
|
150
|
+
# against the new confirmation code. `herdr pane report-agent` is herdr's own
|
|
151
|
+
# documented integration-protocol primitive for a non-built-in-harness process
|
|
152
|
+
# to report its own agent state, verified empirically against real herdr 0.7.1
|
|
153
|
+
# in an isolated session.
|
|
154
|
+
LOOP_SCRIPT="$STATE_DIR/supervisor-loop.sh"
|
|
155
|
+
cat > "$LOOP_SCRIPT" <<'LOOP'
|
|
156
|
+
#!/usr/bin/env bash
|
|
157
|
+
MARK=$'\xE2\x81\xA3'
|
|
158
|
+
LOG="$1"
|
|
159
|
+
AGENT_SOURCE=fm-test-supervisor
|
|
160
|
+
AGENT_LABEL=fm-test-supervisor
|
|
161
|
+
report_agent_state() { # <idle|working>
|
|
162
|
+
herdr pane report-agent "$HERDR_PANE_ID" --source "$AGENT_SOURCE" --agent "$AGENT_LABEL" --state "$1" --session "$HERDR_SESSION" >/dev/null 2>&1
|
|
163
|
+
}
|
|
164
|
+
OLD_STTY=$(stty -g 2>/dev/null || true)
|
|
165
|
+
[ -z "$OLD_STTY" ] || stty -echo -icanon min 1 time 0 2>/dev/null || true
|
|
166
|
+
cleanup() {
|
|
167
|
+
[ -z "$OLD_STTY" ] || stty "$OLD_STTY" 2>/dev/null || true
|
|
168
|
+
}
|
|
169
|
+
trap cleanup EXIT INT TERM
|
|
170
|
+
report_agent_state idle
|
|
171
|
+
|
|
172
|
+
_buf=
|
|
173
|
+
# redraw: keep the composer visually pinned to ONE terminal row regardless of
|
|
174
|
+
# _buf's length - a realistic bordered single-line composer horizontally
|
|
175
|
+
# scrolls to show the tail near the cursor rather than letting the terminal
|
|
176
|
+
# hard-wrap a too-long line across multiple rows (which would break the
|
|
177
|
+
# structural border-row classifier's one-row assumption: a batched escalation
|
|
178
|
+
# digest easily exceeds a narrow pane's column width). A hardcoded width
|
|
179
|
+
# (not `tput cols`) is used deliberately: verified empirically against a real
|
|
180
|
+
# herdr pane launched this same way that `tput cols` inside this script's own
|
|
181
|
+
# process reports 80 regardless of the pane's ACTUAL width (54, confirmed via
|
|
182
|
+
# a separate interactively-typed `tput cols`), so trusting it here silently
|
|
183
|
+
# let content overflow the real width and wrap across two rows. 40 is
|
|
184
|
+
# comfortably under every real pane width observed on this machine.
|
|
185
|
+
redraw() {
|
|
186
|
+
local avail=40 shown tail_n
|
|
187
|
+
if [ "${#_buf}" -gt "$avail" ]; then
|
|
188
|
+
tail_n=$((avail - 3))
|
|
189
|
+
shown="...${_buf: -$tail_n}"
|
|
190
|
+
else
|
|
191
|
+
shown="$_buf"
|
|
192
|
+
fi
|
|
193
|
+
printf '\r\033[K❯ %s' "$shown"
|
|
194
|
+
}
|
|
195
|
+
submit_line() {
|
|
196
|
+
local _line=$_buf _c _hex
|
|
197
|
+
if [ "${_line:0:1}" = "$MARK" ]; then
|
|
198
|
+
_c="injection"
|
|
199
|
+
else
|
|
200
|
+
_c="user"
|
|
201
|
+
fi
|
|
202
|
+
_hex=$(printf '%s' "$_line" | od -An -tx1 | tr -d ' \n')
|
|
203
|
+
printf '%s\t%s\t%s\n' "$_hex" "$_line" "$_c" >> "$LOG"
|
|
204
|
+
_buf=
|
|
205
|
+
printf '\r\033[K\n'
|
|
206
|
+
redraw
|
|
207
|
+
# Report a real idle->working->idle cycle around the submission, exactly
|
|
208
|
+
# like a real harness's agent_status - this is the signal
|
|
209
|
+
# fm_backend_herdr_send_text_submit now confirms against. The 0.6s "working"
|
|
210
|
+
# window comfortably covers the daemon's FM_INJECT_CONFIRM_SLEEP=0.5
|
|
211
|
+
# per-attempt budget used by the scenarios below.
|
|
212
|
+
report_agent_state working
|
|
213
|
+
sleep 0.6
|
|
214
|
+
report_agent_state idle
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
redraw
|
|
218
|
+
while IFS= read -r -n 1 _ch; do
|
|
219
|
+
if [ -z "$_ch" ]; then
|
|
220
|
+
submit_line
|
|
221
|
+
continue
|
|
222
|
+
fi
|
|
223
|
+
case "$_ch" in
|
|
224
|
+
$'\r'|$'\n') submit_line ;;
|
|
225
|
+
$'\177'|$'\b') _buf=${_buf%?}; redraw ;;
|
|
226
|
+
*) _buf="${_buf}${_ch}"; redraw ;;
|
|
227
|
+
esac
|
|
228
|
+
done
|
|
229
|
+
LOOP
|
|
230
|
+
chmod +x "$LOOP_SCRIPT"
|
|
231
|
+
|
|
232
|
+
fm_backend_herdr_send_text_line "$SUPERVISOR_TARGET" "bash '$LOOP_SCRIPT' '$LOG_FILE'" \
|
|
233
|
+
|| fail "could not start the supervisor-loop script in the scratch herdr pane"
|
|
234
|
+
sleep 1 # let the loop start and settle
|
|
235
|
+
|
|
236
|
+
# --- herdr shim: forwards to the real binary, optionally swallows one Enter --
|
|
237
|
+
REAL_HERDR=$(command -v herdr)
|
|
238
|
+
HERDR_SHIM_DIR=$(mktemp -d "${TMPDIR:-/tmp}/fm-herdr-shim.XXXXXX")
|
|
239
|
+
cat > "$HERDR_SHIM_DIR/herdr" <<SHIM
|
|
240
|
+
#!/usr/bin/env bash
|
|
241
|
+
if [ "\${1:-}" = "pane" ] && [ "\${2:-}" = "send-keys" ] && [ -f "$STATE_DIR/.swallow-enter" ]; then
|
|
242
|
+
found_enter=0
|
|
243
|
+
for _a in "\$@"; do [ "\$_a" = "enter" ] && found_enter=1; done
|
|
244
|
+
if [ "\$found_enter" = 1 ]; then
|
|
245
|
+
rm -f "$STATE_DIR/.swallow-enter"
|
|
246
|
+
exit 0
|
|
247
|
+
fi
|
|
248
|
+
fi
|
|
249
|
+
exec "$REAL_HERDR" "\$@"
|
|
250
|
+
SHIM
|
|
251
|
+
chmod +x "$HERDR_SHIM_DIR/herdr"
|
|
252
|
+
|
|
253
|
+
wait_daemon_started() {
|
|
254
|
+
local label=${1:-daemon} start_line=${2:-0} i=0 new_log
|
|
255
|
+
while [ "$i" -lt 30 ]; do
|
|
256
|
+
new_log=$(tail -n +"$((start_line + 1))" "$STATE_DIR/.supervise-daemon.log" 2>/dev/null || true)
|
|
257
|
+
if printf '%s\n' "$new_log" | grep -q 'backend=herdr'; then
|
|
258
|
+
[ -f "$STATE_DIR/.supervise-daemon.pid" ] || fail "$label startup log recorded backend=herdr but no pid file was written"
|
|
259
|
+
kill -0 "$DAEMON_PID" 2>/dev/null || fail "$label exited after recording backend=herdr"
|
|
260
|
+
return 0
|
|
261
|
+
fi
|
|
262
|
+
if ! kill -0 "$DAEMON_PID" 2>/dev/null; then
|
|
263
|
+
echo "daemon stderr:" >&2; cat "$STATE_DIR/daemon.err" >&2
|
|
264
|
+
fail "$label exited before recording backend=herdr: $(cat "$STATE_DIR/.supervise-daemon.log" 2>/dev/null)"
|
|
265
|
+
fi
|
|
266
|
+
sleep 0.2
|
|
267
|
+
i=$((i + 1))
|
|
268
|
+
done
|
|
269
|
+
echo "daemon stderr:" >&2; cat "$STATE_DIR/daemon.err" >&2
|
|
270
|
+
fail "$label did not record backend=herdr after 6s: $new_log"
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
start_daemon() {
|
|
274
|
+
local log_start=0
|
|
275
|
+
[ ! -f "$STATE_DIR/.supervise-daemon.log" ] || log_start=$(wc -l < "$STATE_DIR/.supervise-daemon.log")
|
|
276
|
+
PATH="$HERDR_SHIM_DIR:$PATH" \
|
|
277
|
+
HERDR_SESSION="$SESSION" \
|
|
278
|
+
FM_STATE_OVERRIDE="$STATE_DIR" \
|
|
279
|
+
FM_SUPERVISOR_BACKEND=herdr \
|
|
280
|
+
FM_SUPERVISOR_TARGET="$SUPERVISOR_TARGET" \
|
|
281
|
+
FM_ESCALATE_BATCH_SECS=0 \
|
|
282
|
+
FM_HOUSEKEEPING_TICK=1 \
|
|
283
|
+
FM_POLL=1 \
|
|
284
|
+
FM_SIGNAL_GRACE=1 \
|
|
285
|
+
FM_HEARTBEAT=999999 \
|
|
286
|
+
FM_CHECK_INTERVAL=999999 \
|
|
287
|
+
FM_INJECT_CONFIRM_SLEEP=0.5 \
|
|
288
|
+
FM_INJECT_CONFIRM_RETRIES=6 \
|
|
289
|
+
FM_STALE_ESCALATE_SECS=999999 \
|
|
290
|
+
nohup "$DAEMON" >"$STATE_DIR/daemon.out" 2>"$STATE_DIR/daemon.err" &
|
|
291
|
+
DAEMON_PID=$!
|
|
292
|
+
wait_daemon_started daemon "$log_start"
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
stop_daemon() {
|
|
296
|
+
[ -n "${DAEMON_PID:-}" ] || return 0
|
|
297
|
+
afk_exit "$STATE_DIR" 2>/dev/null || true
|
|
298
|
+
kill "$DAEMON_PID" 2>/dev/null || true
|
|
299
|
+
wait "$DAEMON_PID" 2>/dev/null || true
|
|
300
|
+
DAEMON_PID=""
|
|
301
|
+
sleep 1
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
reset_state() {
|
|
305
|
+
rm -f "$STATE_DIR"/*.status \
|
|
306
|
+
"$STATE_DIR"/.subsuper-* \
|
|
307
|
+
"$STATE_DIR"/.wake-queue* \
|
|
308
|
+
"$STATE_DIR"/.watch.lock* \
|
|
309
|
+
"$STATE_DIR"/.watcher-down* \
|
|
310
|
+
"$STATE_DIR"/.last-* \
|
|
311
|
+
"$STATE_DIR"/.hash-* \
|
|
312
|
+
"$STATE_DIR"/.count-* \
|
|
313
|
+
"$STATE_DIR"/.stale-* \
|
|
314
|
+
"$STATE_DIR"/.seen-* \
|
|
315
|
+
"$STATE_DIR"/.heartbeat-streak \
|
|
316
|
+
"$STATE_DIR"/.swallow-enter \
|
|
317
|
+
2>/dev/null || true
|
|
318
|
+
: > "$LOG_FILE"
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
# --- pane_input_pending environment self-check ------------------------------
|
|
322
|
+
# Verify pane_input_pending (dispatched through fm_backend_composer_state for
|
|
323
|
+
# backend=herdr) can detect typed text in THIS real herdr environment before
|
|
324
|
+
# trusting the scenarios below to prove anything.
|
|
325
|
+
|
|
326
|
+
selfcheck_pane_input_pending() {
|
|
327
|
+
local check_text="selfcheck-marker-12345"
|
|
328
|
+
fm_backend_herdr_send_literal "$SUPERVISOR_TARGET" "$check_text" \
|
|
329
|
+
|| fail "selfcheck: could not send literal text to the scratch pane"
|
|
330
|
+
sleep 0.5
|
|
331
|
+
if PATH="$HERDR_SHIM_DIR:$PATH" pane_input_pending "$SUPERVISOR_TARGET" herdr; then
|
|
332
|
+
fm_backend_herdr_send_key "$SUPERVISOR_TARGET" Enter
|
|
333
|
+
sleep 0.5
|
|
334
|
+
return 0
|
|
335
|
+
fi
|
|
336
|
+
echo "pane_input_pending cannot detect typed text in this real-herdr environment" >&2
|
|
337
|
+
fm_backend_herdr_capture "$SUPERVISOR_TARGET" 10 | sed 's/^/ /' >&2
|
|
338
|
+
fm_backend_herdr_send_key "$SUPERVISOR_TARGET" Enter
|
|
339
|
+
fail "pane_input_pending self-check failed against real herdr"
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
selfcheck_pane_input_pending
|
|
343
|
+
|
|
344
|
+
# --- Scenario A: human-partial-input ----------------------------------------
|
|
345
|
+
|
|
346
|
+
test_scenario_a() {
|
|
347
|
+
reset_state
|
|
348
|
+
afk_enter "$STATE_DIR"
|
|
349
|
+
start_daemon
|
|
350
|
+
|
|
351
|
+
fm_backend_herdr_send_literal "$SUPERVISOR_TARGET" "human draft text"
|
|
352
|
+
sleep 0.5
|
|
353
|
+
|
|
354
|
+
echo "done: PR https://example.test/pr/100" > "$STATE_DIR/fake-c1.status"
|
|
355
|
+
|
|
356
|
+
sleep 8
|
|
357
|
+
|
|
358
|
+
if grep -q 'Supervisor escalate' "$LOG_FILE"; then
|
|
359
|
+
fail "Scenario A: daemon injected while the herdr pane had pending input"
|
|
360
|
+
fi
|
|
361
|
+
if grep -q 'human draft text.*Supervisor escalate' "$LOG_FILE" 2>/dev/null || \
|
|
362
|
+
grep -q 'Supervisor escalate.*human draft text' "$LOG_FILE" 2>/dev/null; then
|
|
363
|
+
fail "Scenario A: human text and digest were merged into one line"
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
fm_backend_herdr_send_key "$SUPERVISOR_TARGET" Enter
|
|
367
|
+
sleep 0.5
|
|
368
|
+
|
|
369
|
+
sleep 8
|
|
370
|
+
|
|
371
|
+
grep -q 'human draft text' "$LOG_FILE" \
|
|
372
|
+
|| fail "Scenario A: human text not in log after submit"
|
|
373
|
+
grep -q 'Supervisor escalate' "$LOG_FILE" \
|
|
374
|
+
|| fail "Scenario A: digest not injected after the pane went idle"
|
|
375
|
+
if grep -q 'human draft text.*Supervisor escalate' "$LOG_FILE" || \
|
|
376
|
+
grep -q 'Supervisor escalate.*human draft text' "$LOG_FILE"; then
|
|
377
|
+
fail "Scenario A: human text and digest merged into one line (after idle)"
|
|
378
|
+
fi
|
|
379
|
+
|
|
380
|
+
local human_line
|
|
381
|
+
human_line=$(grep 'human draft text' "$LOG_FILE" | head -1)
|
|
382
|
+
case "$human_line" in
|
|
383
|
+
*user) ;;
|
|
384
|
+
*) fail "Scenario A: human text misclassified (expected user): $human_line" ;;
|
|
385
|
+
esac
|
|
386
|
+
|
|
387
|
+
local digest_line
|
|
388
|
+
digest_line=$(grep 'Supervisor escalate' "$LOG_FILE" | head -1)
|
|
389
|
+
case "$digest_line" in
|
|
390
|
+
*injection) ;;
|
|
391
|
+
*) fail "Scenario A: digest misclassified (expected injection): $digest_line" ;;
|
|
392
|
+
esac
|
|
393
|
+
|
|
394
|
+
stop_daemon
|
|
395
|
+
pass "real herdr Scenario A: partial input defers injection; digest arrives clean after idle"
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
# --- Scenario B: swallowed-Enter --------------------------------------------
|
|
399
|
+
|
|
400
|
+
test_scenario_b() {
|
|
401
|
+
reset_state
|
|
402
|
+
afk_enter "$STATE_DIR"
|
|
403
|
+
|
|
404
|
+
touch "$STATE_DIR/.swallow-enter"
|
|
405
|
+
|
|
406
|
+
start_daemon
|
|
407
|
+
|
|
408
|
+
echo "done: PR https://example.test/pr/200" > "$STATE_DIR/fake-c1.status"
|
|
409
|
+
|
|
410
|
+
sleep 10
|
|
411
|
+
|
|
412
|
+
local marker_count
|
|
413
|
+
marker_count=$(awk -F '\t' '{ hex=$1; count += gsub(/e281a3/, "", hex) } END { print count + 0 }' "$LOG_FILE")
|
|
414
|
+
[ "$marker_count" -eq 1 ] \
|
|
415
|
+
|| fail "Scenario B: expected exactly 1 U+2063 marker, got $marker_count (duplicate or lost)"
|
|
416
|
+
|
|
417
|
+
local digest_line digest_hex
|
|
418
|
+
digest_line=$(grep 'Supervisor escalate' "$LOG_FILE" | head -1)
|
|
419
|
+
digest_hex=$(printf '%s' "$digest_line" | cut -f1)
|
|
420
|
+
case "$digest_hex" in
|
|
421
|
+
e281a3*) ;;
|
|
422
|
+
*) fail "Scenario B: digest does not start with the terminal-safe sentinel marker (hex: $digest_hex)" ;;
|
|
423
|
+
esac
|
|
424
|
+
|
|
425
|
+
local user_count
|
|
426
|
+
user_count=$(grep -c $'\tuser$' "$LOG_FILE" || true)
|
|
427
|
+
[ "$user_count" -eq 0 ] \
|
|
428
|
+
|| fail "Scenario B: expected 0 user lines, got $user_count (spurious Enter submitted an empty line?)"
|
|
429
|
+
|
|
430
|
+
stop_daemon
|
|
431
|
+
pass "real herdr Scenario B: swallowed Enter (via the herdr shim) produces exactly one clean digest"
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
# --- Scenario C: normal digest -----------------------------------------------
|
|
435
|
+
|
|
436
|
+
test_scenario_c() {
|
|
437
|
+
reset_state
|
|
438
|
+
afk_enter "$STATE_DIR"
|
|
439
|
+
start_daemon
|
|
440
|
+
|
|
441
|
+
echo "done: PR https://example.test/pr/300" > "$STATE_DIR/fake-c1.status"
|
|
442
|
+
sleep 8
|
|
443
|
+
|
|
444
|
+
local marker_count
|
|
445
|
+
marker_count=$(awk -F '\t' '{ hex=$1; count += gsub(/e281a3/, "", hex) } END { print count + 0 }' "$LOG_FILE")
|
|
446
|
+
[ "$marker_count" -eq 1 ] \
|
|
447
|
+
|| fail "Scenario C: expected exactly 1 U+2063 marker, got $marker_count"
|
|
448
|
+
|
|
449
|
+
local digest_line digest_hex
|
|
450
|
+
digest_line=$(grep 'Supervisor escalate' "$LOG_FILE" | head -1)
|
|
451
|
+
case "$digest_line" in
|
|
452
|
+
*injection) ;;
|
|
453
|
+
*) fail "Scenario C: digest misclassified (expected injection): $digest_line" ;;
|
|
454
|
+
esac
|
|
455
|
+
digest_hex=$(printf '%s' "$digest_line" | cut -f1)
|
|
456
|
+
case "$digest_hex" in
|
|
457
|
+
e281a3*) ;;
|
|
458
|
+
*) fail "Scenario C: digest does not start with the terminal-safe sentinel marker (hex: $digest_hex)" ;;
|
|
459
|
+
esac
|
|
460
|
+
|
|
461
|
+
local user_count
|
|
462
|
+
user_count=$(grep -c $'\tuser$' "$LOG_FILE" || true)
|
|
463
|
+
[ "$user_count" -eq 0 ] \
|
|
464
|
+
|| fail "Scenario C: expected 0 user lines, got $user_count (spurious submission?)"
|
|
465
|
+
|
|
466
|
+
stop_daemon
|
|
467
|
+
pass "real herdr Scenario C: a normal captain status injects exactly one clean single-line sentinel digest"
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
# --- Scenario D: max-defer alarm on a persistently non-clearing composer -----
|
|
471
|
+
# A pending composer that NEVER clears (every Enter attempt leaves real text
|
|
472
|
+
# behind) must never be silently swallowed: the daemon must alarm (write
|
|
473
|
+
# state/.subsuper-inject-wedged) while preserving the buffered escalation, and
|
|
474
|
+
# must never crash or hot-loop. Exercises fm_backend_composer_state(herdr, ...)
|
|
475
|
+
# reporting "pending" indefinitely through the REAL structural border reader.
|
|
476
|
+
|
|
477
|
+
test_scenario_d_max_defer() {
|
|
478
|
+
reset_state
|
|
479
|
+
afk_enter "$STATE_DIR"
|
|
480
|
+
local log_start=0
|
|
481
|
+
[ ! -f "$STATE_DIR/.supervise-daemon.log" ] || log_start=$(wc -l < "$STATE_DIR/.supervise-daemon.log")
|
|
482
|
+
# Persistent-pending composer: type real text and never submit it, so every
|
|
483
|
+
# composer read is genuinely "pending" against the real herdr binary.
|
|
484
|
+
fm_backend_herdr_send_literal "$SUPERVISOR_TARGET" "stuck-in-the-box"
|
|
485
|
+
sleep 0.5
|
|
486
|
+
|
|
487
|
+
PATH="$HERDR_SHIM_DIR:$PATH" \
|
|
488
|
+
HERDR_SESSION="$SESSION" \
|
|
489
|
+
FM_STATE_OVERRIDE="$STATE_DIR" \
|
|
490
|
+
FM_SUPERVISOR_BACKEND=herdr \
|
|
491
|
+
FM_SUPERVISOR_TARGET="$SUPERVISOR_TARGET" \
|
|
492
|
+
FM_ESCALATE_BATCH_SECS=99999 \
|
|
493
|
+
FM_HOUSEKEEPING_TICK=1 \
|
|
494
|
+
FM_POLL=1 \
|
|
495
|
+
FM_SIGNAL_GRACE=1 \
|
|
496
|
+
FM_HEARTBEAT=999999 \
|
|
497
|
+
FM_CHECK_INTERVAL=999999 \
|
|
498
|
+
FM_MAX_DEFER_SECS=3 \
|
|
499
|
+
FM_INJECT_CONFIRM_SLEEP=0.3 \
|
|
500
|
+
FM_INJECT_CONFIRM_RETRIES=2 \
|
|
501
|
+
FM_STALE_ESCALATE_SECS=999999 \
|
|
502
|
+
nohup "$DAEMON" >"$STATE_DIR/daemon.out" 2>"$STATE_DIR/daemon.err" &
|
|
503
|
+
DAEMON_PID=$!
|
|
504
|
+
wait_daemon_started "Scenario D daemon" "$log_start"
|
|
505
|
+
|
|
506
|
+
echo "needs-decision: pick A or B" > "$STATE_DIR/fake-c1.status"
|
|
507
|
+
|
|
508
|
+
sleep 12
|
|
509
|
+
|
|
510
|
+
[ -s "$STATE_DIR/.subsuper-inject-wedged" ] \
|
|
511
|
+
|| fail "Scenario D: a persistently pending real herdr composer never raised the max-defer wedge alarm"
|
|
512
|
+
[ -s "$STATE_DIR/.subsuper-escalations" ] \
|
|
513
|
+
|| fail "Scenario D: the buffered escalation was lost instead of preserved during the wedge"
|
|
514
|
+
if grep -q 'Supervisor escalate' "$LOG_FILE" 2>/dev/null; then
|
|
515
|
+
fail "Scenario D: a digest was somehow logged as submitted despite the composer never clearing"
|
|
516
|
+
fi
|
|
517
|
+
kill -0 "$DAEMON_PID" 2>/dev/null || fail "Scenario D: the daemon process died instead of alarming and continuing"
|
|
518
|
+
grep -F 'stuck-in-the-box' "$STATE_DIR/daemon.err" >/dev/null 2>&1 && : # not fatal either way
|
|
519
|
+
|
|
520
|
+
stop_daemon
|
|
521
|
+
# Clean up the stuck composer text for a tidy teardown (best-effort).
|
|
522
|
+
fm_backend_herdr_send_key "$SUPERVISOR_TARGET" C-c >/dev/null 2>&1 || true
|
|
523
|
+
pass "real herdr Scenario D: a persistently pending composer raises the max-defer wedge alarm, preserves the buffer, and never crashes the daemon"
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
test_scenario_a
|
|
527
|
+
test_scenario_b
|
|
528
|
+
test_scenario_c
|
|
529
|
+
test_scenario_d_max_defer
|
|
530
|
+
|
|
531
|
+
echo "all real-herdr afk injection e2e tests passed"
|
|
532
|
+
|
|
533
|
+
fm_backend_herdr_kill "$SUPERVISOR_TARGET" 2>/dev/null || true
|
|
534
|
+
fm_backend_herdr_kill "$SESSION:$FAKE_CREW_PANE_ID" 2>/dev/null || true
|
|
535
|
+
cleanup_all
|
|
536
|
+
trap - EXIT
|