Skip to main content

pi-orchestrator: interactive_protection — skip_owners + grace window (Patch #10063)

Summary

Symptom: John's H/M tasks added via mc.js add were being auto-paused by pi-orchestrator within seconds, before manual orchestration (prompt-forge → mehanik → dispatch pipeline) could begin.
Root cause: The daemon's getNextTask() loop claimed any open H/M task with no owner-based exclusion, colliding with John's interactive workflow where tasks are created as open before the human pipeline starts.
Fix: Added interactive_protection config block (skip_owners + grace_seconds) and updated the SQL WHERE clause in pi-orchestrator.js (lines 3412–3471) to respect both guards.
Date: 2026-04-29 | Patch: MC #10063 | Proveo verdict: 8/8 PASS


Root Cause Detail

Prior to this patch, getNextTask() in ~/system/kernel/pi-orchestrator.js selected tasks with a WHERE clause limited to status and priority, with no consideration for task owner. This meant:

  • John runs node ~/system/tools/mc.js add "TASK" --priority H --owner john
  • Task is inserted as status=open, owner=john
  • Within one daemon poll cycle (~30s), the daemon claimed and auto-paused the task
  • John's manual /prompt-forge → /mehanik → dispatch pipeline never had the chance to operate on it

The collision was systematic: mc.js add happens before manual orchestration begins by design (ZAKON #25). The daemon treated all open tasks as automation targets.


New Config Keys

File: ~/system/config/pi-orchestrator-config.json (block added at patch time):

"interactive_protection": {
  "skip_owners": ["john"],
  "grace_seconds": 300
}
  • skip_owners: Array of owner names whose tasks are never picked up by the daemon, regardless of age or priority.
  • grace_seconds: Unowned tasks (NULL owner) created within this window are also protected — prevents premature pickup of tasks that have not yet been assigned to an owner.
  • Backwards safe: If the config block is absent, both defaults activate automatically (skip_owners=['john'], grace=300s). No existing deployments are broken by a missing block.

Pickup Logic Table

OwnerAgePicked up?Reason
johnanyNOInteractive owner — skip_owners guard
NULL (unowned)< 300sNOGrace window — task may still be in orchestration queue
NULL (unowned)≥ 300sYESTrue unassigned automation task
pi-orchestrator / autowork / agent-workeranyYESExplicit automation owners — allowlist passthrough
edita / other non-protectedanyYESExisting behavior unchanged

Verification Commands

# Confirm daemon is running with new code
launchctl list | grep pi-orchestrator   # should return active PID (e.g. 31020)

# Confirm config has interactive_protection block
cat ~/system/config/pi-orchestrator-config.json | jq .interactive_protection

# Live test: create H task as john, verify NOT auto-paused after 90s
ID=$(node ~/system/tools/mc.js add "VERIFY-protection" --priority H --owner john --category system | grep -oE '#[0-9]+' | tr -d '#')
sleep 90
node ~/system/tools/mc.js show $ID | grep -E "Status|Owner"
# Expected: Status = open  |  Owner = john

Daemon Reload Procedure

Run this after any change to pi-orchestrator-config.json or pi-orchestrator.js:

launchctl unload ~/system/daemons/launchagents/com.john.pi-orchestrator.plist
launchctl load  ~/system/daemons/launchagents/com.john.pi-orchestrator.plist
sleep 5 && launchctl list | grep pi-orchestrator   # PID should be present

Note: The daemon reads config at startup. Changes to interactive_protection are not hot-reloaded; a full unload/load cycle is required.


Tuning Guide

Adding another interactive owner (e.g. alem)

Edit ~/system/config/pi-orchestrator-config.json: add the owner name to the skip_owners array, save, then reload the daemon (procedure above).

Extending the grace window for slower workflows

Edit ~/system/config/pi-orchestrator-config.json: increase grace_seconds (e.g. 600 for 10-minute window), save, then reload the daemon.

Verifying config was picked up after reload

grep -i "interactive_protection|skip_owners|grace" ~/system/logs/pi-orchestrator.log | tail -5

Evidence & Cross-References

  • MC #10063: Task record — node ~/system/tools/mc.js show 10063
  • Proveo report (8/8 PASS): /tmp/postflight-10063/proveo-report.md
  • Evidence bundle: /tmp/10063-evidence/ (config before/after, diff, reload log, scenario results)
  • Backups: ~/system/kernel/pi-orchestrator.js.bak-10063 and ~/system/config/pi-orchestrator-config.json.bak-10063
  • Related runbook — MC #10036: MC Quality Trail Validator — agent output write semantics (Patch #10036)