Commit Graph

141 Commits

Author SHA1 Message Date
Ahmed Mohammed fdca81f984 add delegate-setup utility for fleet lane configuration
Introduce a setup-only skill that discovers implementer CLIs and writes
delegate-fleet.v1 lane maps (implementer + dials) to global or project
config after approval, without dispatching work or touching agent instruction files.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 18:32:32 +03:00
Ahmed Nagdy 347f2fa221 Merge pull request #35 from 7aWy11/fix/relay-preflight-bound
fix(relay): bound the version preflight and stop mislabeling a broken…
2026-07-31 14:27:08 +03:00
Ahmed Mohammed 1921a82e2d fix(relay): keep preflight failure results truthful 2026-07-31 13:59:10 +03:00
Ahmed Mohammed 1e2c369d3c fix(grok): share one version probe timeout budget 2026-07-31 13:51:04 +03:00
Ahmed Mohammed 7d1971f4fd Merge master into fix/relay-preflight-bound 2026-07-31 13:44:18 +03:00
Ahmed Nagdy 2a211bc24f Merge pull request #34 from 7aWy11/fix/relay-timeout-bounds
fix(relay): reject --timeout values the watchdog cannot honour
2026-07-31 13:36:21 +03:00
Youssef Yasser fa060e3e3c fix(relay): bound the version preflight and stop mislabeling a broken CLI
The codex, opencode, grok, and kimi relays probed their implementer's version
before the watchdog was armed, so a CLI that never answered --version wedged
the relay with no result.json for the caller to poll — the exact failure the
relay contract exists to prevent. Their `catch { return null }` also collapsed
"binary missing" and "binary broken" into *_unavailable/127, sending callers to
reinstall something already on disk.

Port the shape cursor, qoder, vibe, and pi already use: cap the probe at
min(--timeout, 10s) with killSignal SIGKILL, and return { version, error } so a
missing binary stays *_unavailable/127, a hung probe reports timeout/124, and a
non-zero exit reports failed with the probe's exit code and stderrTail. Prepare
the run directory before probing so a failed preflight still has somewhere to
publish result.json.

The suite now drives all four through the preflight matrix. Both fake CLIs were
generalized to recognize every probe form in the repo and to take hang/fail from
the mode name, replacing the per-CLI special cases.
2026-07-30 14:11:36 +03:00
Youssef Yasser 807b06cb5f fix(relay): reject --timeout values the watchdog cannot honour
codex, opencode, grok, kimi, and qoder validated --timeout only against
parseDuration returning null, so "0s" survived as 0 and "600h" as a delay past
Node's 2^31-1 ms timer ceiling. Both make setTimeout fire on the next tick: the
relay felled the implementer half a second in and wrote status "timeout",
reporting a 25-day budget as already spent. A watchdog that reports a limit as
exhausted when it never ran is the one failure mode it must not have.

Bound parseDuration itself, the way claude, cursor, and vibe already do, so
every call site inherits the check rather than each guarding separately, and
drop qoder's now-redundant zero check.

Drive all ten relays through the unhonourable durations from one shared smoke
matrix, with a positive control at the ceiling so the bound cannot over-reject.
The per-relay timeout loops it subsumes (agy's and cursor's --timeout lists,
qoder's zero case, pi's zero and out-of-range cases) fold into it; agy's
--print-timeout row stays, since its 60s grace gives it a lower ceiling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 13:30:11 +03:00
Ahmed Nagdy 9cbf983f37 Merge pull request #33 from amElnagdy/readme-scale
Size the README for a growing catalog, and write down what a delegate skill is
2026-07-29 20:21:24 +03:00
Ahmed Mohammed 61ff3ea19c assert package shape and registration, instead of claiming the suite already did
The pull request template told contributors that relay-smoke covered shape and
registration. It did not: the suite walked a hard-coded SKILLS array and never
opened a SKILL.md, a references directory, or skills.sh.json — so a skill could
ship complete and still sit outside every scenario, which is exactly how a
relay ends up unexercised.

