You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
DevSpace can now carry a controller far enough to plan, delegate implementation, independently verify a Candidate, commit it, and push a non-default branch — but the controller can still discover only at the very end that it has no usable GitHub PR-delivery channel.
This is a control-plane reliability defect, not a repository-specific implementation defect.
parent/fresh main at delivery: 2d1aff574306740bd3d261a7d90fa383dbb6d375
exact Candidate delta: 12 files, +100/-14
At PR-delivery time the Codex controller environment could not complete gh pr create because its GitHub write path was unavailable (observed auth/network/browser-channel failure modes).
This left the task in an undesirable partial state:
IMPLEMENTED
→ independently accepted Candidate
→ branch pushed
→ PR not deliverable by controller
→ CI / MERGE_READY not reachable without another actor manually taking over
The controller did the hard engineering work, but delivery still depended on ad-hoc human/operator intervention.
Goal
Make GitHub PR delivery a first-class, explicit, preflighted and recoverable DevSpace capability so a controller can safely complete:
without gaining broad or ambiguous GitHub authority.
Design principles
Delivery capability is separate from model capability.
A controller being able to reason, edit, test, commit, or push does not prove it can create/read a PR.
Preflight before expensive engineering.
If PR delivery is required by the task contract, DevSpace should know before implementation whether a valid delivery lane exists.
Exact Candidate identity.
PR creation must bind at least:
repository
base branch / exact base SHA
candidate branch
exact candidate head SHA
optional Issue binding
No arbitrary GitHub write authority.
A fallback delivery seam must be bounded to the accepted Candidate and requested PR operation, not expose general GitHub mutation.
Remote effect reconciliation. timeout / 502 / lost acknowledgement != PR was not created.
Reconcile the same logical delivery effect before retrying.
No duplicate PR creation.
An identical replay must resolve to the existing matching PR; changed material must fail closed.
Delivery state is not merge authority. PR_DELIVERED, CI_GREEN, MERGE_READY, and MERGED remain distinct states.
Required work
G0 — GitHub delivery preflight
Add an effect-free preflight for the exact intended repository/delivery path.
It should distinguish at least:
GITHUB_PR_READY
GITHUB_AUTH_UNAVAILABLE
GITHUB_NETWORK_UNAVAILABLE
PR_WRITE_UNAVAILABLE
PR_READ_UNAVAILABLE
REPOSITORY_NOT_AUTHORIZED
CANDIDATE_IDENTITY_INVALID
Preflight must not claim push permission merely because read access works; if proof requires mutation, report that dimension separately/unknown.
G1 — Bounded PR-delivery operation
Provide one typed, durable operation for an already accepted and already pushed Candidate.
Persist a stable operation identity before the first possible GitHub write.
After timeout/disconnect/502:
same delivery operation
→ search/read remote PR state using exact candidate head + repository/base binding
→ classify:
COMPLETED
CONFIRMED_NO_EFFECT
OUTCOME_UNKNOWN
→ only retry when safe
Do not create a new attempt just because the local tool response was lost.
G3 — Exact PR identity and idempotency
Acceptance requirements:
same exact Candidate replay resolves to the same PR;
no duplicate open PR for the same exact delivery identity;
changed head/base/title/body material under the same attempt key fails closed;
a PR for a different Candidate cannot be substituted merely because it references the same Issue;
pre-existing PRs are matched by physical Candidate identity, not title similarity.
A controller must not report delivery complete before an exact remote PR readback exists.
G5 — CI/readback seam
After PR creation, provide a bounded read path for:
exact PR number/url
exact base/head SHA
mergeability / draft state
required/current checks
terminal CI result
This is readback only; it does not grant merge.
Preferred architecture
If the Codex/worker sandbox already has a valid GitHub PR channel, use it.
If it does not, DevSpace may provide a narrow host-side delivery seam bound to the exact accepted Candidate. That seam must not become a generic shell/GitHub escape hatch.
Until this closes, the strongest safe statement is:
DevSpace can produce and push accepted Candidates on some controller paths, but end-to-end controller-owned PR delivery / CI closure is not reliably proven and may require manual operator intervention.
Problem
DevSpace can now carry a controller far enough to plan, delegate implementation, independently verify a Candidate, commit it, and push a non-default branch — but the controller can still discover only at the very end that it has no usable GitHub PR-delivery channel.
This is a control-plane reliability defect, not a repository-specific implementation defect.
Fresh observed incident — DevSpace #112
During #112 (
durable owner task ledger + queue-safe targeted dispatch):mainand pushed as:codex/issue-112-chat-swarm-ledgerd10784e79eb08671cfd03bdbd9fbe04f17805c712d1aff574306740bd3d261a7d90fa383dbb6d375gh pr createbecause its GitHub write path was unavailable (observed auth/network/browser-channel failure modes).This left the task in an undesirable partial state:
The controller did the hard engineering work, but delivery still depended on ad-hoc human/operator intervention.
Goal
Make GitHub PR delivery a first-class, explicit, preflighted and recoverable DevSpace capability so a controller can safely complete:
without gaining broad or ambiguous GitHub authority.
Design principles
Delivery capability is separate from model capability.
A controller being able to reason, edit, test, commit, or push does not prove it can create/read a PR.
Preflight before expensive engineering.
If PR delivery is required by the task contract, DevSpace should know before implementation whether a valid delivery lane exists.
Exact Candidate identity.
PR creation must bind at least:
No arbitrary GitHub write authority.
A fallback delivery seam must be bounded to the accepted Candidate and requested PR operation, not expose general GitHub mutation.
Remote effect reconciliation.
timeout / 502 / lost acknowledgement != PR was not created.Reconcile the same logical delivery effect before retrying.
No duplicate PR creation.
An identical replay must resolve to the existing matching PR; changed material must fail closed.
Delivery state is not merge authority.
PR_DELIVERED,CI_GREEN,MERGE_READY, andMERGEDremain distinct states.Required work
G0 — GitHub delivery preflight
Add an effect-free preflight for the exact intended repository/delivery path.
It should distinguish at least:
GITHUB_PR_READYGITHUB_AUTH_UNAVAILABLEGITHUB_NETWORK_UNAVAILABLEPR_WRITE_UNAVAILABLEPR_READ_UNAVAILABLEREPOSITORY_NOT_AUTHORIZEDCANDIDATE_IDENTITY_INVALIDPreflight must not claim push permission merely because read access works; if proof requires mutation, report that dimension separately/unknown.
G1 — Bounded PR-delivery operation
Provide one typed, durable operation for an already accepted and already pushed Candidate.
Illustrative contract:
The operation must re-read remote branch/base identities before any write and refuse on drift.
G2 — Durable operation identity / reconcile-before-retry
Persist a stable operation identity before the first possible GitHub write.
After timeout/disconnect/502:
Do not create a new attempt just because the local tool response was lost.
G3 — Exact PR identity and idempotency
Acceptance requirements:
G4 — Controller-visible delivery lifecycle
Expose structured states such as:
A controller must not report
delivery completebefore an exact remote PR readback exists.G5 — CI/readback seam
After PR creation, provide a bounded read path for:
This is readback only; it does not grant merge.
Preferred architecture
If the Codex/worker sandbox already has a valid GitHub PR channel, use it.
If it does not, DevSpace may provide a narrow host-side delivery seam bound to the exact accepted Candidate. That seam must not become a generic shell/GitHub escape hatch.
Recommended separation:
Required hostile / failure tests
At minimum:
Live acceptance
Use a real Sol controller on macOS with one bounded engineering task and prove:
Acceptance must require:
gh pr createintervention by James/coordinator;Relationship to existing issues
Claim ceiling
Until this closes, the strongest safe statement is: