Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
289 commits
Select commit Hold shift + click to select a range
2c56d22
fix(cursor): capture the conversation checkpoint a suspended tool tur…
lidge-jun Sep 11, 2026
1acff74
Merge pull request #4281 from lidge-jun/codex/4245-cursor-checkpoint-…
lidge-jun Sep 11, 2026
e7ab14f
docs(devlog): close wp2b - its graceMs diagnostic shipped inside #4281
lidge-jun Sep 11, 2026
3784658
docs(devlog): record wp2b as delivered-elsewhere in the work-phase map
lidge-jun Sep 11, 2026
c1ce256
provider: follow the DeepSeek V4.1 transition through the registry (#…
lidge-jun Sep 11, 2026
b3b3e92
feat(cursor): report decoded checkpoint shape so coverage is answerab…
lidge-jun Sep 11, 2026
f529134
docs(cursor): pin the counts-only constraint on the checkpoint shape …
lidge-jun Sep 11, 2026
9ea5759
Merge pull request #4283 from lidge-jun/codex/4245-wp5-checkpoint-shape
lidge-jun Sep 11, 2026
3ee6f37
docs(devlog): open the account pool unification unit (#4275)
lidge-jun Sep 11, 2026
3a3759e
docs(devlog): re-verify the phase 1 anchors against the current dev tip
codex Sep 11, 2026
a11da68
docs(devlog): fold three audit rounds into the phase 1 design
codex Sep 11, 2026
e395a87
feat(providers): pick a warm API key before the first attempt
codex Sep 11, 2026
2e6841b
fix(config): reject an unknown apiKeyPoolStrategy instead of loading …
codex Sep 11, 2026
e1cc655
docs(devlog): scope phase 2 to the files no lane owns
codex Sep 11, 2026
fe2b763
docs(devlog): fold two audit rounds into the phase 2 kernel plan
codex Sep 11, 2026
80d4a31
refactor(oauth): move the pool rotation kernel out of the Codex names…
codex Sep 11, 2026
3015be8
docs(devlog): record the second-half audit findings for the pool kernel
codex Sep 11, 2026
e1e8b25
docs(devlog): re-verify phase 3 anchors and record what blocks it
codex Sep 11, 2026
09d0e7a
docs(devlog): fold the implementation-entry audit into the phase 1 de…
codex Sep 11, 2026
683384a
docs(devlog): record why the consume call site must be built first
codex Sep 11, 2026
afb5db9
docs(devlog): measure why the failover promote needs a guard exemption
codex Sep 11, 2026
63217d1
fix(codex): let an operator account selection outrank the pool cursor
codex Sep 11, 2026
e99db1d
fix(codex): revoke the operator one-shot when its account is deleted
lidge-jun Sep 11, 2026
f725ef8
docs(devlog): record the audit round that found the tests proved nothing
lidge-jun Sep 11, 2026
e3b61b3
fix(codex): keep the model detour outside the operator preference guard
lidge-jun Sep 11, 2026
2da37d7
docs(devlog): record the rebuttal of the model-detour finding
lidge-jun Sep 11, 2026
7235d25
test(codex): cover the generation sweep of operator preferences
lidge-jun Sep 11, 2026
eec1f9b
fix(codex): reset the reconcile watermark with the health state it gu…
lidge-jun Sep 11, 2026
e1bb3a3
Merge pull request #4277 from lidge-jun/codex/key-pool-strategy
lidge-jun Sep 11, 2026
59b84ee
Merge pull request #4279 from lidge-jun/codex/pool-kernel
lidge-jun Sep 11, 2026
c12469d
Merge pull request #4278 from lidge-jun/codex/structure-ssot-followup
lidge-jun Sep 11, 2026
e02578e
Merge pull request #4256 from lidge-jun/codex/260911-ws-commit-boundary
lidge-jun Sep 11, 2026
29d632f
Merge pull request #4284 from lidge-jun/codex/manual-selection-wins
lidge-jun Sep 11, 2026
b7328d7
docs(devlog): plan the generic pool kernel layer at diff level
lidge-jun Sep 11, 2026
82253a3
docs(devlog): fold the plan-audit findings into the generic kernel plan
lidge-jun Sep 11, 2026
5b282ba
docs(devlog): fold three plan blockers, including a wrong fill-first …
lidge-jun Sep 11, 2026
6d21192
feat(oauth): let the generic pool consume its strategy behind pool.ke…
lidge-jun Sep 11, 2026
2122732
test(oauth): make the two 429 strategy cases discriminate
lidge-jun Sep 11, 2026
5567cc8
docs: describe the generic pool contract in both flag states
lidge-jun Sep 11, 2026
f9bf31c
docs(devlog): plan the API-key pool call-site wiring
lidge-jun Sep 11, 2026
6b28478
feat(clients): add omo as an export and integration client
lidge-jun Sep 11, 2026
1c93a6f
docs(devlog): fold the wiring plan blockers
lidge-jun Sep 11, 2026
085fa6f
feat(providers): use the warm API key on the first attempt
lidge-jun Sep 11, 2026
d470f57
docs(devlog): record the rendered Integrations evidence for omo
lidge-jun Sep 11, 2026
78d30c7
test(server): cover the pre-dispatch API key pick end to end
lidge-jun Sep 11, 2026
9b067c2
docs(devlog): plan quota-aware API key selection
lidge-jun Sep 11, 2026
9689ee8
fix(devlog): stop the omo contract note tripping the privacy scan
lidge-jun Sep 11, 2026
f5f87e8
docs(devlog): fold the quota-selection plan blockers
lidge-jun Sep 11, 2026
d984994
feat(devin-cli): local Devin CLI provider over ACP stdio (#4288)
lidge-jun Sep 11, 2026
8c1edce
feat(providers): rank API keys by quota headroom
lidge-jun Sep 11, 2026
9fbff86
test(providers): cover quota-ranked API key selection
lidge-jun Sep 11, 2026
eb314c5
Merge pull request #4290 from lidge-jun/codex/omo-client-integration
lidge-jun Sep 11, 2026
ba21644
docs: document apiKeyPoolStrategy, including the new quota value
lidge-jun Sep 11, 2026
083d044
chore(skills): regenerate the management surface map
lidge-jun Sep 11, 2026
526eaf0
Merge branch 'codex/generic-pool-kernel' into codex/key-pool-wiring
lidge-jun Sep 11, 2026
e5ff46c
docs(devlog): plan the pool-settings contract consolidation
lidge-jun Sep 11, 2026
2f89dd2
docs: close the omo unit and fix two leftovers it created
lidge-jun Sep 11, 2026
5a86180
docs(devlog): fold the wp5 audit, which resized the unit
lidge-jun Sep 11, 2026
4fd8377
docs(devlog): narrow the wp5 cycle to the guard and the validator col…
lidge-jun Sep 11, 2026
7a1e30b
docs(devlog): fold the re-audit residuals and name the guard targets
lidge-jun Sep 11, 2026
3213e8b
test(server): pin the three legacy pool contracts exactly
lidge-jun Sep 11, 2026
cb7f96c
Merge pull request #4294 from lidge-jun/codex/omo-unit-closure
lidge-jun Sep 11, 2026
ee59544
refactor(oauth): one validator for pool strategy and sticky limit
lidge-jun Sep 11, 2026
999c1ba
docs(devlog): scope wp3 to the ordering criterion c-4 actually states
lidge-jun Sep 11, 2026
cd5d070
docs(devlog): fold the wp3 blockers, including a bar that was the thr…
lidge-jun Sep 11, 2026
3f0e79d
docs(devlog): mark the pre-audit wp3 change surface superseded
lidge-jun Sep 11, 2026
270c175
feat(codex): keep a bound thread on its account until that account is…
lidge-jun Sep 11, 2026
68e7074
test(codex): prove cache affinity outranks quota but not exhaustion
lidge-jun Sep 11, 2026
035bd54
docs(devlog): plan the compact and images key-pick seams
lidge-jun Sep 11, 2026
0349ee5
docs(devlog): plan ZCode Responses attachment, GLM-5.3 modality fix, …
lidge-jun Sep 11, 2026
2628213
docs(devlog): fold the wp4c audit, including the images snapshot trap
lidge-jun Sep 11, 2026
2ad973e
feat(server): pick a warm API key on the compact and images paths
lidge-jun Sep 11, 2026
400b111
test(server): cover the keyed image first-send key pick
lidge-jun Sep 11, 2026
a37e794
test(adapters): cover the native compact first-send key pick
lidge-jun Sep 11, 2026
f203436
fix(zcode): attach over the proxy Responses route instead of Chat Com…
lidge-jun Sep 11, 2026
ce98d2b
docs(devlog): plan the unified pool route and the enabled defect
lidge-jun Sep 11, 2026
ad09340
fix(opencode): advertise per-model image capabilities in the exported…
lidge-jun Sep 11, 2026
2c9e545
docs(devlog): fold the wp5c audit; the new field stays off the legacy…
lidge-jun Sep 11, 2026
5edb7b7
Merge pull request #4302 from lidge-jun/codex/zcode-protocol-plan
lidge-jun Sep 11, 2026
f306e4f
feat(management): one pool-settings contract for all three kinds
lidge-jun Sep 11, 2026
5a0a8f9
test(server): cover the unified pool contract and the inherited enabled
lidge-jun Sep 11, 2026
1053138
docs: describe the unified pool route and correct a stale claim
lidge-jun Sep 11, 2026
1394b34
feat(devin): Cognition cloud provider, carried from #4078 and hardene…
lidge-jun Sep 11, 2026
a594f7e
docs(devlog): plan the GUI pool client merge
lidge-jun Sep 11, 2026
38a4bde
fix(zai): declare glm-5.3-flash image input on the Chat rows
lidge-jun Sep 11, 2026
a054ba4
docs(devlog): fold the wp5b audit; the silent-no-op trap a third time
lidge-jun Sep 11, 2026
e0ecab1
docs(devlog): amend the wp5b spec instead of only recording the audit
lidge-jun Sep 11, 2026
45b32cb
Merge pull request #4304 from lidge-jun/codex/glm53-flash-modalities
lidge-jun Sep 11, 2026
f85f6ac
feat(gui): one pool client for every kind
lidge-jun Sep 11, 2026
610dad6
refactor(gui): move the Codex strategy write beside the client it uses
lidge-jun Sep 11, 2026
3dc69c4
docs(devlog): capture the pool settings surface for wp5b
lidge-jun Sep 11, 2026
43d2a35
Merge pull request #4289 from lidge-jun/codex/generic-pool-kernel
lidge-jun Sep 11, 2026
fb3df8e
Merge remote-tracking branch 'origin/dev' into codex/key-pool-wiring
lidge-jun Sep 11, 2026
f567714
test(cli): cover the unified pool route in the headless parity sweep
lidge-jun Sep 11, 2026
d2ca1ab
fix(providers): rebuild the route when the pre-dispatch key pick fires
lidge-jun Sep 11, 2026
86b3613
test(providers): pin the rebuild contract and the Responses core path
lidge-jun Sep 11, 2026
2559502
fix(providers): expire a cached key quota and reset cursors on a batc…
lidge-jun Sep 11, 2026
f593498
docs: document cache affinity and the pre-dispatch key pick
lidge-jun Sep 11, 2026
fd7bde9
feat(grok): reset-coupon inspection + gated redemption (gRPC-Web, jou…
lidge-jun Sep 11, 2026
6097a51
test(providers): stub the destination check in the cursor-reset case
lidge-jun Sep 11, 2026
5282c40
Merge remote-tracking branch 'origin/dev' into codex/key-pool-wiring
lidge-jun Sep 11, 2026
6318374
chore(skills): regenerate the management surface map after the dev merge
lidge-jun Sep 11, 2026
e4b32ed
feat(zai): default to the Responses protocol and keep Chat as a per-m…
lidge-jun Sep 11, 2026
dea1bd2
Merge pull request #4307 from lidge-jun/codex/zai-responses-default
lidge-jun Sep 11, 2026
c67e596
fix: stop masking a failed pool read and a dead pool credential
lidge-jun Sep 11, 2026
7a0513c
Merge pull request #4292 from lidge-jun/codex/key-pool-wiring
lidge-jun Sep 11, 2026
8f1471b
fix(devin): stop Cognition refusing every Codex turn over two tool de…
lidge-jun Sep 12, 2026
9d53661
docs(devlog): roadmap for the add-provider catalog unified search, no…
lidge-jun Sep 12, 2026
a8b26e1
docs(devlog): plan the gpt-5.4 retirement on the Codex login surface
lidge-jun Sep 12, 2026
28ff3f9
fix(zai): persist the Responses destination the router already applies
lidge-jun Sep 12, 2026
d9a444d
docs(devlog): fold the independent audit into the provider-catalog ro…
lidge-jun Sep 12, 2026
67657b9
docs(devlog): add the plan-unit index and work-phase map
lidge-jun Sep 12, 2026
8fc6327
Merge pull request #4321 from lidge-jun/codex/zai-config-responses-mi…
lidge-jun Sep 12, 2026
c7e4d5c
feat(devin): give both Devin providers a mark and make the CLI one ad…
lidge-jun Sep 12, 2026
6d70535
feat(gui): give local providers their own tab in the add-provider cat…
lidge-jun Sep 12, 2026
4ee0522
docs(devlog): capture the Local tab screenshot for the wp2 PR
lidge-jun Sep 12, 2026
7ba7cfd
fix(devin): report the context windows Cognition actually serves (#4323)
lidge-jun Sep 12, 2026
a0676af
fix(devin): shorten the Devin provider label to one word (#4326)
lidge-jun Sep 12, 2026
5d664b1
fix(codex): retire gpt-5.4 and gpt-5.4-mini from the Codex login surface
lidge-jun Sep 12, 2026
4ad0d93
feat(gui): read and redeem Grok reset coupons from the xAI account rows
lidge-jun Sep 12, 2026
20f3087
i18n(gui): translate the Grok reset-coupon copy into the eight non-En…
lidge-jun Sep 12, 2026
16cd41b
docs(grok): name the dashboard coupon surface in the API reference an…
lidge-jun Sep 12, 2026
16e7e19
docs(devlog): record the Grok reset-coupon GUI unit
lidge-jun Sep 12, 2026
fa1fe32
fix(codex): repoint a native-alias combo fixture off the retired mini
lidge-jun Sep 12, 2026
dcdf0a4
fix(gui): satisfy react-doctor on the coupon hook's sort copy and fet…
lidge-jun Sep 12, 2026
dbad475
Merge pull request #4330 from lidge-jun/codex/grok-reset-coupon-gui
lidge-jun Sep 12, 2026
fe01c0f
fix(codex): stop a persisted row from resurrecting a retired native
lidge-jun Sep 12, 2026
7ae0897
fix(gui): allow the French Local tab label to stay Local
lidge-jun Sep 12, 2026
68e6b02
feat(gui): make the add-provider search reach every tab at once
lidge-jun Sep 12, 2026
e3fdf8f
feat(gui): clamp long provider notes to two lines and open the full t…
lidge-jun Sep 12, 2026
e7f7487
fix(devin-cli): stop sending a permission mode the CLI rejects (#4332)
lidge-jun Sep 12, 2026
32bd541
refactor(codex): make the retired-model migration testable, and test it
lidge-jun Sep 12, 2026
2c26549
docs(devlog): close the gpt-5.4 retirement unit
lidge-jun Sep 12, 2026
7c41b38
docs(devlog): record the provider-catalog stack delivery and its CI e…
lidge-jun Sep 12, 2026
b94c42b
Merge pull request #4327 from lidge-jun/codex/gpt54-retirement
lidge-jun Sep 12, 2026
9125074
fix(codex): stop carrying an elapsed account-level short window
lidge-jun Sep 12, 2026
624c86d
docs(devlog): record the elapsed short-carry unit
lidge-jun Sep 12, 2026
d7b4cc9
fix(codex): preserve policy and notification evidence during display …
lidge-jun Sep 12, 2026
e432cf5
Merge pull request #4333 from lidge-jun/codex/phantom-elapsed-short-q…
lidge-jun Sep 12, 2026
7d16c76
Merge branch 'codex/provider-catalog-local-tab' into codex/provider-c…
lidge-jun Sep 12, 2026
6527bd4
fix(gui): contain catalog tabs on narrow screens and document Local b…
lidge-jun Sep 12, 2026
7bf7887
fix(gui): keep all clamped notes readable and restore popup focus
lidge-jun Sep 12, 2026
db699c7
Merge branch 'codex/provider-catalog-note-popup' into codex/provider-…
lidge-jun Sep 12, 2026
6d78535
Merge pull request #4324 from lidge-jun/codex/provider-catalog-plan
lidge-jun Sep 12, 2026
3627b7b
fix(gui): preserve sponsor ordering in the note-popup layer
lidge-jun Sep 12, 2026
a154645
Merge branch 'codex/provider-catalog-note-popup' into codex/provider-…
lidge-jun Sep 12, 2026
69e3dcd
Merge pull request #4325 from lidge-jun/codex/provider-catalog-local-tab
lidge-jun Sep 12, 2026
d8df1b1
Merge pull request #4328 from lidge-jun/codex/provider-catalog-note-p…
lidge-jun Sep 12, 2026
9a37813
Merge pull request #4331 from lidge-jun/codex/provider-catalog-unifie…
lidge-jun Sep 12, 2026
a0c5d1c
docs: plan catalog chain readiness reconciliation
lidge-jun Sep 12, 2026
30d5016
docs: plan independent cache lane carries and Hermes boundary evidence
lidge-jun Sep 12, 2026
22cdbfc
fix(gui): skip disabled catalog actions on ArrowDown
lidge-jun Sep 12, 2026
d27db6d
fix(chat): defer native-main claim until OpenAI helper planning
lidge-jun Sep 12, 2026
3d5e703
docs(remote): plan layered workspace carry from PR 3458
lidge-jun Sep 12, 2026
f840986
docs: plan operations fixes and remote verification slices
lidge-jun Sep 12, 2026
843486a
fix(bridge): keep truncated open tool calls incomplete
lidge-jun Sep 12, 2026
8949fd0
test(bridge): narrow buffered fixture output before inspection
lidge-jun Sep 12, 2026
33335b8
Merge pull request #4337 from lidge-jun/codex/260912-60plus-catalog
lidge-jun Sep 12, 2026
e090ad6
fix(update): retire observed exited pinned-start children
lidge-jun Sep 12, 2026
b09ef15
feat(devin-cli): import the CLI credential and make it an account pro…
lidge-jun Sep 12, 2026
71857fa
feat(remote): carry inactive workspace protocol foundation
lidge-jun Sep 12, 2026
96041e7
docs: define accounts delivery roadmap and acceptance boundaries
lidge-jun Sep 12, 2026
726ddc7
test(remote): cover rejected host signatures and pinned identities
lidge-jun Sep 12, 2026
75d3e5c
Merge pull request #4338 from lidge-jun/codex/260912-60plus-cache-claim
lidge-jun Sep 12, 2026
d6fb871
docs(devlog): close the devin-cli account-provider unit (#4348)
lidge-jun Sep 12, 2026
d6723f7
fix(responses): recover routed continuations after replay misses
lidge-jun Sep 12, 2026
fa4226a
fix(oauth): retire every callback listener response connection
lidge-jun Sep 12, 2026
5042a37
Merge pull request #4350 from lidge-jun/codex/260912-60plus-continuation
lidge-jun Sep 12, 2026
0f7ba8c
docs: record combo quota carry roadmap
lidge-jun Sep 12, 2026
c5df14f
docs: normalize embedded carry diff whitespace
lidge-jun Sep 12, 2026
f18541b
fix(combos): carry credential-scoped inference quota evidence
lidge-jun Sep 12, 2026
0bcb43e
test(combos): complete quota fixture contracts
lidge-jun Sep 12, 2026
7418ef8
fix(gui): carry scoped quota evidence for Combo editing
lidge-jun Sep 12, 2026
91fe8b9
fix(gui): refresh Combo clock with mixed quota snapshots
lidge-jun Sep 12, 2026
1e477c2
test(gui): settle Combo draft baseline before polling regression
lidge-jun Sep 12, 2026
e7a68d2
docs: attach Combo quota editor state captures
lidge-jun Sep 12, 2026
ca5ac39
Merge pull request #4352 from lidge-jun/codex/260912-60plus-accounts
lidge-jun Sep 12, 2026
eb3761b
Merge pull request #4336 from lidge-jun/codex/260912-60plus-combo
lidge-jun Sep 12, 2026
f378947
fix(update): retire failed-spawn children on terminal events
lidge-jun Sep 12, 2026
e4ee8c5
Merge pull request #4339 from lidge-jun/codex/260912-60plus-combo-editor
lidge-jun Sep 12, 2026
4922920
Merge latest dev and correct terminal regression fixture wiring
lidge-jun Sep 12, 2026
be203dd
docs: plan history containment and continuation review phases
lidge-jun Sep 12, 2026
7f76d73
fix(history): contain paginated rollout writes and preserve restore a…
lidge-jun Sep 12, 2026
1338e96
test(history): verify preservation before explicit compensation
lidge-jun Sep 12, 2026
10c7356
Merge pull request #4342 from lidge-jun/codex/260912-60plus-history
lidge-jun Sep 12, 2026
17b3d3f
fix(claude): preserve Go affinity through final combo dispatch
lidge-jun Sep 12, 2026
d608d7f
fix(claude): project native affinity at final canonical attempts
lidge-jun Sep 12, 2026
de20426
fix(claude): retain native UUID separately from Go lane digest
lidge-jun Sep 12, 2026
4f1b6b4
docs: record repaired affinity current-dev adaptation
lidge-jun Sep 12, 2026
d354924
docs: record affinity serial integration slot
lidge-jun Sep 12, 2026
81f0c78
Merge pull request #4340 from lidge-jun/codex/260912-60plus-cache-aff…
lidge-jun Sep 12, 2026
b0fd97b
docs: record source-backed Cline integration roadmap
lidge-jun Sep 12, 2026
90975e9
feat: journal Cline provider and model configuration as a recoverable…
lidge-jun Sep 12, 2026
1feec1b
feat: expose Cline CLI in integration dashboard and explicit catalog …
lidge-jun Sep 12, 2026
75a8ec8
fix: validate Cline recovery authority and explain paired exports
lidge-jun Sep 12, 2026
2b85701
docs: attach Cline source component render evidence
lidge-jun Sep 12, 2026
c08d792
fix(gui): omit Cline key setup heading from paired export
lidge-jun Sep 12, 2026
81f6cd5
Merge pull request #4371 from lidge-jun/codex/260912-60plus-cline
lidge-jun Sep 12, 2026
954c1f2
fix(claude): make harness cache-prefix stabilization explicitly opt-in
lidge-jun Sep 12, 2026
a3c8ec6
docs: record prefix current-dev conflict adaptation
lidge-jun Sep 12, 2026
e114bc9
fix(claude): parse canonical cache notices in one linear scan
lidge-jun Sep 12, 2026
4f6cd1a
docs: preserve cache lane handoff and final evidence export
lidge-jun Sep 12, 2026
489af93
Merge pull request #4347 from lidge-jun/codex/260912-60plus-cache-prefix
lidge-jun Sep 12, 2026
e625fa8
docs: record delivered cache heads and evidence-cycle boundaries
lidge-jun Sep 12, 2026
d42a136
fix(codex): stop a refused Codex account from winning the next pick (…
lidge-jun Sep 12, 2026
6942594
test(combos): drive reactivation expiry callbacks deterministically
lidge-jun Sep 12, 2026
ec065aa
Merge pull request #4341 from lidge-jun/codex/260912-60plus-stream-te…
lidge-jun Sep 12, 2026
c451157
Merge pull request #4344 from lidge-jun/codex/260912-60plus-remote
lidge-jun Sep 12, 2026
f9815da
Merge pull request #4343 from lidge-jun/codex/260912-60plus-operations
lidge-jun Sep 12, 2026
c27a483
Merge pull request #4377 from lidge-jun/codex/260912-60plus-cache-evi…
lidge-jun Sep 12, 2026
6cda25f
fix: synchronize Cline registration and native restore fixtures
lidge-jun Sep 12, 2026
657e068
Merge branch 'codex/260912-finish-combo-clock' into codex/260912-fini…
lidge-jun Sep 12, 2026
d8335f7
docs: include Combo activation in shared integration repair
lidge-jun Sep 12, 2026
c43eebf
docs: plan the release regression train
lidge-jun Sep 12, 2026
f0c880f
fix(tests): deny the Codex profile for real instead of mocking fs
lidge-jun Sep 12, 2026
20861ae
Merge pull request #4390 from lidge-jun/codex/260912-finish-integrati…
lidge-jun Sep 12, 2026
8310875
docs: record the regression sweep results
lidge-jun Sep 12, 2026
79a4c16
fix(codex): apply a quota refusal's avoidance window to the main login
lidge-jun Sep 12, 2026
d302519
docs(structure): record the quota avoidance window contract
lidge-jun Sep 12, 2026
4b6849c
Merge pull request #4396 from lidge-jun/codex/260912-routing-quota-avoid
lidge-jun Sep 12, 2026
bd981da
fix(codex): let clear-cooldown lift an avoidance the cooldown outlived
lidge-jun Sep 12, 2026
f2f1783
Merge pull request #4397 from lidge-jun/codex/260912-routing-avoid-la…
lidge-jun Sep 12, 2026
0819fd9
docs(structure): record what clear-cooldown does to a lapsed window
lidge-jun Sep 12, 2026
392e182
Merge pull request #4398 from lidge-jun/codex/260912-avoid-doc-clear
lidge-jun Sep 12, 2026
acb064a
test(update): use native host pnpm shim fixtures
lidge-jun Sep 12, 2026
293c37d
fix(devin-cli): resolve credential paths for the selected platform
lidge-jun Sep 12, 2026
8fe9a1c
Merge pull request #4379 from lidge-jun/codex/260912-combo-pnpm-ci-re…
lidge-jun Sep 12, 2026
c311f9b
Merge pull request #4400 from lidge-jun/codex/260912-60plus-models-de…
lidge-jun Sep 12, 2026
a33b51e
feat(codex): relay experimental context history under a least-privile…
lidge-jun Sep 12, 2026
f2e9891
fix(codex): require proof of owner identity and revalidate admission …
lidge-jun Sep 12, 2026
5f5c08a
test(codex): model real credential rotation in relay ownership regres…
lidge-jun Sep 12, 2026
5a5e0bf
test(codex): cover cancellation during relay credential selection
lidge-jun Sep 12, 2026
cb5ddf7
fix(codex): let a loopback context caller name itself with its openco…
lidge-jun Sep 12, 2026
2f2d1dc
fix(codex): resolve the relay principal the same way when recording o…
lidge-jun Sep 12, 2026
47f3ed4
docs: fix a wrapped-line indent in the context relay paragraph
lidge-jun Sep 12, 2026
69b5485
fix(codex): gate context relay and ownership recording on the experim…
lidge-jun Sep 12, 2026
bfc91b4
fix(codex): keep the activation gate fail-closed and inert at dispatch
lidge-jun Sep 12, 2026
bb22526
test(context): activate isolated relay admission fixtures
lidge-jun Sep 12, 2026
b1be256
fix(history): repair resumed relay contracts and hosted regression fi…
lidge-jun Sep 12, 2026
157f7a7
test(chat): cover conversation identity at native outbound boundary
lidge-jun Sep 12, 2026
ad00a4d
docs: reconcile cache CI failures with shared integration repair
lidge-jun Sep 12, 2026
65da842
docs: bind Hermes final verification to reserved integration base
lidge-jun Sep 12, 2026
24e637f
docs: separate operational identifiers in cache handoff
lidge-jun Sep 12, 2026
db7062c
Merge pull request #4365 from lidge-jun/codex/260912-60plus-cache-hermes
lidge-jun Sep 12, 2026
94b609a
test(cli): stop judging a stale record on a port another test can take
lidge-jun Sep 12, 2026
2526715
Merge pull request #4360 from lidge-jun/codex/260912-60plus-relay
lidge-jun Sep 12, 2026
b266e57
chore(release): open dev at 2.53.0 before releasing 2.52.0
github-actions[bot] Sep 12, 2026
f0d4adb
Merge pull request #4405 from lidge-jun/codex/dev-version-2.53.0
lidge-jun Sep 12, 2026
7bfb2ad
Merge pull request #4403 from lidge-jun/codex/260912-status-port-flake
lidge-jun Sep 12, 2026
95c4875
release: promote verified 2.52.0 product tree to main
lidge-jun Sep 12, 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
  •  
  •  
  •  
11 changes: 10 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,14 @@ Bun-native TypeScript with no separate server compile step.
- `go/` — retired Go native-runtime experiment; kept only where the TypeScript
runtime still references it. New work does not go here.
- `structure/` — maintainer invariants and architecture notes; read before
changing shared subsystems.
changing shared subsystems. [`structure/INDEX.md`](./structure/INDEX.md) is the
reading order and the source-ownership table, and
[`structure/AGENTS.md`](./structure/AGENTS.md) holds the rules for changing
anything in there. Ownership is not advisory: changing an owned source area
obliges the same change to update its doc, and `bun run structure:check`
(wired into the suite by `tests/ci-workflows/structure-ssot.test.ts`) fails on a
doc that names a path this tree no longer has, on an invariant whose test is
gone, and on a new `src/` area nobody claimed.
- `scripts/` — release and maintenance tooling; `scripts/release.ts` is the
release authority.
- `devlog/` — planning and investigation notes, tracked in this repository. See
Expand Down Expand Up @@ -187,6 +194,8 @@ bun run test:changed # import-graph tests against the resolved `dev` merge bas
bun run test # full tests/ suite (PR-ready / explicit ask only)
bun run lint:gui # GUI eslint
bun run privacy:scan # credential/privacy scan used by CI
bun run structure:check # structure/ doc-map, ownership, and invariant-binding gate
bun run structure:index # regenerate structure/INDEX.md from structure/manifest.json
bun run build:gui # Vite GUI build
```

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Thanks for helping with opencodex.
- Start with the canonical guide: [Contributing](https://opencodex.me/contributing/)
- Pull-request quality contract: [Review readiness and author responsibility](https://opencodex.me/contributing/pr-quality/)
- Public user docs live in [`docs-site/`](./docs-site)
- Current maintainer invariants live in [`structure/`](./structure)
- Current maintainer invariants live in [`structure/`](./structure); start at [`structure/INDEX.md`](./structure/INDEX.md)
- Maintainer roles and merge policy live in [`MAINTAINERS.md`](./MAINTAINERS.md)
- Attribution for work landed through a maintainer carry lives in [`CREDITS.md`](./CREDITS.md)
- Historical investigations live in [`docs/`](./docs)
Expand Down
88 changes: 88 additions & 0 deletions devlog/_fin/260912_devin_cli_account_login/000_plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Devin CLI as an account provider

**Unit:** 260912_devin_cli_account_login
**Class:** C3 (public provider contract + a documented invariant + GUI surface)
**Goal (host):** register devin-cli as an account provider so it appears in the
dashboard accounts tab beside devin, by giving it a login entry that drives the
installed Devin CLI's own auth flow, without opencodex holding a usable Devin
bearer token.

## Why this unit exists

The dashboard's add-provider dialog has three tabs. Two of them (Free, Paid) are
rendered from the preset catalog; the Accounts tab is not. In
`gui/src/components/provider-catalog/ProviderCatalog.tsx` the preset rows are
drawn only when `tier !== "accounts"`, and the Accounts tab instead renders
`accountRows`, which is built from providers that have a login flow. The
`buckets.accounts` bucket that `bucketPresets` computes is never rendered at
all.

That is why `devin-cli` is reachable only under Free today: `authKind: "local"`
makes `isFreeProvider` true (`gui/src/provider-workspace/catalog.ts`), the same
branch that holds Ollama, vLLM and LM Studio. Reclassifying the tier alone would
remove it from Free and put it in a bucket nothing draws, so it would vanish
from the dialog entirely. The only way into the Accounts tab is to become a
provider with a login.

## The constraint this unit has to move

`src/providers/registry.ts` and `tests/providers/devin-cli-adapter.test.ts`
currently pin the opposite posture:

> The installed CLI carries its own credentials from `devin auth login`, so this
> provider takes no key and the proxy never sees a token for this provider.

That statement is about the **request path**, and it stays true: the adapter
spawns `devin acp` and the child authenticates itself. What changes is the
**dashboard path**, which gains a login entry whose job is to run the CLI's own
auth flow and read back who is signed in. The distinction the unit must keep
explicit, in code comments and in the tests, is:

- the adapter still never reads, requests, or forwards a credential at request time;
- the OAuth entry stores an identity marker, never a usable Devin bearer token.

If those two cannot both hold, the unit stops and reports rather than inventing a
token to satisfy the framework.

## Constraints

- No repository-wide local suite, typecheck, or build. Focused tests only; hosted
CI on the exact PR head is the gate. Push with `--no-verify`.
- The Devin CLI is **not installed** on the development machine and must not be
installed as part of this unit without a separate instruction. Every code path
that depends on the binary needs a documented degraded behaviour and a test
that exercises it through an injected spawn, the way
`tests/providers/devin-cli-adapter.test.ts` already drives the adapter.
- `src/lab/` must stay off the core path; nothing here touches `src/router.ts`,
`src/server/lifecycle.ts`, or `src/server/responses/core.ts`.
- Target branch is `dev`.

## Work-phase map

Dependency-ordered; each is one full PABCD cycle.

| Phase | Doc | Outcome |
|---|---|---|
| wp1 | this unit | Roadmap locked, every later phase written to diff level |
| wp2 | `010_phase1_cli_login.md` | `src/oauth/devin-cli.ts`: signed-in detection, login that drives the CLI, identity-only credential |
| wp3 | `020_phase2_reclassify.md` | Registry + OAUTH_PROVIDERS registration, invariant text, tests that pinned `local` |
| wp4 | `030_phase3_surface_and_land.md` | Accounts-tab proof against the running service, docs/locale, PR, merge |

## Open risks carried into wp2

1. **CLI absent.** Signed-in detection cannot be proven end to end on this
machine. wp2 must therefore make the binary lookup injectable and prove both
branches (found / not found) with the existing `resolveDevinCliBinary`
override seam, and wp4 must state plainly that the live signed-in path is
unproven here.
2. **No documented status subcommand.** If the CLI exposes no non-interactive way
to report the signed-in account, the login entry can only report "the CLI
reports it is signed in" without an identity. That is still enough for an
accounts row, but it changes the credential shape, so wp2 decides this against
the subagent finding recorded in `001_cli_auth_survey.md` and amends
`010_` before building.
3. **Refresh.** The OAuth framework expects a refresh path. `src/oauth/devin.ts`
throws `invalid_grant` because Cognition mints no refresh token; the CLI entry
has the same shape and should reuse that posture rather than extending an
expiry it cannot honour.

Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# 001 — What the surfaces actually require

Findings from three parallel read-only investigations (subagents Carson, Gibbs,
Rawls), recorded here so each later phase starts from evidence rather than from
the transcript.

## The Accounts tab is fed by OAUTH_PROVIDERS, not by the preset catalog

`GET /api/oauth/providers` returns `listOAuthProviders()`, which is
`Object.keys(OAUTH_PROVIDERS)` minus `chatgpt`
(`src/server/management/oauth-account-routes.ts:137-140`,
`src/oauth/index.ts:335-371`). The GUI turns that list into the Accounts rows in
`gui/src/pages/providers-page-utils.ts:8-25`. A provider does **not** need to be
in `config.json` to appear. So membership in `OAUTH_PROVIDERS` is the whole
admission rule.

## What an OAuth entry must provide

`OAuthProviderDef` (`src/oauth/index.ts:184-196`) requires `login`, `refresh`,
`providerConfig`, `defaultModel`. `providerConfig` is not hand-written: `oauthConfig(id)`
calls `deriveOAuthProviderConfig`, which finds the registry row **only when
`authKind === "oauth"`** and throws otherwise (`src/providers/derive.ts:350-353`).
That is why the registry reclassification and the OAuth registration are one
atomic change, not two independent edits.

`OAuthCredentials` requires `access: string`, `refresh: string`, `expires: number`;
`normalizeCredential` drops the whole credential if any of the three is missing or
mistyped (`src/oauth/store.ts:447-502`).

## The durable-key precedent already exists

`devin` faces the same "no refresh endpoint" problem and solves it without
inventing one: it stores the durable key as both `access` and `refresh`, sets
`expires: Number.MAX_SAFE_INTEGER`, declares `defaultRefreshPolicy: "disabled"`,
and its `refresh` throws `invalid_grant` so a forced refresh marks the account
`needsReauth` instead of pretending success (`src/oauth/devin.ts:50-72, 155-166`,
`src/oauth/index.ts:310-315`). `orcarouter-oauth` does the same. An empty
`refresh: ""` is explicitly the wrong shape — it makes `detectOAuthWarning` report
`stale_credentials` from the moment of login.

This unit reuses that shape, with one difference that has to stay visible: for
`devin` the stored string is a real API key; for `devin-cli` it is a non-secret
presence marker, because there is no token for opencodex to hold.

## The fail-closed check that makes this a migration

`src/server/auth-cors.ts:731-737` rejects a saved provider row whose
`authMode === "local"` when its registry entry is not local:

> `provider ${name} cannot use authMode "local" — its registry entry requires ${entry.authKind} auth`

`derive.ts:217-231` seeds `authMode` from `authKind`, so every config saved while
`devin-cli` was local carries `authMode: "local"`. Flipping the registry to
`oauth` without a migration turns those configs into a startup rejection. This is
the single highest-risk item in the unit and `020` owns it.

## Everything else `"local"` currently controls for this provider

From `gui/src/provider-workspace/`: `catalog.ts:137-143` treats local as
configuration-ready; `catalog.ts:170-174` puts it in the Free tier;
`auth.ts:21-22` returns `null` so no auth surface is drawn; `kind.ts:12-21`
classifies it as kind `local` for the rail filter. Under `oauth` all four change
behaviour, which is the intent — an OAuth row gets an auth surface and a login
button — but `030` has to look at the rail, not only the modal.

From `src/providers/`: `fastwire.ts:109` returns `"none"` for local, so no
Authorization header is attached. This matters: the `devin-cli` adapter never
travels the fetch path at all (`buildRequest` is a placeholder), so the header
policy is inert for it either way. `quota.ts:2899` and `key-failover.ts` skip
local rows; under `oauth` they take the OAuth branches, which is correct because
there is now an account to reason about.

## What the Devin CLI itself stores

The CLI keeps its own credential on disk as `credentials.toml`. opencodex never
reads it; the adapter only spawns `devin acp` and the child authenticates itself
(`src/adapters/devin-cli/adapter.ts:1-8`). The CLI is **not installed** on this
machine, so the exact path and any non-interactive status subcommand are
unconfirmed. `010` therefore treats both the path and the status probe as
injected dependencies with a proven not-found branch, and `030` states plainly
that the live signed-in path is unproven here.

101 changes: 101 additions & 0 deletions devlog/_fin/260912_devin_cli_account_login/002_audit_resolution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# 002 — Audit resolution: the reclassification is the wrong mechanism

Independent adversarial audit of `000`/`010`/`020`/`030` returned **VERDICT: FAIL**
with four blockers. Three are fixable in place. The first invalidates the central
decision, and the roadmap changes rather than arguing with it.

## Blocker 1 (fatal to the original design)

Flipping `authKind` to `oauth` couples the REQUEST path to a credential that
carries no meaning. `src/router.ts:317-318` forces `authMode` from the registry
for oauth entries, and `src/server/responses/core.ts:4323` then always calls
`getValidAccessTokenSnapshot`, which throws `OAuthLoginRequiredError` when no
account set exists (`src/oauth/index.ts:576-578`) and stamps
`apiKey: resolved.accessToken` at `:4401`.

Today a configured `devin-cli` row answers with no opencodex credential at all,
because the child authenticates itself. Under the original plan every turn would
401 until someone clicked Login, and a dashboard logout would break inference
while the CLI stayed signed in. `020`'s boundary forbids touching
`responses/core.ts`, so the plan could not have special-cased its way out.

The audit also killed a claim in `000`: reclassifying does NOT make the row vanish.
`providerTier` only puts the canonical OpenAI forward provider in `accounts`
(`gui/src/provider-workspace/catalog.ts:160-181`), so an oauth preset with a
non-loopback base URL lands in **Paid**, which is rendered. The original
motivation sentence was wrong about the failure mode while being right that the
Accounts tab is unreachable from the preset catalog.

## The corrected mechanism

Accounts-tab admission is `OAUTH_PROVIDERS` membership — `listOAuthProviders()`
is `Object.keys(OAUTH_PROVIDERS)` minus `chatgpt`
(`src/oauth/index.ts:369-371`, `src/server/management/oauth-account-routes.ts:139-140`).
Nothing in that path reads `authKind`.

`authKind: "oauth"` was only needed because `oauthConfig(id)` derives
`providerConfig` through `deriveOAuthProviderConfig`, which filters on it
(`src/providers/derive.ts:350-353`). But `providerConfig` is an ordinary
`OcxProviderConfig` field — it can be built from the registry row directly.

**So: register `devin-cli` in `OAUTH_PROVIDERS` and leave `authKind: "local"`
alone.** The Accounts row appears; the request path keeps seeing a local
provider, demands no token, and behaves exactly as it does today. The
`auth-cors` migration in `020` and its whole new migration module become
unnecessary, because no persisted `authMode` ever mismatches.

This also resolves the honesty problem that made the original design
uncomfortable: opencodex no longer needs a marker to stand in for a bearer
token on the request path, because the request path never asks. The stored
credential exists only so the Accounts row has a state to show.

The residual risk moves to `isOAuthProvider("devin-cli")` becoming true, which
switches on `ocx login` (`src/oauth/login-cli.ts:86-88`), changes `ocx account`
(`src/cli/account-api.ts:83-93`), and admits the row to generic 429 failover
(`src/oauth/generic-account-failover.ts:97-98`). wp2 must prove each of those
three is either intended or inert for a stdio adapter, and `openUrl("")` in the
CLI login path must not be reached.

## Blocker 2 — preset duplication

`dashboardPreset: true` keeps the row in `deriveProviderPresets`
(`src/providers/derive.ts:365`), so it would show on a preset tab as well as
Accounts. Set `dashboardPreset: false`, matching `devin` and `cursor`, and update
the assertion at `tests/providers/devin-cli-adapter.test.ts:33` that currently
pins it true. With `authKind` staying local the preset tab would otherwise be
Free, not Paid, but the duplication is the same defect either way.

## Blocker 3 — login cannot inherit stdio

`010` said to run `devin auth login` with inherited stdio. Dashboard login is
`POST /api/oauth/login` inside the proxy, typically a launchd process with no
TTY. Use kiro's working shape instead: piped spawn with `stdin: "ignore"`
(`src/oauth/kiro.ts:151-156`), surface the CLI's own output through
`ctrl.onProgress`, and treat a login that cannot complete without a terminal as
a reported failure rather than a hang. If the CLI turns out to require a TTY, the
honest end state is an Accounts row that reports signed-in status and tells the
operator to run `devin auth login` in their own terminal — wp2 decides this
against the real binary and records which it was.

## Blocker 4 — wrong label file

Accounts rows use `oauthLabel` → `OAUTH_LABELS[id] ?? id`
(`gui/src/pages/providers-shared.ts:49-59`), not `formatProviderDisplayName`.
Without an `OAUTH_LABELS` entry the row reads `devin-cli`. `030`'s write set
moves from `gui/src/provider-icons.ts` to `gui/src/pages/providers-shared.ts`.

## Structure obligation the plan missed

`structure/AGENTS.md:49` binds changes in `src/oauth/` and `src/providers/` to
`runtime.md`, `subagents.md`, `transports/inventory.md`, and
`providers/xai-grok.md`, not only `adapters/registry.md`. wp4 checks each for a
sentence this change falsifies.

## Effect on the work-phase map

wp2 and wp3 swap emphasis: wp2 still builds `src/oauth/devin-cli.ts` (now with a
piped spawn and no marker-as-bearer concern), wp3 becomes registration plus the
`dashboardPreset` flip and the three `isOAuthProvider` consequences, with the
`authKind` flip and its migration DELETED. wp4 is unchanged apart from the label
file and the structure docs.

Loading
Loading