The new block reads skills/ from disk rather than from SKILLS, because the one
thing a hard-coded list cannot catch is its own omission. Per skill it asserts
SKILL.md, one relay script, exactly the four references, an entry in
skills.sh.json, and membership in the matrix; both registries are also checked
for entries with no directory behind them.

Verified by mutation: a new skill directory outside the matrix, a skill short
one reference, and a skill dropped from skills.sh.json each fail the suite.
2026-07-29 20:08:36 +03:00
Ahmed Mohammed aff508bd09 review fixes: repo-root links in the templates, and the ledger exception written down
The claim form's ../../ links resolved to /amElnagdy/issues when GitHub renders
the form at /issues/new, so the duplicate-work check the form demands could not
be performed. Absolute URLs are unambiguous wherever a template is rendered.
(The ../blob/master link was already correct at that depth; the suggestion to
deepen it would have broken it.)

AGENTS.md banned version pins outright while the Verification status list has
always carried them on purpose — the pinned version is what makes "verified"
checkable. Written down as an exception so it stops being re-litigated.

Also: name the package gate in CONTRIBUTING and point at the full pre-publish
list; separate the relay's own resume flags from Kimi's in the ledger; and stop
saying the codex relay needs nothing but the codex binary, since it needs Node
and git like every sibling.
2026-07-29 19:53:35 +03:00
Ahmed Mohammed cf737f8782 write down what a delegate skill is, and let contributors claim one
Two people built the same skill independently, twice, and a third had theirs
superseded — a month of outside work spent for nothing. The repo had no
written definition of a delegate skill and no way to say "I started this", so
the README was the only implicit spec.

CONTRIBUTING.md carries the four invariants and the merge checklist derived
from what the shipped skills actually contain. The claim form's label list is
the status board, so nothing here needs hand-maintaining; the pull request
template asks only for the two things CI cannot check — the claim, and what
actually ran.
2026-07-29 19:42:06 +03:00
Ahmed Mohammed d4ffce8d79 size the README for a catalog that keeps growing
Adding an implementer touched five README spots — a table row, a prose
subsection, an example line, a Requirements entry, and a verification line —
so every merge made the shape worse. It is two now: a row, and a verification
line once a run backs it.

The per-skill prose block restated the table above it and the SKILL.md below
it, and had already accumulated a placeholder for a skill that will never be
built. It goes, along with the hardcoded skill count and the per-CLI install
list that duplicated each skill's own prerequisites. The two caveats worth a
landing page survive as table footnotes: the CLIs with no enforceable
read-only mode, and grok's best-effort one.

The Codex-plugin comparison moves into codex-delegate's SKILL.md — one
implementer of ten should not hold a section on the front page. What counts
as a delegate skill takes its place and states the four invariants.

