@zerwiz/ymir 0.1.4 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/README.md +74 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +360 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +11 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +121 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/migrations/0005-roots-out-of-tree.sh +158 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +159 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +736 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +539 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +763 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +415 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +133 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +101 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +180 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +503 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +90 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +57 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +35 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/install.md +69 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +498 -0
- package/CHANGELOG.md +1913 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +114 -60
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +97 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +108 -0
- package/RULES/07-config.md +101 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/09-electron.md +58 -0
- package/RULES/README.md +22 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +133 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +256 -0
- package/bin/apodex-smoke-test.sh +105 -0
- package/bin/bifrost-bridge.sh +131 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +112 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +51 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-assemble.sh +154 -0
- package/bin/changelog-guard.sh +197 -0
- package/bin/crash-sense.sh +173 -0
- package/bin/design-check.sh +80 -0
- package/bin/design-icon.sh +153 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +225 -0
- package/bin/eindri-acclaim.sh +47 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seat.sh +83 -0
- package/bin/eindri-seen.sh +54 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +98 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +158 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/feature-inventory.sh +73 -0
- package/bin/fleet-apply.sh +81 -0
- package/bin/github-deploy.sh +94 -0
- package/bin/gjallarhorn-expose.sh +136 -0
- package/bin/gjallarhorn-notify.sh +71 -0
- package/bin/gjallarhorn-purge.sh +67 -0
- package/bin/gjallarhorn-tunnel.sh +85 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +130 -0
- package/bin/hall-snapshot.sh +111 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +452 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hlidskjalf-agents.sh +172 -0
- package/bin/hlidskjalf-usage.sh +196 -0
- package/bin/hoard-guard.sh +135 -0
- package/bin/hoard-lib.sh +105 -0
- package/bin/hodd.sh +102 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +121 -0
- package/bin/local-model-lock.sh +70 -0
- package/bin/mimir-bridge.py +259 -0
- package/bin/mimir-bridge.sh +100 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir-reflect.sh +27 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +72 -0
- package/bin/mjollnir.sh +104 -0
- package/bin/model-hardware.sh +96 -0
- package/bin/model-resolve.sh +160 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-hall-snapshot.sh +28 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-nsr-compliance.sh +54 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/npm-publish.sh +136 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +161 -0
- package/bin/omarchy-plugins.sh +187 -0
- package/bin/omarchy-sense.sh +162 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-model-agnostic.sh +71 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +58 -0
- package/bin/project-git.sh +69 -0
- package/bin/public-guard.sh +71 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +104 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +94 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +89 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-spawn-pretool-check.sh +58 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +203 -0
- package/bin/telegram-bot.sh +82 -0
- package/bin/toolchain.sh +74 -0
- package/bin/ui-truth-check.sh +75 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +298 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +60 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +163 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +806 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-plan.sh +356 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +110 -0
- package/bin/ymir-setup-auth.sh +119 -0
- package/bin/ymir-validate.sh +193 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1060 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +54 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +269 -0
- package/scripts/lower.sh +34 -0
- package/scripts/raise.sh +42 -0
- package/scripts/start.sh +217 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tests/fm-remote-secondmate-parent-binding.test.sh - regression coverage for the
|
|
3
|
+
# fm-remote-sm-cleanup-parent-binding-s1 scout report: finished-worker cleanup
|
|
4
|
+
# inside a REMOTE second-mate home refused forever with "cannot resolve the
|
|
5
|
+
# primary home ... durable parent binding", because the remote launch hands the
|
|
6
|
+
# child the remote code checkout as its parent home (bin/fm-spawn.sh's sole
|
|
7
|
+
# writer of FM_PUBLIC_FOLLOWUP_PRIMARY_HOME receives FM_HOME=$FM_ROOT from
|
|
8
|
+
# bin/fm-remote-secondmate-control.sh's host-local launch), and that path can
|
|
9
|
+
# never carry the parent's real state or registry.
|
|
10
|
+
#
|
|
11
|
+
# The fix (report section 7, captain-approved same-machine scope): a durable
|
|
12
|
+
# .fm-secondmate-parent record, written once at seeding next to the
|
|
13
|
+
# .fm-secondmate-home identity marker, names this home's route to its parent as
|
|
14
|
+
# "local" or "remote". bin/fm-teardown.sh's cleanup gate reads it and treats a
|
|
15
|
+
# remote parent as OUT OF SCOPE (never refuses purely for being cross-machine,
|
|
16
|
+
# since the whole promised-public-reply subsystem is same-filesystem by
|
|
17
|
+
# construction) while still refusing on a genuine same-filesystem signal
|
|
18
|
+
# committed directly to this home's own .env file - never on an unrelated
|
|
19
|
+
# process-environment export, which is what let the remote host's own login
|
|
20
|
+
# shell mask into this home's binding before.
|
|
21
|
+
#
|
|
22
|
+
# This drives the REAL remote route (fm-remote-home-seed.sh -> fm-on.sh ->
|
|
23
|
+
# fm-remote-entrypoint.sh -> the host-local fm-remote-secondmate-control.sh ->
|
|
24
|
+
# the real bin/fm-spawn.sh --secondmate) across the repo's own deterministic SSH
|
|
25
|
+
# boundary and Herdr fixture, then runs the real bin/fm-teardown.sh for a
|
|
26
|
+
# finished child worker inside the produced remote home - never source-text
|
|
27
|
+
# matching.
|
|
28
|
+
set -u
|
|
29
|
+
|
|
30
|
+
# shellcheck source=tests/lib.sh
|
|
31
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
32
|
+
# shellcheck source=tests/remote-herdr-fixture.sh
|
|
33
|
+
. "$(dirname "${BASH_SOURCE[0]}")/remote-herdr-fixture.sh"
|
|
34
|
+
|
|
35
|
+
command -v jq >/dev/null 2>&1 || { echo "skip: jq not found"; exit 0; }
|
|
36
|
+
|
|
37
|
+
TMP_ROOT=$(fm_test_tmproot fm-remote-parent-binding)
|
|
38
|
+
mkdir -p "$TMP_ROOT"
|
|
39
|
+
TMP_ROOT=$(cd "$TMP_ROOT" && pwd -P)
|
|
40
|
+
PARENT="$TMP_ROOT/parent"
|
|
41
|
+
REMOTE_ROOT="$TMP_ROOT/remote-root"
|
|
42
|
+
REMOTE_HOME="$TMP_ROOT/remote-home"
|
|
43
|
+
FAKEBIN=$(fm_fakebin "$TMP_ROOT/fake")
|
|
44
|
+
SSH_COUNT="$TMP_ROOT/ssh.count"
|
|
45
|
+
DOCTOR_LOG="$TMP_ROOT/doctor.log"
|
|
46
|
+
HERDR_STATE="$TMP_ROOT/remote-herdr.state"
|
|
47
|
+
HERDR_LOG="$TMP_ROOT/remote-herdr.log"
|
|
48
|
+
CLAIMS="$TMP_ROOT/claims"
|
|
49
|
+
PUBLISH_PID=
|
|
50
|
+
mkdir -p "$PARENT/data" "$PARENT/state" "$PARENT/config" "$PARENT/projects" "$REMOTE_ROOT" "$CLAIMS"
|
|
51
|
+
|
|
52
|
+
cleanup() {
|
|
53
|
+
local worker_pid=''
|
|
54
|
+
if [ -n "$PUBLISH_PID" ]; then
|
|
55
|
+
touch "$PUBLISH_RELEASE" 2>/dev/null || true
|
|
56
|
+
kill "$PUBLISH_PID" 2>/dev/null || true
|
|
57
|
+
wait "$PUBLISH_PID" 2>/dev/null || true
|
|
58
|
+
fi
|
|
59
|
+
FM_HOME="$PARENT" FM_PROCEVENT_CLAIM_ROOT="$CLAIMS" \
|
|
60
|
+
"$ROOT/bin/fm-procevent.sh" sweep-home >/dev/null 2>&1 || true
|
|
61
|
+
if [ -f "$TMP_ROOT/remote-jobs/worker.pid" ]; then
|
|
62
|
+
worker_pid=$(cat "$TMP_ROOT/remote-jobs/worker.pid")
|
|
63
|
+
kill "$worker_pid" 2>/dev/null || true
|
|
64
|
+
fi
|
|
65
|
+
rm -rf -- "$TMP_ROOT"
|
|
66
|
+
}
|
|
67
|
+
trap cleanup EXIT
|
|
68
|
+
|
|
69
|
+
PUBLISH_HOME="$TMP_ROOT/publication-home"
|
|
70
|
+
PUBLISH_FAKEBIN=$(fm_fakebin "$TMP_ROOT/publication-fake")
|
|
71
|
+
PUBLISH_ENTERED="$TMP_ROOT/publication-marker-entered"
|
|
72
|
+
PUBLISH_RELEASE="$TMP_ROOT/publication-marker-release"
|
|
73
|
+
PUBLISH_MANIFEST="$TMP_ROOT/publication.manifest"
|
|
74
|
+
REAL_MV=$(command -v mv)
|
|
75
|
+
cat > "$PUBLISH_FAKEBIN/mv" <<'SH'
|
|
76
|
+
#!/usr/bin/env bash
|
|
77
|
+
destination=${!#}
|
|
78
|
+
case "$destination" in
|
|
79
|
+
*/.fm-secondmate-home)
|
|
80
|
+
touch "$FM_TEST_PUBLISH_ENTERED"
|
|
81
|
+
while [ ! -f "$FM_TEST_PUBLISH_RELEASE" ]; do sleep 0.02; done
|
|
82
|
+
;;
|
|
83
|
+
esac
|
|
84
|
+
exec "$FM_TEST_REAL_MV" "$@"
|
|
85
|
+
SH
|
|
86
|
+
chmod +x "$PUBLISH_FAKEBIN/mv"
|
|
87
|
+
printf 'schema=fm-remote-home-provision.v1\nid_b64=%s\ncharter_b64=%s\nparent_host_b64=%s\nproject_count=0\n' \
|
|
88
|
+
"$(printf publication | base64 | tr -d '\n')" \
|
|
89
|
+
"$(printf 'Publication-order regression charter.\n' | base64 | tr -d '\n')" \
|
|
90
|
+
"$(printf publish-host | base64 | tr -d '\n')" > "$PUBLISH_MANIFEST"
|
|
91
|
+
PATH="$PUBLISH_FAKEBIN:$PATH" FM_HOME="$PUBLISH_HOME" FM_ROOT_OVERRIDE="$ROOT" \
|
|
92
|
+
FM_TEST_REAL_MV="$REAL_MV" FM_TEST_PUBLISH_ENTERED="$PUBLISH_ENTERED" \
|
|
93
|
+
FM_TEST_PUBLISH_RELEASE="$PUBLISH_RELEASE" \
|
|
94
|
+
"$ROOT/bin/fm-remote-home-provision.sh" < "$PUBLISH_MANIFEST" >/dev/null 2>&1 &
|
|
95
|
+
PUBLISH_PID=$!
|
|
96
|
+
publish_wait=0
|
|
97
|
+
while [ ! -f "$PUBLISH_ENTERED" ]; do
|
|
98
|
+
kill -0 "$PUBLISH_PID" 2>/dev/null || fail "remote provisioning exited before its completion marker"
|
|
99
|
+
publish_wait=$((publish_wait + 1))
|
|
100
|
+
[ "$publish_wait" -le 250 ] || fail "remote provisioning never reached its completion marker"
|
|
101
|
+
sleep 0.02
|
|
102
|
+
done
|
|
103
|
+
cmp -s "$PUBLISH_HOME/.fm-secondmate-parent" <(
|
|
104
|
+
printf 'schema=fm-secondmate-parent.v1\nroute=remote\nparent_host=publish-host\n'
|
|
105
|
+
) || fail "remote provisioning exposed completion before publishing the durable parent record"
|
|
106
|
+
assert_absent "$PUBLISH_HOME/.fm-secondmate-home" \
|
|
107
|
+
"the remote identity marker must remain absent until durable parent publication completes"
|
|
108
|
+
touch "$PUBLISH_RELEASE"
|
|
109
|
+
wait "$PUBLISH_PID" || fail "remote provisioning failed after publishing durable state"
|
|
110
|
+
PUBLISH_PID=
|
|
111
|
+
assert_present "$PUBLISH_HOME/.fm-secondmate-home" \
|
|
112
|
+
"remote provisioning must publish its identity marker as the completion point"
|
|
113
|
+
pass "remote provisioning publishes durable parent state before its completion marker"
|
|
114
|
+
|
|
115
|
+
# --- the remote host's tracked code root, real git repos, one project --------
|
|
116
|
+
(
|
|
117
|
+
cd "$ROOT" || exit
|
|
118
|
+
tar --exclude=.git --exclude=.no-mistakes --exclude=data --exclude=state --exclude=config -cf - .
|
|
119
|
+
) | (cd "$REMOTE_ROOT" && tar -xf -)
|
|
120
|
+
install_remote_herdr_fixture "$REMOTE_ROOT" "$HERDR_STATE" "$HERDR_LOG" \
|
|
121
|
+
"$TMP_ROOT/herdr-send-fail" "$TMP_ROOT/herdr.sock"
|
|
122
|
+
git -C "$REMOTE_ROOT" init -q -b main
|
|
123
|
+
git -C "$REMOTE_ROOT" config user.email test@example.com
|
|
124
|
+
git -C "$REMOTE_ROOT" config user.name Test
|
|
125
|
+
git -C "$REMOTE_ROOT" add .
|
|
126
|
+
git -C "$REMOTE_ROOT" commit -qm 'remote fixture root'
|
|
127
|
+
REMOTE_ORIGIN="$TMP_ROOT/firstmate-origin.git"
|
|
128
|
+
git init -q --bare "$REMOTE_ORIGIN"
|
|
129
|
+
git -C "$REMOTE_ROOT" remote add origin "file://$REMOTE_ORIGIN"
|
|
130
|
+
git -C "$REMOTE_ROOT" push -q -u origin main
|
|
131
|
+
git --git-dir="$REMOTE_ORIGIN" symbolic-ref HEAD refs/heads/main
|
|
132
|
+
|
|
133
|
+
git init -q --bare "$TMP_ROOT/alpha.git"
|
|
134
|
+
git -C "$PARENT/projects" init -q -b main alpha
|
|
135
|
+
git -C "$PARENT/projects/alpha" config user.email test@example.com
|
|
136
|
+
git -C "$PARENT/projects/alpha" config user.name Test
|
|
137
|
+
printf 'alpha\n' > "$PARENT/projects/alpha/README.md"
|
|
138
|
+
git -C "$PARENT/projects/alpha" add README.md
|
|
139
|
+
git -C "$PARENT/projects/alpha" commit -qm init
|
|
140
|
+
git -C "$PARENT/projects/alpha" remote add origin "file://$TMP_ROOT/alpha.git"
|
|
141
|
+
git -C "$PARENT/projects/alpha" push -q -u origin main
|
|
142
|
+
git --git-dir="$TMP_ROOT/alpha.git" symbolic-ref HEAD refs/heads/main
|
|
143
|
+
printf -- '- alpha [direct-PR] - alpha project (added 2026-08-04)\n' > "$PARENT/data/projects.md"
|
|
144
|
+
printf 'codex\n' > "$PARENT/config/secondmate-harness"
|
|
145
|
+
printf 'tmux\n' > "$PARENT/config/backend"
|
|
146
|
+
|
|
147
|
+
# The primary home is the X-mode / relay home: the captain's real activation.
|
|
148
|
+
printf 'FMX_PAIRING_TOKEN=repro-token\n' > "$PARENT/.env"
|
|
149
|
+
|
|
150
|
+
# --- deterministic SSH boundary, identical shape to the lifecycle e2e suite --
|
|
151
|
+
cat > "$FAKEBIN/fake-ssh" <<'SH'
|
|
152
|
+
#!/usr/bin/env bash
|
|
153
|
+
count=$(cat "$FM_FAKE_SSH_COUNT" 2>/dev/null || echo 0)
|
|
154
|
+
printf '%s\n' "$((count + 1))" > "$FM_FAKE_SSH_COUNT"
|
|
155
|
+
while [ "$#" -gt 0 ]; do
|
|
156
|
+
case "$1" in -o) shift 2 ;; --) shift; break ;; *) exit 90 ;; esac
|
|
157
|
+
done
|
|
158
|
+
host=$1
|
|
159
|
+
entry=$2
|
|
160
|
+
shift 2
|
|
161
|
+
[ "$host" = remote-mac ] || exit 91
|
|
162
|
+
[ "$entry" = fm-remote-entrypoint.sh ] || exit 92
|
|
163
|
+
cd "$FM_FAKE_REMOTE_CWD" || exit 93
|
|
164
|
+
argv_b64=$4
|
|
165
|
+
command_fields=$(perl -MMIME::Base64=decode_base64 -e '
|
|
166
|
+
my $data=decode_base64($ARGV[0]);
|
|
167
|
+
my @args=split(/\0/, $data);
|
|
168
|
+
print join("\t", map { defined $_ ? $_ : "" } @args[0..2]);
|
|
169
|
+
' "$argv_b64")
|
|
170
|
+
IFS=$'\t' read -r command_name _command_action command_rel <<EOF
|
|
171
|
+
$command_fields
|
|
172
|
+
EOF
|
|
173
|
+
if [ "$command_name" = fm-remote-doctor.sh ]; then
|
|
174
|
+
printf 'check herdr=ok: /usr/bin/herdr\n'
|
|
175
|
+
printf 'ok: remote second-mate readiness confirmed on this host\n'
|
|
176
|
+
exit 0
|
|
177
|
+
fi
|
|
178
|
+
if [ "$command_name" = fm-remote-secondmate-control.sh ] \
|
|
179
|
+
&& [ "$_command_action" = launch ] \
|
|
180
|
+
&& [ -n "${FM_TEST_PUBLICATION_TARGET:-}" ]; then
|
|
181
|
+
out=$("$FM_FAKE_REMOTE_ENTRYPOINT" "$@")
|
|
182
|
+
rc=$?
|
|
183
|
+
rm -f "$FM_TEST_PUBLICATION_TARGET"
|
|
184
|
+
ln -s "$FM_TEST_PUBLICATION_FOREIGN" "$FM_TEST_PUBLICATION_TARGET" || exit 94
|
|
185
|
+
printf '%s\n' "$out"
|
|
186
|
+
exit "$rc"
|
|
187
|
+
fi
|
|
188
|
+
exec "$FM_FAKE_REMOTE_ENTRYPOINT" "$@"
|
|
189
|
+
SH
|
|
190
|
+
chmod +x "$FAKEBIN/fake-ssh"
|
|
191
|
+
|
|
192
|
+
remote_env() {
|
|
193
|
+
FM_HOME="$PARENT" \
|
|
194
|
+
FM_ROOT_OVERRIDE="$REMOTE_ROOT" \
|
|
195
|
+
FM_PROCEVENT_CLAIM_ROOT="$CLAIMS" \
|
|
196
|
+
FM_SSH_BIN="$FAKEBIN/fake-ssh" \
|
|
197
|
+
FM_FAKE_SSH_COUNT="$SSH_COUNT" \
|
|
198
|
+
FM_FAKE_REMOTE_ENTRYPOINT="$REMOTE_ROOT/bin/fm-remote-entrypoint.sh" \
|
|
199
|
+
FM_REMOTE_JOB_PLATFORM_OVERRIDE=Linux \
|
|
200
|
+
FM_REMOTE_JOB_STATE_ROOT="$TMP_ROOT/remote-jobs" \
|
|
201
|
+
FM_FAKE_REMOTE_CWD="$TMP_ROOT" \
|
|
202
|
+
FM_FAKE_DOCTOR_LOG="$DOCTOR_LOG" \
|
|
203
|
+
FM_SEND_SETTLE=0 FM_SEND_SLEEP=0 \
|
|
204
|
+
"$@"
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
FM_SECONDMATE_CHARTER='Own iOS delivery on the build Mac.' \
|
|
208
|
+
FM_SECONDMATE_SCOPE='iOS implementation and Xcode validation' \
|
|
209
|
+
remote_env "$ROOT/bin/fm-remote-home-seed.sh" ios remote-mac "$REMOTE_ROOT" "$REMOTE_HOME" alpha \
|
|
210
|
+
>/dev/null || fail "real remote secondmate seeding failed"
|
|
211
|
+
|
|
212
|
+
# --- the durable record itself: the fundamental part of the fix -------------
|
|
213
|
+
assert_present "$REMOTE_HOME/.fm-secondmate-parent" \
|
|
214
|
+
"real remote provisioning must write a durable parent record"
|
|
215
|
+
cmp -s "$REMOTE_HOME/.fm-secondmate-parent" <(
|
|
216
|
+
printf 'schema=fm-secondmate-parent.v1\nroute=remote\nparent_host=remote-mac\n'
|
|
217
|
+
) || fail "real remote provisioning must write the exact durable remote parent record"
|
|
218
|
+
|
|
219
|
+
remote_env "$ROOT/bin/fm-spawn.sh" ios --secondmate >/dev/null \
|
|
220
|
+
|| fail "real remote secondmate launch failed"
|
|
221
|
+
|
|
222
|
+
DELIVERED_LINE=$(grep -F 'FM_PUBLIC_FOLLOWUP_PRIMARY_HOME' "$HERDR_LOG" | tail -1 || true)
|
|
223
|
+
DELIVERED=$(printf '%s\n' "$DELIVERED_LINE" | tr ' ' '\n' \
|
|
224
|
+
| sed -n "s/^FM_PUBLIC_FOLLOWUP_PRIMARY_HOME='\{0,1\}\([^']*\)'\{0,1\}\$/\1/p" | tail -1)
|
|
225
|
+
[ -n "$DELIVERED" ] || fail "the remote launch did not deliver a primary-home binding to assert against"
|
|
226
|
+
case "$DELIVERED" in
|
|
227
|
+
"$REMOTE_ROOT") : ;;
|
|
228
|
+
*) fail "test setup drifted: expected the remote code root to be delivered as the (wrong) parent binding, got: $DELIVERED" ;;
|
|
229
|
+
esac
|
|
230
|
+
|
|
231
|
+
# --- a finished child worker inside the remote secondmate home --------------
|
|
232
|
+
CHILD_WT="$REMOTE_HOME/projects/alpha"
|
|
233
|
+
mkdir -p "$REMOTE_HOME/state"
|
|
234
|
+
# This regression exercises remote-parent binding, not backlog mutation. Keep
|
|
235
|
+
# its synthetic child home on the supported hand-edited backend so teardown's
|
|
236
|
+
# fused automatic close is correctly exempt without requiring a tasks-axi mock.
|
|
237
|
+
printf '%s\n' manual > "$REMOTE_HOME/config/backlog-backend"
|
|
238
|
+
write_child_meta() {
|
|
239
|
+
fm_write_meta "$REMOTE_HOME/state/work-child.meta" \
|
|
240
|
+
"window=firstmate:fm-work-child" "endpoint_task_id=work-child" \
|
|
241
|
+
"worktree=$CHILD_WT" "project=$CHILD_WT" "harness=codex" "kind=ship" \
|
|
242
|
+
"mode=local-only" "yolo=off"
|
|
243
|
+
}
|
|
244
|
+
mkdir -p "$TMP_ROOT/childfake"
|
|
245
|
+
for t in tmux treehouse no-mistakes gh gh-axi tasks-axi; do
|
|
246
|
+
printf '#!/usr/bin/env bash\nexit 0\n' > "$TMP_ROOT/childfake/$t"
|
|
247
|
+
chmod +x "$TMP_ROOT/childfake/$t"
|
|
248
|
+
done
|
|
249
|
+
|
|
250
|
+
run_child_teardown() { # <extra env assignments...>
|
|
251
|
+
local out rc=0
|
|
252
|
+
write_child_meta
|
|
253
|
+
out=$(env "$@" PATH="$TMP_ROOT/childfake:$PATH" \
|
|
254
|
+
FM_HOME="$REMOTE_HOME" FM_STATE_OVERRIDE="$REMOTE_HOME/state" \
|
|
255
|
+
FM_DATA_OVERRIDE="$REMOTE_HOME/data" FM_CONFIG_OVERRIDE="$REMOTE_HOME/config" \
|
|
256
|
+
"$REMOTE_ROOT/bin/fm-teardown.sh" work-child 2>&1) || rc=$?
|
|
257
|
+
CHILD_TEARDOWN_OUT=$out
|
|
258
|
+
CHILD_TEARDOWN_RC=$rc
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
# Case B-equivalent: the delivered (wrong) binding points at the remote code
|
|
262
|
+
# root, and that root itself carries an X-mode .env - a plausible real-world
|
|
263
|
+
# state (a captain who also runs Firstmate directly on the build Mac). Before
|
|
264
|
+
# the fix this refused; the durable record now makes it out of scope.
|
|
265
|
+
printf 'FMX_PAIRING_TOKEN=remote-host-token\n' > "$REMOTE_ROOT/.env"
|
|
266
|
+
run_child_teardown FM_PUBLIC_FOLLOWUP_PRIMARY_HOME="$DELIVERED"
|
|
267
|
+
rm -f "$REMOTE_ROOT/.env"
|
|
268
|
+
[ "$CHILD_TEARDOWN_RC" -eq 0 ] \
|
|
269
|
+
|| fail "a remote-routed child must allow cleanup when only the remote code root looks relay-active (rc=$CHILD_TEARDOWN_RC): $CHILD_TEARDOWN_OUT"
|
|
270
|
+
assert_not_contains "$CHILD_TEARDOWN_OUT" "cannot resolve the primary home" \
|
|
271
|
+
"a cross-machine parent must never be reported as an unresolved binding"
|
|
272
|
+
pass "a remote secondmate's finished worker cleans up when the remote code root's own .env looked relay-active"
|
|
273
|
+
|
|
274
|
+
# Case C-equivalent: FMX_PAIRING_TOKEN exported directly in the process
|
|
275
|
+
# environment, simulating the remote host's own login-shell export reaching the
|
|
276
|
+
# agent's pane. fm_pf_relay_active's environment-wins rule would make this look
|
|
277
|
+
# identical to a genuine same-home commitment; the fix must tell them apart by
|
|
278
|
+
# reading only $FM_HOME/.env, never the process environment, once the durable
|
|
279
|
+
# record says the parent is remote.
|
|
280
|
+
run_child_teardown FM_PUBLIC_FOLLOWUP_PRIMARY_HOME="$DELIVERED" FMX_PAIRING_TOKEN=ambient-login-token
|
|
281
|
+
[ "$CHILD_TEARDOWN_RC" -eq 0 ] \
|
|
282
|
+
|| fail "a remote-routed child must allow cleanup when only an ambient exported token looks relay-active (rc=$CHILD_TEARDOWN_RC): $CHILD_TEARDOWN_OUT"
|
|
283
|
+
assert_not_contains "$CHILD_TEARDOWN_OUT" "cannot resolve the primary home" \
|
|
284
|
+
"an ambient exported token from the remote host's own shell must never bind this child"
|
|
285
|
+
pass "a remote secondmate's finished worker cleans up when only an ambient exported token looked relay-active"
|
|
286
|
+
|
|
287
|
+
# Baseline: no signal anywhere. Must keep succeeding exactly as before the fix.
|
|
288
|
+
run_child_teardown
|
|
289
|
+
[ "$CHILD_TEARDOWN_RC" -eq 0 ] \
|
|
290
|
+
|| fail "a remote-routed child with no relay signal anywhere must allow cleanup (rc=$CHILD_TEARDOWN_RC): $CHILD_TEARDOWN_OUT"
|
|
291
|
+
pass "a remote secondmate's finished worker cleans up with no relay signal anywhere"
|
|
292
|
+
|
|
293
|
+
# Protection-preserved case: THIS home's own .env file (not the process
|
|
294
|
+
# environment, not the remote code root) carries a real token. That is a
|
|
295
|
+
# genuine same-filesystem signal this child's own home could hold, so it must
|
|
296
|
+
# still refuse even though the parent route is remote.
|
|
297
|
+
printf 'FMX_PAIRING_TOKEN=child-own-token\n' > "$REMOTE_HOME/.env"
|
|
298
|
+
run_child_teardown
|
|
299
|
+
rm -f "$REMOTE_HOME/.env"
|
|
300
|
+
[ "$CHILD_TEARDOWN_RC" -ne 0 ] \
|
|
301
|
+
|| fail "a remote secondmate's own committed .env token must still refuse cleanup, got rc=0: $CHILD_TEARDOWN_OUT"
|
|
302
|
+
assert_contains "$CHILD_TEARDOWN_OUT" "cannot resolve the primary home" \
|
|
303
|
+
"a genuine same-filesystem token on this home must remain an actionable refusal"
|
|
304
|
+
assert_present "$REMOTE_HOME/state/work-child.meta" \
|
|
305
|
+
"a genuine refusal must preserve the child work metadata"
|
|
306
|
+
pass "a remote secondmate's own committed relay token still refuses cleanup"
|
|
307
|
+
|
|
308
|
+
FOREIGN_META="$TMP_ROOT/foreign-ios.meta"
|
|
309
|
+
LOCAL_META="$PARENT/state/ios.meta"
|
|
310
|
+
printf 'foreign sentinel\n' > "$FOREIGN_META"
|
|
311
|
+
rm -f "$LOCAL_META"
|
|
312
|
+
PUBLICATION_RC=0
|
|
313
|
+
PUBLICATION_OUT=$(FM_TEST_PUBLICATION_TARGET="$LOCAL_META" \
|
|
314
|
+
FM_TEST_PUBLICATION_FOREIGN="$FOREIGN_META" \
|
|
315
|
+
remote_env "$ROOT/bin/fm-spawn.sh" ios --secondmate 2>&1) || PUBLICATION_RC=$?
|
|
316
|
+
[ "$PUBLICATION_RC" -ne 0 ] \
|
|
317
|
+
|| fail "remote secondmate publication accepted a target resolving outside its home"
|
|
318
|
+
assert_contains "$PUBLICATION_OUT" "task record could not be published" \
|
|
319
|
+
"remote secondmate publication did not report its record-boundary refusal"
|
|
320
|
+
cmp -s "$FOREIGN_META" <(printf 'foreign sentinel\n') \
|
|
321
|
+
|| fail "remote secondmate publication wrote through the foreign target"
|
|
322
|
+
[ -L "$LOCAL_META" ] \
|
|
323
|
+
|| fail "remote secondmate publication replaced the refused target boundary"
|
|
324
|
+
pass "remote secondmate publication refuses targets outside its home"
|
|
325
|
+
|
|
326
|
+
echo "ALL TESTS PASSED"
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tests/fm-remote-secondmate-trace-context.test.sh - trace-context regressions for
|
|
3
|
+
# the REMOTE second mate route, over the deterministic generic SSH boundary.
|
|
4
|
+
#
|
|
5
|
+
# The local spawn path's coverage lives in tests/fm-trace-context-spawn.test.sh.
|
|
6
|
+
# A remote second mate never reaches that path: bin/fm-spawn.sh routes it through
|
|
7
|
+
# spawn_remote_secondmate, which hands the launch to the remote host. These
|
|
8
|
+
# assertions drive the real chain - parent fm-spawn -> fm-on -> the real remote
|
|
9
|
+
# entrypoint -> fm-remote-secondmate-control -> the remote host's own fm-spawn -
|
|
10
|
+
# against a fake herdr CLI, so the carrier the remote pane receives is observable.
|
|
11
|
+
# See docs/verification/trace-context.md for the maintained coverage inventory.
|
|
12
|
+
set -u
|
|
13
|
+
|
|
14
|
+
# shellcheck source=tests/lib.sh
|
|
15
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
16
|
+
# shellcheck source=tests/remote-herdr-fixture.sh
|
|
17
|
+
. "$(dirname "${BASH_SOURCE[0]}")/remote-herdr-fixture.sh"
|
|
18
|
+
# shellcheck source=/dev/null
|
|
19
|
+
. "$ROOT/bin/fm-trace-context-lib.sh"
|
|
20
|
+
|
|
21
|
+
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)
|
|
22
|
+
TMP_ROOT=$(fm_test_tmproot fm-remote-trace-context)
|
|
23
|
+
mkdir -p "$TMP_ROOT"
|
|
24
|
+
TMP_ROOT=$(cd "$TMP_ROOT" && pwd -P)
|
|
25
|
+
PARENT="$TMP_ROOT/parent"
|
|
26
|
+
REMOTE_ROOT="$TMP_ROOT/remote-root"
|
|
27
|
+
REMOTE_HOME="$TMP_ROOT/remote-home"
|
|
28
|
+
SECOND_HOME="$TMP_ROOT/remote-home-2"
|
|
29
|
+
FAKEBIN=$(fm_fakebin "$TMP_ROOT/fake")
|
|
30
|
+
HERDR_LOG="$TMP_ROOT/remote-herdr.log"
|
|
31
|
+
HERDR_STATE="$TMP_ROOT/remote-herdr.state"
|
|
32
|
+
TMUX_LOG="$TMP_ROOT/remote-tmux.log"
|
|
33
|
+
TMUX_STATE="$TMP_ROOT/remote-tmux.state"
|
|
34
|
+
CLAIMS="$TMP_ROOT/claims"
|
|
35
|
+
mkdir -p "$PARENT/data" "$PARENT/state" "$PARENT/config" "$PARENT/projects" "$REMOTE_ROOT" "$CLAIMS"
|
|
36
|
+
trap 'FM_HOME="$PARENT" FM_PROCEVENT_CLAIM_ROOT="$CLAIMS" "$ROOT/bin/fm-procevent.sh" sweep-home >/dev/null 2>&1 || true; if [ -f "$TMP_ROOT/remote-jobs/worker.pid" ]; then kill "$(cat "$TMP_ROOT/remote-jobs/worker.pid")" 2>/dev/null || true; fi; rm -rf -- "$TMP_ROOT"' EXIT
|
|
37
|
+
|
|
38
|
+
# The remote host's tracked code root is this branch, as a real git repository:
|
|
39
|
+
# fm-on and the remote entrypoint both require the dispatched command to be
|
|
40
|
+
# tracked there, and the remote side runs the real scripts under test.
|
|
41
|
+
(
|
|
42
|
+
cd "$ROOT" || exit
|
|
43
|
+
tar --exclude=.git --exclude=.no-mistakes --exclude=data --exclude=state --exclude=config -cf - .
|
|
44
|
+
) | (cd "$REMOTE_ROOT" && tar -xf -)
|
|
45
|
+
|
|
46
|
+
# The remote host runs the Herdr fixture, whose every invocation is logged
|
|
47
|
+
# verbatim, so the pre-launch `export TRACEPARENT=` line and the launch
|
|
48
|
+
# literal's FM_TRACE_CONTEXT prefix are both observable exactly as the pane
|
|
49
|
+
# received them. The tmux fixture below only keeps the remote home's own
|
|
50
|
+
# non-second-mate tooling resolvable.
|
|
51
|
+
cat > "$REMOTE_ROOT/bin/tmux" <<SH
|
|
52
|
+
#!/usr/bin/env bash
|
|
53
|
+
set -u
|
|
54
|
+
log='$TMUX_LOG'
|
|
55
|
+
state='$TMUX_STATE'
|
|
56
|
+
printf '%s\n' "\$*" >> "\$log"
|
|
57
|
+
case "\${1:-}" in
|
|
58
|
+
has-session|new-session|set-window-option) exit 0 ;;
|
|
59
|
+
list-windows)
|
|
60
|
+
[ -f "\$state" ] || exit 0
|
|
61
|
+
name=\$(cut -d'|' -f1 "\$state")
|
|
62
|
+
case "\$*" in *'#{session_name}:#{window_name}'*) printf 'firstmate:%s\n' "\$name" ;; *) printf '%s\n' "\$name" ;; esac
|
|
63
|
+
exit 0
|
|
64
|
+
;;
|
|
65
|
+
new-window)
|
|
66
|
+
name=; cwd=
|
|
67
|
+
while [ "\$#" -gt 0 ]; do
|
|
68
|
+
case "\$1" in -n) shift; name=\$1 ;; -c) shift; cwd=\$1 ;; esac
|
|
69
|
+
shift
|
|
70
|
+
done
|
|
71
|
+
printf '%s|%s\n' "\$name" "\$cwd" > "\$state"
|
|
72
|
+
printf '@1\n'
|
|
73
|
+
exit 0
|
|
74
|
+
;;
|
|
75
|
+
display-message)
|
|
76
|
+
case "\$*" in
|
|
77
|
+
*'#{pane_current_path}'*) cut -d'|' -f2- "\$state" ;;
|
|
78
|
+
*'#{pane_current_command}'*) printf 'codex\n' ;;
|
|
79
|
+
*'#{cursor_y}'*) printf '0\n' ;;
|
|
80
|
+
*'#S'*) printf 'firstmate\n' ;;
|
|
81
|
+
*) printf '%%1\n' ;;
|
|
82
|
+
esac
|
|
83
|
+
exit 0
|
|
84
|
+
;;
|
|
85
|
+
capture-pane) printf '❯\n'; exit 0 ;;
|
|
86
|
+
send-keys) exit 0 ;;
|
|
87
|
+
kill-window) rm -f -- "\$state"; exit 0 ;;
|
|
88
|
+
list-panes) printf 'codex\n'; exit 0 ;;
|
|
89
|
+
esac
|
|
90
|
+
exit 0
|
|
91
|
+
SH
|
|
92
|
+
chmod +x "$REMOTE_ROOT/bin/tmux"
|
|
93
|
+
install_remote_herdr_fixture "$REMOTE_ROOT" "$HERDR_STATE" "$HERDR_LOG" \
|
|
94
|
+
"$TMP_ROOT/herdr-send-fail" "$TMP_ROOT/herdr.sock"
|
|
95
|
+
git -C "$REMOTE_ROOT" init -q -b main
|
|
96
|
+
git -C "$REMOTE_ROOT" config user.email test@example.com
|
|
97
|
+
git -C "$REMOTE_ROOT" config user.name Test
|
|
98
|
+
git -C "$REMOTE_ROOT" add .
|
|
99
|
+
git -C "$REMOTE_ROOT" commit -qm 'remote fixture root'
|
|
100
|
+
|
|
101
|
+
cat > "$FAKEBIN/fake-ssh" <<'SH'
|
|
102
|
+
#!/usr/bin/env bash
|
|
103
|
+
while [ "$#" -gt 0 ]; do
|
|
104
|
+
case "$1" in -o) shift 2 ;; --) shift; break ;; *) exit 90 ;; esac
|
|
105
|
+
done
|
|
106
|
+
host=$1
|
|
107
|
+
entry=$2
|
|
108
|
+
shift 2
|
|
109
|
+
[ "$host" = remote-mac ] || exit 91
|
|
110
|
+
[ "$entry" = fm-remote-entrypoint.sh ] || exit 92
|
|
111
|
+
cd "$FM_FAKE_REMOTE_CWD" || exit 93
|
|
112
|
+
# The readiness gate is answered here rather than by the real doctor, which
|
|
113
|
+
# would inspect the RUNNER's own account; tests/fm-remote-doctor.test.sh owns
|
|
114
|
+
# the doctor's behavior against controlled account fixtures.
|
|
115
|
+
if printf '%s' "$4" | base64 --decode 2>/dev/null | tr '\0' '\n' | head -1 | grep -q '^fm-remote-doctor.sh$'; then
|
|
116
|
+
printf 'ok: remote second-mate readiness confirmed on this host\n'
|
|
117
|
+
exit 0
|
|
118
|
+
fi
|
|
119
|
+
exec "$FM_FAKE_REMOTE_ENTRYPOINT" "$@"
|
|
120
|
+
SH
|
|
121
|
+
chmod +x "$FAKEBIN/fake-ssh"
|
|
122
|
+
|
|
123
|
+
printf 'codex\n' > "$PARENT/config/secondmate-harness"
|
|
124
|
+
printf 'tmux\n' > "$PARENT/config/backend"
|
|
125
|
+
printf 'codex\n' > "$PARENT/config/crew-harness"
|
|
126
|
+
printf '## In flight\n\n## Queued\n\n## Done\n' > "$PARENT/data/backlog.md"
|
|
127
|
+
|
|
128
|
+
remote_env() {
|
|
129
|
+
FM_HOME="$PARENT" \
|
|
130
|
+
FM_ROOT_OVERRIDE="$REMOTE_ROOT" \
|
|
131
|
+
FM_PROCEVENT_CLAIM_ROOT="$CLAIMS" \
|
|
132
|
+
FM_SSH_BIN="$FAKEBIN/fake-ssh" \
|
|
133
|
+
FM_FAKE_REMOTE_ENTRYPOINT="$REMOTE_ROOT/bin/fm-remote-entrypoint.sh" \
|
|
134
|
+
FM_REMOTE_JOB_PLATFORM_OVERRIDE=Linux \
|
|
135
|
+
FM_REMOTE_JOB_STATE_ROOT="$TMP_ROOT/remote-jobs" \
|
|
136
|
+
FM_FAKE_REMOTE_CWD="$TMP_ROOT" \
|
|
137
|
+
FM_SEND_SETTLE=0 FM_SEND_SLEEP=0 \
|
|
138
|
+
"$@"
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
# Freeze the parent home's trace-context decision the way a locked session start
|
|
142
|
+
# does, hermetically against an ambient FM_TRACE_CONTEXT.
|
|
143
|
+
freeze_parent_session() {
|
|
144
|
+
printf '%s\n' "$$" > "$PARENT/state/.lock"
|
|
145
|
+
(
|
|
146
|
+
unset FM_TRACE_CONTEXT
|
|
147
|
+
fm_trace_context_session_start "$PARENT/config" "$PARENT/state/.trace-context-effective"
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
# What the remote pane actually received, read back from the remote tmux log.
|
|
152
|
+
remote_injected_traceparent() {
|
|
153
|
+
sed -n 's/.*export TRACEPARENT=\([0-9a-f-]*\).*/\1/p' "$HERDR_LOG" | tail -1
|
|
154
|
+
}
|
|
155
|
+
remote_launch_snapshot() {
|
|
156
|
+
grep -o 'FM_TRACE_CONTEXT=[a-z]*' "$HERDR_LOG" | tail -1 | cut -d= -f2
|
|
157
|
+
}
|
|
158
|
+
meta_traceparent() { sed -n 's/^traceparent=//p' "$1"; }
|
|
159
|
+
|
|
160
|
+
# Provision and register the remote route from the captain-facing primary.
|
|
161
|
+
FM_SECONDMATE_CHARTER='Own iOS delivery on the build Mac.' \
|
|
162
|
+
FM_SECONDMATE_SCOPE='iOS implementation and Xcode validation' \
|
|
163
|
+
remote_env "$ROOT/bin/fm-remote-home-seed.sh" ios remote-mac "$REMOTE_ROOT" "$REMOTE_HOME" --no-projects >/dev/null \
|
|
164
|
+
|| fail "remote seed did not provision the traced route"
|
|
165
|
+
|
|
166
|
+
# --- disabled: the remote route must stay byte-identically untraced ----------
|
|
167
|
+
freeze_parent_session
|
|
168
|
+
: > "$HERDR_LOG"
|
|
169
|
+
remote_env "$ROOT/bin/fm-spawn.sh" ios --secondmate >/dev/null 2>&1 \
|
|
170
|
+
|| fail "default-off remote secondmate spawn failed"
|
|
171
|
+
assert_present "$PARENT/state/ios.meta" "default-off remote spawn published no parent metadata"
|
|
172
|
+
! grep -q '^traceparent=' "$PARENT/state/ios.meta" \
|
|
173
|
+
|| fail "default-off remote spawn must not record a traceparent= line"
|
|
174
|
+
! grep -q 'export TRACEPARENT=' "$HERDR_LOG" \
|
|
175
|
+
|| fail "default-off remote spawn must not export a carrier into the remote pane"
|
|
176
|
+
! grep -q '^traceparent=' "$REMOTE_HOME/state/parent-route/ios.meta" \
|
|
177
|
+
|| fail "default-off remote spawn must not record a carrier on the remote host"
|
|
178
|
+
[ "$(remote_launch_snapshot)" = off ] \
|
|
179
|
+
|| fail "default-off remote spawn must deliver FM_TRACE_CONTEXT=off (got '$(remote_launch_snapshot)')"
|
|
180
|
+
assert_absent "$REMOTE_HOME/config/trace-context" "default-off remote spawn inherited an enablement flag"
|
|
181
|
+
grep -q 'export GOTMPDIR=' "$HERDR_LOG" || fail "the remote spawn should still run (GOTMPDIR is always exported)"
|
|
182
|
+
pass "disabled: a remote-routed second mate records and receives no carrier and stays enabled-off end to end"
|
|
183
|
+
|
|
184
|
+
# --- enabled: one carrier is recorded by the parent and received remotely ----
|
|
185
|
+
: > "$PARENT/config/trace-context"
|
|
186
|
+
freeze_parent_session
|
|
187
|
+
reset_remote_herdr_fixture "$HERDR_STATE" # the previous endpoint is gone; this is an ordinary relaunch
|
|
188
|
+
: > "$HERDR_LOG"
|
|
189
|
+
remote_env "$ROOT/bin/fm-spawn.sh" ios --secondmate >/dev/null 2>&1 \
|
|
190
|
+
|| fail "enabled remote secondmate spawn failed"
|
|
191
|
+
|
|
192
|
+
PARENT_TP=$(meta_traceparent "$PARENT/state/ios.meta")
|
|
193
|
+
REMOTE_TP=$(meta_traceparent "$REMOTE_HOME/state/parent-route/ios.meta")
|
|
194
|
+
INJECTED_TP=$(remote_injected_traceparent)
|
|
195
|
+
fm_trace_context_valid "$PARENT_TP" \
|
|
196
|
+
|| fail "an enabled remote spawn must record a valid carrier in the parent metadata (got '$PARENT_TP')"
|
|
197
|
+
fm_trace_context_valid "$INJECTED_TP" \
|
|
198
|
+
|| fail "an enabled remote spawn must export a valid carrier into the remote pane (got '$INJECTED_TP')"
|
|
199
|
+
[ "$PARENT_TP" = "$INJECTED_TP" ] \
|
|
200
|
+
|| fail "the parent's recorded carrier and the remote pane's carrier must be identical (parent='$PARENT_TP' pane='$INJECTED_TP')"
|
|
201
|
+
[ "$REMOTE_TP" = "$PARENT_TP" ] \
|
|
202
|
+
|| fail "the remote endpoint record must carry the parent's identity (remote='$REMOTE_TP' parent='$PARENT_TP')"
|
|
203
|
+
[ "$(remote_launch_snapshot)" = on ] \
|
|
204
|
+
|| fail "an enabled remote spawn must deliver FM_TRACE_CONTEXT=on (got '$(remote_launch_snapshot)')"
|
|
205
|
+
assert_present "$REMOTE_HOME/config/trace-context" \
|
|
206
|
+
"an enabled remote launch did not inherit the enablement flag into the remote home"
|
|
207
|
+
GOTMP_LINE=$(grep -n 'export GOTMPDIR=' "$HERDR_LOG" | tail -1 | cut -d: -f1)
|
|
208
|
+
TP_LINE=$(grep -n 'export TRACEPARENT=' "$HERDR_LOG" | tail -1 | cut -d: -f1)
|
|
209
|
+
LAUNCH_LINE=$(grep -n 'FM_TRACE_CONTEXT=' "$HERDR_LOG" | tail -1 | cut -d: -f1)
|
|
210
|
+
[ -n "$GOTMP_LINE" ] && [ -n "$TP_LINE" ] && [ -n "$LAUNCH_LINE" ] \
|
|
211
|
+
|| fail "remote pane log missing GOTMPDIR/TRACEPARENT/launch lines"
|
|
212
|
+
[ "$TP_LINE" -gt "$GOTMP_LINE" ] \
|
|
213
|
+
|| fail "the remote TRACEPARENT export must ride the GOTMPDIR pre-launch site (gotmp=$GOTMP_LINE tp=$TP_LINE)"
|
|
214
|
+
[ "$TP_LINE" -lt "$LAUNCH_LINE" ] \
|
|
215
|
+
|| fail "the remote TRACEPARENT export must be sent before the launch command (tp=$TP_LINE launch=$LAUNCH_LINE)"
|
|
216
|
+
pass "enabled: a remote-routed second mate receives one carrier in its pane, identical to the parent's recorded identity, before launch"
|
|
217
|
+
|
|
218
|
+
# --- relaunch stability on the remote path ----------------------------------
|
|
219
|
+
reset_remote_herdr_fixture "$HERDR_STATE"
|
|
220
|
+
: > "$HERDR_LOG"
|
|
221
|
+
remote_env "$ROOT/bin/fm-spawn.sh" ios --secondmate >/dev/null 2>&1 \
|
|
222
|
+
|| fail "enabled remote secondmate relaunch failed"
|
|
223
|
+
RELAUNCH_TP=$(meta_traceparent "$PARENT/state/ios.meta")
|
|
224
|
+
RELAUNCH_INJECTED=$(remote_injected_traceparent)
|
|
225
|
+
[ "$RELAUNCH_TP" = "$PARENT_TP" ] \
|
|
226
|
+
|| fail "a remote relaunch must keep the task's recorded carrier (first='$PARENT_TP' relaunch='$RELAUNCH_TP')"
|
|
227
|
+
[ "$RELAUNCH_INJECTED" = "$PARENT_TP" ] \
|
|
228
|
+
|| fail "a remote relaunch must re-export the original carrier (first='$PARENT_TP' injected='$RELAUNCH_INJECTED')"
|
|
229
|
+
pass "relaunch: a remote-routed second mate keeps one stable identity across restarts"
|
|
230
|
+
|
|
231
|
+
# --- per-task boundary: ambient carriers are never adopted or shared ---------
|
|
232
|
+
# A persistent supervisor exports its own launch-time TRACEPARENT for its whole
|
|
233
|
+
# life. A second remote route resolved from that same environment must root its
|
|
234
|
+
# own trace rather than chain onto it or onto the first route.
|
|
235
|
+
AMBIENT='00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab-bbbbbbbbbbbbbbbb-01'
|
|
236
|
+
FM_SECONDMATE_CHARTER='Own the second build Mac.' \
|
|
237
|
+
FM_SECONDMATE_SCOPE='second remote domain' \
|
|
238
|
+
TRACEPARENT="$AMBIENT" \
|
|
239
|
+
remote_env "$ROOT/bin/fm-remote-home-seed.sh" ios2 remote-mac "$REMOTE_ROOT" "$SECOND_HOME" --no-projects >/dev/null \
|
|
240
|
+
|| fail "second remote seed failed"
|
|
241
|
+
reset_remote_herdr_fixture "$HERDR_STATE"
|
|
242
|
+
: > "$HERDR_LOG"
|
|
243
|
+
TRACEPARENT="$AMBIENT" remote_env "$ROOT/bin/fm-spawn.sh" ios2 --secondmate >/dev/null 2>&1 \
|
|
244
|
+
|| fail "second remote secondmate spawn failed"
|
|
245
|
+
SECOND_TP=$(meta_traceparent "$PARENT/state/ios2.meta")
|
|
246
|
+
fm_trace_context_valid "$SECOND_TP" \
|
|
247
|
+
|| fail "the second remote route must record a valid carrier (got '$SECOND_TP')"
|
|
248
|
+
[ "${SECOND_TP:3:32}" != "${AMBIENT:3:32}" ] \
|
|
249
|
+
|| fail "a remote route must not adopt the spawning process's ambient trace id (got '$SECOND_TP')"
|
|
250
|
+
[ "${SECOND_TP:3:32}" != "${PARENT_TP:3:32}" ] \
|
|
251
|
+
|| fail "two remote routes must root distinct traces (first='$PARENT_TP' second='$SECOND_TP')"
|
|
252
|
+
[ "$(remote_injected_traceparent)" = "$SECOND_TP" ] \
|
|
253
|
+
|| fail "the second remote route's pane must receive its own recorded carrier"
|
|
254
|
+
pass "boundary: each remote-routed second mate roots its own trace and never adopts the spawning environment's carrier"
|
|
255
|
+
|
|
256
|
+
# --- the enablement flag is one allowlist, shared by both remote ends --------
|
|
257
|
+
# config/trace-context reaches the remote home only because the sender and the
|
|
258
|
+
# receiver derive the same declared inherited-material set. Prove the receiver
|
|
259
|
+
# accepts it as ordinary inherited material rather than by name.
|
|
260
|
+
PROTOCOL_HOME="$TMP_ROOT/protocol-home"
|
|
261
|
+
mkdir -p "$PROTOCOL_HOME/config" "$PROTOCOL_HOME/data" "$PROTOCOL_HOME/state"
|
|
262
|
+
: > "$TMP_ROOT/flag-payload"
|
|
263
|
+
FLAG_BYTES=$(LC_ALL=C wc -c < "$TMP_ROOT/flag-payload" | tr -d ' ')
|
|
264
|
+
if command -v shasum >/dev/null 2>&1; then
|
|
265
|
+
FLAG_HASH=$(shasum -a 256 "$TMP_ROOT/flag-payload" | awk '{print $1}')
|
|
266
|
+
else
|
|
267
|
+
FLAG_HASH=$(sha256sum "$TMP_ROOT/flag-payload" | awk '{print $1}')
|
|
268
|
+
fi
|
|
269
|
+
FM_HOME="$PROTOCOL_HOME" "$REMOTE_ROOT/bin/fm-remote-inherit.sh" \
|
|
270
|
+
put config/trace-context "$FLAG_BYTES" "$FLAG_HASH" 1 < "$TMP_ROOT/flag-payload" >/dev/null \
|
|
271
|
+
|| fail "the remote inherit receiver refused a declared inheritable item"
|
|
272
|
+
assert_present "$PROTOCOL_HOME/config/trace-context" "the accepted inherited enablement flag was not published"
|
|
273
|
+
if FM_HOME="$PROTOCOL_HOME" "$REMOTE_ROOT/bin/fm-remote-inherit.sh" \
|
|
274
|
+
put config/secondmate-harness "$FLAG_BYTES" "$FLAG_HASH" 1 < "$TMP_ROOT/flag-payload" >/dev/null 2>&1; then
|
|
275
|
+
fail "the remote inherit receiver accepted an item outside the declared set"
|
|
276
|
+
fi
|
|
277
|
+
assert_absent "$PROTOCOL_HOME/config/secondmate-harness" "a non-inheritable item was published remotely"
|
|
278
|
+
pass "allowlist: the remote receiver accepts exactly the declared inherited-material set, including the enablement flag"
|
|
279
|
+
|
|
280
|
+
# --- the delivery flag is the only caller-supplied path to a pane export -----
|
|
281
|
+
# A remote host receives the carrier as an argument rather than resolving it, so
|
|
282
|
+
# that argument is refused unless it is a secondmate launch carrying a strictly
|
|
283
|
+
# valid W3C value. Nothing else may reach `export TRACEPARENT=`.
|
|
284
|
+
FLAG_HOME="$TMP_ROOT/flag-home"
|
|
285
|
+
mkdir -p "$FLAG_HOME/state" "$FLAG_HOME/data" "$FLAG_HOME/config" "$FLAG_HOME/projects" "$TMP_ROOT/flag-proj"
|
|
286
|
+
VALID='00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab-bbbbbbbbbbbbbbbb-01'
|
|
287
|
+
try_flag() { # <expect-substring> <message> [extra args...]
|
|
288
|
+
local expect=$1 message=$2 out
|
|
289
|
+
shift 2
|
|
290
|
+
if out=$(FM_SPAWN_NO_GUARD=1 FM_HOME="$FLAG_HOME" "$ROOT/bin/fm-spawn.sh" \
|
|
291
|
+
flag-a-b1 "$TMP_ROOT/flag-proj" "$@" 2>&1); then
|
|
292
|
+
fail "$message (the spawn succeeded instead)"
|
|
293
|
+
fi
|
|
294
|
+
assert_contains "$out" "$expect" "$message"
|
|
295
|
+
}
|
|
296
|
+
try_flag 'applies only to --secondmate spawns' \
|
|
297
|
+
"a ship spawn must refuse a caller-supplied carrier" \
|
|
298
|
+
--mode no-mistakes --yolo off --traceparent "$VALID"
|
|
299
|
+
try_flag 'not a valid W3C traceparent' \
|
|
300
|
+
"a shell-metacharacter carrier must be refused before any pane export" \
|
|
301
|
+
--secondmate --traceparent 'bogus; rm -rf /'
|
|
302
|
+
try_flag 'not a valid W3C traceparent' \
|
|
303
|
+
"an all-zero trace id must be refused as W3C-invalid" \
|
|
304
|
+
--secondmate --traceparent '00-00000000000000000000000000000000-bbbbbbbbbbbbbbbb-01'
|
|
305
|
+
try_flag 'requires a non-empty value' \
|
|
306
|
+
"an empty carrier must be refused rather than silently ignored" \
|
|
307
|
+
--secondmate --traceparent=
|
|
308
|
+
pass "delivery: a parent-supplied carrier is accepted only for a secondmate launch and only as a strict W3C value"
|
|
309
|
+
|
|
310
|
+
echo "ALL TESTS PASSED"
|