@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,291 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eindri-homes
|
|
3
|
+
description: >-
|
|
4
|
+
Agent-only reference for persistent Eindri-home setup and retirement.
|
|
5
|
+
Use when creating, seeding, validating, launching, recovering, handing backlog to, pushing inherited local material into, or retiring a Eindri-home home, or when editing data/eindri-homes.md.
|
|
6
|
+
Covers local leases, whole-home remote routes, transactional seeding, record intake for an existing or inherited domain, project clone restrictions, Eindri-home harness pins, inherited local-material push, idle charter, handoff helper, and teardown safety.
|
|
7
|
+
user-invocable: false
|
|
8
|
+
metadata:
|
|
9
|
+
internal: true
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# eindri-homes — worker homes — provisioning and upkeep of Eindri homes
|
|
13
|
+
|
|
14
|
+
Use this reference before creating, seeding, validating, launching, handing backlog to, recovering, pushing inherited local material into, or retiring a persistent Eindri-home, and before editing `data/eindri-homes.md`.
|
|
15
|
+
|
|
16
|
+
Keep the always-inline routing rules in `AGENTS.md` authoritative: route by natural-language `scope:`, local-only projects stay with the main Brokk, and eindri-homes are idle by default.
|
|
17
|
+
|
|
18
|
+
## Routing table
|
|
19
|
+
|
|
20
|
+
`data/eindri-homes.md` has one parser-compatible line per persistent Eindri-home.
|
|
21
|
+
A local route uses:
|
|
22
|
+
|
|
23
|
+
```markdown
|
|
24
|
+
- <id> - <one-sentence charter summary> (home: <absolute-home-path>; scope: <natural-language responsibility>; projects: <project-a>, <project-b>; added <date>)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
A whole-home remote route uses:
|
|
28
|
+
|
|
29
|
+
```markdown
|
|
30
|
+
- <id> - <one-sentence charter summary> (host: <ssh-alias>; root: <absolute-remote-code-root>; home: <absolute-remote-home>; scope: <natural-language responsibility>; projects: <project-a>, <project-b>; added <date>)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Each registry entry stays concise and single-line: the summary is one sentence naming the durable charter, `scope:` is the natural-language intake responsibility, `projects:` is the non-exclusive clone list, and any extra prose is limited to genuinely domain-specific hard rules that change routing or safety for that Eindri-home.
|
|
34
|
+
Natural-language summary and `scope:` text may contain parentheses and semicolons; keep the generated `(home: ...; scope: ...; projects: ...; added ...)` suffix intact so operational consumers resolve its explicit field markers.
|
|
35
|
+
The `home:` path points to the seeded home containing `data/charter.md`; no extra registry pointer field is needed.
|
|
36
|
+
For a remote route, `host:` is an OpenSSH config alias and `root:` is that host's separate tracked Brokk code root.
|
|
37
|
+
A remote Eindri-home agent always runs on the Herdr backend and every seed, launch, and liveness relaunch first gates its host on `bin/brokk-remote-doctor.sh` readiness, so an unready host refuses with that doctor's own gap text rather than half-creating a route; the workers that Eindri-home supervises keep the home's ordinary backend selection.
|
|
38
|
+
This release places whole Eindri-home homes remotely and never individual workers.
|
|
39
|
+
[`docs/remote-eindri-homes.md`](../../../docs/remote-eindri-homes.md) owns current operator setup and transport behavior.
|
|
40
|
+
The home-seeded `data/charter.md` is the sole owner of boilerplate idle-by-default behavior, the normal delegation lifecycle, and standard escalation contracts, so point to that charter rather than restating those contracts in the registry entry.
|
|
41
|
+
The `scope:` field is used during intake.
|
|
42
|
+
The `projects:` field is a non-exclusive clone list, not ownership.
|
|
43
|
+
|
|
44
|
+
## Charter and seed
|
|
45
|
+
|
|
46
|
+
Scaffold a Eindri-home charter with:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
bin/erindi-brief.sh <id> --Eindri-home {<project>...|--no-projects}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The scaffold writes a charter brief instead of a task brief.
|
|
53
|
+
Set `BROKK_EINDRI_HOME_CHARTER='<charter>'` to fill the charter text and `BROKK_EINDRI_HOME_SCOPE='<scope>'` when the routing scope differs.
|
|
54
|
+
If you scaffold without `BROKK_EINDRI_HOME_CHARTER`, replace the `{TASK}` placeholder before seeding.
|
|
55
|
+
Pass `--no-projects` instead of a project list to scaffold a project-less charter for a domain whose subject is the Brokk repo itself, whose home is a Brokk worktree and whose Eindri take pooled worktrees of the same repo.
|
|
56
|
+
`--no-projects` is mutually exclusive with a project list, and omitting both still fails loudly, so an accidental omission is never mistaken for a deliberate project-less seed.
|
|
57
|
+
Re-seeding a populated home as project-less is refused non-destructively when the home contains project clones or `data/projects.md` entries.
|
|
58
|
+
Retire or clean that home first, and re-scaffold a stale project-bearing charter with `--no-projects` before seeding.
|
|
59
|
+
Keep custom charter text focused on the persistent responsibility, available project clones, and genuinely domain-specific hard rules.
|
|
60
|
+
The scaffolded charter, later copied to `data/charter.md`, owns the standard lifecycle and escalation wording.
|
|
61
|
+
Preserve the generated charter sections unless the domain genuinely needs a hard rule.
|
|
62
|
+
|
|
63
|
+
Provision a local persistent home and registry entry after the charter is filled:
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
bin/brokk-home-seed.sh <id> <home|-> {<project>...|--no-projects}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Provision a whole remote home through its configured SSH host with:
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
bin/brokk-remote-home-seed.sh <id> <ssh-alias> <remote-root> <remote-home> {<project>[=<origin-url>]...|--no-projects}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
You resolve each project's origin yourself - from the Allfather, the project registry, a clone that exists elsewhere, `gh-axi`, or an explicit paste - and name it as `<project>=<origin-url>`; the seed validates and transports what you supply.
|
|
76
|
+
A remote seed therefore creates nothing in this home beyond the route, the charter brief, and a launch record once it is launched: never clone a project into `projects/`, initialize no-mistakes here, or run a fleet sync just to seed a remote Eindri-home.
|
|
77
|
+
A bare `<project>` remains a convenience for a project this home already has cloned, whose configured origin is read instead.
|
|
78
|
+
[`docs/remote-eindri-homes.md`](../../../docs/remote-eindri-homes.md#provision-a-route) owns the rest of the operator contract, and [`bin/brokk-project-origin-lib.sh`](../../../bin/brokk-project-origin-lib.sh) owns the accepted origin forms.
|
|
79
|
+
Pass `--no-projects` in the project position to seed the project-less home described above; the same mutual-exclusion and fail-loud-on-omission rules apply.
|
|
80
|
+
It may only seed a home with no project clones or project-registry entries, and refuses conversion of populated homes without changing them.
|
|
81
|
+
`-` durably leases a fresh Brokk worktree via `Yggdrasil get --lease` under the Eindri-home id.
|
|
82
|
+
The lease survives with no live process and is never recycled by later `Yggdrasil get` or `prune`.
|
|
83
|
+
The slot stays reserved across restarts until the lease is released.
|
|
84
|
+
Release happens only on explicit retirement or seed rollback, never on routine restart or recovery.
|
|
85
|
+
|
|
86
|
+
`bin/brokk-home-seed.sh` copies the charter into the Eindri-home home as `data/charter.md`.
|
|
87
|
+
It also writes the gitignored `.brokk-Eindri-home-parent` durable binding before the required `.brokk-Eindri-home-home` identity marker; the parser header in [`bin/brokk-Eindri-home-parent-lib.sh`](../../../bin/brokk-Eindri-home-parent-lib.sh) owns the record contract, and both files must remain in place.
|
|
88
|
+
`bin/einherjar-spawn.sh --Eindri-home` launches it through the Eindri-home harness path, resolving `config/Eindri-home-harness` -> `config/eindri-harness` -> the primary's own harness unless an explicit per-spawn harness override is passed.
|
|
89
|
+
|
|
90
|
+
`config/Eindri-home-harness` may also pin a concrete model and effort for the Eindri-home agent, in the SAME file rather than a new one: the format is a single whitespace-separated line `<harness> [<model>] [<effort>]`, with only the first non-empty, non-comment line parsed.
|
|
91
|
+
A bare `<harness>` (today's format, e.g. `claude`) behaves exactly as before - harness only, no model/effort flag - so this is fully backward-compatible.
|
|
92
|
+
`bin/hamr-harness.sh Eindri-home-model` and `bin/hamr-harness.sh Eindri-home-effort` print the optional 2nd/3rd tokens (empty when absent, or when the file is absent/`default`/harness-only); they read only `config/Eindri-home-harness`, never `config/eindri-harness`, which stays a bare adapter name.
|
|
93
|
+
For a `--Eindri-home` spawn, `bin/einherjar-spawn.sh` populates `MODEL`/`EFFORT` from those tokens only when the harness itself came from the Eindri-home config path for that spawn.
|
|
94
|
+
For a local route, an explicit per-spawn `--harness` flag, positional harness arg, or raw launch command starts clean on model and effort too, unless the caller also passes explicit `--model` or `--effort`.
|
|
95
|
+
A remote route accepts only a verified harness adapter and refuses a raw launch command at the host boundary.
|
|
96
|
+
When the file's tokens do apply, an explicit per-spawn `--model` or `--effort` flag always wins over the file's token for that axis.
|
|
97
|
+
Because this resolves from the file on every spawn, the pin is durable across every respawn (recovery, `/updateBrokk`, restart) exactly like the harness axis itself - e.g. `config/Eindri-home-harness` containing `claude opus` keeps a Eindri-home pinned to Opus even if the primary's own default model later changes.
|
|
98
|
+
This is Eindri-home-only: Eindri/scout model resolution is untouched by this file.
|
|
99
|
+
|
|
100
|
+
This section is the single owner of the Eindri-home sync and inherited-local-material propagation contract; `AGENTS.md` sections 3 and 4 point here.
|
|
101
|
+
Before a local launch, `einherjar-spawn.sh --Eindri-home` locally fast-forwards the home to the primary Brokk checkout's current default-branch commit when it is safe; dirty, diverged, or in-flight homes launch unchanged with a warning.
|
|
102
|
+
The locked session-start deferred network stage runs the same bootstrap sweep for every live local Eindri-home home, discovered from `state/<id>.meta` records with `kind=Eindri-home` (`data/eindri-homes.md` only backfills `home=` for older records).
|
|
103
|
+
That no-fetch path is a purely local fast-forward of tracked files, never an origin fetch, and it never touches the gitignored operational dirs, so a Eindri-home's backlog, projects, and in-flight work are never disturbed; a linked worktree advances immediately, while a standalone clone that lacks the target receives Brokk updates through `/updateBrokk`'s origin refresh.
|
|
104
|
+
A remote launch and the deferred bootstrap sweep ask the configured host to fast-forward its persistent home to that host's code-root commit under the same clean and ancestry guards.
|
|
105
|
+
`/updateBrokk` first updates the remote code root from its own origin, then runs that guarded home sync.
|
|
106
|
+
SSH exit 255 preserves the route and reports unknown completion; it never triggers local respawn or failover.
|
|
107
|
+
The same placement-specific launch and deferred bootstrap sweep also propagate the primary's declared inherited local material: `config/crew-dispatch.json`, `config/eindri-harness`, `config/backlog-backend`, `config/backend`, `config/herdr-presentation-spaces`, `config/startup-memory-budget`, and the one shared Allfather-preference file `data/Allfather-shared.md`.
|
|
108
|
+
Because these paths are gitignored, that propagation is a separate, primary-authoritative copy independent of the tracked-files fast-forward: it re-converges every live home whether or not its tracked files advanced, and it touches only the declared items.
|
|
109
|
+
Propagation failures warn without blocking Eindri-home launch or session-start continuation, and the destination keeps whatever safely validated state the helper left behind.
|
|
110
|
+
Inheritance copies the literal `config/eindri-harness` file, so a Eindri-home's own Eindri use the primary's Eindri harness only when it names a concrete adapter such as `codex`; an unset or `default` value has nothing concrete to inherit, and the Eindri-home's own Eindri fall back to the Eindri-home's own or detected harness instead.
|
|
111
|
+
Inherited `config/backend` becomes that Eindri-home home's local runtime-backend default for future spawns only; it never retargets, rewrites, migrates, stops, or restarts an already-live worker endpoint.
|
|
112
|
+
A present primary value always converges byte-exact into validated Eindri-home homes, and primary absence removes the destination so those homes keep runtime auto-detection.
|
|
113
|
+
Explicit per-spawn `--backend` and `BROKK_BACKEND` remain stronger than every home's local `config/backend`, including an inherited default.
|
|
114
|
+
`config/Eindri-home-harness` is not inherited because it is only the primary's knob for launching Eindri-home agents.
|
|
115
|
+
`data/Allfather-shared.md` is main-authoritative in the primary home and read-only in Eindri-home homes.
|
|
116
|
+
Its primary file header must state that the file is main-authoritative, read-only in Eindri-home homes, must not be edited there, and that new Allfather-preference discoveries are routed to the main Brokk through marked status or a document pointer.
|
|
117
|
+
Every propagation point converges the Eindri-home copy to the primary bytes; when the primary file is absent, any existing Eindri-home copy is quarantined and removed so absence converges too.
|
|
118
|
+
The helper rejects unsafe directories, symlinked or nonordinary source or destination artifacts, and hardlinked destination files.
|
|
119
|
+
Between propagation runs, the Eindri-home copy is filesystem read-only; the helper may make its owned destination writable only around a guarded update and restores read-only mode on success, unchanged bytes, and recoverable failure paths.
|
|
120
|
+
Before replacing divergent Eindri-home bytes, the helper hash-compares source and destination, quarantines the Eindri-home-local version to a collision-safe private dated sibling file, and emits a `EINDRI_HOME_SYNC:` diagnostic naming the home and quarantine artifact.
|
|
121
|
+
Never copy any Eindri-home `data/Allfather-shared.md` back into the primary.
|
|
122
|
+
Keep each home's `data/Allfather.md` domain-local.
|
|
123
|
+
After first propagation to an existing home, trim that home's local `data/Allfather.md` by hand to domain-specific content plus pointers to `data/Allfather-shared.md`; do not automate or silently delete private content.
|
|
124
|
+
Keep every `data/learnings.md` fully local by Allfather decision; route fleet-general machinery facts into tracked documentation through the normal Brokk repo path rather than inventing shared learnings propagation.
|
|
125
|
+
No AGENTS.md reread nudge is needed at spawn or respawn because the agent reads instructions fresh on launch; only the bootstrap sweep's running-home instruction-surface advance needs that AGENTS.md re-read.
|
|
126
|
+
Bootstrap reports successful AGENTS.md re-read sends as `BOOTSTRAP_INFO:` and only emits `NUDGE_EINDRI_HOMES:` when that send fails and needs retry.
|
|
127
|
+
A separate, literal-content config reread is required whenever inherited `config/*` material changes under an already-running Eindri-home.
|
|
128
|
+
For a local home, after each successful allowlisted config write, both the locked bootstrap convergence path and mid-session `bin/brokk-config-push.sh` use the shared propagation report to build one per-home generation-specific private instruction file from the validated destination post-write bytes for only the allowlisted config items that actually changed for that home (`config/crew-dispatch.json`, `config/eindri-harness`, `config/backlog-backend`, `config/backend`, `config/herdr-presentation-spaces`, `config/startup-memory-budget`), in deterministic allowlist order.
|
|
129
|
+
Each changed path is printed with clear begin/end delimiters and the destination file's full exact new bytes unparsed, or the explicit token `ABSENT` when propagation removed the destination copy.
|
|
130
|
+
The instruction uses only minimal framing that these are defaults/rules and do not remove judgment; it never includes SHA values, selected profiles, parsed summaries, or any other generated interpretation.
|
|
131
|
+
`data/Allfather-shared.md` is not a config file and is never inlined into this instruction file or message.
|
|
132
|
+
Homes whose allowlisted config files were all unchanged receive no config-reread message when no retry is pending.
|
|
133
|
+
Different homes may receive different changed-file sets based on their pre-push destination bytes.
|
|
134
|
+
Delivery uses the existing routed Eindri-home path (`brokk-send`) with only a single-line `CONFIG_REREAD: <absolute generation-specific instruction path>` pointer; a failed instruction publication retains the generated exact bytes in a bounded private retry queue when possible, legacy retry reports remain recoverable, a failed publication or retry-marker write retains the exact generation until it can be delivered, a failed send records a per-generation durable retry marker when possible, and all failures surface a concrete `CONFIG_REREAD:` diagnostic without claiming the live agent already re-read the values.
|
|
135
|
+
The propagation, generation publication, and pointer-delivery sequence holds one per-home inheritance lock, so concurrent mid-session pushes cannot deliver an older generation after a newer one.
|
|
136
|
+
A newly launched or relaunched Eindri-home already reads its files at launch, so its pending config-reread generations are discarded or quarantined after cleanup failure and it needs no redundant live-agent config nudge unless propagation changes files after launch.
|
|
137
|
+
Quarantined pre-relaunch generations are retained in bounded private history, and cleanup skips creating an empty quarantine generation.
|
|
138
|
+
Successfully delivered generations are retained only within a bounded per-home state history, while pending generations remain until delivery succeeds or a launch supersedes them.
|
|
139
|
+
A remote home receives the same allowlisted bytes through `brokk-remote-inherit.sh` and gets one marked re-read instruction after a changed transfer.
|
|
140
|
+
The parent records that nudge before delivery, retains it after a failed send, and retries the exact same route during locked bootstrap convergence.
|
|
141
|
+
It does not receive a pointer to a primary-local generation path that cannot exist on that host.
|
|
142
|
+
These config values remain defaults and rules only; they must not harden `brokk-spawn` to reject a deliberate runtime choice that differs from the configured defaults.
|
|
143
|
+
For already-live eindri-homes, use `bin/brokk-config-push.sh` to push a mid-session inherited local-material change without running the tracked-file fast-forward.
|
|
144
|
+
It uses the same live-home discovery and propagation helper as bootstrap, reports each item as `pushed`, `unchanged`, `skipped`, or `error`, and follows the config-reread contract above for changed or pending generations.
|
|
145
|
+
`bin/brokk-home-seed.sh` refuses to copy a missing or placeholder charter.
|
|
146
|
+
|
|
147
|
+
Direct seed without a preexisting brief requires `BROKK_EINDRI_HOME_CHARTER`.
|
|
148
|
+
Run `bin/brokk-home-seed.sh validate` when checking registry integrity; its header owns the complete validation and refusal mechanics.
|
|
149
|
+
|
|
150
|
+
Seeding is transactional.
|
|
151
|
+
If validation, cloning, no-mistakes initialization, or registry update fails, generated briefs, new homes, new project clones, and registry edits are rolled back.
|
|
152
|
+
|
|
153
|
+
Eindri-home project lists may include `no-mistakes` and `direct-PR` projects only.
|
|
154
|
+
`local-only` projects stay with the main Brokk.
|
|
155
|
+
For `no-mistakes` projects, seeding initializes only projects newly cloned into a Eindri-home home and refuses to mutate a preexisting clone that is not already initialized.
|
|
156
|
+
|
|
157
|
+
## Record intake for an existing or inherited domain
|
|
158
|
+
|
|
159
|
+
Classify the domain before seeding, because this step applies to only one of the two cases.
|
|
160
|
+
A greenfield domain has no delivered domain work yet: nothing already shipped in its projects, no live deployment, and no predecessor records to import.
|
|
161
|
+
Seed a greenfield domain normally; there is nothing to reconcile and this section adds no work to it.
|
|
162
|
+
An existing or inherited domain is any domain whose product is already in development, and any predecessor's domain a new mate takes over, including a consolidation after a retirement.
|
|
163
|
+
Both of those cases require record intake before the new mate acts on any inherited plan.
|
|
164
|
+
|
|
165
|
+
For an existing or inherited domain, the creating agent must:
|
|
166
|
+
|
|
167
|
+
1. Reconcile every inherited plan against the domain's authoritative shipped state, which is `origin/main` for each relevant project plus the live deployment.
|
|
168
|
+
A fetched clone of each relevant project is a precondition of that reconciliation, so wire the home to its projects before reconciling rather than on first task.
|
|
169
|
+
The imported backlog, the predecessor's own notes, instruction-surface prose, and an absent or unfetched local view are all inadmissible as shipped-state evidence.
|
|
170
|
+
2. Seed the new home with only genuinely open work plus the domain's durable knowledge, meaning the learnings, decisions, and delivery posture that are still live.
|
|
171
|
+
3. Never inherit a plan backlog blind.
|
|
172
|
+
A plan row whose work is already shipped is dropped, or recorded as done with the merged evidence that settles it, and is never carried forward as open.
|
|
173
|
+
|
|
174
|
+
A live backlog keeps only the configured recent Done entries by design, so an inherited queue structurally over-represents plans and under-represents deliveries.
|
|
175
|
+
Treat an inherited queue that carries plans with no matching delivery record as unreconciled rather than as open work, and record whatever could not be reconciled as an explicit residual-uncertainty list in the new home rather than leaving that gap silent.
|
|
176
|
+
|
|
177
|
+
## Backlog handoff
|
|
178
|
+
|
|
179
|
+
Apply `AGENTS.md` section 10's work-items-only backlog contract before creation or handoff.
|
|
180
|
+
When a Eindri-home is created for a domain, existing main-backlog items that fall under its scope should become its work instead of staying stranded in the main backlog.
|
|
181
|
+
Scope-matching is Brokk's judgment against the Eindri-home's natural-language scope, not a keyword rule.
|
|
182
|
+
Read `data/backlog.md`, pick queued items that fit the new scope, and move them with:
|
|
183
|
+
|
|
184
|
+
```sh
|
|
185
|
+
bin/brokk-backlog-handoff.sh <Eindri-home-id> <item-key>...
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
After seeding, run this handoff for the new Eindri-home's in-scope queued items.
|
|
189
|
+
For an existing or inherited domain, complete record intake first so no already-shipped plan row is handed off as open work.
|
|
190
|
+
For a local route, the helper resolves and validates the Eindri-home home from `data/eindri-homes.md`, then delegates the item move to `tasks-axi mv` (the single owner of the backlog format), which moves each named item - and a whole connected set, blocker plus dependents, atomically - from the main `data/backlog.md` into the Eindri-home home's `data/backlog.md`.
|
|
191
|
+
For a remote route, the same helper first moves the dependency-closed set atomically from the main backlog into `data/handoff/<id>.outbox.md`, then transfers that backlog-format outbox through `brokk-on.sh` and lets the remote home's `brokk-backlog-receive.sh` move every not-already-present key under the destination lock.
|
|
192
|
+
After a new local placement or a remote outbox receipt becomes durable, the helper sends one marked routed-work instruction through the receiving Eindri-home's recorded endpoint; missing or failed delivery makes the command fail loudly with the moved work intact, and the same handoff command retries known-undelivered wake intent without moving an already-present item again.
|
|
193
|
+
An unresolved delivery attempt is never blindly resent.
|
|
194
|
+
For a remote route, the outbox remains until both backlog receipt and receiver wake are confirmed; `--resume-pending` retries unfinished outboxes, while the script header owns its stable wake-correlation recovery state.
|
|
195
|
+
There is no two-phase handoff journal and no tasks-axi release beyond the already-required atomic `mv` capability.
|
|
196
|
+
Bootstrap retries pending outboxes when mutation is authorized and emits `EINDRI_HOME_HANDOFF:` for any that remain.
|
|
197
|
+
This delegated route remains required when `config/backlog-backend=manual`, which controls only routine Brokk backlog edits.
|
|
198
|
+
It moves each queued item's whole block - the `- [ ] <id> ...` header plus every following two-or-more-space-indented body line and blank separator, up to the next item or column-0 section heading - byte-exact under the same section, treating an indented `## ...` line as body rather than a section boundary, so neither the header nor its body is duplicated or orphaned.
|
|
199
|
+
It refuses a selected item with a single-space or tab-indented continuation rather than risk leaving content orphaned in the main backlog.
|
|
200
|
+
It accepts in-scope `## Queued` entries only and refuses `## In flight` and historical `## Done` entries.
|
|
201
|
+
Done records stay with their home for pruning or archiving.
|
|
202
|
+
It is idempotent; an item already in the Eindri-home backlog is skipped.
|
|
203
|
+
After a successful move it warns for any moved key that still owes a public relay reply bound to `main/<key>`, because that binding no longer names the home owning the work; rebind the commitment to `Eindri-home:<id>` through the `fmx-respond` promised-final procedure, which owns those commands.
|
|
204
|
+
That same rule governs routing generally: a Relay-linked request whose work goes to a Eindri-home cannot use the home-local mention link at all and needs a promised-final commitment bound to that Eindri-home's home.
|
|
205
|
+
It refuses any destination that is not a genuine seeded Brokk home with safe operational directories and a matching `.brokk-Eindri-home-home` marker, so a move can never land in a project.
|
|
206
|
+
Do not hand off `local-only` items.
|
|
207
|
+
|
|
208
|
+
## Recovery
|
|
209
|
+
|
|
210
|
+
For local `kind=Eindri-home` meta with no window, treat the Eindri-home as a dead persistent direct report and respawn it with:
|
|
211
|
+
|
|
212
|
+
```sh
|
|
213
|
+
bin/einherjar-spawn.sh <id> --Eindri-home
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Use the recorded `home=` in meta.
|
|
217
|
+
If meta is missing but `data/eindri-homes.md` still registers the Eindri-home, respawn from the registry entry and its persistent home.
|
|
218
|
+
For a remote route, the same command probes and relaunches only on the configured host.
|
|
219
|
+
An SSH transport failure or unreadable remote endpoint remains unknown and must be reconciled on that host; never launch a local replacement.
|
|
220
|
+
`stuck-Eindri-recovery`'s remote-Eindri-home note owns why the endpoint-dead and send-failed verdicts that seem to justify this are themselves unreliable.
|
|
221
|
+
Respawn re-resolves the Eindri-home harness from current config, uses the same guarded pre-launch sync, and re-propagates inherited local material, so recovered eindri-homes converge inherited config items and shared Allfather preferences whenever their home validates; tracked-file sync remains guarded separately.
|
|
222
|
+
If the Eindri-home is already running and only inherited local material changed, prefer `bin/brokk-config-push.sh` over respawning.
|
|
223
|
+
To move a live LOCAL Eindri-home onto a newly pinned harness, model, or effort without a full recovery, set `config/Eindri-home-harness` and then relaunch it with `bin/brokk-control.sh <id> relaunch`, which re-resolves that pin, stops the agent, and launches the replacement in the same home ([`docs/agent-control.md`](../../../docs/agent-control.md)).
|
|
224
|
+
That plane refuses a remotely placed Eindri-home by name, because its agent runs on another host where none of the plane's postconditions can be read; use the remote route's own relaunch path for those.
|
|
225
|
+
|
|
226
|
+
Do not reconstruct a Eindri-home's whole tree from the main home.
|
|
227
|
+
The main Brokk reconciles only direct reports.
|
|
228
|
+
Each Eindri-home is a Brokk in its own home, so it runs recovery on startup and reconciles its own Eindri.
|
|
229
|
+
A Eindri-home's recovery reconciles only work that is already its own and then idles.
|
|
230
|
+
It never initiates a survey or audit during recovery.
|
|
231
|
+
|
|
232
|
+
## Retirement and teardown
|
|
233
|
+
|
|
234
|
+
A Eindri-home is persistent by default.
|
|
235
|
+
An empty queue is healthy and does not trigger teardown.
|
|
236
|
+
Run `bin/brokk-teardown.sh <id>` for `kind=Eindri-home` only when the Allfather or main Brokk explicitly decides to retire that persistent Eindri-home.
|
|
237
|
+
|
|
238
|
+
The safety check is the Eindri-home's own home.
|
|
239
|
+
Teardown refuses while its `state/*.meta` contains in-flight work.
|
|
240
|
+
A remote route delegates the same guard to its configured host and additionally refuses while the primary has a pending handoff outbox or unresolved routed reply.
|
|
241
|
+
SSH exit 255 preserves the route and local records because remote completion is unknown.
|
|
242
|
+
When safe, teardown kills the direct endpoint, removes the `data/eindri-homes.md` route, clears the main home metadata, and removes the retired Eindri-home home.
|
|
243
|
+
Removing a leased home releases its durable Yggdrasil lease via `Yggdrasil return`, so the pool slot is freed for reuse rather than left leased forever.
|
|
244
|
+
A plain-clone home with no pool slot is simply removed.
|
|
245
|
+
If `Yggdrasil return` fails for a leased home, teardown stops with state intact rather than raw-removing the directory and hiding a held lease.
|
|
246
|
+
Before either return or direct removal, teardown asks the target home's process-event runner to retire its registrations and physically owned machine-wide claims through the safe generation-bound path.
|
|
247
|
+
It refuses retirement while that cleanup is uncertain or unavailable, preserving the home and retirement records for a later retry.
|
|
248
|
+
Raw deletion is unsupported because a blocking process-event child can outlive its home.
|
|
249
|
+
|
|
250
|
+
With `--force`, teardown is the explicit discard path.
|
|
251
|
+
It kills child windows, discards child work and state inside the Eindri-home home, removes the route, releases the lease, and removes the retired Eindri-home home.
|
|
252
|
+
If forced teardown contends with a fresh task publication in any affected home, one command refuses without publishing or removing task state; treat that refusal as terminal and inspect the other operation before retrying.
|
|
253
|
+
Relaunch and non-forced teardown remain outside that serialization.
|
|
254
|
+
Never use `--force` unless the Allfather explicitly said to discard the work.
|
|
255
|
+
|
|
256
|
+
## Fleet preferences
|
|
257
|
+
|
|
258
|
+
Fleet-wide per-user settings live in `data/fleet.md` (gitignored), one
|
|
259
|
+
`key: value` per line. `bin/fleet-apply.sh` writes each into THIS home and every
|
|
260
|
+
registered home's gitignored `state/` (for `ro`: `state/ro`), and
|
|
261
|
+
`bin/brokk-update.sh` re-applies them on every sweep — so one fleet setting
|
|
262
|
+
reaches every home without dirtying any tracked tree. Remote routes are reported,
|
|
263
|
+
not written. Keys: `ro: on | off` (Ró calm presentation).
|
|
264
|
+
|
|
265
|
+
## Dispatch (full chain)
|
|
266
|
+
|
|
267
|
+
Seating a worker is a chain, not a guess: role → **`bin/model-resolve.sh`** →
|
|
268
|
+
harness rule (local→pi, online→opencode) → **`bin/herdr-run.sh eindri`** (pane)
|
|
269
|
+
→ **`bin/local-model-lock.sh`** → A2A register. Read
|
|
270
|
+
`assets/dispatch.md` before dispatching, and never guess a model.
|
|
271
|
+
|
|
272
|
+
## Tools this skill drives (in `bin/`)
|
|
273
|
+
|
|
274
|
+
Use these — never hand-run herdr/tmux:
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
tools[6]{tool,plane}:
|
|
278
|
+
"bin/eindri-start.sh \"<task>\" [--role] [--model] [--pane|--tab|--space]","one command: role -> model-resolve -> seat -> serve"
|
|
279
|
+
"bin/herdr-run.sh eindri [--model] <role> -- \"<task>\"","the seat engine (pane/tab/space)"
|
|
280
|
+
"bin/eindri-send.sh <agent> \"<text>\"","DATA plane — talk to a running Eindri"
|
|
281
|
+
"bin/eindri-control.sh interrupt|exit|read <agent>","CONTROL plane — allowlisted lifecycle"
|
|
282
|
+
"bin/einherjar-spawn.sh <id> --Eindri-home","launch a persistent home (recovery/retire above)"
|
|
283
|
+
"bin/model-resolve.sh · bin/local-model-lock.sh","model choice + one-local-at-a-time"
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Assets
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
assets[1]{path,holds}:
|
|
290
|
+
"assets/control-plane.md","agent lifecycle control plane (from the upstream distro): DATA plane (conversational send) vs CONTROL plane (allowlisted verbs interrupt/exit/relaunch), per-harness mechanics, per-backend capability"
|
|
291
|
+
```
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Agent lifecycle control plane
|
|
2
|
+
|
|
3
|
+
Brokk talks to a running agent two ways, and they are not the same channel.
|
|
4
|
+
|
|
5
|
+
The **data plane** is [`bin/fm-send.sh`](../bin/fm-send.sh): conversational text for the agent to read.
|
|
6
|
+
For a `kind=eindri-home` target it always prepends the routing marker (`[fm-from-firstmate]`), because an Eindri-home runs its own primary Brokk and its reply must come back through the status path rather than a chat nobody reads.
|
|
7
|
+
|
|
8
|
+
The **control plane** is [`bin/fm-control.sh`](../bin/fm-control.sh): allowlisted lifecycle verbs addressed to an exact task id.
|
|
9
|
+
|
|
10
|
+
The split exists because the data plane's marking is exactly right for a message and exactly wrong for a lifecycle command.
|
|
11
|
+
A routing-marked `/quit` arrives as ordinary chat - `[fm-from-firstmate] /quit` - which the agent reasons about instead of executing.
|
|
12
|
+
The failure repeated across harnesses and homes, and the workaround (remember to use an unmarked send for agent-control commands, and improvise the right key or command per harness) lived only in agent prose, so it failed again every time a session did not happen to recall it.
|
|
13
|
+
|
|
14
|
+
## What the control plane owns
|
|
15
|
+
|
|
16
|
+
`bin/fm-control-lib.sh` is the single executable owner of three capability tables, with no side effects, so it can be read as a contract:
|
|
17
|
+
|
|
18
|
+
- The **verb allowlist**: `interrupt`, `exit`, `relaunch`.
|
|
19
|
+
There is no arbitrary-text and no generic raw-key entry point.
|
|
20
|
+
A caller either names an allowlisted verb or is refused.
|
|
21
|
+
- **Per-harness mechanics**: the key that cancels a running turn, how many times it must be delivered, whether the composer needs clearing afterwards, the command that exits the agent, and which task kinds the adapter is verified to run.
|
|
22
|
+
These were previously carried only in the [`harness-adapters`](../.agents/skills/harness-adapters/SKILL.md) skill's tool references, which now point here.
|
|
23
|
+
`bin/fm-send.sh`'s `--key` path reads the composer-clear table from this owner too, rather than keeping a second copy of it.
|
|
24
|
+
- **Per-backend capability**: which named keys a runtime backend can deliver, and whether it has a recovery-grade agent-state classifier able to prove an agent stopped.
|
|
25
|
+
|
|
26
|
+
A recorded `harness=` is not always an exact adapter name: a task launched from a raw command records that command's basename instead.
|
|
27
|
+
`fm_control_harness_family` is the one place that prefix rule is stated, and an unrecognized value resolves to no adapter rather than being guessed into one.
|
|
28
|
+
|
|
29
|
+
## Verbs
|
|
30
|
+
|
|
31
|
+
| Verb | Effect | Postcondition |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| `interrupt` | Deliver the harness's verified interrupt sequence while leaving the agent running. | Delivery succeeds while the endpoint still exists and the agent is still alive where the backend can classify that; cancellation is confirmed only from an adapter-owned acknowledgement and otherwise reports `cancel=unconfirmed`. |
|
|
34
|
+
| `exit` | Stop the agent, preserving the endpoint, the worktree, and every uncommitted change. | The backend's recovery-grade classifier reports the agent gone. Already-stopped is idempotent success. |
|
|
35
|
+
| `relaunch` | Replace the running agent with a new one in the same endpoint and worktree, on the exact recorded adapter or an explicitly chosen harness, model, and effort. | The new agent is alive on the recorded endpoint, and the durable record names the harness that is actually running. |
|
|
36
|
+
|
|
37
|
+
An exit that delivers lifecycle input but cannot prove the agent stopped fails with `exit=unconfirmed`, reports the observed agent state and any interrupt cancellation claim, and never claims that nothing changed.
|
|
38
|
+
Interrupt never rewrites busy state as proof of its own success.
|
|
39
|
+
Claude exposes no lifecycle acknowledgement for a manual interrupt, so delivery succeeds with `cancel=unconfirmed` and its adapter-owned busy state remains as observed.
|
|
40
|
+
muse's session log records `terminal=cancelled` for the interrupted run, so the control plane reports `cancel=confirmed` only after observing that exact acknowledgement.
|
|
41
|
+
|
|
42
|
+
An interrupt is not complete until the composer is empty.
|
|
43
|
+
muse is the one verified adapter that restores the cancelled prompt back into its composer as real text, so its interrupt key is followed by a Ctrl+U clear; without it the next submitted line - including this plane's own exit command - would concatenate onto the restored prompt and submit both as one line.
|
|
44
|
+
The clear is refused before anything is sent when the recorded backend cannot deliver it.
|
|
45
|
+
|
|
46
|
+
**Teardown and discard are not verbs and will not become verbs.**
|
|
47
|
+
`exit` stops an agent and preserves everything else.
|
|
48
|
+
Removing a worktree, closing an endpoint, or discarding work stays with [`bin/fm-teardown.sh`](../bin/fm-teardown.sh), which owns the landed-work test.
|
|
49
|
+
|
|
50
|
+
**`resume` is not a verb.**
|
|
51
|
+
It is not deterministic across the verified adapters: codex and grok resume only from a session id printed at exit, opencode continues the most recent session for the cwd, and claude, pi, pi-signed, and kimi have no verified pane-resume contract.
|
|
52
|
+
`relaunch` covers the same need on every adapter, because the brief on disk - not a harness-private session - is the durable instruction.
|
|
53
|
+
|
|
54
|
+
## Transactional relaunch
|
|
55
|
+
|
|
56
|
+
`relaunch` is the only verb that changes durable records, so it runs as a transaction with a journal at `state/<id>.control-relaunch`, the prior record preserved beside it, and a ship or scout's prior instructions preserved when a progress note is appended.
|
|
57
|
+
|
|
58
|
+
1. **Resolve the profile.**
|
|
59
|
+
An explicit `--harness`, `--model`, or `--effort` wins.
|
|
60
|
+
Otherwise a `kind=eindri-home` task re-resolves its durable `config/eindri-harness` pin, including that file's optional model and effort tokens, exactly as every other respawn does - so setting the pin and relaunching is the ordinary way to move an Eindri-home's runtime.
|
|
61
|
+
A ship or scout keeps the harness already recorded for it, because that harness comes from Brokk's dispatch-profile judgment at intake and must not be silently re-read from configuration.
|
|
62
|
+
A recorded raw-command basename that differs from its resolved adapter cannot reproduce the command actually running, so relaunch refuses before the checkpoint unless the caller passes an explicit `--harness` to choose the replacement runtime deliberately.
|
|
63
|
+
A harness change resets model and effort unless they are named too, because a model chosen for one adapter does not transfer to another.
|
|
64
|
+
2. **Safe checkpoint.**
|
|
65
|
+
The recorded worktree must exist and be a worktree root; its head and dirty state are recorded.
|
|
66
|
+
For a `kind=eindri-home` task, the home's identity marker must match and its child records must be readable, so a relaunch can never strand child work behind an unreadable home.
|
|
67
|
+
The Eindri an Eindri-home launched run in their own endpoints and outlive its relaunch; the relaunched home reconciles them from its home's durable records at startup.
|
|
68
|
+
3. **Record the note.**
|
|
69
|
+
A ship or scout relaunch requires `--note`, because the replacement inherits the local copy but none of the conversation; the note is appended to the instructions it reads.
|
|
70
|
+
An Eindri-home relaunch does not require one and never rewrites its standing charter.
|
|
71
|
+
4. **Stop the old agent** through the `exit` verb, with its postcondition.
|
|
72
|
+
5. **Launch the replacement** through its single owner, `bin/fm-spawn.sh --relaunch`, which adopts the recorded endpoint and worktree instead of creating either, clears the previous harness's per-task wiring, and arms a fresh busy generation.
|
|
73
|
+
|
|
74
|
+
Switching harness is therefore one ordinary relaunch rather than a separate mechanism.
|
|
75
|
+
|
|
76
|
+
### Failure and rollback
|
|
77
|
+
|
|
78
|
+
- A refusal **before** the agent is stopped leaves the durable record and the instructions byte-identical.
|
|
79
|
+
- A launch failure **after** the agent is stopped restores the prior durable record, keeps the progress note so a later recovery still has it, marks the journal `failed:launching`, and reports plainly that no agent is running and where the work is preserved.
|
|
80
|
+
- If the launch owner already published the new record but no running agent can be confirmed, the new record is kept: the task is recorded on the new harness with no agent confirmed, which is exactly what recovery reconciles.
|
|
81
|
+
Rewriting it back to the old harness would be a second, worse inaccuracy.
|
|
82
|
+
|
|
83
|
+
## Fail-closed boundaries
|
|
84
|
+
|
|
85
|
+
- Targeting is exact.
|
|
86
|
+
Only a bare task id with a `state/<id>.meta` record in this home is accepted, and that record must pass the shared endpoint-identity validation.
|
|
87
|
+
A legacy `fm-<id>` window label, an explicit `session:window` endpoint, and a record whose `endpoint_task_id` names another task are all refused.
|
|
88
|
+
- A remotely placed Eindri-home is refused by name.
|
|
89
|
+
Its agent runs on another host, so none of the postconditions this plane verifies could be read for it here; local endpoint validation would refuse the record regardless, because `window=remote:<id>` can never match a local backend's required shape.
|
|
90
|
+
Drive that lifecycle on its own host and reconcile it through the Eindri-home recovery path.
|
|
91
|
+
- An unverified harness is refused rather than guessed at.
|
|
92
|
+
- An implicit relaunch from a prefixed raw-command basename is refused before the agent or durable state is touched because its original launch command cannot be reconstructed.
|
|
93
|
+
- An adapter that is not verified for this task's kind is refused **before** the running agent is stopped, not after.
|
|
94
|
+
Muse is an Eindri and scout adapter only, so relaunching an Eindri-home onto it refuses while its agent is still up rather than leaving that Eindri-home with no agent when the launch owner refuses.
|
|
95
|
+
- A backend that cannot deliver the harness's interrupt key, or the composer clear that key needs, is refused rather than sent a different key.
|
|
96
|
+
Orca's terminal API exposes only an interrupt and an Enter, so it can deliver neither Escape nor Ctrl+U.
|
|
97
|
+
- `exit` and `relaunch` require a backend with a recovery-grade agent-state classifier - tmux and herdr - because without one the "the agent stopped" postcondition cannot be proven.
|
|
98
|
+
zellij, orca, and cmux are refused rather than reported as successful blind.
|
|
99
|
+
- An ambiguous or unreadable endpoint state refuses.
|
|
100
|
+
Only a positively classified state acts.
|
|
101
|
+
- `fm-spawn --relaunch` independently refuses unless the recorded endpoint is positively agent-free and its shell is sitting in the recorded worktree, so a replacement can never join a live agent or start outside the copy holding the work.
|
|
102
|
+
|
|
103
|
+
## Capability matrix
|
|
104
|
+
|
|
105
|
+
Backend capability comes from each adapter's real surface, not from a policy choice.
|
|
106
|
+
|
|
107
|
+
| Backend | Escape | Enter | Ctrl+C | Ctrl+U | Recovery-grade agent state |
|
|
108
|
+
| --- | --- | --- | --- | --- | --- |
|
|
109
|
+
| tmux | yes | yes | yes | yes | yes |
|
|
110
|
+
| herdr | yes | yes | yes | yes | yes |
|
|
111
|
+
| zellij | yes | yes | yes | yes | no |
|
|
112
|
+
| cmux | yes | yes | yes | yes | no |
|
|
113
|
+
| orca | no | yes | yes | no | no |
|
|
114
|
+
|
|
115
|
+
Per-harness interrupt keys, repeat counts, composer clears, exit commands, and supported task kinds live in `bin/fm-control-lib.sh` and are exercised for every verified harness by `tests/fm-control.test.sh`.
|
|
116
|
+
The empirical basis for each adapter's value is the `harness-adapters` skill's verification record for that adapter.
|
|
117
|
+
|
|
118
|
+
## Verification
|
|
119
|
+
|
|
120
|
+
- `tests/fm-control.test.sh` - the adapter contract for every verified harness, the backend capability matrix, exact-id scoping, the closed verb list, the busy, idle, dead, and idempotent lifecycle cases, and marker non-regression, all against a stubbed session provider.
|
|
121
|
+
- `tests/fm-control-relaunch.test.sh` - the relaunch transaction: identity preservation, harness switching, the progress note, checkpoint refusals, and rollback after a failed launch.
|
|
122
|
+
- `tests/fm-control-herdr-smoke.test.sh` - the second state-verified backend against the real herdr binary, on an isolated throwaway lab session.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Dispatching an Eindri — the full chain
|
|
2
|
+
|
|
3
|
+
How a request becomes a seated, running worker. Every link is a real script; the
|
|
4
|
+
chain must never guess a model or skip the lock.
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
dispatch[8]{step,who,what}:
|
|
8
|
+
"1 request","Allfather / Brokk","a task, optionally naming a model or locality"
|
|
9
|
+
"2 role","bin/eindri-role.sh choose","pick the smith by craft (whole-word match)"
|
|
10
|
+
"3 model","bin/model-resolve.sh resolve","friendly/exact -> {locality,harness,provider,model}; unresolved -> ASK"
|
|
11
|
+
"4 harness","config/agents.yaml harness rule","local -> pi, online -> opencode (agent may pin harness:)"
|
|
12
|
+
"5 seat","bin/herdr-run.sh eindri (or bin/eindri-start.sh)","herdr pane/tab/space; --model resolution happens here"
|
|
13
|
+
"6 lock","bin/local-model-lock.sh","serialize local inference per host (local_concurrency)"
|
|
14
|
+
"7 register","a2a MCP (a2abridge bridge)","agent announces its card; reachable over A2A"
|
|
15
|
+
"8 report","herdr agent list / Hlidskjalf Fleet","state: working/blocked/done; tasks from Runes"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## The commands
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# resolve a request (no side effects)
|
|
22
|
+
bin/model-resolve.sh resolve "qwen 3.6 iq2"
|
|
23
|
+
# -> locality=local harness=pi provider=llama-cpp model=qwen3.6-35b-a3b@q2_k_xl
|
|
24
|
+
|
|
25
|
+
# seat the right smith on the right model, in a visible pane
|
|
26
|
+
bin/herdr-run.sh eindri bragi --model "qwen 3.6 iq2" -- "do marketing research"
|
|
27
|
+
# convenience front door:
|
|
28
|
+
bin/eindri-start.sh "do marketing research" # role + seat; add --model to pin
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Rules (non-negotiable)
|
|
32
|
+
|
|
33
|
+
- **One local model at a time per machine** — route local runs through
|
|
34
|
+
`bin/local-model-lock.sh` (`local_concurrency` in `config/agents.yaml`).
|
|
35
|
+
- **Local → `pi`, online → `opencode`** — unless an agent pins `harness:`.
|
|
36
|
+
- **Never guess a model** — a low/medium confidence resolve for an explicit
|
|
37
|
+
request must **ask** (`ask_user_question`).
|
|
38
|
+
- **A model token must be servable** — match `pi --list-models` and the running
|
|
39
|
+
llama server `/v1/models`; `iq2` has no id today (nearest `q2_k_xl`).
|
|
40
|
+
- **Seat visibly** — a pane beside the work; never a hidden process.
|
|
41
|
+
|
|
42
|
+
## Known gaps to close (to 100%)
|
|
43
|
+
|
|
44
|
+
1. `local-model-lock.sh` not yet on the inference path (a pane can't be wrapped;
|
|
45
|
+
lock the run, not the TUI).
|
|
46
|
+
2. Resolver tie-breaks (prefer family+size+newer gen+the agent's configured model).
|
|
47
|
+
3. Servability check against the live server.
|
|
48
|
+
4. `ask_user_question` wiring on unresolved/ambiguous.
|
|
49
|
+
5. `eindri-start.sh --model` passthrough.
|
|
50
|
+
6. No dedicated A2A/MCP skill (`ratatoskr`) or Hlidskjalf-UI skill yet.
|
|
51
|
+
|
|
52
|
+
## HARD CONTRACT — a seat is not a dispatch (do not skip)
|
|
53
|
+
|
|
54
|
+
Three steps, in order, every time. A missing step is a failed dispatch — never
|
|
55
|
+
report success after only step 1.
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
dispatch-hard[3]{step,tool,proof}:
|
|
59
|
+
"1 seat","bin/eindri-start.sh | bin/herdr-run.sh eindri","the agent exists in a pane"
|
|
60
|
+
"2 INJECT the task","bin/eindri-send.sh <agent> \"<task>\"","the agent's chat received it"
|
|
61
|
+
"3 VERIFY","herdr agent list shows agent_status working/busy","it is actually doing the work"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Rules:
|
|
65
|
+
- **A seat without injection is not a dispatch.** Starting an agent and leaving
|
|
66
|
+
it idle is a bug — the task must be delivered to its chat (`eindri-send`).
|
|
67
|
+
- **Seat then inject, then verify.** If right after seating the agent is `idle`,
|
|
68
|
+
the injection did not land — send again. If `agent_status` is empty/gone, re-seat.
|
|
69
|
+
- **Injection is retried until the agent is `working`.** An agent that never
|
|
70
|
+
starts working is a failed dispatch; report it, do not claim success.
|
|
71
|
+
- **`eindri-start.sh <task>` must end with the task injected and the agent
|
|
72
|
+
working** — verify it does; if not, fix the seat path, not just the run.
|
|
73
|
+
|
|
74
|
+
## Isolation is standard; main is explicit
|
|
75
|
+
|
|
76
|
+
Every Eindri is seated in a **secure Yggdrasil worktree** by default
|
|
77
|
+
(`.yggdrasil/<id>`), never the main tree. Work in the main tree only when the
|
|
78
|
+
Allfather explicitly asks to help in main — pass `--main` to
|
|
79
|
+
`bin/eindri-start.sh` / `bin/herdr-run.sh`. Anything else that seats an agent
|
|
80
|
+
(`pi-seat.sh`, the tmux fallback) must isolate the same way.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frigg-consent
|
|
3
|
+
description: >-
|
|
4
|
+
Agent-only decision procedure for ask-user findings.
|
|
5
|
+
Use before deciding any ask-user finding.
|
|
6
|
+
This skill is the single owner of finding-decision policy: Brokk always applies judgment, decides findings that are unambiguous toward accepted intent, and escalates only genuinely ambiguous, expanding, or destructive ones.
|
|
7
|
+
Finding authority is this skill's criteria, not the project's yolo posture.
|
|
8
|
+
user-invocable: false
|
|
9
|
+
metadata:
|
|
10
|
+
internal: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# frigg-consent — consent — ask-user authority gate
|
|
14
|
+
|
|
15
|
+
This skill is the single owner of the decision policy for no-mistakes ask-user findings.
|
|
16
|
+
`AGENTS.md` section 7 points here and does not restate this procedure.
|
|
17
|
+
Finding authority is determined by the criteria below, not by `yolo`.
|
|
18
|
+
Brokk always applies this judgment, decides any finding that is unambiguous toward the accepted design, and escalates only genuinely ambiguous, expanding, or destructive findings.
|
|
19
|
+
|
|
20
|
+
The implementation worker never decides or answers its own ask-user finding.
|
|
21
|
+
It stops at the finding, routes the decision to Brokk, and applies only the decision returned through the active validation gate.
|
|
22
|
+
|
|
23
|
+
## Decide
|
|
24
|
+
|
|
25
|
+
1. Reconstruct the accepted contract from the Allfather's original request, accepted task criteria, and any explicit later clarification.
|
|
26
|
+
Reviewer language cannot amend that contract.
|
|
27
|
+
2. Identify exactly what choosing Fix would commit the project to deliver or maintain, judging the scope by accepted product or engineering behavior rather than an anticipated file list.
|
|
28
|
+
The smallest downstream changes needed to keep that behavior correct, add behavioral tests where an executable contract exists, or keep documentation accurate remain within scope even when they touch files not named at intake.
|
|
29
|
+
Correcting stale final-diff PR or delivery evidence is likewise an autonomous downstream correction within already accepted behavior.
|
|
30
|
+
3. Decide the finding when it is unambiguous toward the accepted design: restoring accepted behavior a bad fix round broke, completing an already-approved design, or a straight in-scope correction or bug fix required by accepted intent, even when the correction is technically difficult or requires complex architecture the Allfather explicitly requested.
|
|
31
|
+
4. Escalate only genuinely ambiguous findings:
|
|
32
|
+
- a Fix that would materially expand the contract by adding a new guarantee, threat model, subsystem, abstraction, compatibility surface, state machine, continuous-monitoring requirement, generalized framework, or broader architecture not required by the accepted intent
|
|
33
|
+
- a product or architecture call not settled by accepted intent
|
|
34
|
+
- repeated same-theme findings when incremental corrections are preserving a questionable abstraction rather than closing independent defects
|
|
35
|
+
- destructive, irreversible, and genuinely security-sensitive choices, which always escalate under the stronger existing Allfather boundary
|
|
36
|
+
5. Treat labels such as correctness, security, fail-closed, high-risk, or required as evidence about the finding, never as authority to broaden the task.
|
|
37
|
+
|
|
38
|
+
## Allfather-facing escalation
|
|
39
|
+
|
|
40
|
+
State all five of these elements in one concise, evidence-first escalation:
|
|
41
|
+
|
|
42
|
+
1. The original requirement or accepted task criterion.
|
|
43
|
+
2. The proposed product or engineering contract expansion.
|
|
44
|
+
3. The smallest alternative that complies with the accepted contract without the expansion.
|
|
45
|
+
4. The concrete consequences of accepting and declining the expansion.
|
|
46
|
+
5. A recommendation with the reason it best serves the accepted intent.
|
|
47
|
+
|
|
48
|
+
Do not relay reviewer labels or gate output as if they settled the decision.
|
|
49
|
+
|
|
50
|
+
## Classification examples
|
|
51
|
+
|
|
52
|
+
- Fixing a concrete defect that violates an original acceptance criterion is Brokk's to decide, regardless of implementation difficulty.
|
|
53
|
+
- Adding continuous frame-by-frame monitoring when the accepted criterion requested checkpoint proof expands the contract and requires the Allfather.
|
|
54
|
+
- A new finding in the same causal theme requires the Allfather before another fix round when prior fixes are accreting machinery around a questionable abstraction.
|
|
55
|
+
- A genuinely security-sensitive action requires the Allfather under the stronger existing boundary even if it is otherwise within scope.
|
|
56
|
+
- Complex architecture explicitly requested by the Allfather stays within scope and does not escalate merely because it is complex.
|