Table cells were re-derived from each relay's own flag surface rather than
copied forward: agy has no read-only mode, and qoder's is --permission-mode
plan.
2026-07-29 19:42:06 +03:00
Ahmed Nagdy 8cc7de34be Merge pull request #27 from ali-maher-m/pi-delegate
feat: add pi-delegate (Pi coding agent CLI)
2026-07-29 19:30:37 +03:00
Ahmed Mohammed afd877fc39 docs: keep Pi verification version-neutral 2026-07-29 19:17:09 +03:00
Ahmed Mohammed 1713cb97fc pi-delegate: harden relay integration 2026-07-29 19:15:39 +03:00
Ahmed Mohammed 570ae9bccd Merge remote-tracking branch 'origin/master' into pr27-review
# Conflicts:
#	AGENTS.md
#	README.md
#	skills.sh.json
#	test/relay-smoke.mjs
2026-07-29 18:37:29 +03:00
Ahmed Nagdy 7fe974b537 Merge pull request #32 from zsnakeee/add-cursor-delegate
Add cursor-delegate: delegate to the Cursor Agent CLI
2026-07-29 18:21:12 +03:00
Ahmed Mohammed e9e5d10ea2 tests: isolate Cursor negative paths 2026-07-29 18:10:17 +03:00
Ahmed Mohammed a6e756edb1 cursor-delegate: harden relay integration 2026-07-29 17:58:10 +03:00
Ahmed Mohammed 078d74b256 Merge remote-tracking branch 'origin/master' into pr32-review
# Conflicts:
#	AGENTS.md
#	README.md
#	test/relay-smoke.mjs
2026-07-29 17:22:06 +03:00
Ahmed Nagdy 95a8a6d302 Merge pull request #30 from webdivs/pr/agy-timeout
feat(agy): add --timeout as an explicit relay watchdog
2026-07-29 15:00:51 +03:00
Ahmed Mohammed 01d0c29cdc agy-delegate: bound version preflight 2026-07-29 14:55:13 +03:00
Ahmed Mohammed 4ca70c721e agy-delegate: validate print watchdog input 2026-07-29 14:44:46 +03:00
Ahmed Mohammed 904e4e7656 agy-delegate: harden explicit watchdog 2026-07-29 14:24:39 +03:00
Ahmed Mohammed b9f908778c Merge master into pr/agy-timeout 2026-07-29 14:18:19 +03:00
Ahmed Nagdy 3f3539bb2d Merge pull request #28 from webdivs/pr/codex-session
feat(codex): add --session <id> for exact-thread resume
2026-07-29 14:10:00 +03:00
Ahmed Mohammed 907fb72f65 docs(codex): prefer exact-session resume 2026-07-29 14:00:05 +03:00
Ahmed Mohammed 9899a94761 codex-delegate: validate exact session ids 2026-07-29 13:51:51 +03:00
Ahmed Mohammed ff0fdb45e3 Merge master into pr/codex-session 2026-07-29 13:46:47 +03:00
Ahmed Nagdy dfe1b6b637 Merge pull request #29 from webdivs/pr/artifact-hardening
fix: publish result.json atomically in the five older relays
2026-07-29 13:39:58 +03:00
Ahmed Mohammed 3ae403c794 test: exercise atomic publication in flight 2026-07-29 13:28:20 +03:00
Ahmed Mohammed f6054cc90e Merge master and validate atomic results 2026-07-29 12:42:24 +03:00
Ahmed Nagdy 85bc0a3fc3 Merge pull request #22 from welcoMattic/copilot/add-vibe-delegate-skill
Add `vibe` delegate skill
2026-07-29 12:20:25 +03:00
Ziad Talaat d29e8d854e cursor-delegate: document the Git Bash console hook-wrapper caveat on Windows
When cursor-agent is launched from a Git Bash (MSYS) console with hooks
configured (its own hooks.json or imported Claude Code PreToolUse hooks),
it selects bash.exe as its persistent shell but generates hook wrappers
in PowerShell syntax, so every hook errors and Cursor blocks all command
execution fail-closed - edits land, gates never run. Reproduced and
isolated on cursor-agent 2026.07.23 (env, PATH, and process ancestry
ruled out; the same dispatch works from a PowerShell console, and works
from Git Bash once the hook entries are removed).

Document the failure signature and the workaround - dispatch from
PowerShell/cmd - in dispatch-and-poll.md and flag it in SKILL.md.
2026-07-28 23:29:40 +03:00
Ziad Talaat b59ab18189 Add cursor-delegate: delegate to the Cursor Agent CLI
Same brief -> dispatch -> review -> land loop for cursor-agent:

- relay.mjs feeds the brief on stdin (no process-list exposure, no argv
  cap), captures the stream-json events, and writes the standard
  delegate-relay.result.v1 contract with sessionId, resolvedModel,
  permissionMode, touchedFiles, and finalMessage.
- Fresh runs are write-capable with --force; --read-only switches to
  Cursor's plan mode backed by a porcelain tripwire that reports
  readOnlyViolation. --trust is always passed so headless runs never
  stall on the workspace-trust prompt.
- Resume via --resume-last (--continue) or --session <id> (--resume=<id>).
- Windows launches serialize a pre-joined, quoted command string through
  the shell so the cursor-agent.cmd shim resolves without Node's DEP0190
  warning; POSIX spawns the binary directly in its own process group.
