Repository navigation
Retire the structural suite and narrow Dely to the harnesses it can support (0.19.0) - #55
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
…vents. Control can no longer compose worker launches by hand: dely.js owns ACK, adopt quiescence, silence, and deadline so later verify and skill tasks have a stable command surface. Co-authored-by: Cursor <cursoragent@cursor.com>
…tch cannot swallow settlement. Co-authored-by: Cursor <cursoragent@cursor.com>
…le-batch consumer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
…own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
A heartbeat-typed wait can no longer hide a batched worker_done: dispatch never consumes, wait and sidecar judge the frozen FIFO batch, and collect reads acknowledged history. Co-authored-by: Cursor <cursoragent@cursor.com>
… of this delivery. Codex's weekly limit was 97% used with about five reviews left; the human chose to move the review pin rather than pause until 2026-09-15. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
A consuming typed wait must replay the frozen Delivery when a newer matching type arrives, and collect must fail closed on a draining check instead of collapsing distinct settles. Co-authored-by: Cursor <cursoragent@cursor.com>
…nce row. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
Dispatch needs a PASS verdict for this repo, these pins and this Control harness; verify proves that path and restores the previously bound Run so a later worker-start can still run. Co-authored-by: Cursor <cursoragent@cursor.com>
…immediately on a failed launch. Co-authored-by: Cursor <cursoragent@cursor.com>
…sk 4. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
…ute, as decision 8 of the 2026-09-11 record requires. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
…ses launches or retries into the same terminal. Co-authored-by: Cursor <cursoragent@cursor.com>
… sidecar into its remediation; the adopt terminal leak into task 4. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
…at inverted sentences were passing. Collect now reports DEADLINE from dispatchedAt and keeps one sidecar per Run so nudge-mode recovery can see those exits. Co-authored-by: Cursor <cursoragent@cursor.com>
… be woken by any message and Orca already reports a dead worker. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…unch failed on a shell prompt and left its terminal behind. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…erminal it cannot find or judge live. Co-authored-by: Cursor <cursoragent@cursor.com>
…dispatch, pin the sentence that states what removing the sidecar costs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…and pin the sidecar-removal limit in both skills. Co-authored-by: Cursor <cursoragent@cursor.com>
…5 to say collect reads liveness for a dispatch that is no longer open. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…forget it and a live dispatch can still settle. Co-authored-by: Cursor <cursoragent@cursor.com>
…eport-once must be Dely's own memory, not a terminalState Orca may never set. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… so collect forgets a dead worker even when Orca leaves it retained. Co-authored-by: Cursor <cursoragent@cursor.com>
…outside a git repository, and the rest of the review's findings are deferred. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…repository, so collect still reports a dead worker once. Co-authored-by: Cursor <cursoragent@cursor.com>
… to the case it covers, and defer the unwritable git directory. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…became ready. A failed launch must not keep launching pins or leave the created terminal, and a throw after launch must reuse verify's cleanup and FAIL verdict before restoring the previous Run. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WcUecPMViKUf1gJRBLnsJc
…ompt; it retries --enter, then leaves the result file. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WcUecPMViKUf1gJRBLnsJc
… the block clears, then give up. Co-authored-by: Cursor <cursoragent@cursor.com>
…val env values are not positive. A non-numeric retry used to hang Atomics.wait; the skill still described the removed bare-return send. Co-authored-by: Cursor <cursoragent@cursor.com>
…lure lines quote the worker's screen before release, preflight waits longer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WcUecPMViKUf1gJRBLnsJc
…rs, and wait 150s for each preflight pin. Co-authored-by: Cursor <cursoragent@cursor.com>
…d transcript failure text comes from message blocks. Co-authored-by: Cursor <cursoragent@cursor.com>
hieuphung97
marked this pull request as ready for review
September 14, 2026 08:28
… for waker Controls, quote the gate, fail preflight early, fix the skill and Grok Setup. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
…ker Controls, and fail preflight when a gate stays on screen. Co-authored-by: Cursor <cursoragent@cursor.com>
…DELY_WAITER is set, and ignore non-blocking usage footers. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tnfpfr9czVFGiXVksmrFDB
hieuphung97
marked this pull request as draft
September 14, 2026 13:30
…, and drop a failed worker-list row instead of waiting out the budget. Co-authored-by: Cursor <cursoragent@cursor.com>
… NO_ACK. Co-authored-by: Cursor <cursoragent@cursor.com>
hieuphung97
marked this pull request as ready for review
September 14, 2026 14:17
…supported harnesses, and plan the deletions. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…s the whole structural check. The suite was a change detector: 89 CI runs, 86 green, and no defect in this repository's shipped code first found by it, against 56 commits spent on contracts.sh versus 39 on everything under skills/. The fake Orca it ran on diverged from the real CLI in four shapes and stayed green through every probe round that failed. The version pin moves out of contracts.sh into a literal gate in AGENTS.md, so a skills/ change that forgets one manifest is a red gate rather than a silent split between the Claude and Codex installs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Gone: the Antigravity adopt path and the six temp-file helpers behind it, the nine-string GATES classifier and the two preflight polls built on it, pinWhy, dely.cmd, and the launcher's Electron fallback. The helper is 478 lines, from 688. A failure quote is now the tail of the worker's own screen rather than the lines that matched a gate string. Two of those strings had already been removed as footer false positives, and the quote is checked live by the untrusted-pin row of the probe checklist, not by a string list. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The README keeps Claude Code, Codex CLI and Cursor Agent CLI, and the setup skill discovers models and effort for those three. Grok Build, Antigravity CLI, Kiro CLI and GitHub Copilot CLI keep their measured launch mechanics in references/harnesses.md and lose their install commands, their discovery commands and their checked-version rows. This narrows what is documented. It does not declare a closed set: the wording that was open stays open, and a deferred harness returns as a status change. Checked versions are refreshed to what is installed here: Claude Code 2.1.273, Codex CLI 0.154.0, Cursor Agent CLI 2026.09.10-fd3934a, Orca 1.4.203. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
probe/checklist.md carries the seven live rows, the snapshot install with its hash check, the fixed probe paths, and what each row leaves behind. probe/mkrepo.sh builds a probe repository with a bare remote and a delivery-sized task. probe/trust.sh acts as the human on a Claude trust dialog and reports trust from ~/.claude.json, not from the screen: the earlier probe script reported success twice while hasTrustDialogAccepted stayed false. Both scripts resolve their target and refuse anything outside ~/dely-probe/ before creating a directory or an Orca terminal. No skill references probe/. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Everything durable is in the 2026-09-16 decision record; the live results go in the pull request body. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Row 5 of the probe checklist failed on the pushed candidate: an untrusted Claude pin was refused correctly and quoted the dialog, but took 192 s instead of the 39 s the deleted gate classifier used to manage. The classifier was the only early-failure path, and deleting it left only the 150 s timeout. Orca already reports this without any string matching. On an untrusted pin the worker-list projection holds stage.worker "starting" for about 40 s and then flips to "start_unknown" with detail "turn_start_unobserved", while dispatchStatus stays "pending" the whole time, which is why the failed-row poll never fired. Preflight now drops on that projection as well as on a failed row. The trailing sleep in the poll loop goes with it: it existed so that the two consecutive gate observations were spaced, and there are no gate observations left. The loop now costs one check --wait per turn instead of two. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude Code 2.1.273 asks "Quick safety check: Is this a project you created or one you trust?", so the script's "do you trust" pattern never fired and it reported NOT_TRUSTED after 60 s with the dialog plainly on screen. It now matches several parts of the dialog. The wording is a detector for when to answer, never for whether the answer took: that stays the store check, which is the reason this script exists. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three things the first live run needed and the file did not say: a terminal read needs --screen or it returns stacked fragments and, after one read, an empty tail; worker-list can report an empty taskTitle, so a dispatch is identified by id and order; and the hash check has to cover the marketplace source directory, because a Claude Control was seen running scripts/dely from there rather than from the plugin cache. The killed-worker row now says whose signal it is. It reads Orca's projection.nextAction, that projection has changed between Orca releases, and a row where the agent process is gone while terminalState stays active is a finding about the execution plane rather than about the helper. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Remediation for the CHANGES_REQUESTED review of de50905. Documentation only; nothing under skills/ changes. The record claimed it verified rows 1, 4, 5 and 7. Row 4 ran and failed: on Orca 1.4.203 a killed worker kept terminalState "active" and nextAction "none" for 6 min 8 s, against 16 s to ATTENTION on 1.4.200, while wait's ATTENTION path is unchanged from 0.18.0. The record now says that, names the Orca version, and says running four of seven rows was a recorded exception rather than the floor. It also carries the real cost of dropping the dialog classifier: 56 s now against the classifier's 39 s, with 192 s as the timeout-only case in between. The checklist said row 1 was the release floor, which contradicted the record's own Deferred section and the decision it came from. The floor is all seven rows; a release that runs fewer names which it skipped. Step 1 told the next operator to install the snapshot into Cursor with the README commands. That is not possible: cursor-agent plugin marketplace add takes a git URL only and installing needs the interactive /plugin panel. Step 1 now says Cursor runs off the Claude plugin cache, gives the command that checks for older Cursor copies, and says a Cursor row that cannot be trusted is reported rather than run. It also warns that codex plugin marketplace add was seen keeping a stale marketplace and installing the previous version while reporting success. trust.sh reads with --screen, which is what the checklist tells everyone else to do. The bug report template marks the four deferred harnesses so a reporter is not promised support that does not exist. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
0.19.0 keeps the protocol and the helper that live probes actually exercised, and deletes the rest.
tests/(contracts.sh,scripts.test.js, the fake Orca) and.github/workflows/contracts.ymlare gone. The closure gates inAGENTS.mdare now the whole structuralcheck: whitespace, JSON validity, syntax enumerated from
git ls-files, absence commands, an identifiergrep over
skills/, the disclosure greps, and a version gate.AGENTS.md. It names the literal0.19.0and both manifests must match it.That is what keeps the Claude and Codex installs from splitting now that no workflow compares them.
nine-string
GATESclassifier and the two preflight polls on it,pinWhy,dely.cmd, and the launcher'sElectron branch.
Kiro CLI and GitHub Copilot CLI keep their measured launch mechanics in
references/harnesses.mdand losetheir install sections and discovery commands. This narrows what is documented; it does not declare a closed
set.
probe/replaces the suite.checklist.md(seven live rows, the snapshot install with its hash check,the fixed probe paths, cleanup),
mkrepo.sh, andtrust.sh, which acts as the human on a Claude trustdialog and reports trust from
~/.claude.jsonrather than from the screen. Both scripts resolve theirtarget and refuse anything outside
~/dely-probe/. No skill referencesprobe/.docs/decisions.md.Why now: measured in this repository on 2026-09-16, the
contractsworkflow ran 89 times — 86 green, onecancelled, two red. One red was the logo-assets commit, where the disclosure grep matched coordinates inside
an SVG path. The other was an external contributor's branch, whose logs have expired. No defect in this
repository's own shipped code was first found by CI, while
tests/contracts.shtook 56 commits onmainagainst 39 for everything under
skills/.Live verification
Candidate installed for real from
git archive de50905into~/dely-probe/.snap-de50905, added as amarketplace and installed in Claude Code and Codex CLI.
sha256ofSKILL.mdmatched the snapshot at everyClaude and Codex location. Orca 1.4.203, Claude Code 2.1.273, Codex CLI 0.154.0.
cf6cfbaon the remote, reviewACCEPT, zero human steps after the opening prompt, all four dispatches releaseddocs/decisions.md, not as a passPREFLIGHT implement claude FAIL worker never started a turn: turn_start_unobservedin 56 s, quote carried the whole dialog ("Quick safety check: Is this a project you created or one you trust? … Security guide"), no terminal left behind, path confirmed untrusted in~/.claude.jsonfirstRows 2, 3 and 6 were not run for this release.
Row 7, step by step
Code, the failing pin and the action required.
PREFLIGHT implement claude FAIL … ; PREFLIGHT review codex PASS 16s. Both preflight dispatches released, no leftover terminal.probe/trust.sh ~/dely-probe/t-de50905answered the dialog and verified it:TRUSTED … verified in ~/.claude.json, 9.9 s.on the first try, no
agent_prompt_blocked.ACCEPT,and
d436a86reached the remote. Nothing else was sent. The Codex Control usedwait-bgandnotifyforboth waits, as its waker wake mode requires.
Row 5 was red first, and was fixed
The first run of row 5 on
4e0448drefused the untrusted pin correctly and quoted the dialog, but took 192 sinstead of the 39 s the deleted gate classifier used to manage: the classifier had been the only early-failure
path, and deleting it left only the 150 s timeout.
Orca already reports this without any string matching. Measured on an untrusted pin: the
worker-listprojection holds
stage.worker: "starting"for about 40 s, then flips to"start_unknown"withdetail: "turn_start_unobserved", whiledispatchStatusstays"pending"throughout — which is why thefailed-row poll never fired.
a51a247drops on that projection as well as on a failed row, and removes thetrailing sleep in the poll loop, which existed only to space the two gate observations that no longer happen.
Row 5 then passed at 56 s.
Row 4 failed, and not here
A dispatched worker was killed after it acknowledged. Its process was gone and its terminal was back at a shell
prompt, but for 6 minutes and 8 seconds Orca 1.4.203 kept reporting
terminalState: "active",stage.worker: "ready",liveness: unverifiable/missing_statusandnextAction: "none", sodely waithadnothing to report and correctly kept waiting. The same scenario measured 16 s to
ATTENTIONon Orca 1.4.200.dely wait'sATTENTIONpath is byte-identical to 0.18.0 —diffof the wholewaitfunction between3ee4e1aand this head shows one hunk, the removal of the adopted-terminal close afterSETTLED, which runsnowhere near it.
worker-showoffers no better signal: itslastHeartbeatAtwas set 10 s after dispatch andnever updated, so it cannot distinguish a dead worker from a quiet one without a threshold that would
false-positive on the two-minute gaps seen in row 1.
This is an execution-plane finding, not a candidate defect, and adding a new liveness detector is outside this
delivery.
probe/checklist.mdnow says whose signal that row reads and asks for the Orca version next to theresult. It also retires the "ATTENTION 16 s after the kill" line this pull request used to carry.
Also measured, not fixed here
directory? … 1. Yes, continue").
references/harnesses.mdstill records Codex's Setup asOrca preflight.That file is deliberately untouched here; it is replaced by
harnesses.jsonin the next delivery, which iswhere the row should be corrected.
scripts/delyfrom the marketplace source directory, not from~/.claude/plugins/cache. The hash check has to cover both;probe/checklist.mdnow says so.cursor-agent plugin marketplace addtakes a git URLonly, and installing needs the interactive
/pluginpanel. Two stale copies remain on this machine, withhashes that differ from the candidate and from each other:
~/.cursor/plugins/cache/dely/dely/5690982…and~/.cursor/plugins/marketplaces/github.com/hieuphung97/dely/8062f35…. No row here needed Cursor, so therows above are unaffected, but a Cursor row cannot be run until those are replaced.
codex plugin marketplace addsilently kept a stale marketplace and installed 0.18.0 while reportingsuccess. Removing and re-adding fixed it. The hash check caught it; the report did not.
~/.claude/plugins/cache/dely/dely/0.19.0behind after its marketplace was removed.worker_donebodycapped at a short summary is a lossy channel for review findings, where a report file in the worktree is
reliable; and
orchestration inboxis not Run-scoped, so a coordinator reading the inbox rather than thewait result could attribute a stale report to the current Run.
Closure gates on exact HEAD
de50905All nine blocks exit 0:
git diff --check;jq -e .over five manifests;node --checkon the helper; shellsyntax over the three shipped scripts enumerated by
git ls-files; both version gates; the fifteen absencecommands; the identifier grep over
skills/; the two disclosure greps.What this does not do
harnesses.json, a harness-agnostic setup skill, a shorterSKILL.md, the JSONL log, preflight moved to setupand after a
NO_ACK, anddelywith no arguments printing version and hashes are all the next delivery'scontract, on
main.Review
CHANGES_REQUESTEDatde50905, remediated at984fa22.The independent session reproduced all ten closure-gate blocks on exact
de50905, and reproduced the threegates discriminating against seeded wrong implementations: the Codex manifest left at 0.18.0, a
hasGatecaller left in
skills/without its definition, and a brokenprobe/mkrepo.sh. It also reproduced the oneruntime change against a stub Orca —
stage.worker: start_unknownwithdispatchStatus: pendingand areworded dialog matching no old gate string — where this head fails in 0.4 s and calls
worker-stopandworker-releaseonce each, while3ee4e1awaits out the budget. It did not reinstall the candidate or rerunthe live rows.
Every finding was a contradiction between this delivery's documentation and this delivery's own measurements.
984fa22is documentation only; nothing underskills/changes, which the diff shows:docs/decisions.mdclaimed it "verified rows 1, 4, 5 and 7". It now says rows 1, 5 and 7 passed, that row 4ran and failed on Orca 1.4.203 with the projection numbers and the note that
wait'sATTENTIONpath isunchanged from 0.18.0, and that four of seven rows was a recorded exception rather than the floor.
probe/checklist.mdsaid row 1 was the release floor, contradicting the record's own Deferred section anddecision 15 of 2026-09-15. The floor is all seven rows; a release that runs fewer names which it skipped.
probe/checklist.mdstep 1 told the next operator to install the snapshot into Cursor with the READMEcommands, which this delivery had already measured to be impossible. It now states that Cursor runs off the
Claude plugin cache, gives the command that finds older Cursor copies, and says a Cursor row that cannot be
trusted is reported rather than run. It also warns about
codex plugin marketplace addkeeping a stalemarketplace while reporting success.
probe/trust.shnow reads with--screen, as the checklist tells everyone else to..github/ISSUE_TEMPLATE/bug_report.ymlmarks the four deferred harnesses.One further note the reviewer recorded for the next delivery, not fixed here: the plan was deleted at
4e0448dand three candidate commits followed it, one of them a runtime change. The record carries thatchange, so nothing is lost, but the skill puts the plan deletion in the release commit.
Closure gates rerun on exact
984fa22: all nine blocks exit 0.Awaiting re-review of the
de50905..984fa22diff.🤖 Generated with Claude Code