@zerwiz/ymir 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +290 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml +50 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +9 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/config/tailscale-sync.yaml +27 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/kaia.engram +0 -0
- package/.agents/memory/kaia.engram-shm +0 -0
- package/.agents/memory/kaia.engram-wal +0 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/memory/well/episodes.jsonl +367 -0
- package/.agents/memory/well/workspace.jsonl +27 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +111 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +70 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +52 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +34 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +454 -0
- package/CHANGELOG.md +881 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +113 -59
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +65 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +58 -0
- package/RULES/07-config.md +45 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/README.md +20 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +98 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +233 -0
- package/bin/apodex-smoke-test.sh +92 -0
- package/bin/bifrost-bridge.sh +112 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +107 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +38 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-guard.sh +165 -0
- package/bin/crash-sense.sh +160 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +207 -0
- package/bin/eindri-acclaim.sh +34 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seen.sh +41 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +85 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +112 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/fleet-apply.sh +68 -0
- package/bin/github-deploy.sh +81 -0
- package/bin/gjallarhorn-expose.sh +102 -0
- package/bin/gjallarhorn-notify.sh +58 -0
- package/bin/gjallarhorn-purge.sh +54 -0
- package/bin/gjallarhorn-tunnel.sh +72 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +122 -0
- package/bin/hall-snapshot.sh +92 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +431 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hoard-lib.sh +25 -0
- package/bin/hodd.sh +78 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +108 -0
- package/bin/local-model-lock.sh +51 -0
- package/bin/mimir-bridge.py +226 -0
- package/bin/mimir-bridge.sh +87 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +59 -0
- package/bin/mjollnir.sh +85 -0
- package/bin/model-hardware.sh +82 -0
- package/bin/model-resolve.sh +147 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +148 -0
- package/bin/omarchy-plugins.sh +174 -0
- package/bin/omarchy-sense.sh +149 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +38 -0
- package/bin/project-git.sh +55 -0
- package/bin/public-guard.sh +70 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +91 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +90 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +76 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +190 -0
- package/bin/telegram-bot.sh +69 -0
- package/bin/toolchain.sh +74 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +260 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +47 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +150 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +641 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +97 -0
- package/bin/ymir-setup-auth.sh +108 -0
- package/bin/ymir-validate.sh +173 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1056 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +44 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +210 -0
- package/scripts/start.sh +167 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# fm-send answerer-closes (--resolve-key) behavior.
|
|
3
|
+
#
|
|
4
|
+
# A captain decision opened by a keyed needs-decision:/blocked: status line
|
|
5
|
+
# historically stayed open forever when the answer kicked off work: the worker's
|
|
6
|
+
# next line is working [key=<workstream>], never resolved [key=<decision>].
|
|
7
|
+
# fm-send's --resolve-key removes that writer-dependency at its source: the
|
|
8
|
+
# ANSWERING firstmate closes the decision in this home's own ledger at answer
|
|
9
|
+
# time - for a local target that is ENQUEUE time, because the durable inbox
|
|
10
|
+
# write is delivery to the task's record. These tests drive the real fm-send
|
|
11
|
+
# executable over stubbed transports and assert closure through the real
|
|
12
|
+
# consumer (fm-wake-drain.sh's OPEN DECISIONS section), never through source
|
|
13
|
+
# text:
|
|
14
|
+
# 1. An answer send closes the open decision, including the answer-starts-work
|
|
15
|
+
# scenario where the worker never writes a matching resolved line.
|
|
16
|
+
# 2. A routine steer without the flag never closes anything, and a working:/
|
|
17
|
+
# done: line still cannot clear a captain decision.
|
|
18
|
+
# 3. A key that is not open refuses BEFORE anything is sent (mistype safety).
|
|
19
|
+
# 4. The close happens at enqueue: a failed doorbell ring still closes the
|
|
20
|
+
# answered key (the record is durably sent), while a failed ENQUEUE - the
|
|
21
|
+
# real local failure - closes nothing and leaves the decision open.
|
|
22
|
+
# 5. A local secondmate answer is marked+corr'd in its record yet closes the
|
|
23
|
+
# same way, and the closing line carries the plain answer, not marker or
|
|
24
|
+
# corr bytes.
|
|
25
|
+
# 6. A remote secondmate answer differs only at the transport layer: the
|
|
26
|
+
# message crosses the stubbed ssh transport while the close is the same
|
|
27
|
+
# local ledger append; a failed transport closes nothing.
|
|
28
|
+
# 7. Flag misuse (--key, empty message, explicit backend target) refuses.
|
|
29
|
+
set -u
|
|
30
|
+
|
|
31
|
+
# shellcheck source=tests/lib.sh
|
|
32
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
33
|
+
# shellcheck source=/dev/null
|
|
34
|
+
. "$ROOT/bin/fm-marker-lib.sh"
|
|
35
|
+
|
|
36
|
+
SEND="$ROOT/bin/fm-send.sh"
|
|
37
|
+
DRAIN="$ROOT/bin/fm-wake-drain.sh"
|
|
38
|
+
|
|
39
|
+
TMP_ROOT=$(fm_test_tmproot fm-send-resolve-key)
|
|
40
|
+
|
|
41
|
+
# Stub tmux: logs literal typed text to FM_SEND_LOG and lets the submit path
|
|
42
|
+
# reach a clean "empty" verdict (numeric cursor_y, empty bordered composer).
|
|
43
|
+
# FM_FAKE_TMUX_SEND_FAIL=1 makes send-keys fail so the delivery-failure leg can
|
|
44
|
+
# assert that a failed send closes nothing.
|
|
45
|
+
make_stubs() { # <dir> -> echoes fakebin dir
|
|
46
|
+
local dir=$1 fb="$1/fakebin"
|
|
47
|
+
mkdir -p "$fb"
|
|
48
|
+
cat > "$fb/tmux" <<'SH'
|
|
49
|
+
#!/usr/bin/env bash
|
|
50
|
+
set -u
|
|
51
|
+
case "${1:-}" in
|
|
52
|
+
send-keys)
|
|
53
|
+
[ "${FM_FAKE_TMUX_SEND_FAIL:-0}" = 1 ] && exit 1
|
|
54
|
+
shift
|
|
55
|
+
literal=0
|
|
56
|
+
while [ $# -gt 0 ]; do
|
|
57
|
+
case "$1" in
|
|
58
|
+
-t) shift 2 ;;
|
|
59
|
+
-l) literal=1; shift ;;
|
|
60
|
+
*) break ;;
|
|
61
|
+
esac
|
|
62
|
+
done
|
|
63
|
+
if [ "$literal" = 1 ]; then
|
|
64
|
+
printf '%s' "${1:-}" >> "$FM_SEND_LOG"
|
|
65
|
+
fi
|
|
66
|
+
exit 0 ;;
|
|
67
|
+
display-message)
|
|
68
|
+
for a in "$@"; do case "$a" in *cursor_y*) printf '1\n'; exit 0 ;; esac; done
|
|
69
|
+
printf 'fakepane\n'; exit 0 ;;
|
|
70
|
+
capture-pane) printf '╭────╮\n│ │\n╰────╯\n'; exit 0 ;;
|
|
71
|
+
list-windows) exit 0 ;;
|
|
72
|
+
esac
|
|
73
|
+
exit 0
|
|
74
|
+
SH
|
|
75
|
+
chmod +x "$fb/tmux"
|
|
76
|
+
cat > "$fb/sleep" <<'SH'
|
|
77
|
+
#!/usr/bin/env bash
|
|
78
|
+
exit 0
|
|
79
|
+
SH
|
|
80
|
+
chmod +x "$fb/sleep"
|
|
81
|
+
# Stub ssh transport for the remote-secondmate legs, selected via FM_SSH_BIN.
|
|
82
|
+
# Records the full remote invocation and exits FM_FAKE_SSH_RC (default 0).
|
|
83
|
+
cat > "$fb/fake-ssh" <<'SH'
|
|
84
|
+
#!/usr/bin/env bash
|
|
85
|
+
cat > /dev/null
|
|
86
|
+
printf '%s\n' "$*" >> "$FM_SSH_LOG"
|
|
87
|
+
exit "${FM_FAKE_SSH_RC:-0}"
|
|
88
|
+
SH
|
|
89
|
+
chmod +x "$fb/fake-ssh"
|
|
90
|
+
printf '%s\n' "$fb"
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# run_send <fakebin> <home> <send-log> <fm-send args...>: run the real fm-send
|
|
94
|
+
# with the stubs on PATH against the given home. Guard noise goes to stderr,
|
|
95
|
+
# captured per test when the diagnostic matters.
|
|
96
|
+
run_send() {
|
|
97
|
+
local fb=$1 home=$2 log=$3; shift 3
|
|
98
|
+
: > "$log"
|
|
99
|
+
env PATH="$fb:$PATH" \
|
|
100
|
+
FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
101
|
+
"$SEND" "$@" 2>/dev/null
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
setup_home() { # <name> -> echoes a fresh home dir with an empty state/
|
|
105
|
+
local home="$TMP_ROOT/$1-$RANDOM"
|
|
106
|
+
mkdir -p "$home/state"
|
|
107
|
+
printf '%s\n' "$home"
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
drain_out() { # <home>
|
|
111
|
+
FM_STATE_OVERRIDE="$1/state" "$DRAIN" 2>/dev/null
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
test_answer_send_closes_open_decision() {
|
|
115
|
+
local dir fb log home rc out
|
|
116
|
+
dir="$TMP_ROOT/closes"; mkdir -p "$dir"
|
|
117
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
118
|
+
home=$(setup_home closes)
|
|
119
|
+
fm_write_meta "$home/state/t1.meta" "window=sess:fm-t1" "kind=ship"
|
|
120
|
+
printf 'needs-decision [key=api-shape]: pick REST or RPC\n' > "$home/state/t1.status"
|
|
121
|
+
printf 'working: kept busy on an unrelated stream\n' >> "$home/state/t1.status"
|
|
122
|
+
|
|
123
|
+
out=$(drain_out "$home")
|
|
124
|
+
printf '%s' "$out" | grep -F '[key=api-shape]' >/dev/null \
|
|
125
|
+
|| fail "precondition: the buried decision should list as open before the answer"
|
|
126
|
+
|
|
127
|
+
run_send "$fb" "$home" "$log" t1 --resolve-key api-shape "go with REST"; rc=$?
|
|
128
|
+
expect_code 0 "$rc" "an answer send with --resolve-key should succeed"
|
|
129
|
+
grep -qF "go with REST" "$home/state/t1.inbox/001.msg" \
|
|
130
|
+
|| fail "the answer text should reach the worker's durable inbox record"
|
|
131
|
+
assert_contains "$(cat "$log")" "Firstmate instruction waiting" "the doorbell should be rung for the answer"
|
|
132
|
+
grep -F 'resolved [key=api-shape]: answered: go with REST' "$home/state/t1.status" >/dev/null \
|
|
133
|
+
|| fail "fm-send did not append the closing resolved line:"$'\n'"$(cat "$home/state/t1.status")"
|
|
134
|
+
|
|
135
|
+
out=$(drain_out "$home")
|
|
136
|
+
if printf '%s' "$out" | grep -F 'OPEN DECISIONS' >/dev/null; then
|
|
137
|
+
fail "the answered decision still lists as open: $out"
|
|
138
|
+
fi
|
|
139
|
+
pass "fm-send --resolve-key: the answer send itself closes the open decision"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# The answerer's close is this home's own bookkeeping: it must not re-wake the
|
|
143
|
+
# session that wrote it, while any other writer's later line on the same task
|
|
144
|
+
# still must. Both directions are read through the production seen-signature
|
|
145
|
+
# gate the watcher's signal scan consumes (bin/fm-wake-lib.sh).
|
|
146
|
+
test_answer_close_is_self_announced() {
|
|
147
|
+
local dir fb log home rc
|
|
148
|
+
dir="$TMP_ROOT/self-announced"; mkdir -p "$dir"
|
|
149
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
150
|
+
home=$(setup_home self-announced)
|
|
151
|
+
fm_write_meta "$home/state/t9.meta" "window=sess:fm-t9" "kind=ship"
|
|
152
|
+
printf 'needs-decision [key=port-choice]: 8080 or 9090\n' > "$home/state/t9.status"
|
|
153
|
+
FM_STATE_OVERRIDE="$home/state" bash -c '
|
|
154
|
+
. "$1"
|
|
155
|
+
fm_wake_status_mark_current "$2" "$3"
|
|
156
|
+
' _ "$ROOT/bin/fm-wake-lib.sh" "$home/state" "$home/state/t9.status" \
|
|
157
|
+
|| fail "could not prime the announced baseline"
|
|
158
|
+
|
|
159
|
+
run_send "$fb" "$home" "$log" t9 --resolve-key port-choice "use 9090"; rc=$?
|
|
160
|
+
expect_code 0 "$rc" "the answer send should succeed"
|
|
161
|
+
grep -F 'resolved [key=port-choice]: answered: use 9090' "$home/state/t9.status" >/dev/null \
|
|
162
|
+
|| fail "the closing resolved line is missing"
|
|
163
|
+
FM_STATE_OVERRIDE="$home/state" bash -c '
|
|
164
|
+
. "$1"; fm_wake_signal_seen_current "$2" "$3"
|
|
165
|
+
' _ "$ROOT/bin/fm-wake-lib.sh" "$home/state" "$home/state/t9.status" \
|
|
166
|
+
|| fail "the answerer's own close was left to re-wake this same home"
|
|
167
|
+
|
|
168
|
+
printf 'done: worker finished after the answer\n' >> "$home/state/t9.status"
|
|
169
|
+
if FM_STATE_OVERRIDE="$home/state" bash -c '
|
|
170
|
+
. "$1"; fm_wake_signal_seen_current "$2" "$3"
|
|
171
|
+
' _ "$ROOT/bin/fm-wake-lib.sh" "$home/state" "$home/state/t9.status"; then
|
|
172
|
+
fail "a later worker line after the self-announced close was swallowed"
|
|
173
|
+
fi
|
|
174
|
+
pass "fm-send --resolve-key: the close never re-wakes its own home, later lines still do"
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
# The reported failure behind issue #2109: a worker that put the colon first
|
|
178
|
+
# (needs-decision: [key=X] ...) had its key silently folded to "default", so
|
|
179
|
+
# the answer's --resolve-key X refused with "no open decision or blocker with
|
|
180
|
+
# that key". The stated key must be honored in that position too, end to end
|
|
181
|
+
# through the real send.
|
|
182
|
+
test_colon_first_key_position_is_answerable() {
|
|
183
|
+
local dir fb log home rc out
|
|
184
|
+
dir="$TMP_ROOT/colon-first"; mkdir -p "$dir"
|
|
185
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
186
|
+
home=$(setup_home colon-first)
|
|
187
|
+
fm_write_meta "$home/state/t8.meta" "window=sess:fm-t8" "kind=ship"
|
|
188
|
+
printf 'needs-decision: [key=seam-max-bound] cap the seam at 4 or 8\n' > "$home/state/t8.status"
|
|
189
|
+
|
|
190
|
+
out=$(drain_out "$home")
|
|
191
|
+
printf '%s' "$out" | grep -F '[key=seam-max-bound]' >/dev/null \
|
|
192
|
+
|| fail "precondition: the colon-first decision should list as open under its stated key: $out"
|
|
193
|
+
|
|
194
|
+
run_send "$fb" "$home" "$log" t8 --resolve-key seam-max-bound "cap it at 4"; rc=$?
|
|
195
|
+
expect_code 0 "$rc" "answering a colon-first stated key should succeed, not refuse as unknown"
|
|
196
|
+
grep -F 'resolved [key=seam-max-bound]: answered: cap it at 4' "$home/state/t8.status" >/dev/null \
|
|
197
|
+
|| fail "the closing resolved line is missing:"$'\n'"$(cat "$home/state/t8.status")"
|
|
198
|
+
|
|
199
|
+
out=$(drain_out "$home")
|
|
200
|
+
if printf '%s' "$out" | grep -F 'OPEN DECISIONS' >/dev/null; then
|
|
201
|
+
fail "the answered colon-first decision still lists as open: $out"
|
|
202
|
+
fi
|
|
203
|
+
pass "fm-send --resolve-key: a colon-first stated key is open under that key and answerable"
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
test_answer_starts_work_never_orphans() {
|
|
207
|
+
local dir fb log home rc out
|
|
208
|
+
dir="$TMP_ROOT/starts-work"; mkdir -p "$dir"
|
|
209
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
210
|
+
home=$(setup_home starts-work)
|
|
211
|
+
fm_write_meta "$home/state/t2.meta" "window=sess:fm-t2" "kind=ship"
|
|
212
|
+
printf 'needs-decision [key=rollout]: big-bang or phased\n' > "$home/state/t2.status"
|
|
213
|
+
|
|
214
|
+
run_send "$fb" "$home" "$log" t2 --resolve-key rollout "phased, gate each region"; rc=$?
|
|
215
|
+
expect_code 0 "$rc" "the rollout answer send should succeed"
|
|
216
|
+
# The forensic scenario: the answer starts a workstream, so the worker's next
|
|
217
|
+
# events use a DIFFERENT key namespace and it never writes
|
|
218
|
+
# resolved [key=rollout] itself.
|
|
219
|
+
printf 'working [key=phased-impl]: building region gates\n' >> "$home/state/t2.status"
|
|
220
|
+
printf 'done [key=phased-impl]: PR up\n' >> "$home/state/t2.status"
|
|
221
|
+
|
|
222
|
+
out=$(drain_out "$home")
|
|
223
|
+
if printf '%s' "$out" | grep -F 'OPEN DECISIONS' >/dev/null; then
|
|
224
|
+
fail "the answered decision orphaned after the answer started work: $out"
|
|
225
|
+
fi
|
|
226
|
+
pass "fm-send --resolve-key: an answer that starts a workstream leaves no orphaned decision"
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
test_routine_steer_never_closes() {
|
|
230
|
+
local dir fb log home rc out
|
|
231
|
+
dir="$TMP_ROOT/routine"; mkdir -p "$dir"
|
|
232
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
233
|
+
home=$(setup_home routine)
|
|
234
|
+
fm_write_meta "$home/state/t3.meta" "window=sess:fm-t3" "kind=ship"
|
|
235
|
+
printf 'needs-decision [key=schema]: split or embed\n' > "$home/state/t3.status"
|
|
236
|
+
|
|
237
|
+
run_send "$fb" "$home" "$log" t3 "unrelated nudge, keep going"; rc=$?
|
|
238
|
+
expect_code 0 "$rc" "a routine steer should still succeed"
|
|
239
|
+
printf 'working: resumed\n' >> "$home/state/t3.status"
|
|
240
|
+
printf 'done: unrelated milestone\n' >> "$home/state/t3.status"
|
|
241
|
+
|
|
242
|
+
if grep -F 'resolved' "$home/state/t3.status" >/dev/null; then
|
|
243
|
+
fail "a routine steer wrote a resolved line: $(cat "$home/state/t3.status")"
|
|
244
|
+
fi
|
|
245
|
+
out=$(drain_out "$home")
|
|
246
|
+
printf '%s' "$out" | grep -F '[key=schema]' >/dev/null \
|
|
247
|
+
|| fail "a routine steer (or later working/done lines) cleared an unanswered captain decision: $out"
|
|
248
|
+
pass "fm-send: a send without --resolve-key never closes a decision, and working/done still cannot"
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
test_not_open_key_refuses_before_send() {
|
|
252
|
+
local dir fb log home err rc out
|
|
253
|
+
dir="$TMP_ROOT/not-open"; mkdir -p "$dir"
|
|
254
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"; err="$dir/send.err"
|
|
255
|
+
home=$(setup_home not-open)
|
|
256
|
+
fm_write_meta "$home/state/t4.meta" "window=sess:fm-t4" "kind=ship"
|
|
257
|
+
printf 'needs-decision [key=real-key]: choose\n' > "$home/state/t4.status"
|
|
258
|
+
|
|
259
|
+
: > "$log"
|
|
260
|
+
env PATH="$fb:$PATH" \
|
|
261
|
+
FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
262
|
+
"$SEND" t4 --resolve-key mistyped "the answer" >/dev/null 2>"$err"; rc=$?
|
|
263
|
+
[ "$rc" -ne 0 ] || fail "a not-open key should refuse"
|
|
264
|
+
assert_contains "$(cat "$err")" "--resolve-key 'mistyped'" "the refusal should name the bad key"
|
|
265
|
+
assert_contains "$(cat "$err")" "nothing was sent" "the refusal should state nothing was sent"
|
|
266
|
+
[ ! -s "$log" ] || fail "a refused answer still typed text: $(cat "$log")"
|
|
267
|
+
[ ! -d "$home/state/t4.inbox" ] || fail "a refused answer still enqueued an inbox record"
|
|
268
|
+
if grep -F 'resolved' "$home/state/t4.status" >/dev/null; then
|
|
269
|
+
fail "a refused answer still closed something: $(cat "$home/state/t4.status")"
|
|
270
|
+
fi
|
|
271
|
+
out=$(drain_out "$home")
|
|
272
|
+
printf '%s' "$out" | grep -F '[key=real-key]' >/dev/null \
|
|
273
|
+
|| fail "the real decision disappeared after a refused answer: $out"
|
|
274
|
+
pass "fm-send --resolve-key: a key that is not open refuses loudly before anything is sent"
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
# The close is an enqueue-time fact: the durable record IS the delivery, so a
|
|
278
|
+
# failed doorbell keystroke must not reopen the split-brain where the close
|
|
279
|
+
# waited on an unconfirmable submit.
|
|
280
|
+
test_failed_ring_still_closes_at_enqueue() {
|
|
281
|
+
local dir fb log home rc out
|
|
282
|
+
dir="$TMP_ROOT/ring-fail"; mkdir -p "$dir"
|
|
283
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
284
|
+
home=$(setup_home ring-fail)
|
|
285
|
+
fm_write_meta "$home/state/t5.meta" "window=sess:fm-t5" "kind=ship"
|
|
286
|
+
printf 'blocked [key=creds]: need the deploy token\n' > "$home/state/t5.status"
|
|
287
|
+
|
|
288
|
+
: > "$log"
|
|
289
|
+
env PATH="$fb:$PATH" FM_FAKE_TMUX_SEND_FAIL=1 \
|
|
290
|
+
FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
291
|
+
"$SEND" t5 --resolve-key creds "token is in the vault now" >/dev/null 2>&1; rc=$?
|
|
292
|
+
expect_code 0 "$rc" "a failed doorbell must not fail the durably enqueued answer"
|
|
293
|
+
grep -qF 'token is in the vault now' "$home/state/t5.inbox/001.msg" \
|
|
294
|
+
|| fail "the answer must be durably recorded despite the failed ring"
|
|
295
|
+
grep -F 'resolved [key=creds]' "$home/state/t5.status" >/dev/null \
|
|
296
|
+
|| fail "the enqueued answer must close the decision at answer time: $(cat "$home/state/t5.status")"
|
|
297
|
+
out=$(drain_out "$home")
|
|
298
|
+
if printf '%s' "$out" | grep -F '[key=creds]' >/dev/null; then
|
|
299
|
+
fail "the answered blocker still lists as open after an enqueue-time close: $out"
|
|
300
|
+
fi
|
|
301
|
+
pass "fm-send --resolve-key: the close happens at enqueue, surviving a failed doorbell"
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
# The real local failure - an unwritable record - is the case that must never
|
|
305
|
+
# close anything: nothing durable was sent.
|
|
306
|
+
test_failed_enqueue_does_not_close() {
|
|
307
|
+
local dir fb log home rc out
|
|
308
|
+
dir="$TMP_ROOT/enqueue-fail"; mkdir -p "$dir"
|
|
309
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
310
|
+
home=$(setup_home enqueue-fail)
|
|
311
|
+
fm_write_meta "$home/state/t5.meta" "window=sess:fm-t5" "kind=ship"
|
|
312
|
+
printf 'blocked [key=creds]: need the deploy token\n' > "$home/state/t5.status"
|
|
313
|
+
: > "$home/state/t5.inbox" # a FILE where the inbox dir must go
|
|
314
|
+
|
|
315
|
+
: > "$log"
|
|
316
|
+
env PATH="$fb:$PATH" \
|
|
317
|
+
FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
318
|
+
"$SEND" t5 --resolve-key creds "token is in the vault now" >/dev/null 2>&1; rc=$?
|
|
319
|
+
[ "$rc" -ne 0 ] || fail "a failed enqueue should exit nonzero"
|
|
320
|
+
if grep -F 'resolved' "$home/state/t5.status" >/dev/null; then
|
|
321
|
+
fail "a failed enqueue still closed the decision: $(cat "$home/state/t5.status")"
|
|
322
|
+
fi
|
|
323
|
+
[ ! -s "$log" ] || fail "a failed enqueue still typed something: $(cat "$log")"
|
|
324
|
+
out=$(drain_out "$home")
|
|
325
|
+
printf '%s' "$out" | grep -F '[key=creds]' >/dev/null \
|
|
326
|
+
|| fail "the blocker vanished after a failed enqueue: $out"
|
|
327
|
+
pass "fm-send --resolve-key: a failed enqueue never closes the decision"
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
test_multiple_keys_close_together() {
|
|
331
|
+
local dir fb log home rc out
|
|
332
|
+
dir="$TMP_ROOT/multi"; mkdir -p "$dir"
|
|
333
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
334
|
+
home=$(setup_home multi)
|
|
335
|
+
fm_write_meta "$home/state/t6.meta" "window=sess:fm-t6" "kind=ship"
|
|
336
|
+
{
|
|
337
|
+
printf 'needs-decision [key=k1]: first\n'
|
|
338
|
+
printf 'blocked [key=k2]: second\n'
|
|
339
|
+
printf 'needs-decision [key=k3]: third, unanswered\n'
|
|
340
|
+
} > "$home/state/t6.status"
|
|
341
|
+
|
|
342
|
+
run_send "$fb" "$home" "$log" t6 --resolve-key k1 --resolve-key k2 \
|
|
343
|
+
"one answer covering both"; rc=$?
|
|
344
|
+
expect_code 0 "$rc" "an answer resolving two keys should succeed"
|
|
345
|
+
out=$(drain_out "$home")
|
|
346
|
+
printf '%s' "$out" | grep -F '[key=k3]' >/dev/null \
|
|
347
|
+
|| fail "the unanswered third decision must stay open: $out"
|
|
348
|
+
if printf '%s' "$out" | grep -E '\[key=k1\]|\[key=k2\]' >/dev/null; then
|
|
349
|
+
fail "an answered key is still open after a multi-key answer: $out"
|
|
350
|
+
fi
|
|
351
|
+
pass "fm-send --resolve-key: one answer closes each named key and only those"
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
test_local_secondmate_answer_marked_and_closed() {
|
|
355
|
+
local dir fb log home rc got out closing
|
|
356
|
+
dir="$TMP_ROOT/sm"; mkdir -p "$dir"
|
|
357
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"
|
|
358
|
+
home=$(setup_home sm)
|
|
359
|
+
fm_write_secondmate_meta "$home/state/domain.meta" "$home" "sess:fm-domain"
|
|
360
|
+
printf 'needs-decision [key=fleet-split]: shard by team or by repo\n' > "$home/state/domain.status"
|
|
361
|
+
|
|
362
|
+
run_send "$fb" "$home" "$log" fm-domain --resolve-key fleet-split "shard by team"; rc=$?
|
|
363
|
+
expect_code 0 "$rc" "a secondmate answer send should succeed"
|
|
364
|
+
got=$(bash -c '. "$1"; fm_task_inbox_body "$2"' _ "$ROOT/bin/fm-task-inbox-lib.sh" \
|
|
365
|
+
"$home/state/domain.inbox/001.msg")
|
|
366
|
+
case "$got" in
|
|
367
|
+
"$FM_FROMFIRST_MARK"corr=*) : ;;
|
|
368
|
+
*) fail "the secondmate answer's record lost its from-firstmate marker/corr framing: $got" ;;
|
|
369
|
+
esac
|
|
370
|
+
closing=$(grep -F 'resolved [key=fleet-split]' "$home/state/domain.status" || true)
|
|
371
|
+
[ -n "$closing" ] || fail "the secondmate decision was not closed: $(cat "$home/state/domain.status")"
|
|
372
|
+
case "$closing" in
|
|
373
|
+
*corr=*) fail "the closing line leaked the corr token: $closing" ;;
|
|
374
|
+
esac
|
|
375
|
+
case "$closing" in
|
|
376
|
+
*"$FM_FROMFIRST_SEPARATOR"*) fail "the closing line leaked marker bytes" ;;
|
|
377
|
+
esac
|
|
378
|
+
assert_contains "$closing" "shard by team" "the closing line should carry the plain answer"
|
|
379
|
+
out=$(drain_out "$home")
|
|
380
|
+
if printf '%s' "$out" | grep -F 'OPEN DECISIONS' >/dev/null; then
|
|
381
|
+
fail "the answered secondmate decision still lists as open: $out"
|
|
382
|
+
fi
|
|
383
|
+
pass "fm-send --resolve-key: a marked local-secondmate answer closes with the plain answer text"
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
# Remote secondmate: the answer crosses the (stubbed) ssh transport through the
|
|
387
|
+
# real fm-on.sh + registry route, while the close is the SAME local ledger
|
|
388
|
+
# append as every other target kind - the transport is the only difference.
|
|
389
|
+
setup_remote_home() { # <name> -> echoes home dir with remote meta + registry
|
|
390
|
+
local home
|
|
391
|
+
home=$(setup_home "$1")
|
|
392
|
+
mkdir -p "$home/data"
|
|
393
|
+
fm_write_meta "$home/state/rsm.meta" \
|
|
394
|
+
"window=fm-remote:w1:p1" \
|
|
395
|
+
"endpoint_task_id=rsm" \
|
|
396
|
+
"harness=claude" \
|
|
397
|
+
"kind=secondmate" \
|
|
398
|
+
"mode=secondmate" \
|
|
399
|
+
"yolo=off" \
|
|
400
|
+
"remote_host=remote-mac" \
|
|
401
|
+
"remote_root=/remote/root" \
|
|
402
|
+
"remote_backend=herdr" \
|
|
403
|
+
"remote_herdr_session=fm-remote" \
|
|
404
|
+
"remote_target=fm-remote:w1:p1"
|
|
405
|
+
cat > "$home/data/secondmates.md" <<EOF
|
|
406
|
+
- rsm - remote test domain (host: remote-mac; root: /remote/root; home: /remote/home; scope: remote testing; projects: alpha; added 2026-08-02)
|
|
407
|
+
EOF
|
|
408
|
+
printf '%s\n' "$home"
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
test_remote_secondmate_answer_closes_locally() {
|
|
412
|
+
local dir fb log home ssh_log rc out
|
|
413
|
+
dir="$TMP_ROOT/remote-ok"; mkdir -p "$dir"
|
|
414
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"; ssh_log="$dir/ssh.log"; : > "$ssh_log"
|
|
415
|
+
home=$(setup_remote_home remote-ok)
|
|
416
|
+
printf 'needs-decision [key=upgrade-window]: tonight or the weekend\n' > "$home/state/rsm.status"
|
|
417
|
+
|
|
418
|
+
: > "$log"
|
|
419
|
+
env PATH="$fb:$PATH" \
|
|
420
|
+
FM_ROOT_OVERRIDE="$ROOT" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
421
|
+
FM_SSH_BIN="$fb/fake-ssh" FM_SSH_LOG="$ssh_log" FM_FAKE_SSH_RC=0 \
|
|
422
|
+
"$SEND" rsm --resolve-key upgrade-window "the weekend, freeze Friday" >/dev/null 2>&1; rc=$?
|
|
423
|
+
expect_code 0 "$rc" "a remote secondmate answer send should succeed"
|
|
424
|
+
assert_grep 'fm-remote-entrypoint.sh' "$ssh_log" \
|
|
425
|
+
"the answer message should cross the remote transport"
|
|
426
|
+
grep -F 'resolved [key=upgrade-window]: answered: the weekend, freeze Friday' "$home/state/rsm.status" >/dev/null \
|
|
427
|
+
|| fail "the remote answer did not close the local ledger: $(cat "$home/state/rsm.status")"
|
|
428
|
+
out=$(drain_out "$home")
|
|
429
|
+
if printf '%s' "$out" | grep -F 'OPEN DECISIONS' >/dev/null; then
|
|
430
|
+
fail "the answered remote-secondmate decision still lists as open: $out"
|
|
431
|
+
fi
|
|
432
|
+
pass "fm-send --resolve-key: a remote-secondmate answer closes the same local ledger, transport-only difference"
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
# The reported failure: a remote secondmate reply line prepends a
|
|
436
|
+
# "[corr=<hex>]" correlation tag ahead of "[key=...]"
|
|
437
|
+
# (needs-decision [corr=d448ea86afa4bf67] [key=x]: ...). The verb parser used
|
|
438
|
+
# to strip only a leading "[key=...]" token, so the corr tag stayed glued onto
|
|
439
|
+
# the returned verb and the fold never recognized the line as a decision at
|
|
440
|
+
# all - "--resolve-key x" refused with "no open decision with that key" even
|
|
441
|
+
# though the key was right there on the line. This drives the real fm-send
|
|
442
|
+
# over that exact line shape and asserts the answer now succeeds and closes it.
|
|
443
|
+
test_remote_reply_corr_tag_does_not_block_resolve_key() {
|
|
444
|
+
local dir fb log home ssh_log rc out
|
|
445
|
+
dir="$TMP_ROOT/remote-corr-tag"; mkdir -p "$dir"
|
|
446
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"; ssh_log="$dir/ssh.log"; : > "$ssh_log"
|
|
447
|
+
home=$(setup_remote_home remote-corr-tag)
|
|
448
|
+
printf 'needs-decision [corr=d448ea86afa4bf67] [key=loan-installment-cadence-amount]: pick the cadence\n' \
|
|
449
|
+
> "$home/state/rsm.status"
|
|
450
|
+
|
|
451
|
+
out=$(drain_out "$home")
|
|
452
|
+
printf '%s' "$out" | grep -F '[key=loan-installment-cadence-amount]' >/dev/null \
|
|
453
|
+
|| fail "precondition: the corr-tagged remote decision should list as open under its stated key: $out"
|
|
454
|
+
|
|
455
|
+
: > "$log"
|
|
456
|
+
env PATH="$fb:$PATH" \
|
|
457
|
+
FM_ROOT_OVERRIDE="$ROOT" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
458
|
+
FM_SSH_BIN="$fb/fake-ssh" FM_SSH_LOG="$ssh_log" FM_FAKE_SSH_RC=0 \
|
|
459
|
+
"$SEND" rsm --resolve-key loan-installment-cadence-amount "monthly" >/dev/null 2>&1; rc=$?
|
|
460
|
+
expect_code 0 "$rc" "answering a corr-tagged remote decision should succeed, not refuse as unknown"
|
|
461
|
+
grep -F 'resolved [key=loan-installment-cadence-amount]: answered: monthly' "$home/state/rsm.status" >/dev/null \
|
|
462
|
+
|| fail "the closing resolved line is missing:"$'\n'"$(cat "$home/state/rsm.status")"
|
|
463
|
+
|
|
464
|
+
out=$(drain_out "$home")
|
|
465
|
+
if printf '%s' "$out" | grep -F 'OPEN DECISIONS' >/dev/null; then
|
|
466
|
+
fail "the answered corr-tagged remote decision still lists as open: $out"
|
|
467
|
+
fi
|
|
468
|
+
pass "fm-send --resolve-key: a remote reply's leading [corr=...] tag no longer blocks closing its stated key"
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
test_remote_transport_failure_does_not_close() {
|
|
472
|
+
local dir fb log home ssh_log rc out
|
|
473
|
+
dir="$TMP_ROOT/remote-fail"; mkdir -p "$dir"
|
|
474
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"; ssh_log="$dir/ssh.log"; : > "$ssh_log"
|
|
475
|
+
home=$(setup_remote_home remote-fail)
|
|
476
|
+
printf 'blocked [key=quota]: remote host is out of runway\n' > "$home/state/rsm.status"
|
|
477
|
+
|
|
478
|
+
: > "$log"
|
|
479
|
+
env PATH="$fb:$PATH" \
|
|
480
|
+
FM_ROOT_OVERRIDE="$ROOT" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
481
|
+
FM_SSH_BIN="$fb/fake-ssh" FM_SSH_LOG="$ssh_log" FM_FAKE_SSH_RC=1 \
|
|
482
|
+
"$SEND" rsm --resolve-key quota "quota refreshed, resume" >/dev/null 2>&1; rc=$?
|
|
483
|
+
[ "$rc" -ne 0 ] || fail "a failed remote transport should exit nonzero"
|
|
484
|
+
if grep -F 'resolved' "$home/state/rsm.status" >/dev/null; then
|
|
485
|
+
fail "a failed remote send still closed the decision: $(cat "$home/state/rsm.status")"
|
|
486
|
+
fi
|
|
487
|
+
out=$(drain_out "$home")
|
|
488
|
+
printf '%s' "$out" | grep -F '[key=quota]' >/dev/null \
|
|
489
|
+
|| fail "the remote blocker vanished after a failed transport: $out"
|
|
490
|
+
pass "fm-send --resolve-key: a failed remote transport never closes the decision"
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
test_flag_misuse_refuses() {
|
|
494
|
+
local dir fb log home err rc
|
|
495
|
+
dir="$TMP_ROOT/misuse"; mkdir -p "$dir"
|
|
496
|
+
fb=$(make_stubs "$dir"); log="$dir/send.log"; err="$dir/send.err"
|
|
497
|
+
home=$(setup_home misuse)
|
|
498
|
+
fm_write_meta "$home/state/t7.meta" "window=sess:fm-t7" "kind=ship"
|
|
499
|
+
printf 'needs-decision [key=k]: choose\n' > "$home/state/t7.status"
|
|
500
|
+
|
|
501
|
+
# --resolve-key with --key (both orders) is refused: an answer is text.
|
|
502
|
+
: > "$log"
|
|
503
|
+
env PATH="$fb:$PATH" FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
504
|
+
"$SEND" t7 --resolve-key k --key Enter >/dev/null 2>"$err"; rc=$?
|
|
505
|
+
[ "$rc" -ne 0 ] || fail "--resolve-key before --key should refuse"
|
|
506
|
+
assert_contains "$(cat "$err")" "cannot accompany --key" "the --key refusal should be explicit"
|
|
507
|
+
: > "$log"
|
|
508
|
+
env PATH="$fb:$PATH" FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
509
|
+
"$SEND" t7 --key Enter --resolve-key k >/dev/null 2>"$err"; rc=$?
|
|
510
|
+
[ "$rc" -ne 0 ] || fail "--resolve-key after --key should refuse instead of being silently dropped"
|
|
511
|
+
assert_contains "$(cat "$err")" "cannot accompany --key" "the trailing --resolve-key refusal should be explicit"
|
|
512
|
+
|
|
513
|
+
# An empty answer message is refused.
|
|
514
|
+
env PATH="$fb:$PATH" FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
515
|
+
"$SEND" t7 --resolve-key k >/dev/null 2>"$err"; rc=$?
|
|
516
|
+
[ "$rc" -ne 0 ] || fail "an empty answer message should refuse"
|
|
517
|
+
assert_contains "$(cat "$err")" "nonempty answer message" "the empty-message refusal should be explicit"
|
|
518
|
+
|
|
519
|
+
# An explicit backend target has no task ledger in this home.
|
|
520
|
+
env PATH="$fb:$PATH" FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
521
|
+
"$SEND" sess:elsewhere --resolve-key k "answer" >/dev/null 2>"$err"; rc=$?
|
|
522
|
+
[ "$rc" -ne 0 ] || fail "an explicit backend target should refuse --resolve-key"
|
|
523
|
+
assert_contains "$(cat "$err")" "no decision ledger" "the explicit-target refusal should be explicit"
|
|
524
|
+
|
|
525
|
+
# A malformed key is refused before anything else.
|
|
526
|
+
env PATH="$fb:$PATH" FM_ROOT_OVERRIDE="$home" FM_HOME="$home" FM_SEND_LOG="$log" FM_SEND_SETTLE=0 \
|
|
527
|
+
"$SEND" t7 --resolve-key 'bad key!' "answer" >/dev/null 2>"$err"; rc=$?
|
|
528
|
+
[ "$rc" -ne 0 ] || fail "a malformed key should refuse"
|
|
529
|
+
assert_contains "$(cat "$err")" "not a valid decision key" "the malformed-key refusal should be explicit"
|
|
530
|
+
|
|
531
|
+
[ ! -s "$log" ] || fail "a refused misuse still typed text: $(cat "$log")"
|
|
532
|
+
if grep -F 'resolved' "$home/state/t7.status" >/dev/null; then
|
|
533
|
+
fail "a refused misuse still closed something: $(cat "$home/state/t7.status")"
|
|
534
|
+
fi
|
|
535
|
+
pass "fm-send --resolve-key: --key, empty message, explicit targets, and malformed keys refuse loudly"
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
test_answer_send_closes_open_decision
|
|
539
|
+
test_answer_close_is_self_announced
|
|
540
|
+
test_colon_first_key_position_is_answerable
|
|
541
|
+
test_answer_starts_work_never_orphans
|
|
542
|
+
test_routine_steer_never_closes
|
|
543
|
+
test_not_open_key_refuses_before_send
|
|
544
|
+
test_failed_ring_still_closes_at_enqueue
|
|
545
|
+
test_failed_enqueue_does_not_close
|
|
546
|
+
test_multiple_keys_close_together
|
|
547
|
+
test_local_secondmate_answer_marked_and_closed
|
|
548
|
+
test_remote_secondmate_answer_closes_locally
|
|
549
|
+
test_remote_reply_corr_tag_does_not_block_resolve_key
|
|
550
|
+
test_remote_transport_failure_does_not_close
|
|
551
|
+
test_flag_misuse_refuses
|