@zerwiz/ymir 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +290 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml +50 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +9 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/config/tailscale-sync.yaml +27 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/kaia.engram +0 -0
- package/.agents/memory/kaia.engram-shm +0 -0
- package/.agents/memory/kaia.engram-wal +0 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/memory/well/episodes.jsonl +367 -0
- package/.agents/memory/well/workspace.jsonl +27 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +111 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +70 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +52 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +34 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +454 -0
- package/CHANGELOG.md +881 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +113 -59
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +65 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +58 -0
- package/RULES/07-config.md +45 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/README.md +20 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +98 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +233 -0
- package/bin/apodex-smoke-test.sh +92 -0
- package/bin/bifrost-bridge.sh +112 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +107 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +38 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-guard.sh +165 -0
- package/bin/crash-sense.sh +160 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +207 -0
- package/bin/eindri-acclaim.sh +34 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seen.sh +41 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +85 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +112 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/fleet-apply.sh +68 -0
- package/bin/github-deploy.sh +81 -0
- package/bin/gjallarhorn-expose.sh +102 -0
- package/bin/gjallarhorn-notify.sh +58 -0
- package/bin/gjallarhorn-purge.sh +54 -0
- package/bin/gjallarhorn-tunnel.sh +72 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +122 -0
- package/bin/hall-snapshot.sh +92 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +431 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hoard-lib.sh +25 -0
- package/bin/hodd.sh +78 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +108 -0
- package/bin/local-model-lock.sh +51 -0
- package/bin/mimir-bridge.py +226 -0
- package/bin/mimir-bridge.sh +87 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +59 -0
- package/bin/mjollnir.sh +85 -0
- package/bin/model-hardware.sh +82 -0
- package/bin/model-resolve.sh +147 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +148 -0
- package/bin/omarchy-plugins.sh +174 -0
- package/bin/omarchy-sense.sh +149 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +38 -0
- package/bin/project-git.sh +55 -0
- package/bin/public-guard.sh +70 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +91 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +90 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +76 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +190 -0
- package/bin/telegram-bot.sh +69 -0
- package/bin/toolchain.sh +74 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +260 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +47 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +150 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +641 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +97 -0
- package/bin/ymir-setup-auth.sh +108 -0
- package/bin/ymir-validate.sh +173 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1056 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +44 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +210 -0
- package/scripts/start.sh +167 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Present durable watcher wake records, optionally acknowledge handled records,
|
|
3
|
+
# annotate every unread line for validated signal status keys, surface unread
|
|
4
|
+
# informational status lines, OPEN DECISIONS, and captain-call record
|
|
5
|
+
# divergence, then assert liveness.
|
|
6
|
+
#
|
|
7
|
+
# Keep sequence-bound row consumption independent from generation-bound episode
|
|
8
|
+
# retirement; docs/watcher-continuity.md owns the recovery contract.
|
|
9
|
+
set -u
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
# shellcheck source=bin/fm-wake-lib.sh
|
|
13
|
+
. "$SCRIPT_DIR/fm-wake-lib.sh"
|
|
14
|
+
# shellcheck source=bin/fm-classify-lib.sh
|
|
15
|
+
. "$SCRIPT_DIR/fm-classify-lib.sh"
|
|
16
|
+
# shellcheck source=bin/fm-line-cap-lib.sh
|
|
17
|
+
. "$SCRIPT_DIR/fm-line-cap-lib.sh"
|
|
18
|
+
# shellcheck source=bin/fm-timeout-lib.sh
|
|
19
|
+
. "$SCRIPT_DIR/fm-timeout-lib.sh"
|
|
20
|
+
# shellcheck source=bin/fm-lease-lib.sh
|
|
21
|
+
. "$SCRIPT_DIR/fm-lease-lib.sh"
|
|
22
|
+
|
|
23
|
+
DRAIN_TMP=
|
|
24
|
+
DRAIN_VIEW_TMP=
|
|
25
|
+
DRAIN_LOCK_HELD=false
|
|
26
|
+
RAW_ROWS=
|
|
27
|
+
RECOVERY_MARKER="$STATE/.watcher-down"
|
|
28
|
+
RECOVERY_MARKER_TOKEN=
|
|
29
|
+
RECOVERY_ACK_REQUIRED=false
|
|
30
|
+
RECOVERY_ACK_MOVED=false
|
|
31
|
+
ACK_THROUGH=
|
|
32
|
+
ACK_GENERATION=
|
|
33
|
+
ACK_FINGERPRINTS=
|
|
34
|
+
ACK_NOTICE_FINGERPRINTS=
|
|
35
|
+
|
|
36
|
+
# --- per-actor consume (docs/watcher-continuity.md "Per-actor acknowledgement") --
|
|
37
|
+
# main (FM_SUPERVISION_ACTOR unset or "main", via fm-lease-lib.sh's fm_lease_actor
|
|
38
|
+
# - the same actor identity fm-send.sh/fm-control.sh/fm-teardown.sh already use)
|
|
39
|
+
# claims every row not already granted to branch, then drains and acks only
|
|
40
|
+
# that claimed set. branch (FM_SUPERVISION_ACTOR=branch, injected
|
|
41
|
+
# deterministically by the Pi branch extension's bash tool - never agent
|
|
42
|
+
# memory) drains and acks only the row set the extension granted to it.
|
|
43
|
+
# .pi/extensions/lib/fm-branch-dispatch.ts is the single owner of that
|
|
44
|
+
# eligibility classification (which signal/stale rows resolve to a known
|
|
45
|
+
# project, and the existing all-unread-rows-safe rule for a heartbeat); this
|
|
46
|
+
# script never reclassifies a row itself, it only consumes the extension's
|
|
47
|
+
# already-computed verdict. The extension writes the exact eligible sequence
|
|
48
|
+
# numbers to ELIGIBLE_ROWS_FILE under the queue lock, immediately before every
|
|
49
|
+
# branch prompt, so the file is always fresh for the one wake that prompt is about to
|
|
50
|
+
# handle (the branch drains and acks exactly once per prompt, serialized by
|
|
51
|
+
# its own branchChain, before the next wake can overwrite the file).
|
|
52
|
+
# A row whose sequence number is not in that file is left completely
|
|
53
|
+
# untouched by a branch-actor drain or ack, no matter its sequence number
|
|
54
|
+
# relative to what the branch presents or consumes - that per-row scoping,
|
|
55
|
+
# not a cutoff comparison, is what makes a mixed main-only + task-local queue
|
|
56
|
+
# safe to split: the branch's ack can never remove a row it was not granted,
|
|
57
|
+
# so it can never swallow a main-owned row still waiting for main.
|
|
58
|
+
ACTOR=$(fm_lease_actor) || exit 2
|
|
59
|
+
ELIGIBLE_ROWS_FILE="$STATE/.branch-eligible-rows"
|
|
60
|
+
ELIGIBLE_OWNER_FILE="$STATE/.branch-eligible-owner"
|
|
61
|
+
MAIN_ROWS_FILE="$STATE/.main-eligible-rows"
|
|
62
|
+
|
|
63
|
+
rows_file_valid() {
|
|
64
|
+
[ -s "$1" ] && awk 'BEGIN { ok=1 } !/^[0-9]+$/ || seen[$0]++ { ok=0 } END { exit !ok }' "$1"
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
branch_grant_live_locked() {
|
|
68
|
+
local version pid identity generation current
|
|
69
|
+
[ -f "$ELIGIBLE_OWNER_FILE" ] && [ ! -L "$ELIGIBLE_OWNER_FILE" ] || return 1
|
|
70
|
+
exec 8< "$ELIGIBLE_OWNER_FILE" || return 1
|
|
71
|
+
IFS= read -r version <&8 || { exec 8<&-; return 1; }
|
|
72
|
+
IFS= read -r pid <&8 || { exec 8<&-; return 1; }
|
|
73
|
+
IFS= read -r identity <&8 || { exec 8<&-; return 1; }
|
|
74
|
+
IFS= read -r generation <&8 || { exec 8<&-; return 1; }
|
|
75
|
+
if IFS= read -r _extra <&8; then exec 8<&-; return 1; fi
|
|
76
|
+
exec 8<&-
|
|
77
|
+
[ "$version" = fm-branch-eligible-owner-v1 ] || return 1
|
|
78
|
+
case "$pid" in ''|*[!0-9]*|1) return 1 ;; esac
|
|
79
|
+
case "$generation" in ''|*[!A-Za-z0-9._-]*) return 1 ;; esac
|
|
80
|
+
current=$(fm_pid_identity "$pid" 2>/dev/null) || return 1
|
|
81
|
+
[ -n "$current" ] && [ "$current" = "$identity" ]
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
reclaim_stale_branch_grant_locked() {
|
|
85
|
+
[ -e "$ELIGIBLE_ROWS_FILE" ] || [ -L "$ELIGIBLE_ROWS_FILE" ] || return 0
|
|
86
|
+
if ! rows_file_valid "$ELIGIBLE_ROWS_FILE" || ! branch_grant_live_locked; then
|
|
87
|
+
rm -f -- "$ELIGIBLE_ROWS_FILE" "$ELIGIBLE_OWNER_FILE"
|
|
88
|
+
fi
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
write_rows_file_locked() { # <target> <source>
|
|
92
|
+
local target=$1 source=$2
|
|
93
|
+
if [ ! -s "$source" ]; then
|
|
94
|
+
rm -f -- "$target"
|
|
95
|
+
return
|
|
96
|
+
fi
|
|
97
|
+
chmod 0600 "$source" || return 1
|
|
98
|
+
_fm_atomic_replace "$source" "$target"
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
claim_main_rows_locked() {
|
|
102
|
+
DRAIN_TMP=$(mktemp "$STATE/.main-eligible-rows.tmp.XXXXXX") || return 1
|
|
103
|
+
awk -F '\t' -v branch="$ELIGIBLE_ROWS_FILE" -v main="$MAIN_ROWS_FILE" '
|
|
104
|
+
BEGIN {
|
|
105
|
+
while ((getline line < branch) > 0) reserved[line]=1
|
|
106
|
+
while ((getline line < main) > 0) owned[line]=1
|
|
107
|
+
}
|
|
108
|
+
NF >= 5 && $2 ~ /^[0-9]+$/ {
|
|
109
|
+
present[$2]=1
|
|
110
|
+
if (!($2 in reserved)) owned[$2]=1
|
|
111
|
+
}
|
|
112
|
+
END { for (seq in owned) if (seq in present) print seq }
|
|
113
|
+
' "$FM_WAKE_QUEUE" | LC_ALL=C sort -n > "$DRAIN_TMP" || return 1
|
|
114
|
+
write_rows_file_locked "$MAIN_ROWS_FILE" "$DRAIN_TMP" || return 1
|
|
115
|
+
DRAIN_TMP=
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
consume_actor_rows_locked() { # <rows-file> <cutoff>
|
|
119
|
+
local rows=$1 cutoff=$2
|
|
120
|
+
if [ ! -e "$rows" ] && [ ! -L "$rows" ]; then
|
|
121
|
+
return 0
|
|
122
|
+
fi
|
|
123
|
+
DRAIN_TMP=$(mktemp "$STATE/.wake-rows.consume.XXXXXX") || return 1
|
|
124
|
+
awk -v cutoff="$cutoff" '$1 ~ /^[0-9]+$/ && $1 > cutoff { print $1 }' "$rows" > "$DRAIN_TMP" || return 1
|
|
125
|
+
write_rows_file_locked "$rows" "$DRAIN_TMP" || return 1
|
|
126
|
+
DRAIN_TMP=
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
# A branch-actor drain or ack requires a snapshot to already exist and name at
|
|
130
|
+
# least one row. The extension always writes a non-empty snapshot before it
|
|
131
|
+
# ever prompts the branch (an empty eligible set means no prompt at all), so a
|
|
132
|
+
# missing or empty file here means this ran outside that handoff - a wiring
|
|
133
|
+
# bug, never "nothing eligible" - and must fail loudly rather than silently
|
|
134
|
+
# draining or acking nothing.
|
|
135
|
+
require_branch_eligible_rows() {
|
|
136
|
+
rows_file_valid "$ELIGIBLE_ROWS_FILE" || {
|
|
137
|
+
echo "wake drain: no branch-eligible row snapshot at $ELIGIBLE_ROWS_FILE; refusing to guess what this actor may consume" >&2
|
|
138
|
+
return 1
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
case "${1:-}" in
|
|
143
|
+
'') ;;
|
|
144
|
+
--ack-through)
|
|
145
|
+
ACK_THROUGH=${2:-}
|
|
146
|
+
case "$ACK_THROUGH" in ''|*[!0-9]*) echo "wake drain: invalid acknowledgement sequence" >&2; exit 2 ;; esac
|
|
147
|
+
[ "${3:-}" = --recovery-generation ] \
|
|
148
|
+
|| { echo "wake drain: acknowledgement requires its recovery generation" >&2; exit 2; }
|
|
149
|
+
ACK_GENERATION=${4:-}
|
|
150
|
+
case "$ACK_GENERATION" in ''|*[!A-Za-z0-9._-]*) echo "wake drain: invalid recovery generation" >&2; exit 2 ;; esac
|
|
151
|
+
[ "$#" -eq 4 ] || { echo "wake drain: unexpected acknowledgement arguments" >&2; exit 2; }
|
|
152
|
+
;;
|
|
153
|
+
*) echo "usage: fm-wake-drain.sh [--ack-through SEQUENCE --recovery-generation GENERATION]" >&2; exit 2 ;;
|
|
154
|
+
esac
|
|
155
|
+
|
|
156
|
+
[ "$ACTOR" != branch ] || require_branch_eligible_rows || exit 1
|
|
157
|
+
|
|
158
|
+
# Defense in depth for the supervision chain: this script runs at the top of
|
|
159
|
+
# every wake-handling and recovery turn, so assert supervision health here too. A
|
|
160
|
+
# lapsed supervision chain then surfaces on a plain drain-and-handle turn, not
|
|
161
|
+
# only when a guarded supervision script (fm-peek/fm-send/...) happens to run.
|
|
162
|
+
# Reuse fm-guard.sh's model-aware alarm and FM_GUARD_GRACE instead of duplicating
|
|
163
|
+
# its supervision verdict. Under Claude's between-turns auto-arm model, a normal
|
|
164
|
+
# fire leaves a recent beacon well inside grace and stays silent mid-turn. Under
|
|
165
|
+
# the Pi extension model, a fresh beacon also stays silent during a genuinely
|
|
166
|
+
# unheld-lock hand-off only while the live session proves extension ownership.
|
|
167
|
+
# Persistent-watcher models still require the live identity-matched watcher.
|
|
168
|
+
# Never let a guard hiccup change the drain's exit status.
|
|
169
|
+
assert_watcher_liveness() {
|
|
170
|
+
"$SCRIPT_DIR/fm-guard.sh" || true
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
# Mark presentation-stage inactive terminal outcomes only after the handling
|
|
174
|
+
# turn has completed and before this acknowledgement consumes its queue rows.
|
|
175
|
+
# The helper ignores non-presentation and legacy keys, so this is a narrow
|
|
176
|
+
# receipt path rather than a second interpretation of general check wakes.
|
|
177
|
+
inactive_outcome_fingerprints() { # <sequence> <key-prefix> [<rows-file>]
|
|
178
|
+
local cutoff=$1 prefix=$2 rows=${3:-} epoch seq kind key payload
|
|
179
|
+
while IFS=$(printf '\t') read -r epoch seq kind key payload; do
|
|
180
|
+
[ "$kind" = check ] || continue
|
|
181
|
+
case "$seq" in ''|*[!0-9]*) continue ;; esac
|
|
182
|
+
[ "$seq" -le "$cutoff" ] || continue
|
|
183
|
+
if [ -n "$rows" ] && ! grep -qxF "$seq" "$rows"; then continue; fi
|
|
184
|
+
case "$key" in
|
|
185
|
+
"$prefix"*) printf '%s\n' "${key#"$prefix"}" ;;
|
|
186
|
+
esac
|
|
187
|
+
done < "$FM_WAKE_QUEUE"
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
acknowledge_inactive_outcomes() { # <mode> <newline-separated-fingerprints>
|
|
191
|
+
local mode=$1 fingerprints=$2 fingerprint
|
|
192
|
+
while IFS= read -r fingerprint; do
|
|
193
|
+
[ -n "$fingerprint" ] || continue
|
|
194
|
+
"$SCRIPT_DIR/fm-inactive-reconcile.sh" "$mode" "$fingerprint" || return 1
|
|
195
|
+
done <<< "$fingerprints"
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
# Print still-unread informational status lines (note: answers and pending-reply
|
|
199
|
+
# resolutions) that the OPEN DECISIONS fold never carries. Uses the same
|
|
200
|
+
# cursor-backed unread span as the annotation path, and runs on every drain -
|
|
201
|
+
# including the empty-queue fast path - so a buried answer cannot be swallowed
|
|
202
|
+
# when the fold later advances the cursor. Prints nothing when nothing is
|
|
203
|
+
# unread, which is the common case.
|
|
204
|
+
print_unread_status_section() {
|
|
205
|
+
local snapshot=${1:-} unread task line shown=0
|
|
206
|
+
|
|
207
|
+
if [ -n "$snapshot" ]; then
|
|
208
|
+
unread=$(scan_unread_surface_snapshot "$STATE" "$snapshot") || return 1
|
|
209
|
+
else
|
|
210
|
+
unread=$(scan_unread_surface_lines "$STATE") || return 1
|
|
211
|
+
fi
|
|
212
|
+
[ -n "$unread" ] || return 0
|
|
213
|
+
|
|
214
|
+
while IFS=$(printf '\t') read -r task line; do
|
|
215
|
+
[ -n "$task" ] || continue
|
|
216
|
+
[ -n "$line" ] || continue
|
|
217
|
+
line="$task $line"
|
|
218
|
+
if [ "$shown" -eq 0 ]; then
|
|
219
|
+
printf 'UNREAD STATUS (new since last drain, not re-printed after this presentation):\n' || return 1
|
|
220
|
+
fi
|
|
221
|
+
printf '%s\n' "$line" || return 1
|
|
222
|
+
shown=$((shown + 1))
|
|
223
|
+
done <<EOF
|
|
224
|
+
$unread
|
|
225
|
+
EOF
|
|
226
|
+
|
|
227
|
+
[ "$shown" -gt 0 ] || return 0
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
# Print the consolidated OPEN DECISIONS section: every still-open
|
|
231
|
+
# needs-decision/blocked, fleet-wide, folded from the durable status logs by
|
|
232
|
+
# fm-classify-lib.sh's status_open_decisions fold (via its cursor-backed
|
|
233
|
+
# scan_open_decisions_incremental wrapper) rather than from the annotations
|
|
234
|
+
# above, so a decision buried under later unrelated appends cannot be silently
|
|
235
|
+
# missed. Informational `note:` lines and pending-reply resolutions are not
|
|
236
|
+
# decisions; print_unread_status_section owns their one-shot surface. Runs on
|
|
237
|
+
# every drain - including the empty-queue fast path - because the decision can
|
|
238
|
+
# still be open even when nothing new is queued for
|
|
239
|
+
# its task this turn. The incremental wrapper bounds this scan's cost to bytes
|
|
240
|
+
# appended to each task's status log since the LAST drain, not that log's whole
|
|
241
|
+
# lifetime, while still never dropping an old buried decision (see
|
|
242
|
+
# fm-classify-lib.sh's "incremental (cursor-backed) open-decisions fold").
|
|
243
|
+
# Bounded and silent: prints nothing when no decision is open, which is the
|
|
244
|
+
# common case.
|
|
245
|
+
print_open_decisions_section() {
|
|
246
|
+
local snapshot=${1:-} open task key verb note line item_bytes=220 global_bytes=4000
|
|
247
|
+
local output='' used=0 shown=0 omitted=0 bytes
|
|
248
|
+
|
|
249
|
+
if [ -n "$snapshot" ]; then
|
|
250
|
+
open=$(scan_open_decisions_snapshot "$STATE" "$snapshot") || return 1
|
|
251
|
+
else
|
|
252
|
+
open=$(scan_open_decisions_incremental "$STATE") || return 1
|
|
253
|
+
fi
|
|
254
|
+
[ -n "$open" ] || return 0
|
|
255
|
+
|
|
256
|
+
while IFS=$(printf '\t') read -r task key verb note; do
|
|
257
|
+
[ -n "$task" ] || continue
|
|
258
|
+
line="$task"
|
|
259
|
+
[ "$key" = default ] || line="$line [key=$key]"
|
|
260
|
+
line="$line $verb: $note"
|
|
261
|
+
# The shared cut counts the item's own characters; the trailing newline this
|
|
262
|
+
# section's global budget also pays for is this caller's, so the per-item
|
|
263
|
+
# allowance passed down is one short of the cap.
|
|
264
|
+
fm_cap_line_var "$line" $((item_bytes - 1))
|
|
265
|
+
line=$FM_LINE_CAP_LINE
|
|
266
|
+
bytes=$(( ${#line} + 1 ))
|
|
267
|
+
if [ $((used + bytes)) -gt "$global_bytes" ]; then
|
|
268
|
+
omitted=$((omitted + 1))
|
|
269
|
+
continue
|
|
270
|
+
fi
|
|
271
|
+
output="$output$line
|
|
272
|
+
"
|
|
273
|
+
used=$((used + bytes))
|
|
274
|
+
shown=$((shown + 1))
|
|
275
|
+
done <<EOF
|
|
276
|
+
$open
|
|
277
|
+
EOF
|
|
278
|
+
|
|
279
|
+
[ "$shown" -gt 0 ] || [ "$omitted" -gt 0 ] || return 0
|
|
280
|
+
printf 'OPEN DECISIONS (still open, folded from the durable status logs - not just the latest line):\n' || return 1
|
|
281
|
+
printf '%s' "$output" || return 1
|
|
282
|
+
if [ "$omitted" -gt 0 ]; then
|
|
283
|
+
printf 'OPEN DECISIONS: %d more omitted (byte cap)\n' "$omitted" || return 1
|
|
284
|
+
fi
|
|
285
|
+
# Answerer-closes hint, printed at exactly the moment an answer gets written:
|
|
286
|
+
# the send that answers a listed decision also closes it, so closure never
|
|
287
|
+
# depends on the busy worker writing a matching resolved line (contract:
|
|
288
|
+
# bin/fm-send.sh header).
|
|
289
|
+
printf "OPEN DECISIONS: close one by answering it: bin/fm-send.sh <task> --resolve-key <key> '<answer>'\n" || return 1
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
# Print the RECORD DIVERGENCE section: every captain call whose two records
|
|
293
|
+
# contradict each other - the status log says a key was resolved outright while
|
|
294
|
+
# the task held for the captain is still open. Nothing here closes anything; the
|
|
295
|
+
# section exists because posting the resolution alone reads as complete on the
|
|
296
|
+
# status side, so the durable record can keep saying the captain owes an answer
|
|
297
|
+
# with no warning at all. bin/fm-captain-hold.sh's `diverged` owns which pairs
|
|
298
|
+
# count and why; this prints what it reports.
|
|
299
|
+
#
|
|
300
|
+
# Bounded and silent like OPEN DECISIONS above: nothing prints when the two
|
|
301
|
+
# records agree, which is the common case. If tasks-axi is unavailable, the
|
|
302
|
+
# guard cannot read the structured record and stays silent. A guard failure
|
|
303
|
+
# never changes the drain's exit status - a supervision turn must still present
|
|
304
|
+
# its wakes when the backlog tool is having a bad day.
|
|
305
|
+
print_record_divergence_section() {
|
|
306
|
+
local diverged task origin key title line shown=0 omitted=0 bound
|
|
307
|
+
local output='' used=0 bytes item_bytes=220 global_bytes=2000
|
|
308
|
+
|
|
309
|
+
# A non-positive bound is not a bound (bin/fm-timeout-lib.sh), so a bad
|
|
310
|
+
# override falls back to the default rather than disabling the deadline.
|
|
311
|
+
bound=${FM_DIVERGENCE_TIMEOUT:-20}
|
|
312
|
+
case "$bound" in ''|*[!0-9]*|0) bound=20 ;; esac
|
|
313
|
+
|
|
314
|
+
# Bounded, because this runs at the top of every supervision turn: a backlog
|
|
315
|
+
# tool having a bad day must cost the drain a few seconds at worst, never the
|
|
316
|
+
# presentation of the wakes it exists to deliver.
|
|
317
|
+
diverged=$(fm_run_timed "$bound" "$SCRIPT_DIR/fm-captain-hold.sh" diverged 2>/dev/null) || return 0
|
|
318
|
+
[ -n "$diverged" ] || return 0
|
|
319
|
+
|
|
320
|
+
while IFS=$(printf '\t') read -r task origin key title; do
|
|
321
|
+
[ -n "$task" ] || continue
|
|
322
|
+
line="$task [key=$key] reads resolved in $origin's status log but is still held for the captain"
|
|
323
|
+
[ -z "$title" ] || line="$line: $title"
|
|
324
|
+
fm_cap_line_var "$line" $((item_bytes - 1))
|
|
325
|
+
line=$FM_LINE_CAP_LINE
|
|
326
|
+
bytes=$(( ${#line} + 1 ))
|
|
327
|
+
if [ $((used + bytes)) -gt "$global_bytes" ]; then
|
|
328
|
+
omitted=$((omitted + 1))
|
|
329
|
+
continue
|
|
330
|
+
fi
|
|
331
|
+
output="$output$line
|
|
332
|
+
"
|
|
333
|
+
used=$((used + bytes))
|
|
334
|
+
shown=$((shown + 1))
|
|
335
|
+
done <<EOF
|
|
336
|
+
$diverged
|
|
337
|
+
EOF
|
|
338
|
+
|
|
339
|
+
[ "$shown" -gt 0 ] || [ "$omitted" -gt 0 ] || return 0
|
|
340
|
+
printf 'RECORD DIVERGENCE (answered in the status log, still held in the backlog - nothing was closed automatically):\n' || return 1
|
|
341
|
+
printf '%s' "$output" || return 1
|
|
342
|
+
if [ "$omitted" -gt 0 ]; then
|
|
343
|
+
printf 'RECORD DIVERGENCE: %d more omitted (byte cap)\n' "$omitted" || return 1
|
|
344
|
+
fi
|
|
345
|
+
# Both directions, deliberately. The status resolution is not proof the
|
|
346
|
+
# captain ruled: a call can dissolve, or turn out to have been a question of
|
|
347
|
+
# fact. Reconcile with what actually happened - never by closing on the
|
|
348
|
+
# strength of this line.
|
|
349
|
+
printf 'RECORD DIVERGENCE: reconcile each one - record the captain'"'"'s own words with bin/fm-captain-hold.sh answer <task> --decision-file <path>, or re-open the status decision when that resolution was not the captain'"'"'s word.\n' || return 1
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
print_status_sections() {
|
|
353
|
+
local snapshot=${1:-} fully_presented=${2:-} acknowledged
|
|
354
|
+
if [ -z "$snapshot" ]; then snapshot=$(status_presentation_snapshot "$STATE") || return 1; fi
|
|
355
|
+
[ -n "$snapshot" ] || return 0
|
|
356
|
+
acknowledged=$(status_acknowledge_presented_snapshot "$STATE" "$snapshot" "$fully_presented") || return 1
|
|
357
|
+
print_unread_status_section "$snapshot" || return 1
|
|
358
|
+
print_open_decisions_section "$snapshot" || return 1
|
|
359
|
+
print_record_divergence_section || return 1
|
|
360
|
+
status_commit_presentation_snapshot "$STATE" "$acknowledged"
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
print_status_presentation() { # [<deduped-raw-rows>]
|
|
364
|
+
local rows=${1:-} lock="$STATE/.status-presentation-lock" snapshot annotation_manifest fully_presented='' rc=0
|
|
365
|
+
fm_lock_acquire_wait "$lock" || return 1
|
|
366
|
+
snapshot=$(status_presentation_snapshot "$STATE") || {
|
|
367
|
+
printf 'STATUS PRESENTATION INCOMPLETE: status snapshot could not be read.\n'
|
|
368
|
+
rc=1
|
|
369
|
+
}
|
|
370
|
+
if [ "$rc" -eq 0 ] && [ -n "$rows" ]; then
|
|
371
|
+
fm_wake_print_annotations "$rows" "$snapshot" || rc=1
|
|
372
|
+
if [ "$rc" -eq 0 ]; then
|
|
373
|
+
annotation_manifest=$(fm_wake_annotation_manifest "$rows") || rc=1
|
|
374
|
+
fully_presented=$(printf '%s\n' "$annotation_manifest" | awk -F '\t' '$2 == "direct" { sub(/\.status$/, "", $1); print $1 }') || rc=1
|
|
375
|
+
fi
|
|
376
|
+
fi
|
|
377
|
+
if [ "$rc" -eq 0 ] && [ -n "$snapshot" ]; then print_status_sections "$snapshot" "$fully_presented" || rc=1; fi
|
|
378
|
+
fm_lock_release "$lock"
|
|
379
|
+
return "$rc"
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
# shellcheck disable=SC2317,SC2329 # Invoked by trap handlers below.
|
|
383
|
+
cleanup() {
|
|
384
|
+
local status=$?
|
|
385
|
+
[ -z "$DRAIN_TMP" ] || rm -f -- "$DRAIN_TMP" 2>/dev/null || true
|
|
386
|
+
[ -z "$DRAIN_VIEW_TMP" ] || rm -f -- "$DRAIN_VIEW_TMP" 2>/dev/null || true
|
|
387
|
+
if [ "$DRAIN_LOCK_HELD" = true ]; then
|
|
388
|
+
fm_lock_release "$FM_WAKE_QUEUE_LOCK"
|
|
389
|
+
fi
|
|
390
|
+
exit "$status"
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
trap cleanup EXIT
|
|
394
|
+
trap 'exit 130' INT
|
|
395
|
+
trap 'exit 143' TERM
|
|
396
|
+
|
|
397
|
+
fm_lock_acquire_wait "$FM_WAKE_QUEUE_LOCK"
|
|
398
|
+
DRAIN_LOCK_HELD=true
|
|
399
|
+
reclaim_stale_branch_grant_locked || exit 1
|
|
400
|
+
[ "$ACTOR" != branch ] || require_branch_eligible_rows || exit 1
|
|
401
|
+
|
|
402
|
+
if [ -n "$ACK_THROUGH" ]; then
|
|
403
|
+
if [ "$ACTOR" = main ]; then
|
|
404
|
+
# Preserve main's original whole-cutoff acknowledgement contract: rows may
|
|
405
|
+
# arrive after presentation but before the printed ack runs, and a direct
|
|
406
|
+
# or replayed main ack still owns every unreserved row through its cutoff.
|
|
407
|
+
# Claim again under the queue lock so those rows cannot be stranded merely
|
|
408
|
+
# because they were not present during the earlier drain. A live branch
|
|
409
|
+
# grant remains excluded by claim_main_rows_locked.
|
|
410
|
+
claim_main_rows_locked || exit 1
|
|
411
|
+
fi
|
|
412
|
+
if [ "$ACTOR" = branch ]; then
|
|
413
|
+
# check-kind rows (inactive-outcome receipts, secondmate stall markers)
|
|
414
|
+
# are never in a branch's eligible snapshot - they are main-only by
|
|
415
|
+
# construction (docs/pi-supervision-branch.md) - so a branch-actor ack
|
|
416
|
+
# never removes one and these scans would find nothing relevant anyway.
|
|
417
|
+
ACK_FINGERPRINTS=
|
|
418
|
+
ACK_NOTICE_FINGERPRINTS=
|
|
419
|
+
else
|
|
420
|
+
if { [ -e "$MAIN_ROWS_FILE" ] || [ -L "$MAIN_ROWS_FILE" ]; } \
|
|
421
|
+
&& ! rows_file_valid "$MAIN_ROWS_FILE"; then
|
|
422
|
+
echo "wake drain: main acknowledgement has an invalid presented-row claim" >&2
|
|
423
|
+
exit 1
|
|
424
|
+
fi
|
|
425
|
+
ACK_FINGERPRINTS=$(inactive_outcome_fingerprints "$ACK_THROUGH" 'inactive-outcome:' "$MAIN_ROWS_FILE") || exit 1
|
|
426
|
+
ACK_NOTICE_FINGERPRINTS=$(inactive_outcome_fingerprints "$ACK_THROUGH" 'inactive-reconcile:' "$MAIN_ROWS_FILE") || exit 1
|
|
427
|
+
fi
|
|
428
|
+
fm_lock_release "$FM_WAKE_QUEUE_LOCK"
|
|
429
|
+
DRAIN_LOCK_HELD=false
|
|
430
|
+
if ! acknowledge_inactive_outcomes acknowledge "$ACK_FINGERPRINTS" \
|
|
431
|
+
|| ! acknowledge_inactive_outcomes acknowledge-notice "$ACK_NOTICE_FINGERPRINTS"; then
|
|
432
|
+
echo "wake drain: inactive outcome receipt could not be recorded safely" >&2
|
|
433
|
+
exit 1
|
|
434
|
+
fi
|
|
435
|
+
fm_lock_acquire_wait "$FM_WAKE_QUEUE_LOCK"
|
|
436
|
+
DRAIN_LOCK_HELD=true
|
|
437
|
+
DRAIN_TMP=$(mktemp "$STATE/.wake-queue.ack.XXXXXX") || exit 1
|
|
438
|
+
chmod 0600 "$DRAIN_TMP" || exit 1
|
|
439
|
+
if [ "$ACTOR" = branch ]; then
|
|
440
|
+
require_branch_eligible_rows || exit 1
|
|
441
|
+
# Delete a row only when its sequence is <= cutoff AND it is named in the
|
|
442
|
+
# extension's eligible snapshot; every other row - including one whose
|
|
443
|
+
# sequence is below cutoff but not in the snapshot - is kept untouched.
|
|
444
|
+
awk -F '\t' -v cutoff="$ACK_THROUGH" -v seqs="$ELIGIBLE_ROWS_FILE" '
|
|
445
|
+
BEGIN { while ((getline line < seqs) > 0) if (line ~ /^[0-9]+$/) keep[line] = 1 }
|
|
446
|
+
NF < 5 || $2 !~ /^[0-9]+$/ || $2 > cutoff || !($2 in keep) { print }
|
|
447
|
+
' "$FM_WAKE_QUEUE" > "$DRAIN_TMP" || exit 1
|
|
448
|
+
else
|
|
449
|
+
awk -F '\t' -v cutoff="$ACK_THROUGH" -v seqs="$MAIN_ROWS_FILE" '
|
|
450
|
+
BEGIN { while ((getline line < seqs) > 0) owned[line]=1 }
|
|
451
|
+
NF < 5 || $2 !~ /^[0-9]+$/ || $2 > cutoff || !($2 in owned) { print }
|
|
452
|
+
' "$FM_WAKE_QUEUE" > "$DRAIN_TMP" || exit 1
|
|
453
|
+
fm_wake_commit_secondmate_stall_receipts_through "$ACK_THROUGH" "$MAIN_ROWS_FILE" || {
|
|
454
|
+
echo "wake drain: secondmate stall receipt could not be recorded safely" >&2
|
|
455
|
+
exit 1
|
|
456
|
+
}
|
|
457
|
+
fi
|
|
458
|
+
if [ ! -s "$DRAIN_TMP" ]; then
|
|
459
|
+
fm_recovery_marker_ack "$RECOVERY_MARKER" "$ACK_GENERATION"
|
|
460
|
+
RECOVERY_ACK_STATUS=$?
|
|
461
|
+
case "$RECOVERY_ACK_STATUS" in
|
|
462
|
+
0) ;;
|
|
463
|
+
3) RECOVERY_ACK_MOVED=true ;;
|
|
464
|
+
*)
|
|
465
|
+
echo "wake drain: recovery episode could not be retired safely; re-run bin/fm-wake-drain.sh and use the new WAKE_ACK_REQUIRED command" >&2
|
|
466
|
+
exit 1
|
|
467
|
+
;;
|
|
468
|
+
esac
|
|
469
|
+
else
|
|
470
|
+
fm_recovery_marker_snapshot "$RECOVERY_MARKER" || exit 1
|
|
471
|
+
RECOVERY_MARKER_TOKEN=$FM_RECOVERY_MARKER_TOKEN
|
|
472
|
+
if [ "${RECOVERY_MARKER_TOKEN##*:}" != "$ACK_GENERATION" ]; then
|
|
473
|
+
RECOVERY_ACK_MOVED=true
|
|
474
|
+
fi
|
|
475
|
+
fi
|
|
476
|
+
if ! _fm_atomic_replace "$DRAIN_TMP" "$FM_WAKE_QUEUE"; then
|
|
477
|
+
echo "wake drain: acknowledged wakes could not be consumed safely" >&2
|
|
478
|
+
exit 1
|
|
479
|
+
fi
|
|
480
|
+
DRAIN_TMP=
|
|
481
|
+
if [ "$ACTOR" = branch ]; then
|
|
482
|
+
consume_actor_rows_locked "$ELIGIBLE_ROWS_FILE" "$ACK_THROUGH" || exit 1
|
|
483
|
+
else
|
|
484
|
+
consume_actor_rows_locked "$MAIN_ROWS_FILE" "$ACK_THROUGH" || exit 1
|
|
485
|
+
fi
|
|
486
|
+
fm_lock_release "$FM_WAKE_QUEUE_LOCK"
|
|
487
|
+
DRAIN_LOCK_HELD=false
|
|
488
|
+
if [ "$RECOVERY_ACK_MOVED" = true ]; then
|
|
489
|
+
printf 'wake drain: acknowledged wakes through %s, but a newer recovery episode is pending; re-run bin/fm-wake-drain.sh and use the new WAKE_ACK_REQUIRED command\n' \
|
|
490
|
+
"$ACK_THROUGH" >&2
|
|
491
|
+
fi
|
|
492
|
+
exit 0
|
|
493
|
+
fi
|
|
494
|
+
|
|
495
|
+
if [ ! -s "$FM_WAKE_QUEUE" ]; then
|
|
496
|
+
: > "$FM_WAKE_QUEUE"
|
|
497
|
+
fm_recovery_marker_snapshot "$RECOVERY_MARKER" || true
|
|
498
|
+
RECOVERY_MARKER_TOKEN=$FM_RECOVERY_MARKER_TOKEN
|
|
499
|
+
case "$RECOVERY_MARKER_TOKEN" in
|
|
500
|
+
pending:downtime:*|announced:downtime:*)
|
|
501
|
+
fm_recovery_marker_begin_handling "$RECOVERY_MARKER" || {
|
|
502
|
+
echo "wake drain: decision recovery could not begin handling safely" >&2
|
|
503
|
+
exit 1
|
|
504
|
+
}
|
|
505
|
+
RECOVERY_MARKER_TOKEN=$FM_RECOVERY_MARKER_TOKEN
|
|
506
|
+
RECOVERY_ACK_REQUIRED=true
|
|
507
|
+
;;
|
|
508
|
+
pending:handling:*|announced:handling:*) RECOVERY_ACK_REQUIRED=true ;;
|
|
509
|
+
esac
|
|
510
|
+
fm_lock_release "$FM_WAKE_QUEUE_LOCK"
|
|
511
|
+
DRAIN_LOCK_HELD=false
|
|
512
|
+
(print_status_presentation) || true
|
|
513
|
+
if [ "$RECOVERY_ACK_REQUIRED" = true ]; then
|
|
514
|
+
printf 'WAKE_ACK_REQUIRED: after handling completes run bin/fm-wake-drain.sh --ack-through 0 --recovery-generation %s\n' "${RECOVERY_MARKER_TOKEN##*:}" >&2
|
|
515
|
+
fi
|
|
516
|
+
assert_watcher_liveness
|
|
517
|
+
exit 0
|
|
518
|
+
fi
|
|
519
|
+
|
|
520
|
+
if [ "$ACTOR" = main ]; then
|
|
521
|
+
if [ -e "$ELIGIBLE_ROWS_FILE" ] || [ -L "$ELIGIBLE_ROWS_FILE" ]; then
|
|
522
|
+
require_branch_eligible_rows || exit 1
|
|
523
|
+
fi
|
|
524
|
+
claim_main_rows_locked || exit 1
|
|
525
|
+
if [ ! -s "$MAIN_ROWS_FILE" ]; then
|
|
526
|
+
fm_lock_release "$FM_WAKE_QUEUE_LOCK"
|
|
527
|
+
DRAIN_LOCK_HELD=false
|
|
528
|
+
(print_status_presentation) || true
|
|
529
|
+
assert_watcher_liveness
|
|
530
|
+
exit 0
|
|
531
|
+
fi
|
|
532
|
+
fi
|
|
533
|
+
|
|
534
|
+
fm_recovery_marker_snapshot "$RECOVERY_MARKER" || true
|
|
535
|
+
RECOVERY_MARKER_TOKEN=$FM_RECOVERY_MARKER_TOKEN
|
|
536
|
+
if [ -z "$RECOVERY_MARKER_TOKEN" ]; then
|
|
537
|
+
if [ -e "$RECOVERY_MARKER" ] || [ -L "$RECOVERY_MARKER" ]; then
|
|
538
|
+
echo "wake drain: durable wakes have invalid recovery state" >&2
|
|
539
|
+
exit 1
|
|
540
|
+
fi
|
|
541
|
+
fm_recovery_marker_publish "$RECOVERY_MARKER" downtime || {
|
|
542
|
+
echo "wake drain: legacy durable wakes could not be adopted safely" >&2
|
|
543
|
+
exit 1
|
|
544
|
+
}
|
|
545
|
+
elif [ "${RECOVERY_MARKER_TOKEN%%:*}" = acked ]; then
|
|
546
|
+
fm_recovery_marker_publish "$RECOVERY_MARKER" downtime || {
|
|
547
|
+
echo "wake drain: durable wakes could not enter a fresh recovery generation" >&2
|
|
548
|
+
exit 1
|
|
549
|
+
}
|
|
550
|
+
fi
|
|
551
|
+
fm_recovery_marker_begin_handling "$RECOVERY_MARKER" || {
|
|
552
|
+
echo "wake drain: durable wakes could not begin handling safely" >&2
|
|
553
|
+
exit 1
|
|
554
|
+
}
|
|
555
|
+
RECOVERY_MARKER_TOKEN=$FM_RECOVERY_MARKER_TOKEN
|
|
556
|
+
|
|
557
|
+
DRAIN_VIEW_TMP=$(mktemp "$STATE/.wake-queue.actor-view.XXXXXX") || exit 1
|
|
558
|
+
if [ "$ACTOR" = branch ]; then
|
|
559
|
+
ACTOR_ROWS_FILE=$ELIGIBLE_ROWS_FILE
|
|
560
|
+
else
|
|
561
|
+
ACTOR_ROWS_FILE=$MAIN_ROWS_FILE
|
|
562
|
+
fi
|
|
563
|
+
awk -F '\t' -v seqs="$ACTOR_ROWS_FILE" '
|
|
564
|
+
BEGIN { while ((getline line < seqs) > 0) keep[line]=1 }
|
|
565
|
+
NF >= 5 && ($2 in keep)
|
|
566
|
+
' "$FM_WAKE_QUEUE" > "$DRAIN_VIEW_TMP" || exit 1
|
|
567
|
+
RAW_ROWS=$(fm_wake_print_deduped "$DRAIN_VIEW_TMP") || exit "$?"
|
|
568
|
+
rm -f -- "$DRAIN_VIEW_TMP" || exit 1
|
|
569
|
+
DRAIN_VIEW_TMP=
|
|
570
|
+
ACK_THROUGH=$(printf '%s\n' "$RAW_ROWS" | awk -F '\t' '$2 ~ /^[0-9]+$/ && $2 > max { max=$2 } END { print max + 0 }') || exit 1
|
|
571
|
+
case "${FM_WAKE_DRAIN_TEST_DELAY_BEFORE_COMMIT:-0}" in
|
|
572
|
+
0) ;;
|
|
573
|
+
''|*[!0-9]*) ;;
|
|
574
|
+
*) sleep "$FM_WAKE_DRAIN_TEST_DELAY_BEFORE_COMMIT" ;;
|
|
575
|
+
esac
|
|
576
|
+
if [ -n "$RAW_ROWS" ]; then
|
|
577
|
+
printf '%s\n' "$RAW_ROWS" || exit "$?"
|
|
578
|
+
fi
|
|
579
|
+
fm_recovery_marker_snapshot "$RECOVERY_MARKER" || exit 1
|
|
580
|
+
RECOVERY_MARKER_TOKEN=$FM_RECOVERY_MARKER_TOKEN
|
|
581
|
+
case "$RECOVERY_MARKER_TOKEN" in
|
|
582
|
+
pending:*|announced:*|acked:*) ;;
|
|
583
|
+
*) echo "wake drain: durable wakes have no recovery generation" >&2; exit 1 ;;
|
|
584
|
+
esac
|
|
585
|
+
fm_lock_release "$FM_WAKE_QUEUE_LOCK"
|
|
586
|
+
DRAIN_LOCK_HELD=false
|
|
587
|
+
printf 'WAKE_ACK_REQUIRED: after handling completes run bin/fm-wake-drain.sh --ack-through %s --recovery-generation %s\n' \
|
|
588
|
+
"$ACK_THROUGH" "${RECOVERY_MARKER_TOKEN##*:}" >&2
|
|
589
|
+
|
|
590
|
+
(print_status_presentation "$RAW_ROWS") || true
|
|
591
|
+
assert_watcher_liveness
|
|
592
|
+
exit 0
|