- Smoke harness drives the cursor relay's parse, timeout (whole-tree
  kill), and abort paths alongside the other seven.

Verified end-to-end on Windows against cursor-agent 2026.07.23: write
run under --force, plan-mode read-only run with a clean tripwire,
--session resume applying a delta brief, and usage errors exiting 2
with no result file.
2026-07-28 22:38:51 +03:00
bahaaesmail d0218478ba feat(agy): add --timeout as an explicit relay watchdog
The agy relay derives its watchdog from --print-timeout plus a fixed 60s grace,
which assumes agy always honors its own print timeout. It does not always: I have
watched a conversation hang server-side well past it, and the grace window cannot
cover an unbounded hang. The other relays expose --timeout for exactly this, so
this closes the gap rather than inventing a mechanism.

--timeout <dur> overrides the derived value; without it nothing changes. The
value is validated up front because parseDuration returns null for a malformed
one and setTimeout(fn, null) fires on the next tick - an unvalidated flag would
turn a typo into an instant, silent "timeout". Zero is rejected for the same
reason. The timeout error message names whichever limit actually fired.

Adds four smoke assertions for the rejected forms.
2026-07-27 13:13:02 +03:00
bahaaesmail f0b3a71bcb fix: publish result.json atomically in the five older relays
claude-delegate (writeJsonAtomic) and qoder-delegate already write result.json to
a pid-suffixed temporary and rename it into place. codex, opencode, agy, grok and
kimi still write it directly, so an orchestrator polling for the file can read a
truncated, unparseable JSON object — the documented "a run is done when
result.json exists with a status" contract makes that race the normal way to
consume the file, not an edge case.

Applies the same idiom to the five, and adds a smoke assertion per relay that no
.tmp artifact survives a finished run.
2026-07-27 13:07:17 +03:00
bahaaesmail e5a87aad91 feat(codex): add --session <id> for exact-thread resume
--resume-last picks the most recent Codex session globally, not per repo or per
relay run: any other codex invocation between the two legs of a delegation
becomes "last", and the delta brief lands in the wrong thread. The relay already
records threadId in result.json, but had no way to consume it.

--session <id> resumes that exact thread. It is mutually exclusive with
--resume-last, an empty id is rejected (it would otherwise fall through to a
fresh run while still being reported as a resume), and it takes the same
argv path, so -s is still withheld from exec resume.

Adds five smoke assertions covering argv shape, the withheld -s, the recorded
field, and both rejections.
2026-07-27 12:59:57 +03:00
Ali Maher 7ab7a72c39 fix: cap --timeout at Node's timer range, keep missing pi classified pi_unavailable on win32, and document the Windows kill path 2026-07-27 02:09:59 +03:00
Ali Maher 03733aa2e9 docs: wire pi-delegate into README, skills.sh.json, and AGENTS.md 2026-07-27 00:47:50 +03:00
Ali Maher 99c9902f26 feat: add pi-delegate skill docs and references 2026-07-27 00:47:50 +03:00
Ali Maher b39d3e8d93 feat: add pi-delegate relay 2026-07-27 00:47:50 +03:00
Ali Maher da5bdf475d test: add pi-delegate smoke scenarios (failing until the relay lands) 2026-07-27 00:47:50 +03:00
Ahmed Mohammed 54278b1abf docs: clarify Vibe limits and setup 2026-07-26 19:50:29 +03:00
Ahmed Mohammed 9038774395 Merge master and harden Vibe delegation 2026-07-26 19:00:20 +03:00
Ahmed Nagdy b28d826d9f Merge pull request #20 from samehdoush/codex/qoder-delegate
qoder delegate
2026-07-26 18:07:47 +03:00
Ahmed Mohammed d44ad730c2 fix: harden Qoder run artifacts 2026-07-26 17:55:39 +03:00
Ahmed Mohammed 3fdd4dc5bf test: guard Qoder resume result 2026-07-26 17:41:52 +03:00
Ahmed Mohammed a2244a9c54 feat: forward-port qoder delegate 2026-07-26 17:34:49 +03:00