@zerwiz/ymir 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +290 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml +50 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +9 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/config/tailscale-sync.yaml +27 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/kaia.engram +0 -0
- package/.agents/memory/kaia.engram-shm +0 -0
- package/.agents/memory/kaia.engram-wal +0 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/memory/well/episodes.jsonl +367 -0
- package/.agents/memory/well/workspace.jsonl +27 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +111 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +70 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +52 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +34 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +454 -0
- package/CHANGELOG.md +881 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +113 -39
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +65 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +58 -0
- package/RULES/07-config.md +45 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/README.md +20 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +98 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +233 -0
- package/bin/apodex-smoke-test.sh +92 -0
- package/bin/bifrost-bridge.sh +112 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +107 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +38 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-guard.sh +165 -0
- package/bin/crash-sense.sh +160 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +207 -0
- package/bin/eindri-acclaim.sh +34 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seen.sh +41 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +85 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +112 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/fleet-apply.sh +68 -0
- package/bin/github-deploy.sh +81 -0
- package/bin/gjallarhorn-expose.sh +102 -0
- package/bin/gjallarhorn-notify.sh +58 -0
- package/bin/gjallarhorn-purge.sh +54 -0
- package/bin/gjallarhorn-tunnel.sh +72 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +122 -0
- package/bin/hall-snapshot.sh +92 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +431 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hoard-lib.sh +25 -0
- package/bin/hodd.sh +78 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +108 -0
- package/bin/local-model-lock.sh +51 -0
- package/bin/mimir-bridge.py +226 -0
- package/bin/mimir-bridge.sh +87 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +59 -0
- package/bin/mjollnir.sh +85 -0
- package/bin/model-hardware.sh +82 -0
- package/bin/model-resolve.sh +147 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +148 -0
- package/bin/omarchy-plugins.sh +174 -0
- package/bin/omarchy-sense.sh +149 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +38 -0
- package/bin/project-git.sh +55 -0
- package/bin/public-guard.sh +70 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +91 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +90 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +76 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +190 -0
- package/bin/telegram-bot.sh +69 -0
- package/bin/toolchain.sh +74 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +260 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +47 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +150 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +641 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +97 -0
- package/bin/ymir-setup-auth.sh +108 -0
- package/bin/ymir-validate.sh +173 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1056 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +44 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +210 -0
- package/scripts/start.sh +167 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Behavior tests for the remote transport's per-home lanes, caller-disconnect
|
|
3
|
+
# cancellation, stdin default, and staging-litter reaping.
|
|
4
|
+
#
|
|
5
|
+
# Pins, against the real worker and the real fm-on -> entrypoint transport
|
|
6
|
+
# (through the deterministic FM_SSH_BIN seam tests/fm-on.test.sh proves
|
|
7
|
+
# preserves exit status):
|
|
8
|
+
# T9: a job for home B completes while home A runs a long job, and two
|
|
9
|
+
# A-jobs execute strictly in stage order even when staged rapidly.
|
|
10
|
+
# T3: a caller killed mid-wait cancels its job - the worker never executes a
|
|
11
|
+
# cancelled queued job and terminates a running cancelled job's process
|
|
12
|
+
# group - and a caller whose parent dies without delivering a signal
|
|
13
|
+
# (the dead-ssh-channel shape) cancels the same way; afterwards a burst
|
|
14
|
+
# of short commands completes with no convoy.
|
|
15
|
+
# T6: a non-payload fm-on call with an OPEN stdin pipe completes instead of
|
|
16
|
+
# wedging staging, and a payload caller with --stdin still delivers its
|
|
17
|
+
# bytes through the worker.
|
|
18
|
+
# Stage litter older than the reap age does not survive a worker pass while
|
|
19
|
+
# fresh staging does.
|
|
20
|
+
set -u
|
|
21
|
+
|
|
22
|
+
# shellcheck source=tests/lib.sh
|
|
23
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
24
|
+
|
|
25
|
+
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)
|
|
26
|
+
# shellcheck source=bin/fm-timeout-lib.sh
|
|
27
|
+
. "$ROOT/bin/fm-timeout-lib.sh"
|
|
28
|
+
|
|
29
|
+
TMP_ROOT=$(fm_test_tmproot fm-remote-transport-lanes)
|
|
30
|
+
mkdir -p "$TMP_ROOT"
|
|
31
|
+
TMP_ROOT=$(cd "$TMP_ROOT" && pwd -P)
|
|
32
|
+
REMOTE_ROOT="$TMP_ROOT/remote-root"
|
|
33
|
+
HOME_A="$TMP_ROOT/home-a"
|
|
34
|
+
HOME_B="$TMP_ROOT/home-b"
|
|
35
|
+
HOME_EDGE="$TMP_ROOT/home-a "
|
|
36
|
+
LOCAL_HOME="$TMP_ROOT/local-home"
|
|
37
|
+
ACCOUNT_HOME="$TMP_ROOT/account"
|
|
38
|
+
STATE_ROOT="$TMP_ROOT/remote-jobs"
|
|
39
|
+
FAKEBIN=$(fm_fakebin "$TMP_ROOT/fakebin")
|
|
40
|
+
mkdir -p "$REMOTE_ROOT/bin" "$HOME_A" "$HOME_B" "$HOME_EDGE" "$LOCAL_HOME/data" "$ACCOUNT_HOME"
|
|
41
|
+
|
|
42
|
+
cleanup_lane_fixture() {
|
|
43
|
+
if [ -f "$STATE_ROOT/worker.pid" ]; then
|
|
44
|
+
fm_remote_job_stop_worker_tree "$(cat "$STATE_ROOT/worker.pid")" || true
|
|
45
|
+
fi
|
|
46
|
+
rm -rf -- "$TMP_ROOT"
|
|
47
|
+
}
|
|
48
|
+
trap cleanup_lane_fixture EXIT
|
|
49
|
+
|
|
50
|
+
cp "$ROOT/bin/fm-remote-job-lib.sh" "$ROOT/bin/fm-remote-job-worker.sh" \
|
|
51
|
+
"$ROOT/bin/fm-remote-entrypoint.sh" "$ROOT/bin/fm-remote-delta-read.sh" \
|
|
52
|
+
"$ROOT/bin/fm-remote-secondmate-control.sh" "$ROOT/bin/fm-backend.sh" \
|
|
53
|
+
"$ROOT/bin/fm-pending-reply-lib.sh" "$ROOT/bin/fm-task-inbox-lib.sh" \
|
|
54
|
+
"$ROOT/bin/fm-wake-lib.sh" "$ROOT/bin/fm-marker-lib.sh" \
|
|
55
|
+
"$ROOT/bin/fm-operational-input.sh" "$ROOT/bin/fm-tmux-lib.sh" \
|
|
56
|
+
"$ROOT/bin/fm-composer-lib.sh" "$ROOT/bin/fm-cursor-lib.sh" \
|
|
57
|
+
"$ROOT/bin/fm-classify-lib.sh" "$ROOT/bin/fm-timeout-lib.sh" \
|
|
58
|
+
"$REMOTE_ROOT/bin/"
|
|
59
|
+
mkdir -p "$REMOTE_ROOT/bin/backends"
|
|
60
|
+
cp "$ROOT/bin/backends/herdr.sh" "$REMOTE_ROOT/bin/backends/herdr.sh"
|
|
61
|
+
printf 'fixture\n' > "$REMOTE_ROOT/AGENTS.md"
|
|
62
|
+
# Appends its tag to a shared log, then optionally sleeps: the log order is the
|
|
63
|
+
# observable execution order.
|
|
64
|
+
cat > "$REMOTE_ROOT/bin/fm-mark-job.sh" <<'SH'
|
|
65
|
+
#!/bin/bash
|
|
66
|
+
printf '%s\n' "$1" >> "$2"
|
|
67
|
+
sleep "${3:-0}"
|
|
68
|
+
SH
|
|
69
|
+
cat > "$REMOTE_ROOT/bin/fm-touch-job.sh" <<'SH'
|
|
70
|
+
#!/bin/bash
|
|
71
|
+
printf 'ran\n' > "$1"
|
|
72
|
+
SH
|
|
73
|
+
# Marks its start, sleeps, then marks completion: cancellation must leave the
|
|
74
|
+
# start marker without the completion marker.
|
|
75
|
+
cat > "$REMOTE_ROOT/bin/fm-two-phase-job.sh" <<'SH'
|
|
76
|
+
#!/bin/bash
|
|
77
|
+
printf 'started\n' > "$1"
|
|
78
|
+
sleep "$3"
|
|
79
|
+
printf 'finished\n' > "$2"
|
|
80
|
+
SH
|
|
81
|
+
cat > "$REMOTE_ROOT/bin/fm-stdin-probe.sh" <<'SH'
|
|
82
|
+
#!/bin/bash
|
|
83
|
+
while IFS= read -r line || [ -n "$line" ]; do printf 'stdin=%s\n' "$line"; done
|
|
84
|
+
SH
|
|
85
|
+
chmod +x "$REMOTE_ROOT/bin"/*.sh
|
|
86
|
+
git -C "$REMOTE_ROOT" init -q -b main
|
|
87
|
+
git -C "$REMOTE_ROOT" config user.email test@example.com
|
|
88
|
+
git -C "$REMOTE_ROOT" config user.name Test
|
|
89
|
+
git -C "$REMOTE_ROOT" add AGENTS.md bin
|
|
90
|
+
git -C "$REMOTE_ROOT" commit -qm 'lane transport fixture'
|
|
91
|
+
|
|
92
|
+
# ios routes to home A, build routes to home B.
|
|
93
|
+
cat > "$LOCAL_HOME/data/secondmates.md" <<EOF
|
|
94
|
+
- ios - iOS delivery (host: remote-mac; root: $REMOTE_ROOT; home: $HOME_A; scope: iOS work; projects: alpha; added 2026-08-02)
|
|
95
|
+
- build - build delivery (host: remote-mac; root: $REMOTE_ROOT; home: $HOME_B; scope: build work; projects: beta; added 2026-08-02)
|
|
96
|
+
EOF
|
|
97
|
+
|
|
98
|
+
cat > "$FAKEBIN/fake-ssh" <<'SH'
|
|
99
|
+
#!/usr/bin/env bash
|
|
100
|
+
while [ "$#" -gt 0 ]; do
|
|
101
|
+
case "$1" in
|
|
102
|
+
-o) shift 2 ;;
|
|
103
|
+
--) shift; break ;;
|
|
104
|
+
*) exit 90 ;;
|
|
105
|
+
esac
|
|
106
|
+
done
|
|
107
|
+
shift 2
|
|
108
|
+
exec "$FM_FAKE_REMOTE_ENTRYPOINT" "$@"
|
|
109
|
+
SH
|
|
110
|
+
chmod +x "$FAKEBIN/fake-ssh"
|
|
111
|
+
|
|
112
|
+
export FM_REMOTE_JOB_STATE_ROOT="$STATE_ROOT"
|
|
113
|
+
export FM_REMOTE_JOB_PLATFORM_OVERRIDE=Linux
|
|
114
|
+
export FM_REMOTE_JOB_QUEUE_TIMEOUT=60
|
|
115
|
+
export FM_REMOTE_JOB_TIMEOUT=30
|
|
116
|
+
export FM_REMOTE_JOB_STAGE_REAP_SECONDS=1
|
|
117
|
+
# shellcheck source=bin/fm-remote-job-lib.sh
|
|
118
|
+
. "$ROOT/bin/fm-remote-job-lib.sh"
|
|
119
|
+
|
|
120
|
+
fm_remote_job_prepare_state "$ACCOUNT_HOME" || fail "$FM_REMOTE_JOB_ERROR"
|
|
121
|
+
rm -f -- "$STATE_ROOT/seq"
|
|
122
|
+
SEQ_PIDS=()
|
|
123
|
+
for i in $(seq 1 20); do
|
|
124
|
+
fm_remote_job_next_seq > "$TMP_ROOT/seq-$i" &
|
|
125
|
+
SEQ_PIDS+=("$!")
|
|
126
|
+
done
|
|
127
|
+
for pid in "${SEQ_PIDS[@]}"; do
|
|
128
|
+
wait "$pid" || fail "a concurrent sequence allocator failed"
|
|
129
|
+
done
|
|
130
|
+
SEQ_RESULTS=$(cat "$TMP_ROOT"/seq-* | sort -n)
|
|
131
|
+
SEQ_EXPECTED=$(seq 1 20)
|
|
132
|
+
[ "$SEQ_RESULTS" = "$SEQ_EXPECTED" ] \
|
|
133
|
+
|| fail "concurrent sequence claims were not unique and monotonic: $SEQ_RESULTS"
|
|
134
|
+
[ "$(find "$STATE_ROOT/.seq-claims" -mindepth 1 -maxdepth 1 -type d | wc -l | tr -d ' ')" = 20 ] \
|
|
135
|
+
|| fail "concurrent sequence allocations did not retain every durable claim"
|
|
136
|
+
mkdir "$STATE_ROOT/.seq-claims/999998" "$STATE_ROOT/.seq-claims/999999"
|
|
137
|
+
touch -t 200001010000 "$STATE_ROOT/.seq-claims/999998"
|
|
138
|
+
fm_remote_job_reap_stale "$ACCOUNT_HOME" || fail "sequence claim reaping failed"
|
|
139
|
+
assert_absent "$STATE_ROOT/.seq-claims/999998" "an expired sequence claim survived stale reaping"
|
|
140
|
+
assert_present "$STATE_ROOT/.seq-claims/999999" "a fresh sequence claim was reaped"
|
|
141
|
+
mkdir "$STATE_ROOT/.seq-claims/999997"
|
|
142
|
+
touch -t 200001010000 "$STATE_ROOT/.seq-claims/999997"
|
|
143
|
+
fm_remote_job_reap_stale "$ACCOUNT_HOME" || fail "rate-limited sequence claim reaping failed"
|
|
144
|
+
assert_present "$STATE_ROOT/.seq-claims/999997" "sequence claims were rescanned before the hourly interval"
|
|
145
|
+
touch -t 200001010000 "$STATE_ROOT/.seq-claims-reaped"
|
|
146
|
+
fm_remote_job_reap_stale "$ACCOUNT_HOME" || fail "expired sequence claim reaping failed"
|
|
147
|
+
assert_absent "$STATE_ROOT/.seq-claims/999997" "an expired sequence claim survived the next hourly scan"
|
|
148
|
+
rmdir "$STATE_ROOT/.seq-claims/999999"
|
|
149
|
+
pass "atomic sequence claims remain unique and reap only after expiry"
|
|
150
|
+
|
|
151
|
+
fm_on() {
|
|
152
|
+
FM_HOME="$LOCAL_HOME" \
|
|
153
|
+
FM_ROOT_OVERRIDE="$REMOTE_ROOT" \
|
|
154
|
+
FM_SSH_BIN="$FAKEBIN/fake-ssh" \
|
|
155
|
+
FM_FAKE_REMOTE_ENTRYPOINT="$REMOTE_ROOT/bin/fm-remote-entrypoint.sh" \
|
|
156
|
+
"$ROOT/bin/fm-on.sh" "$@"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
job_state() { # <id>
|
|
160
|
+
fm_remote_job_read_state "$STATE_ROOT/jobs/$1" 2>/dev/null || true
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
wait_for_state() { # <id> <state>
|
|
164
|
+
local i=0
|
|
165
|
+
while [ "$i" -lt 200 ]; do
|
|
166
|
+
[ "$(job_state "$1")" = "$2" ] && return 0
|
|
167
|
+
i=$((i + 1))
|
|
168
|
+
sleep 0.05
|
|
169
|
+
done
|
|
170
|
+
return 1
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
HOME="$ACCOUNT_HOME" FM_ROOT_OVERRIDE="$REMOTE_ROOT" FM_REMOTE_JOB_STATE_ROOT="$STATE_ROOT" \
|
|
174
|
+
FM_REMOTE_JOB_PLATFORM_OVERRIDE=Linux \
|
|
175
|
+
"$REMOTE_ROOT/bin/fm-remote-job-worker.sh" > "$TMP_ROOT/worker.out" 2> "$TMP_ROOT/worker.err" &
|
|
176
|
+
for _ in $(seq 1 100); do
|
|
177
|
+
[ -f "$STATE_ROOT/worker.ready" ] && break
|
|
178
|
+
sleep 0.05
|
|
179
|
+
done
|
|
180
|
+
assert_present "$STATE_ROOT/worker.ready" "the worker did not publish its readiness heartbeat"
|
|
181
|
+
|
|
182
|
+
# T9: home B's job completes while home A runs a long job, and A's queued job
|
|
183
|
+
# stays strictly behind A's running job.
|
|
184
|
+
LOG_A="$TMP_ROOT/log-a"
|
|
185
|
+
LOG_B="$TMP_ROOT/log-b"
|
|
186
|
+
fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_A" fm-mark-job.sh a1 "$LOG_A" 4 < /dev/null > /dev/null
|
|
187
|
+
A1=$FM_REMOTE_JOB_ID
|
|
188
|
+
wait_for_state "$A1" running || fail "home A's long job did not begin running"
|
|
189
|
+
fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_A" fm-mark-job.sh a2 "$LOG_A" 0 < /dev/null > /dev/null
|
|
190
|
+
A2=$FM_REMOTE_JOB_ID
|
|
191
|
+
fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_EDGE" fm-mark-job.sh b1 "$LOG_B" 0 < /dev/null > /dev/null
|
|
192
|
+
B1=$FM_REMOTE_JOB_ID
|
|
193
|
+
B_BEGAN=$(date +%s)
|
|
194
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$B1" || fail "$FM_REMOTE_JOB_ERROR"
|
|
195
|
+
B_ELAPSED=$(( $(date +%s) - B_BEGAN ))
|
|
196
|
+
[ "$FM_REMOTE_JOB_EXIT" -eq 0 ] || fail "home B's job behind home A's long job did not complete"
|
|
197
|
+
[ "$B_ELAPSED" -le 3 ] || fail "home B's job waited ${B_ELAPSED}s behind home A's long job"
|
|
198
|
+
[ "$(job_state "$A1")" = running ] || fail "home A's long job should still be running for the FIFO assertion"
|
|
199
|
+
[ "$(cat "$LOG_A")" = a1 ] || fail "home A's queued job ran beside its running job: $(cat "$LOG_A")"
|
|
200
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$B1" || fail "home B's job could not be reaped"
|
|
201
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$A1" || fail "$FM_REMOTE_JOB_ERROR"
|
|
202
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$A2" || fail "$FM_REMOTE_JOB_ERROR"
|
|
203
|
+
[ "$(printf '%s' "$(cat "$LOG_A")")" = "$(printf 'a1\na2')" ] \
|
|
204
|
+
|| fail "home A's jobs did not execute in stage order: $(cat "$LOG_A")"
|
|
205
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$A1" || fail "home A's first job could not be reaped"
|
|
206
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$A2" || fail "home A's second job could not be reaped"
|
|
207
|
+
pass "lanes run homes concurrently while each home stays FIFO"
|
|
208
|
+
|
|
209
|
+
# T9 stage order: five jobs staged in rapid succession behind a busy lane must
|
|
210
|
+
# execute in staging-sequence order, not the queue directory's random-id order.
|
|
211
|
+
: > "$LOG_A"
|
|
212
|
+
fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_A" fm-mark-job.sh hold "$LOG_A" 2 < /dev/null > /dev/null
|
|
213
|
+
HOLD=$FM_REMOTE_JOB_ID
|
|
214
|
+
wait_for_state "$HOLD" running || fail "the lane-holding job did not begin running"
|
|
215
|
+
RAPID_IDS=()
|
|
216
|
+
for tag in r1 r2 r3 r4 r5; do
|
|
217
|
+
fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_A" fm-mark-job.sh "$tag" "$LOG_A" 0 < /dev/null > /dev/null
|
|
218
|
+
RAPID_IDS+=("$FM_REMOTE_JOB_ID")
|
|
219
|
+
done
|
|
220
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$HOLD" || fail "$FM_REMOTE_JOB_ERROR"
|
|
221
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$HOLD" || true
|
|
222
|
+
for id in "${RAPID_IDS[@]}"; do
|
|
223
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$id" || fail "$FM_REMOTE_JOB_ERROR"
|
|
224
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$id" || true
|
|
225
|
+
done
|
|
226
|
+
[ "$(cat "$LOG_A")" = "$(printf 'hold\nr1\nr2\nr3\nr4\nr5')" ] \
|
|
227
|
+
|| fail "rapidly staged same-home jobs did not execute in stage order: $(tr '\n' ' ' < "$LOG_A")"
|
|
228
|
+
pass "same-home jobs staged in the same second execute in staging-sequence order"
|
|
229
|
+
|
|
230
|
+
: > "$LOG_A"
|
|
231
|
+
fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_A" fm-mark-job.sh publish-hold "$LOG_A" 3 < /dev/null > /dev/null
|
|
232
|
+
PUBLISH_HOLD=$FM_REMOTE_JOB_ID
|
|
233
|
+
wait_for_state "$PUBLISH_HOLD" running || fail "the publication-order lane holder did not begin running"
|
|
234
|
+
(
|
|
235
|
+
{
|
|
236
|
+
printf 'delayed payload\n'
|
|
237
|
+
sleep 5
|
|
238
|
+
} | fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_A" \
|
|
239
|
+
fm-mark-job.sh delayed "$LOG_A" 0
|
|
240
|
+
) > "$TMP_ROOT/delayed-stage-id" &
|
|
241
|
+
DELAYED_STAGE_PID=$!
|
|
242
|
+
for _ in $(seq 1 200); do
|
|
243
|
+
ls "$STATE_ROOT/jobs"/.stage.* >/dev/null 2>&1 && break
|
|
244
|
+
sleep 0.02
|
|
245
|
+
done
|
|
246
|
+
ls "$STATE_ROOT/jobs"/.stage.* >/dev/null 2>&1 \
|
|
247
|
+
|| fail "the delayed stdin stage did not begin capturing"
|
|
248
|
+
fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_A" fm-mark-job.sh fast "$LOG_A" 0 < /dev/null > /dev/null
|
|
249
|
+
FAST_STAGE=$FM_REMOTE_JOB_ID
|
|
250
|
+
wait "$DELAYED_STAGE_PID" || fail "the delayed stdin stage failed to publish"
|
|
251
|
+
DELAYED_STAGE=$(cat "$TMP_ROOT/delayed-stage-id")
|
|
252
|
+
FAST_SEQ=$(fm_remote_job_read_number "$STATE_ROOT/jobs/$FAST_STAGE" seq) \
|
|
253
|
+
|| fail "the fast stage lost its sequence"
|
|
254
|
+
DELAYED_SEQ=$(fm_remote_job_read_number "$STATE_ROOT/jobs/$DELAYED_STAGE" seq) \
|
|
255
|
+
|| fail "the delayed stage lost its sequence"
|
|
256
|
+
[ "$FAST_SEQ" -lt "$DELAYED_SEQ" ] \
|
|
257
|
+
|| fail "sequence order did not follow publication order: fast=$FAST_SEQ delayed=$DELAYED_SEQ"
|
|
258
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$PUBLISH_HOLD" || fail "$FM_REMOTE_JOB_ERROR"
|
|
259
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$FAST_STAGE" || fail "$FM_REMOTE_JOB_ERROR"
|
|
260
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$DELAYED_STAGE" || fail "$FM_REMOTE_JOB_ERROR"
|
|
261
|
+
[ "$(cat "$LOG_A")" = "$(printf 'publish-hold\nfast\ndelayed')" ] \
|
|
262
|
+
|| fail "execution order diverged from publication sequence: $(tr '\n' ' ' < "$LOG_A")"
|
|
263
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$PUBLISH_HOLD" || true
|
|
264
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$FAST_STAGE" || true
|
|
265
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$DELAYED_STAGE" || true
|
|
266
|
+
pass "same-home sequence order follows completed staging publication"
|
|
267
|
+
|
|
268
|
+
# T3a: a caller killed while its job is still queued cancels it; the worker
|
|
269
|
+
# never executes it.
|
|
270
|
+
fm_remote_job_stage "$ACCOUNT_HOME" "$REMOTE_ROOT" "$HOME_A" fm-mark-job.sh hold2 "$LOG_A" 4 < /dev/null > /dev/null
|
|
271
|
+
HOLD2=$FM_REMOTE_JOB_ID
|
|
272
|
+
wait_for_state "$HOLD2" running || fail "the cancellation fixture's lane holder did not begin running"
|
|
273
|
+
QUEUED_EFFECT="$TMP_ROOT/queued-cancel-effect"
|
|
274
|
+
fm_on ios fm-touch-job.sh "$QUEUED_EFFECT" > /dev/null 2>&1 &
|
|
275
|
+
QUEUED_CALLER=$!
|
|
276
|
+
QUEUED_JOB=
|
|
277
|
+
for _ in $(seq 1 200); do
|
|
278
|
+
for job in "$STATE_ROOT"/jobs/job-*; do
|
|
279
|
+
[ -d "$job" ] || continue
|
|
280
|
+
[ "${job##*/}" = "$HOLD2" ] && continue
|
|
281
|
+
[ "$(job_state "${job##*/}")" = queued ] && QUEUED_JOB=${job##*/} && break
|
|
282
|
+
done
|
|
283
|
+
[ -n "$QUEUED_JOB" ] && break
|
|
284
|
+
sleep 0.05
|
|
285
|
+
done
|
|
286
|
+
[ -n "$QUEUED_JOB" ] || fail "the doomed caller's job never appeared in the queue"
|
|
287
|
+
kill -TERM "$QUEUED_CALLER" 2>/dev/null || true
|
|
288
|
+
wait "$QUEUED_CALLER" 2>/dev/null || true
|
|
289
|
+
for _ in $(seq 1 200); do
|
|
290
|
+
[ ! -d "$STATE_ROOT/jobs/$QUEUED_JOB" ] && break
|
|
291
|
+
sleep 0.05
|
|
292
|
+
done
|
|
293
|
+
[ ! -d "$STATE_ROOT/jobs/$QUEUED_JOB" ] \
|
|
294
|
+
|| fail "the cancelled queued job's record survived (state: $(job_state "$QUEUED_JOB"))"
|
|
295
|
+
fm_remote_job_wait "$ACCOUNT_HOME" "$HOLD2" || fail "$FM_REMOTE_JOB_ERROR"
|
|
296
|
+
fm_remote_job_reap "$ACCOUNT_HOME" "$HOLD2" || true
|
|
297
|
+
sleep 1
|
|
298
|
+
assert_absent "$QUEUED_EFFECT" "the worker executed a queued job whose caller was killed"
|
|
299
|
+
pass "a caller killed mid-wait cancels its queued job before execution"
|
|
300
|
+
|
|
301
|
+
# T3b: a caller killed while its job is running terminates the job's process
|
|
302
|
+
# group instead of letting it run to completion for nobody.
|
|
303
|
+
RUN_START="$TMP_ROOT/running-cancel-start"
|
|
304
|
+
RUN_FINISH="$TMP_ROOT/running-cancel-finish"
|
|
305
|
+
fm_on build fm-two-phase-job.sh "$RUN_START" "$RUN_FINISH" 8 > /dev/null 2>&1 &
|
|
306
|
+
RUNNING_CALLER=$!
|
|
307
|
+
for _ in $(seq 1 200); do
|
|
308
|
+
[ -f "$RUN_START" ] && break
|
|
309
|
+
sleep 0.05
|
|
310
|
+
done
|
|
311
|
+
assert_present "$RUN_START" "the running-cancellation fixture never started"
|
|
312
|
+
kill -TERM "$RUNNING_CALLER" 2>/dev/null || true
|
|
313
|
+
wait "$RUNNING_CALLER" 2>/dev/null || true
|
|
314
|
+
CANCEL_BEGAN=$(date +%s)
|
|
315
|
+
for _ in $(seq 1 200); do
|
|
316
|
+
ls "$STATE_ROOT"/jobs/job-* >/dev/null 2>&1 || break
|
|
317
|
+
sleep 0.05
|
|
318
|
+
done
|
|
319
|
+
CANCEL_ELAPSED=$(( $(date +%s) - CANCEL_BEGAN ))
|
|
320
|
+
ls "$STATE_ROOT"/jobs/job-* >/dev/null 2>&1 \
|
|
321
|
+
&& fail "the cancelled running job's record survived"
|
|
322
|
+
[ "$CANCEL_ELAPSED" -le 6 ] || fail "running-job cancellation took ${CANCEL_ELAPSED}s"
|
|
323
|
+
sleep 2
|
|
324
|
+
assert_absent "$RUN_FINISH" "a cancelled running job's process group ran to completion"
|
|
325
|
+
pass "a caller killed mid-wait stops its running job's process group"
|
|
326
|
+
|
|
327
|
+
# T3c: a caller whose parent exits WITHOUT delivering any signal - the shape a
|
|
328
|
+
# dead ssh channel leaves behind - still cancels through the entrypoint's
|
|
329
|
+
# parent-liveness probe.
|
|
330
|
+
ORPHAN_START="$TMP_ROOT/orphan-cancel-start"
|
|
331
|
+
ORPHAN_FINISH="$TMP_ROOT/orphan-cancel-finish"
|
|
332
|
+
# shellcheck disable=SC2016 # Expansion is deliberately deferred to the child shell.
|
|
333
|
+
env FM_HOME="$LOCAL_HOME" FM_ROOT_OVERRIDE="$REMOTE_ROOT" \
|
|
334
|
+
FM_SSH_BIN="$FAKEBIN/fake-ssh" \
|
|
335
|
+
FM_FAKE_REMOTE_ENTRYPOINT="$REMOTE_ROOT/bin/fm-remote-entrypoint.sh" \
|
|
336
|
+
FM_REMOTE_JOB_STATE_ROOT="$STATE_ROOT" FM_REMOTE_JOB_PLATFORM_OVERRIDE=Linux \
|
|
337
|
+
bash -c '
|
|
338
|
+
"$1/bin/fm-on.sh" build fm-two-phase-job.sh "$2" "$3" 12 >/dev/null 2>&1 &
|
|
339
|
+
while [ ! -f "$2" ]; do sleep 0.1; done
|
|
340
|
+
' _ "$ROOT" "$ORPHAN_START" "$ORPHAN_FINISH"
|
|
341
|
+
assert_present "$ORPHAN_START" "the orphan-cancellation fixture never started"
|
|
342
|
+
ORPHAN_BEGAN=$(date +%s)
|
|
343
|
+
for _ in $(seq 1 300); do
|
|
344
|
+
ls "$STATE_ROOT"/jobs/job-* >/dev/null 2>&1 || break
|
|
345
|
+
sleep 0.05
|
|
346
|
+
done
|
|
347
|
+
ORPHAN_ELAPSED=$(( $(date +%s) - ORPHAN_BEGAN ))
|
|
348
|
+
ls "$STATE_ROOT"/jobs/job-* >/dev/null 2>&1 \
|
|
349
|
+
&& fail "the orphaned caller's job record survived its disconnect"
|
|
350
|
+
[ "$ORPHAN_ELAPSED" -le 10 ] || fail "orphan-disconnect cancellation took ${ORPHAN_ELAPSED}s"
|
|
351
|
+
sleep 2
|
|
352
|
+
assert_absent "$ORPHAN_FINISH" "a job abandoned by a signal-less disconnect ran to completion"
|
|
353
|
+
pass "a signal-less caller disconnect cancels the abandoned job through the parent probe"
|
|
354
|
+
|
|
355
|
+
# T3: after the cancellations, a burst of short bounded commands meets its own
|
|
356
|
+
# budget - no convoy behind abandoned work.
|
|
357
|
+
BURST_BEGAN=$(date +%s)
|
|
358
|
+
for tag in c1 c2 c3; do
|
|
359
|
+
rc=0
|
|
360
|
+
fm_run_timed 15 env FM_HOME="$LOCAL_HOME" FM_ROOT_OVERRIDE="$REMOTE_ROOT" \
|
|
361
|
+
FM_SSH_BIN="$FAKEBIN/fake-ssh" \
|
|
362
|
+
FM_FAKE_REMOTE_ENTRYPOINT="$REMOTE_ROOT/bin/fm-remote-entrypoint.sh" \
|
|
363
|
+
FM_REMOTE_JOB_STATE_ROOT="$STATE_ROOT" FM_REMOTE_JOB_PLATFORM_OVERRIDE=Linux \
|
|
364
|
+
"$ROOT/bin/fm-on.sh" ios fm-touch-job.sh "$TMP_ROOT/burst-$tag" >/dev/null 2>&1 || rc=$?
|
|
365
|
+
[ "$rc" -eq 0 ] || fail "post-cancellation burst command $tag failed with $rc"
|
|
366
|
+
assert_present "$TMP_ROOT/burst-$tag" "post-cancellation burst command $tag did not run"
|
|
367
|
+
done
|
|
368
|
+
BURST_ELAPSED=$(( $(date +%s) - BURST_BEGAN ))
|
|
369
|
+
[ "$BURST_ELAPSED" -le 12 ] || fail "the post-cancellation burst convoyed for ${BURST_ELAPSED}s"
|
|
370
|
+
pass "bounded reads after a cancellation meet their own budget with no convoy"
|
|
371
|
+
|
|
372
|
+
# T6: a non-payload call with an OPEN stdin pipe completes instead of wedging
|
|
373
|
+
# staging on a stdin capture that never reaches EOF.
|
|
374
|
+
printf 'rsm\n' > "$HOME_A/.fm-secondmate-home"
|
|
375
|
+
printf '# fixture secondmate home\n' > "$HOME_A/AGENTS.md"
|
|
376
|
+
mkdir -p "$HOME_A/state" "$HOME_A/bin"
|
|
377
|
+
rc=0
|
|
378
|
+
fm_run_timed 20 env FM_HOME="$LOCAL_HOME" FM_ROOT_OVERRIDE="$REMOTE_ROOT" \
|
|
379
|
+
FM_SSH_BIN="$FAKEBIN/fake-ssh" \
|
|
380
|
+
FM_FAKE_REMOTE_ENTRYPOINT="$REMOTE_ROOT/bin/fm-remote-entrypoint.sh" \
|
|
381
|
+
FM_REMOTE_JOB_STATE_ROOT="$STATE_ROOT" FM_REMOTE_JOB_PLATFORM_OVERRIDE=Linux \
|
|
382
|
+
"$ROOT/bin/fm-on.sh" ios fm-remote-secondmate-control.sh state rsm \
|
|
383
|
+
< <(sleep 30) > "$TMP_ROOT/state-out" 2> "$TMP_ROOT/state-err" || rc=$?
|
|
384
|
+
[ "$rc" -ne 124 ] || fail "a control-state call with an open stdin pipe wedged staging"
|
|
385
|
+
assert_grep 'missing' "$TMP_ROOT/state-out" \
|
|
386
|
+
"the control-state call did not complete through the worker: $(cat "$TMP_ROOT/state-err")"
|
|
387
|
+
pass "an open caller stdin no longer wedges a non-payload remote command"
|
|
388
|
+
|
|
389
|
+
# A live explicit stdin stage can exceed the litter age while waiting for EOF;
|
|
390
|
+
# the stale sweep must retain it until its owning entrypoint publishes the job.
|
|
391
|
+
rc=0
|
|
392
|
+
{
|
|
393
|
+
printf 'slow payload one\n'
|
|
394
|
+
sleep 3
|
|
395
|
+
printf 'slow payload two\n'
|
|
396
|
+
} | fm_on --stdin ios fm-stdin-probe.sh > "$TMP_ROOT/slow-payload-out" 2> "$TMP_ROOT/slow-payload-err" || rc=$?
|
|
397
|
+
expect_code 0 "$rc" "a live slow stdin stage must survive stale reaping: $(cat "$TMP_ROOT/slow-payload-err")"
|
|
398
|
+
assert_grep 'stdin=slow payload one' "$TMP_ROOT/slow-payload-out" "the slow stdin stage lost its first bytes"
|
|
399
|
+
assert_grep 'stdin=slow payload two' "$TMP_ROOT/slow-payload-out" "the slow stdin stage was reaped before EOF"
|
|
400
|
+
pass "a live explicit-stdin stage survives the staging-litter age bound"
|
|
401
|
+
|
|
402
|
+
# T6: a payload caller with --stdin still delivers its bytes.
|
|
403
|
+
printf 'payload byte one\npayload byte two\n' > "$TMP_ROOT/payload"
|
|
404
|
+
fm_on --stdin ios fm-stdin-probe.sh < "$TMP_ROOT/payload" > "$TMP_ROOT/payload-out" 2>/dev/null \
|
|
405
|
+
|| fail "the --stdin payload call failed"
|
|
406
|
+
assert_grep 'stdin=payload byte one' "$TMP_ROOT/payload-out" "--stdin did not deliver the payload"
|
|
407
|
+
assert_grep 'stdin=payload byte two' "$TMP_ROOT/payload-out" "--stdin lost part of the payload"
|
|
408
|
+
pass "--stdin still delivers a payload caller's bytes"
|
|
409
|
+
|
|
410
|
+
# Stage litter: an abandoned .stage.* older than the reap age does not survive
|
|
411
|
+
# a worker pass, while staging owned by this live process is left alone even if
|
|
412
|
+
# CI scheduling pauses long enough for it to cross the age bound.
|
|
413
|
+
OLD_STAGE="$STATE_ROOT/jobs/.stage.abandoned"
|
|
414
|
+
LIVE_STAGE="$STATE_ROOT/jobs/.stage.live"
|
|
415
|
+
LIVE_STAGE_BUILD="$STATE_ROOT/jobs/.stage-live-build"
|
|
416
|
+
mkdir -p "$OLD_STAGE" "$LIVE_STAGE_BUILD"
|
|
417
|
+
printf '%s\n' "$$" > "$LIVE_STAGE_BUILD/.owner-pid"
|
|
418
|
+
fm_remote_job_process_start "$$" > "$LIVE_STAGE_BUILD/.owner-start" \
|
|
419
|
+
|| fail "the live staging fixture could not record its owner identity"
|
|
420
|
+
mv -- "$LIVE_STAGE_BUILD" "$LIVE_STAGE"
|
|
421
|
+
touch -t 200001010000 "$OLD_STAGE" "$LIVE_STAGE"
|
|
422
|
+
for _ in $(seq 1 100); do
|
|
423
|
+
[ ! -d "$OLD_STAGE" ] && break
|
|
424
|
+
sleep 0.05
|
|
425
|
+
done
|
|
426
|
+
[ ! -d "$OLD_STAGE" ] || fail "stage litter older than the reap age survived the worker pass"
|
|
427
|
+
assert_present "$LIVE_STAGE" "the worker reaped staging owned by a live process"
|
|
428
|
+
rm -rf -- "$LIVE_STAGE"
|
|
429
|
+
pass "abandoned stage litter is reaped by age while live staging survives"
|
|
430
|
+
|
|
431
|
+
echo "ALL TESTS PASSED"
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Tests for bin/fm-review-diff.sh: when a task has an open PR recorded in meta,
|
|
3
|
+
# the review diff must compare the authoritative base against a freshly fetched
|
|
4
|
+
# PR head, not a stale local branch or a stale recorded pr_head= left behind
|
|
5
|
+
# after no-mistakes fix rounds push to the PR.
|
|
6
|
+
#
|
|
7
|
+
# Matrix:
|
|
8
|
+
# (a) pr= + reachable pr_head=, no remote pull ref -> offline fallback to recorded SHA
|
|
9
|
+
# (b) pr= without pr_head= -> fetch refs/pull/<n>/head and diff that
|
|
10
|
+
# (c) pr= absent -> unchanged worktree-branch diff
|
|
11
|
+
# (d) pr= present but PR head unreachable -> fallback to local branch + warning
|
|
12
|
+
# (e) pr= + STALE recorded pr_head= + newer remote pull head -> must use fetched head
|
|
13
|
+
# (this is the class that bit reviewers holding merges over "missing" fixes)
|
|
14
|
+
set -u
|
|
15
|
+
|
|
16
|
+
# shellcheck source=tests/lib.sh
|
|
17
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
18
|
+
fm_git_identity fmtest fmtest@example.invalid
|
|
19
|
+
|
|
20
|
+
REVIEW_DIFF="$ROOT/bin/fm-review-diff.sh"
|
|
21
|
+
TMP_ROOT=$(fm_test_tmproot fm-review-diff-tests)
|
|
22
|
+
|
|
23
|
+
make_case() {
|
|
24
|
+
local name=$1 case_dir
|
|
25
|
+
case_dir="$TMP_ROOT/$name"
|
|
26
|
+
mkdir -p "$case_dir/state"
|
|
27
|
+
|
|
28
|
+
git init -q --bare "$case_dir/origin.git"
|
|
29
|
+
git -C "$case_dir/origin.git" symbolic-ref HEAD refs/heads/main
|
|
30
|
+
git clone -q "$case_dir/origin.git" "$case_dir/_seed" 2>/dev/null
|
|
31
|
+
printf 'base\n' > "$case_dir/_seed/feature.txt"
|
|
32
|
+
git -C "$case_dir/_seed" add feature.txt
|
|
33
|
+
git -C "$case_dir/_seed" -c user.email=t@t -c user.name=t commit -qm "origin baseline"
|
|
34
|
+
git -C "$case_dir/_seed" push -q origin main
|
|
35
|
+
rm -rf "$case_dir/_seed"
|
|
36
|
+
|
|
37
|
+
git clone -q "$case_dir/origin.git" "$case_dir/project"
|
|
38
|
+
git -C "$case_dir/project" remote set-head origin main 2>/dev/null || true
|
|
39
|
+
git -C "$case_dir/project" worktree add -q -b fm/task-x1 "$case_dir/wt" main
|
|
40
|
+
|
|
41
|
+
touch "$case_dir/state/.last-watcher-beat"
|
|
42
|
+
printf '%s\n' "$case_dir"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
write_task_meta() {
|
|
46
|
+
local case_dir=$1
|
|
47
|
+
shift
|
|
48
|
+
fm_write_meta "$case_dir/state/task-x1.meta" \
|
|
49
|
+
"window=fm-task-x1" \
|
|
50
|
+
"worktree=$case_dir/wt" \
|
|
51
|
+
"project=$case_dir/project" \
|
|
52
|
+
"$@"
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
stale_and_pr_commits() {
|
|
56
|
+
local case_dir=$1
|
|
57
|
+
printf 'stale-local\n' > "$case_dir/wt/feature.txt"
|
|
58
|
+
git -C "$case_dir/wt" add feature.txt
|
|
59
|
+
git -C "$case_dir/wt" commit -qm "stale local branch"
|
|
60
|
+
|
|
61
|
+
git -C "$case_dir/wt" checkout -q -b pr-head-tmp
|
|
62
|
+
printf 'pr-fixed\n' > "$case_dir/wt/feature.txt"
|
|
63
|
+
git -C "$case_dir/wt" add feature.txt
|
|
64
|
+
git -C "$case_dir/wt" commit -qm "pipeline fix on PR"
|
|
65
|
+
PR_SHA=$(git -C "$case_dir/wt" rev-parse HEAD)
|
|
66
|
+
|
|
67
|
+
git -C "$case_dir/wt" checkout -q fm/task-x1
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
run_review_diff() {
|
|
71
|
+
local case_dir=$1
|
|
72
|
+
shift
|
|
73
|
+
FM_ROOT_OVERRIDE="$ROOT" \
|
|
74
|
+
FM_STATE_OVERRIDE="$case_dir/state" \
|
|
75
|
+
"$REVIEW_DIFF" "$@"
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
test_pr_meta_uses_pr_head_not_stale_local() {
|
|
79
|
+
local case_dir out
|
|
80
|
+
case_dir=$(make_case pr-head-sha)
|
|
81
|
+
stale_and_pr_commits "$case_dir"
|
|
82
|
+
# No remote pull ref: fetch fails, recorded pr_head is the offline fallback.
|
|
83
|
+
write_task_meta "$case_dir" \
|
|
84
|
+
"pr=https://github.com/example/repo/pull/9" \
|
|
85
|
+
"pr_head=$PR_SHA"
|
|
86
|
+
|
|
87
|
+
out=$(run_review_diff "$case_dir" task-x1 2> "$case_dir/stderr")
|
|
88
|
+
|
|
89
|
+
assert_contains "$out" '+pr-fixed' "pr-head-sha: diff should show the PR head content"
|
|
90
|
+
assert_not_contains "$out" 'stale-local' "pr-head-sha: diff must not use the stale local branch"
|
|
91
|
+
assert_not_contains "$(cat "$case_dir/stderr")" 'warning: PR head unavailable' \
|
|
92
|
+
"pr-head-sha: should not warn when recorded pr_head is reachable offline"
|
|
93
|
+
pass "fm-review-diff falls back to recorded pr_head when pull head cannot be fetched"
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
test_stale_recorded_pr_head_loses_to_fetched_pull_head() {
|
|
97
|
+
local case_dir out stale_sha
|
|
98
|
+
case_dir=$(make_case stale-recorded)
|
|
99
|
+
stale_and_pr_commits "$case_dir"
|
|
100
|
+
stale_sha=$(git -C "$case_dir/wt" rev-parse fm/task-x1)
|
|
101
|
+
# Remote PR head is newer (pipeline fix); meta still points at the older local tip.
|
|
102
|
+
git -C "$case_dir/wt" push -q origin "pr-head-tmp:refs/pull/9/head"
|
|
103
|
+
write_task_meta "$case_dir" \
|
|
104
|
+
"pr=https://github.com/example/repo/pull/9" \
|
|
105
|
+
"pr_head=$stale_sha"
|
|
106
|
+
|
|
107
|
+
out=$(run_review_diff "$case_dir" task-x1 2> "$case_dir/stderr")
|
|
108
|
+
|
|
109
|
+
assert_contains "$out" '+pr-fixed' \
|
|
110
|
+
"stale-recorded: diff must show the fetched PR head, not the recorded stale SHA"
|
|
111
|
+
assert_not_contains "$out" 'stale-local' \
|
|
112
|
+
"stale-recorded: diff must not use the stale local/recorded content"
|
|
113
|
+
assert_not_contains "$(cat "$case_dir/stderr")" 'warning: PR head unavailable' \
|
|
114
|
+
"stale-recorded: fetch of refs/pull/<n>/head should succeed"
|
|
115
|
+
# Pre-fix behavior preferred reachable recorded pr_head= and would show stale-local.
|
|
116
|
+
[ "$stale_sha" != "$PR_SHA" ] || fail "stale-recorded: fixture did not diverge recorded vs PR head"
|
|
117
|
+
pass "fm-review-diff prefers freshly fetched PR head over a stale recorded pr_head="
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
test_pr_meta_fetches_pull_head_without_recorded_sha() {
|
|
121
|
+
local case_dir out
|
|
122
|
+
case_dir=$(make_case pr-fetch)
|
|
123
|
+
stale_and_pr_commits "$case_dir"
|
|
124
|
+
git -C "$case_dir/wt" push -q origin "pr-head-tmp:refs/pull/9/head"
|
|
125
|
+
write_task_meta "$case_dir" "pr=https://github.com/example/repo/pull/9"
|
|
126
|
+
|
|
127
|
+
out=$(run_review_diff "$case_dir" task-x1 2> "$case_dir/stderr")
|
|
128
|
+
|
|
129
|
+
assert_contains "$out" '+pr-fixed' "pr-fetch: diff should use fetched PR head"
|
|
130
|
+
assert_not_contains "$out" 'stale-local' "pr-fetch: diff must not use the stale local branch"
|
|
131
|
+
assert_not_contains "$(cat "$case_dir/stderr")" 'warning: PR head unavailable' \
|
|
132
|
+
"pr-fetch: should not warn when fetch succeeds"
|
|
133
|
+
pass "fm-review-diff fetches refs/pull/<n>/head when pr_head= is absent"
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
test_no_pr_meta_uses_local_branch() {
|
|
137
|
+
local case_dir out
|
|
138
|
+
case_dir=$(make_case no-pr-meta)
|
|
139
|
+
stale_and_pr_commits "$case_dir"
|
|
140
|
+
write_task_meta "$case_dir"
|
|
141
|
+
|
|
142
|
+
out=$(run_review_diff "$case_dir" task-x1 2> "$case_dir/stderr")
|
|
143
|
+
|
|
144
|
+
assert_contains "$out" '+stale-local' "no-pr-meta: diff should still use the local branch"
|
|
145
|
+
assert_not_contains "$out" '+pr-fixed' "no-pr-meta: diff must not jump to the unpushed PR commit"
|
|
146
|
+
assert_not_contains "$(cat "$case_dir/stderr")" 'warning: PR head unavailable' \
|
|
147
|
+
"no-pr-meta: no warning without pr= in meta"
|
|
148
|
+
pass "fm-review-diff without pr= keeps the worktree-branch diff"
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
test_unreachable_pr_head_falls_back_with_warning() {
|
|
152
|
+
local case_dir out err
|
|
153
|
+
case_dir=$(make_case fetch-fallback)
|
|
154
|
+
stale_and_pr_commits "$case_dir"
|
|
155
|
+
git -C "$case_dir/wt" remote remove origin
|
|
156
|
+
write_task_meta "$case_dir" \
|
|
157
|
+
"pr=https://github.com/example/repo/pull/9" \
|
|
158
|
+
"pr_head=deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
|
|
159
|
+
|
|
160
|
+
set +e
|
|
161
|
+
out=$(run_review_diff "$case_dir" task-x1 2> "$case_dir/stderr")
|
|
162
|
+
set -e
|
|
163
|
+
err=$(cat "$case_dir/stderr")
|
|
164
|
+
|
|
165
|
+
assert_contains "$err" 'warning: PR head unavailable; diff may lag the open PR' \
|
|
166
|
+
"fetch-fallback: must warn when PR head cannot be resolved"
|
|
167
|
+
assert_contains "$out" '+stale-local' "fetch-fallback: should fall back to the local branch diff"
|
|
168
|
+
assert_not_contains "$out" '+pr-fixed' "fetch-fallback: must not invent a PR head diff offline"
|
|
169
|
+
pass "fm-review-diff falls back to local branch with a warning when PR head is unreachable"
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
test_pr_meta_uses_pr_head_not_stale_local
|
|
173
|
+
test_pr_meta_fetches_pull_head_without_recorded_sha
|
|
174
|
+
test_stale_recorded_pr_head_loses_to_fetched_pull_head
|
|
175
|
+
test_no_pr_meta_uses_local_branch
|
|
176
|
+
test_unreachable_pr_head_falls_back_with_warning
|