Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
135 commits
Select commit Hold shift + click to select a range
9ec9467
chore(release): open dev at 2.49.0 before releasing 2.48.0
invalid-email-address Sep 8, 2026
0372c43
Merge pull request #4019 from lidge-jun/codex/dev-bump-249
lidge-jun Sep 8, 2026
358e1ee
docs(devlog): archive the 2.48.0 release train record
invalid-email-address Sep 8, 2026
29bb221
Merge pull request #4021 from lidge-jun/codex/release-248-record
lidge-jun Sep 8, 2026
87b685d
feat(provider): add official CodeBuddy Global and CN providers
Flowershangfromthebranches Sep 3, 2026
e80f5a3
fix(provider): harden CodeBuddy CLI lifecycle
Flowershangfromthebranches Sep 3, 2026
1e3cd67
fix(provider): address CodeBuddy runtime review
Flowershangfromthebranches Sep 3, 2026
aa5404a
docs(codebuddy): document adapter factory and turn input contracts
Flowershangfromthebranches Sep 4, 2026
769e420
test(providers): place CodeBuddy tests in their layout domain
invalid-email-address Sep 8, 2026
124c57b
feat(provider): add Qoder Global PAT provider
Flowershangfromthebranches Sep 3, 2026
094cb93
test(providers): place Qoder tests in their layout domain
invalid-email-address Sep 8, 2026
5adf130
fix(qoder): carry captured alias through discovery and anchor auth er…
invalid-email-address Sep 8, 2026
615c5c6
feat(provider): add Qoder CN PAT provider
Flowershangfromthebranches Sep 3, 2026
a0e794d
feat(integrations): support source-preserving YAML for Hermes Agent (…
rrmlima Sep 8, 2026
14ce693
fix(google): guard model-tail histories with user continue nudge acro…
Sep 8, 2026
6ba1e67
feat(gui): give Qoder its brand mark and name the CLI providers
invalid-email-address Sep 8, 2026
295bcf8
docs(integrations): keep fr and zh-TW in step with Hermes source pres…
invalid-email-address Sep 8, 2026
16d49ce
fix(google): keep a single owner for the model-tail continue nudge
invalid-email-address Sep 8, 2026
b77b05a
Merge pull request #4026 from lidge-jun/codex/prs-l1-codebuddy
lidge-jun Sep 8, 2026
753ecb8
Merge pull request #4027 from lidge-jun/codex/prs-l2-qoder-global
lidge-jun Sep 8, 2026
07ac34b
Merge pull request #4028 from lidge-jun/codex/prs-l3-qoder-cn
lidge-jun Sep 8, 2026
9f07212
Merge pull request #4029 from lidge-jun/codex/prs-l4-marks-docs
lidge-jun Sep 8, 2026
5bb8faf
Merge pull request #4030 from lidge-jun/codex/prs-l5-hermes-yaml
lidge-jun Sep 8, 2026
e2bf167
Merge pull request #4031 from lidge-jun/codex/prs-l6-gemini-tail
lidge-jun Sep 8, 2026
ed66b6b
docs(devlog): record the provider runtime stack landing
invalid-email-address Sep 8, 2026
7dc7dc9
Merge pull request #4037 from lidge-jun/codex/prs-stack-record
lidge-jun Sep 8, 2026
cfff026
wp1: land the luvs01 fixture and bug-fix train (9 PRs) (#4049)
lidge-jun Sep 8, 2026
9587750
wp2: land seven contributor bug fixes (quota, catalog, streaming, sto…
lidge-jun Sep 8, 2026
164bd2b
wp3: land four small contributor changes and the missing feedback-cal…
lidge-jun Sep 8, 2026
b11cd84
test(stream): prove bare upstream error at EOF meters failed without …
chilung-cgu Sep 8, 2026
e12dfb1
fix(logs): persist transport finality evidence
chilung-cgu Sep 8, 2026
ff524ae
wp4: fix four reported bugs with no owning pull request (#4058)
lidge-jun Sep 8, 2026
6bd3274
test(server): verify exactly one failed terminal on upstream error
chilung-cgu Sep 8, 2026
02bc10e
wp6: pin Bun 1.4.2 and catch up the drifted workflow (#4064)
lidge-jun Sep 8, 2026
8026405
wp7: report the actual reason a proxy refused to stop (#4067)
lidge-jun Sep 8, 2026
7269be2
feat(codex): opt into client-side compaction
cb8010d6 Sep 8, 2026
3c3307e
test(gui): preserve client compaction on sync failure
cb8010d6 Sep 8, 2026
cc49bd6
fix(codex): keep client compaction future-only
cb8010d6 Sep 8, 2026
3c86cfd
docs(codex): tighten compaction guidance
cb8010d6 Sep 8, 2026
ad60bc0
docs(codex): add client compaction UI screenshot
cb8010d6 Sep 8, 2026
dce2b50
docs(codex): scope client compaction guidance
cb8010d6 Sep 8, 2026
178ba36
docs(codex): clarify V2 quota behavior
cb8010d6 Sep 8, 2026
d94c369
fix(codex): tighten compaction review coverage
cb8010d6 Sep 8, 2026
f2327ab
fix(stop): confirm shared teardown before skipping parent restoration
luvs01 Sep 9, 2026
166309c
feat(doctor): explain ChatGPT public endpoint latency
chilung-cgu Sep 8, 2026
7bd7429
docs(codex-integration): clarify ChatGPT channel scope and verify doc…
chilung-cgu Sep 8, 2026
b8853a4
fix(doctor): restrict ChatGPT hint to canonical forward auth and clar…
chilung-cgu Sep 8, 2026
22420a7
fix(doctor): validate baseUrl hostname for ChatGPT public endpoint hint
chilung-cgu Sep 9, 2026
b93415e
fix(server): honor rejected identity checks during port reclaim
luvs01 Sep 8, 2026
7dc2405
test(stop): exercise parent restoration through the real CLI module g…
luvs01 Sep 9, 2026
87447a7
fix(openai): drop tool-schema patterns Python re cannot compile
Sep 9, 2026
875c457
fix(usage): validate token values and escape human output
luvs01 Sep 9, 2026
f3bf31b
fix(usage): retain invalid streamed usage state
luvs01 Sep 9, 2026
1dbf74b
fix(transport): pin manual redirects at upstream dispatch
luvs01 Sep 9, 2026
45a56cc
fix(transport): enforce manual redirects in OAuth override dispatch
luvs01 Sep 9, 2026
4e5d3ce
test(transport): clarify manual redirect compatibility and assertions
luvs01 Sep 9, 2026
11d6617
fix(doctor): gate ChatGPT hint on canonical forward provider, correct…
invalid-email-address Sep 9, 2026
47a9627
devlog: plan the xAI OAuth retry hardening unit (#4045, #4046, #4047,…
invalid-email-address Sep 9, 2026
f917d47
oauth/xai: honor Retry-After and stop retrying aborted token requests…
invalid-email-address Sep 9, 2026
034c1ee
oauth/xai: annotate the deliberate non-JSON catch in readTokenError
invalid-email-address Sep 9, 2026
35c0349
test(codex): lock voice-sideband and history-retag contracts for clie…
invalid-email-address Sep 9, 2026
aa9e30c
oauth/xai: parse all three RFC 9110 HTTP-date forms, strip unreleased…
invalid-email-address Sep 9, 2026
3bd66da
fix(doctor): hedge ChatGPT latency copy to what the classifier can su…
invalid-email-address Sep 9, 2026
50ad78f
chore(carry): record attribution for the #4063 carry
invalid-email-address Sep 9, 2026
29e6e78
chore(carry): record attribution for the #3987 carry
invalid-email-address Sep 9, 2026
4b379b9
feat(sponsors): OrcaRouter placement, overview introduction and links…
lidge-jun Sep 9, 2026
6bdfad3
oauth/xai: pin discovery endpoints to trusted auth hosts and reject u…
invalid-email-address Sep 9, 2026
589daec
fix(server): close expired dashboard selection streams quietly when n…
lidge-jun Sep 9, 2026
6097c67
test(openai): assert the chat wire drops uncompilable tool patterns
lidge-jun Sep 9, 2026
bd1b6c0
chore(carry): record attribution for the #4072 carry
lidge-jun Sep 9, 2026
91d75da
docs(claude-code): note Unicode-property pattern normalization in too…
lidge-jun Sep 9, 2026
52ad823
usage: open the custom date range on request instead of on arrival
lidge-jun Sep 9, 2026
f45d619
fix(codex): restore main policy binding after owned recovery
luvs01 Sep 8, 2026
ad576de
test(codex): preserve verified policy after unknown rebind
luvs01 Sep 8, 2026
b6bce51
fix(codex): reject conflicting startup token identities
luvs01 Sep 8, 2026
037137a
fix(readme): show the OrcaRouter sponsor logo on every branch (#4097)
lidge-jun Sep 9, 2026
0480891
devlog: name the language on the design-dial fence (#4098)
lidge-jun Sep 9, 2026
a79193f
fix(codex): bound the startup policy-binding credential read
lidge-jun Sep 9, 2026
3f5d141
test(config): give the config-lock holder child a platform-policy rea…
lidge-jun Sep 9, 2026
3822eff
docs(server): state that the reclaim allowlist narrows candidates but…
lidge-jun Sep 9, 2026
49b31be
docs(lifecycle): move the port-recovery note into the restart section
lidge-jun Sep 9, 2026
c7e7589
chore(carry): record attribution for the #4036 carry
lidge-jun Sep 9, 2026
b483a54
fix(auth): scope caller credentials to the selected route
luvs01 Sep 9, 2026
a093f1d
fix(auth): retain explicit OpenAI credentials within their destinatio…
luvs01 Sep 9, 2026
e6d8f09
fix(auth): keep ChatGPT-claimed and combined bearers off noncanonical…
invalid-email-address Sep 9, 2026
30d2b85
fix(auth): restore caller Direct credentials on canonical reroutes un…
invalid-email-address Sep 9, 2026
c9bbd64
fix(auth): require an account claim for Direct credential restore acr…
invalid-email-address Sep 9, 2026
f13f531
fix(auth): restore only provably ChatGPT-domain caller credentials ac…
lidge-jun Sep 9, 2026
945734c
docs(auth): note that the reroute restore is stricter than unchanged …
lidge-jun Sep 9, 2026
8663fef
test(auth): pin the canonical caller restore boundary
luvs01 Sep 9, 2026
545a8e4
test(auth): assert claimed bearer rejection outcomes
luvs01 Sep 9, 2026
11f575e
fix(codex): reject conflicting account-id claims within one startup t…
lidge-jun Sep 9, 2026
bf8f36f
fix(auth): distinguish ChatGPT-domain markers from generic org claims…
lidge-jun Sep 9, 2026
b499227
devlog: match the plan example to the implemented waitForOwnedChildRe…
lidge-jun Sep 9, 2026
7939ff3
fix(auth): treat a present ChatGPT marker key as marked regardless of…
lidge-jun Sep 9, 2026
616650b
fix(openai): drop patternProperties keys Python re cannot compile
lidge-jun Sep 9, 2026
b7666d5
docs(claude-code): scope the pattern normalization to the adapter paths
lidge-jun Sep 9, 2026
5748cdf
fix(doctor): classify the resolved openai destination and complete th…
lidge-jun Sep 9, 2026
ed89af5
fix(codex): keep existing threads routed when enabling client compaction
lidge-jun Sep 9, 2026
87efd10
docs(codex): name the full fenced admission set and prove the pinned …
lidge-jun Sep 9, 2026
1457884
fix(codex): fall back to caller main during pool cooldown
luvs01 Sep 8, 2026
e282d4d
fix(codex): keep the cooled subscription out of its own caller-main f…
lidge-jun Sep 9, 2026
2f3f826
feat(sponsors): PackyCode Standard sponsor preset, README row and doc…
lidge-jun Sep 9, 2026
0000689
test(doctor): a blank baseUrl is discarded, not unresolvable
lidge-jun Sep 9, 2026
22baa64
test(openai): compare surviving patternProperties keys as a set
lidge-jun Sep 9, 2026
3af5402
fix(auth): keep the ChatGPT-domain inspector total for non-object JWT…
lidge-jun Sep 9, 2026
8db0ab4
fix(auth): retain stored sidecar auth for caller-auth Chat
luvs01 Sep 9, 2026
4a201df
test(auth): avoid sidecar model migration in credential fixture
luvs01 Sep 9, 2026
1bb5e93
fix(codex): keep the root override beside the client-compaction table
lidge-jun Sep 9, 2026
066ce4c
docs(codex): scope the routing guarantee to the managed root override
lidge-jun Sep 9, 2026
65d5483
docs(codex): separate the compaction-only contract from the authless …
lidge-jun Sep 9, 2026
00b96bb
fix(codex): identify the cooled subscription by its stable user id
lidge-jun Sep 9, 2026
8a0b67f
fix(codex): journal the root override the compaction form retains
lidge-jun Sep 9, 2026
49efae6
docs(codex): condition the migrate-back claim on the form you return to
lidge-jun Sep 9, 2026
c247b9d
Merge pull request #4074 from luvs01/agent/usage-token-output-hardeni…
lidge-jun Sep 9, 2026
d77015f
Merge pull request #4082 from luvs01/agent/upstream-redirect-dispatch…
lidge-jun Sep 9, 2026
f5b5e7b
Merge pull request #4101 from lidge-jun/codex/pr4036-port-reclaim
lidge-jun Sep 9, 2026
567588a
Merge pull request #4087 from lidge-jun/codex/xai-oauth-retry-after
lidge-jun Sep 9, 2026
3057078
Merge pull request #4094 from lidge-jun/codex/xai-oauth-endpoint-vali…
lidge-jun Sep 9, 2026
4285b8b
Merge pull request #4095 from lidge-jun/codex/pr4069-quiet-selection-…
lidge-jun Sep 9, 2026
0c1d5dd
Merge pull request #4099 from lidge-jun/codex/ci-config-mutation-lock…
lidge-jun Sep 9, 2026
6be88f9
Merge pull request #4085 from lidge-jun/codex/pr4025-main-policy-binding
lidge-jun Sep 9, 2026
4a08c75
Merge pull request #4088 from lidge-jun/codex/pr3997-caller-main-cool…
lidge-jun Sep 9, 2026
4be3cb5
Merge pull request #4070 from luvs01/agent/stop-teardown-confirmation…
lidge-jun Sep 9, 2026
76b7ea7
Merge pull request #4061 from chilung-cgu/fix/issue-3657-persist-stre…
lidge-jun Sep 9, 2026
4de1ecc
Merge pull request #4102 from lidge-jun/codex/pr4081-credential-scope…
lidge-jun Sep 9, 2026
ab03162
docs(codex): scope the ChatGPT channel claim to the resolved destination
lidge-jun Sep 9, 2026
5e68c4e
fix(openai): only drop a patternProperties matcher where it cannot na…
lidge-jun Sep 9, 2026
97841a7
fix(codex): report the mixed compaction result instead of the root-on…
lidge-jun Sep 9, 2026
bb61007
Merge pull request #4091 from lidge-jun/codex/pr4063-chatgpt-latency-…
lidge-jun Sep 9, 2026
8213fad
Merge pull request #4092 from lidge-jun/codex/pr3987-client-compaction
lidge-jun Sep 9, 2026
b5c9833
Merge pull request #4096 from lidge-jun/codex/pr4072-tool-schema-regex
lidge-jun Sep 9, 2026
9240bde
fix(openai): preserve composed tool schema contracts
lidge-jun Sep 9, 2026
ad36c7b
Merge pull request #4113 from lidge-jun/codex/preserve-composed-tool-…
lidge-jun Sep 9, 2026
62849df
release: promote verified 2.49.0 product tree to main
lidge-jun Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion .github/workflows/cleanup-orphaned-workflows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: 1.3.14
bun-version: 1.4.2

- name: Remove stale workflow histories
env:
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:1

# Keep the runtime aligned with package.json and pin the multi-platform image index.
ARG BUN_IMAGE=oven/bun:1.4.0@sha256:5ff609364c049b54eb0ff560ec96319729a972078ef2c755d758f0c6ef89c2d6
ARG BUN_IMAGE=oven/bun:1.4.2@sha256:9114c058aeae42162ee16dd5084b95fe9473970bb6bcb5b232ab1630f0546895

FROM ${BUN_IMAGE} AS build
WORKDIR /home/bun/app
Expand Down
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,16 +106,19 @@ See [SPONSORS.md](./SPONSORS.md).

<!-- sponsors:main — one banner, model developers only; empty until a Main sponsor signs -->

<!-- sponsors:standard — one row per sponsor, in order of signing. Uncomment the table with the first row:
<!-- sponsors:standard — one row per sponsor, in order of signing -->
<table>
<tbody>
<tr>
<td width="180"><a href="SPONSOR_URL"><img src="https://raw.githubusercontent.com/lidge-jun/opencodex/main/assets/sponsors/SPONSOR.png" alt="SPONSOR" width="150"></a></td>
<td>Thanks to SPONSOR for sponsoring this project! BLURB</td>
<td width="180"><a href="https://www.orcarouter.ai/?utm_source=opencodex&utm_medium=readme"><img src="assets/sponsors/orcarouter.png" alt="OrcaRouter" width="150"></a></td>
<td>Thanks to <a href="https://www.orcarouter.ai/?utm_source=opencodex&utm_medium=readme">OrcaRouter</a> for sponsoring this project! OrcaRouter is one OpenAI-compatible AI gateway for production AI: adaptive routing that grades every prompt and sends it to the model that clears your bar, automatic failover, routing rules as code, zero-markup provider pricing with prompt caching, and guardrails, an agent firewall, and request logs on every call across 200+ models. Pick <code>OrcaRouter</code> in the Add provider picker or run <code>ocx provider add orcarouter</code>; <code>orcarouter/auto</code> is the adaptive router.</td>
</tr>
<tr>
<td width="180"><a href="https://www.packyapi.com/register?aff=k5KT"><img src="assets/sponsors/packycode.png" alt="PackyCode" width="150"></a></td>
<td>Thanks to <a href="https://www.packyapi.com/register?aff=k5KT">PackyCode</a> for sponsoring this project! PackyCode is a stable, high-performance API relay provider, offering relay services for Claude Code, Codex, Gemini, and more. With automatic failover, smart routing, and unlimited concurrency, it turns AI into a real productivity tool. <a href="https://www.packyapi.com/register?aff=k5KT">Register via this link</a> and get started! Pick <code>PackyCode</code> in the Add provider picker or run <code>ocx provider add packycode</code>.<br><sub>PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。<a href="https://www.packyapi.com/register?aff=k5KT">点此链接注册</a>,立即开始使用!</sub></td>
</tr>
</tbody>
</table>
-->

---

Expand Down Expand Up @@ -288,7 +291,7 @@ full-slash form keeps working too. Details: [model routing docs](https://opencod
OpenAI (ChatGPT login or API key), Anthropic, Google Gemini, xAI, Kimi, Azure OpenAI, Ollama
(local + Cloud), Cursor (experimental), and every OpenAI-compatible endpoint — plus DeepSeek,
Groq, OpenRouter, Together, Fireworks, Cerebras, Mistral, Hugging Face, NVIDIA NIM, MiniMax,
Qwen Cloud, SiliconFlow, and more. Full list: `ocx init` or the
Qwen Cloud, Qoder Global and CN (official PAT + CLI), SiliconFlow, and more. Full list: `ocx init` or the
[provider docs](https://opencodex.me/guides/providers/).

## CLI
Expand Down
2 changes: 1 addition & 1 deletion SPONSORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ sponsor receives:
supplied by the sponsor and published verbatim. The maintainer may decline or require edits to
text that is false, misleading, disparages third parties, or breaches applicable law or GitHub
policy. A second-language blurb (for example Chinese) may run alongside the English one.
- A built-in provider preset (`ocx provider select <id>`) shipped in a public npm release,
- A built-in provider preset (`ocx provider add <id>`) shipped in a public npm release,
listed near the top of the provider picker in the dashboard and CLI and marked as a sponsor
there. (The registry field and picker ordering that back this land with the first sponsor
preset; today the picker follows registry order.)
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/orcarouter-overview-mobile.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/orcarouter-overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/orcarouter-picker.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/orcarouter-readme.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/orcarouter.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/packycode-overview-mobile.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/packycode-overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/packycode-picker.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/packycode-readme.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/sponsors/packycode.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
34 changes: 17 additions & 17 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

65 changes: 65 additions & 0 deletions devlog/_fin/260908_provider_runtime_stack/000_plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# 000 — Plan and live manifest

Unit: `devlog/_plan/260908_provider_runtime_stack`. Session `01a080e2-1dfc-7082-bff8-5043215bdd35`.
Snapshot: 2026-09-08T12:00Z (fetch), `origin/dev` = `29bb221c3`
(`Merge pull request #4021 from lidge-jun/codex/release-248-record`).
Carry worktree: `/private/tmp/ocx-prs-stack-01a080e2` (linked worktree of the main checkout;
`core.worktree` unset, toplevel verified).

## Objective

Land the open provider-runtime contributor PRs on `dev` as one ordinary manual dependent PR
stack, integrated with the repository's provider discipline (test layout, provider marks,
docs-site sections, contributor attribution), and merge the stack bottom-up into `dev`
after a single green final-head CI run. Constraints given by the maintainer:

- Never run the local product suite, typecheck, build, or install. Every one of those is
labelled NOT RUN in the delivery record. Hosted CI on the final head is the only proof.
- Every mutating Git command runs as `git -c core.hooksPath=/dev/null` (the repository
`postmerge` hook can otherwise install dependencies and typecheck). Push with
`--no-verify`.
- CI runs once, on the top of the stack. Merge only if that head is green.
- Ordinary dependent PR bases, no GitHub native stack registration (DEV-STACK-OPT-IN-01).
- Cherry-pick, reimplement, squash, or rebase are all permitted. Original authors stay
as commit authors (`cherry-pick -x`) or in a `Co-authored-by` trailer.
- Subagents: `anthropic/claude-opus-5` unlimited; Aside browser delegation unlimited.
- Out of scope: release/publish, `main`/`preview` promotion, unrelated subsystems.

## Work-phase map (one PABCD cycle each)

| WP | Scope | Doc |
|----|-------|-----|
| wp1 | Docs-only roadmap: this manifest, layer plan (010), conflict map (011), mark sourcing (012), secondary dispositions (013) | 000-013 |
| wp2 | Carry L1-L3 (CodeBuddy #3340, Qoder Global #3349, Qoder CN #3350) onto `dev` with layout registration | 020 |
| wp3 | L4 marks + display names + docs-site sections + attribution; accepted secondary layers | 030 |
| wp4 | Publish, final-head CI, bottom-up admin merge, ancestry proof, closeouts, delivery record | 040, 060 |

## Manifest (exact head at snapshot)

| PR | Author | Head | Base | Mergeable vs dev | +/- | Files | Commits | Draft |
|----|--------|------|------|------------------|-----|-------|---------|-------|
| #3340 | Flowershangfromthebranches | `4b705e92d` | dev | clean (merge-tree) | 2108/6 | 17 | 4 | yes |
| #3349 | Flowershangfromthebranches | `4ac98bd4d` | dev | CONFLICTING (`tests/providers/provider-connection-test.test.ts`, import-path only) | 2683/14 | 30 | 4 (3 shared with #3340) | yes |
| #3350 | Flowershangfromthebranches | `a4e805084` | dev | conflicts inherited from #3349 | 2834/16 | 30 | 5 (4 shared) | yes |
| #3010 | Liang-Psych | `2e3582328` | dev | CONFLICTING; OAuth/private-protocol design the maintainer review rejected | 1474/2 | 11 | 18 | yes |

The three Flowershangfromthebranches PRs are already a contributor-declared chain
(#3340 → #3349 → #3350); #3349 and #3350 GitHub diffs include the lower layers because
each targets `dev`. The carry keeps that chain shape but rebases each layer onto its
parent so every PR diff is layer-only (DEV-STACK-03).

## Maintainer review state carried into this unit

The prior maintainer reviews (grok-bot, 2026-09-03) on all three PRs left these open items,
now dispositioned here:

| Item | Disposition |
|------|-------------|
| AUP / terms acceptance for headless CLI proxy routing (CodeBuddy, Qoder) | Maintainer decided in this session by authorizing the landing. Recorded in 040. |
| Provider marks missing in `gui/src/provider-icons.ts` | wp3, per the Meta precedent `81a1fc1cc` (#3338): first-party SVG with source notes, or documented initials tile when terms forbid. See 012. |
| docs-site guide lacks a Qoder Global/CN section | wp3. CodeBuddy section already exists at `guides/providers.md:620`. |
| Shared `coding-agent/protocol.ts` error classification broadened in the Qoder commit | Kept in L2 where the contributor put it; audit (wp2 A-phase) checks CodeBuddy fixture coverage. |
| `qoder` promoted from free-directory reference id to runtime seed with `preserveCustomDestination` | Kept; parity test in the carried commits asserts the flag. |
| #3010 relationship | Superseded by #3350 once landed; close with credit to Liang-Psych. |
| Tests at `tests/` root | Blocker on current `dev`: layout guard. Fixed per layer in wp2. |
| Draft readiness checklist (contributor-side) | Not applicable; maintainer carries the PRs under admin authority. Originals close as superseded. |
34 changes: 34 additions & 0 deletions devlog/_fin/260908_provider_runtime_stack/010_layer_plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# 010 — Layer plan

Stack shape (merge bottom-up, ordinary dependent bases):

| # | Branch | Base | Thesis | Source commits |
|---|--------|------|--------|----------------|
| 1 | `codex/prs-l1-codebuddy` | `dev` | CodeBuddy Global/CN headless CLI providers + shared `coding-agent` runtime | #3340: `7e56b6399`, `f651611f1`, `18530f8e8`, `4b705e92d` (cherry-pick -x) + layout fix commit |
| 2 | `codex/prs-l2-qoder-global` | L1 | Qoder Global PAT provider, account-scoped live model discovery | #3349: `4ac98bd4d` (cherry-pick -x, import-path conflict resolved) + layout fix commit |
| 3 | `codex/prs-l3-qoder-cn` | L2 | Qoder CN PAT profile | #3350: `a4e805084` (cherry-pick -x) |
| 4 | `codex/prs-l4-marks-docs` | L3 | Provider marks, display names, docs-site Qoder section, CREDITS | new maintainer commits |
| 5+ | `codex/prs-l5-*` | L4 | Secondary PRs accepted by 013 triage, one layer each | cherry-pick -x |

Layer rules:

- Each layer builds at its own tip. The layout-guard fix for a layer's tests lives in
that layer, not deferred upward.
- Original author preserved by `cherry-pick -x` (author field + `(cherry picked from
commit …)` line). Maintainer-authored repair commits carry no trailer because they
are not the contributor's work; the PR body names the source PR.
- PR bodies use the repository template and carry the stack map (DEV-STACK-03).
- Only the top layer's head gets CI. Lower PRs are opened for review navigation and
merge order; their own PR CI may run (`pull_request` trigger) but is not the gate.

Verification plan (hosted only):

1. Push all layers with `--no-verify`.
2. If the top PR's `pull_request` CI skips platform lanes, dispatch
`gh workflow run ci.yml -R lidge-jun/opencodex --ref <top-branch> -f lane=all`.
3. Record run id, every job conclusion; skipped/cancelled are not passing.
4. Merge bottom-up with `--admin`, retarget the next child to `dev` after each parent
lands, keep parent branches until no open child targets them.
5. After the top merge: `git fetch origin dev`; every merge SHA must satisfy
`git merge-base --is-ancestor <sha> origin/dev`; `git rev-parse origin/dev^{tree}`
must equal the certified head's tree (or a diff limited to merge-commit metadata).
Loading
Loading