Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
790a581
fix(xai): normalize web search on the Grok CLI proxy, not just the pu…
olddonkey Aug 27, 2026
2a0ab4b
fix(cli): neutralize usage report terminal controls
luvs01 Aug 25, 2026
63941b5
fix(integrations): ignore JSON object key order in ownership
Ingwannu Aug 27, 2026
aac50fe
docs(devlog): record the v2.34.0 release train outcome
lidge-jun Aug 27, 2026
8b1b65b
Merge pull request #2762 from lidge-jun/codex/release-train-record-2340
lidge-jun Aug 27, 2026
3110bd1
fix(ci): avoid release-doc email false positive
Ingwannu Aug 27, 2026
076ad30
fix(release): advance dev after v2.34.0
Ingwannu Aug 27, 2026
913f844
Merge pull request #2766 from lidge-jun/ingw/fix-release-doc-privacy-…
lidge-jun Aug 27, 2026
5070175
fix(moonshot): intersect nested schema bounds
Ingwannu Aug 27, 2026
1d547fe
fix(openai): strip unsupported forward cache options
Ingwannu Aug 27, 2026
ae5d399
Merge pull request #2733 from luvs01/fix/cli-usage-terminal-controls
lidge-jun Aug 27, 2026
0821ce9
Merge pull request #2726 from olddonkey/fix/xai-cli-web-search-preview
lidge-jun Aug 27, 2026
d1def68
Merge pull request #2761 from lidge-jun/ingw/fix-zcode-key-order-2759
lidge-jun Aug 27, 2026
3b53024
Merge pull request #2764 from lidge-jun/ingw/fix-moonshot-nested-sche…
lidge-jun Aug 27, 2026
50e9556
Merge pull request #2767 from lidge-jun/ingw/fix-canonical-prompt-cac…
lidge-jun Aug 27, 2026
d3481ee
docs(devlog): plan the ocx agentic control surface roadmap
lidge-jun Aug 27, 2026
d896882
docs(devlog): fold seven audit blockers into the ocx roadmap
lidge-jun Aug 27, 2026
1ef9163
docs(devlog): reconcile the roadmap phase map with the wp3b split
lidge-jun Aug 27, 2026
4a0cbb5
fix(tests): reap the recovery proxy instead of trusting `stop`
olddonkey Aug 26, 2026
be11a65
fix(storage): atomically commit cleanup run metadata
luvs01 Aug 27, 2026
d083f32
docs(devlog): phrase the empty-catch defect so the hygiene scanner ca…
lidge-jun Aug 27, 2026
e17dbfa
fix(cli): stop the CLI reporting success for failed management calls
lidge-jun Aug 27, 2026
2fd41eb
fix(cli): reset process.exitCode before the provider and models handlers
lidge-jun Aug 27, 2026
af9d608
fix(cli): make the transport fixes reachable and cover tray
lidge-jun Aug 27, 2026
f8b13ed
fix(cli): report a fenced management plane as FAIL, not WARN
lidge-jun Aug 27, 2026
9eb7072
docs(devlog): correct wp3's plan against the tree before implementing it
lidge-jun Aug 27, 2026
0bf2a10
docs(devlog): audit the wp3 amendment and fix four defects in it
lidge-jun Aug 27, 2026
c1f41a6
fix(cli): settle the 409 exit code against the pre-existing native-pr…
lidge-jun Aug 27, 2026
f37ffe8
feat(server): declare every management route and reconcile it against…
lidge-jun Aug 27, 2026
7aef44e
feat(cli): add ocx capabilities as the machine-readable surface index
lidge-jun Aug 27, 2026
3216932
fix(cli): report version skew between this ocx and the running proxy
lidge-jun Aug 27, 2026
00d9b1c
test(server): drop a dead try/catch the route-scanner probe never needed
lidge-jun Aug 27, 2026
efaf2d9
test(cli): assert the proxy version threaded through the direct trans…
lidge-jun Aug 27, 2026
d631470
fix(cli): make exit codes and --json usable from a script
lidge-jun Aug 27, 2026
fc10889
docs(devlog): record wp3b and the two places 025 under-specified the …
lidge-jun Aug 27, 2026
6f66df8
fix(cli): a contended catalog lock is a skip, not a sync-cache failure
lidge-jun Aug 27, 2026
40cf944
fix(cli): stop sync-cache reporting a failed refresh as a deliberate …
lidge-jun Aug 27, 2026
e82c43a
fix(cli): treat an absent catalog as nothing-to-sync, not a sync-cach…
lidge-jun Aug 27, 2026
f3a360c
fix(cli): stop discarding fields the API already returns
lidge-jun Aug 27, 2026
3fc82f6
docs(skill): add the repo-owned ocx operating skill with a generated …
lidge-jun Aug 27, 2026
3f810ad
fix(cli): show access key usage instead of only id, name, and prefix
lidge-jun Aug 27, 2026
b68edc0
feat(cli): add the pool-steering verbs and stop a log filter from lying
lidge-jun Aug 27, 2026
72e5c91
ci: name the skill-surface regeneration in its own step
lidge-jun Aug 27, 2026
b9ebfd7
docs(devlog): record wp4, including a test that could not detect its …
lidge-jun Aug 27, 2026
88295c2
feat(cli): declare ocx logs in the capability table
lidge-jun Aug 27, 2026
9c4ae1c
feat(usage): attribute usage per account for non-Codex OAuth providers
lidge-jun Aug 27, 2026
1bbd6b9
feat(cli): close the GUI-only gaps for storage, inspection, and nativ…
lidge-jun Aug 27, 2026
368d85b
docs(devlog): record wp9 and the audit finding that disproved my own …
lidge-jun Aug 27, 2026
07f943d
fix(cli): stop logout and doctor --json reporting success for work th…
lidge-jun Aug 27, 2026
bf0185e
test(cli): make capability/route parity bidirectional with a dated ra…
lidge-jun Aug 27, 2026
1502014
docs(devlog): record wp10 and the two claims the plan audit disproved
lidge-jun Aug 27, 2026
41b4d31
test(cli): seed the store so the logout non-mutation assertions are n…
lidge-jun Aug 27, 2026
6a377ca
fix(cli): close the audit findings my own logout fix left open
lidge-jun Aug 27, 2026
2441103
docs(devlog): record the second audit round, including two defects in…
lidge-jun Aug 27, 2026
396fcfa
fix(cli): validate the logout provider by shape instead of naming das…
lidge-jun Aug 27, 2026
1f07b68
fix(gui): warn when cleanup metadata is not saved
luvs01 Aug 28, 2026
d829215
fix(google-antigravity): gate the thought-signature sentinel correctly
lidge-jun Aug 28, 2026
3468cea
fix(google-antigravity): keep the sentinel out of the real-signature …
lidge-jun Aug 28, 2026
29be459
Merge pull request #2740 from luvs01/fix/storage-policy-metadata-race
lidge-jun Aug 28, 2026
5511a42
fix(responses): coalesce buffered deltas so a stalled consumer cannot…
lidge-jun Aug 28, 2026
922d534
feat(cursor): observe mid-stream envelope echoes and call-id corrupti…
lidge-jun Aug 28, 2026
1e46430
fix(claude): derive response.failed status from the classified error …
lidge-jun Aug 28, 2026
eebd191
fix(google-antigravity): match the model component, not the whole Ver…
lidge-jun Aug 28, 2026
7232a60
feat(cursor): umbrella capability catalog — single source of truth fo…
lidge-jun Aug 28, 2026
bdc1e97
Merge pull request #2794 from lidge-jun/codex/antigravity-signature-f…
lidge-jun Aug 28, 2026
fe063d1
Merge pull request #2747 from olddonkey/fix/update-recovery-orphan-cl…
lidge-jun Aug 28, 2026
624e81a
docs(devlog): record the admin merges of #2794 and #2747
lidge-jun Aug 28, 2026
7dd01bf
Merge pull request #2806 from lidge-jun/codex/round-docs
lidge-jun Aug 28, 2026
fbb5b02
feat(cursor): collapse the picker into umbrella rows routed through t…
lidge-jun Aug 28, 2026
4d9bf16
docs(devlog): close the cursor merge-train round log (#2808)
lidge-jun Aug 28, 2026
afaf0a1
docs(devlog): record where the admin merge stopped
lidge-jun Aug 28, 2026
8d9e286
Merge pull request #2809 from lidge-jun/codex/admin-merge-record
lidge-jun Aug 28, 2026
80e251a
fix(codex): fsync coordinator adoption files with a writable handle (…
lidge-jun Aug 28, 2026
c70f412
Merge pull request #2773 from lidge-jun/codex/ocx-agentic-control-roa…
lidge-jun Aug 28, 2026
cf1a572
fix(kiro): explain empty exec output and stop reopening a delivered f…
lidge-jun Aug 28, 2026
60537f0
fix(kiro): address review findings on completion suppression and fail…
lidge-jun Aug 28, 2026
65c88c9
fix(cli): diagnose and refuse a colliding service token file
Aug 28, 2026
ea8f04f
Merge pull request #2775 from lidge-jun/codex/ocx-transport-honesty
lidge-jun Aug 28, 2026
7162034
fix(cli): stop capabilities from advertising routes the CLI does not …
Aug 28, 2026
b1cf248
Merge pull request #2778 from lidge-jun/codex/ocx-capability-registry
lidge-jun Aug 28, 2026
ccc4821
fix(cli): keep restore-back and sync-cache --json as a single JSON value
Aug 28, 2026
5be31bd
Merge pull request #2779 from lidge-jun/codex/ocx-uniform-contract
lidge-jun Aug 28, 2026
c219744
merge dest to keep transport-honesty and capabilities fixes
Aug 28, 2026
77d1281
fix(cli): show cached Codex quota on account list --quota
Aug 28, 2026
cc6ea42
merge dest after 2778/2779 landed
Aug 28, 2026
78f3552
Merge pull request #2780 from lidge-jun/codex/ocx-dto-fidelity
lidge-jun Aug 28, 2026
ab0c69b
merge dest before pause-exhausted honesty fix
Aug 28, 2026
459c542
fix(cli): pause-exhausted is not success when some accounts were not …
Aug 28, 2026
761cb4c
fix(cursor): keep failure guidance for a failed exec wrapper
lidge-jun Aug 28, 2026
ad766f1
Merge pull request #2782 from lidge-jun/codex/ocx-new-verbs
lidge-jun Aug 28, 2026
d1ea980
merge dest before attribution hash fix
Aug 28, 2026
16b38d8
fix(usage): namespace OAuth account labels by provider
Aug 28, 2026
1768510
Merge pull request #2784 from lidge-jun/codex/ocx-account-attribution
lidge-jun Aug 28, 2026
0b389bf
merge dest before storage codex-logs fix
Aug 28, 2026
a4478cd
fix(cli): keep ocx storage codex-logs as the log-guard entry
Aug 28, 2026
3b8a6ae
Merge pull request #2787 from lidge-jun/codex/ocx-gui-parity
lidge-jun Aug 28, 2026
8490718
merge dest before skill contract fixes
Aug 28, 2026
04fcbc3
fix(skill): stop teaching false exit-0 and JSON-error contracts
Aug 28, 2026
6d0d7f0
Merge pull request #2788 from lidge-jun/codex/ocx-agent-skill
lidge-jun Aug 28, 2026
32c1b02
merge dest before gap-closure review
Aug 28, 2026
ba79798
fix(cli): refuse JSON spellings doctor ignored and usage-exit-1 on de…
Aug 28, 2026
7794485
Merge pull request #2790 from lidge-jun/codex/ocx-gap-closure
lidge-jun Aug 28, 2026
b557a81
fix(kiro): answer a delivered final answer locally instead of asking …
lidge-jun Aug 28, 2026
7cdb55b
fix(kiro): track the local-terminal stream's lifetime like every othe…
lidge-jun Aug 28, 2026
ca73ac1
fix(cli): unblock dest CI after the agentic-control stack
Aug 28, 2026
f1d819b
Merge pull request #2820 from lidge-jun/ocx/dest-ci-honesty
lidge-jun Aug 28, 2026
7781a02
fix(kiro): log a locally answered turn as exact zero usage, not an es…
lidge-jun Aug 28, 2026
b074084
fix(kiro): mark the physical attempt as locally answered too
lidge-jun Aug 28, 2026
d9d2655
fix(tools): state the code-mode echo rule before the first call, not …
lidge-jun Aug 28, 2026
68eaf45
fix(kiro): remember a delivered final answer instead of trusting the …
lidge-jun Aug 28, 2026
d7a82a8
Merge pull request #2819 from lidge-jun/codex/kiro-exec-empty-output-…
lidge-jun Aug 28, 2026
6667e34
merge dev into preview for the v2.35.0-preview release
Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,12 @@ jobs:
- name: Privacy scan
run: bun run privacy:scan

# The ocx skill ships a capability -> route map generated from src/cli/capabilities.ts.
# `bun run test` already covers this via tests/skill-ocx.test.ts; this step exists so the
# failure names the fix instead of surfacing as a byte-comparison diff in a test log.
- name: Check the generated ocx skill surface is current
run: bun run skill:surface:check

- name: Check release helper syntax
run: bun build scripts/release.ts --target=bun --outdir=.tmp/ci-release-script-check

Expand Down
13 changes: 13 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,19 @@ bun run privacy:scan # credential/privacy scan used by CI
bun run build:gui # Vite GUI build
```

`skills/ocx/` is the operating reference for the CLI — what an agent reads to *drive* a running
proxy, as opposed to [`AGENTS_INSTALL.md`](./AGENTS_INSTALL.md) (installing and operating consent)
or this file (changing the codebase). Its surface map is generated:

```bash
bun run skill:surface # regenerate after adding a capability
bun run skill:surface:check # what CI asserts
```

`tests/skill-ocx.test.ts` fails if the committed map drifts from `src/cli/capabilities.ts`, and
also if the hand-written pages name a command the registry does not have. That second check is not
hypothetical: it caught a documented `ocx request-history` that never existed.

During implementation, use the smallest focused checks that directly cover the
changed subsystem. Do not run repository-wide `bun run typecheck` or
`bun run test` for a scoped change unless the change affects shared runtime,
Expand Down
116 changes: 116 additions & 0 deletions devlog/_plan/260827_igwanu_bug_pr_merge_round/000_plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# 000 — igwanu bug-PR merge round: plan

Round base: `dev @ 8b1b65b8d` (local == `origin/dev`, verified 2026-08-27).
Scope: the 13 open **bug**-labelled PRs. Four are Ingwannu's (#2767, #2766, #2764,
#2761); nine are other authors' (#2747, #2745, #2740, #2733, #2729, #2726, #2693,
#2638, #2497).

Enhancement-labelled PRs are explicitly out of scope for this round.

## The finding that orders the whole round

Three PRs (#2767, #2764, #2747) show **failing required CI** — `ci`, `macos`,
`test 3/4`, `gates` — while their own merged trees compile clean. The failure is
not theirs. Every one of them fails the same repository-wide assertion:

```
error: package.json version 2.34.0 equals release tag v2.34.0, but this commit is
not the one that tag names. The tree claims an already-published version.
(fail) release version line > the in-tree version is never behind a released one
```

`dev` still carries `2.34.0` after tag `v2.34.0` shipped, so *every* PR opened
after the release train inherits a red matrix. A second shared failure hits
`gates`: `privacy:scan` reads the scp-style SSH remote principal recorded in
`devlog/_plan/260827_release_train/020_preview_release.md` as an email address.

**#2766 repairs both.** It is the keystone: until it lands, no other PR in this
round can produce a trustworthy green matrix, and re-running their CI is wasted
work. This is the inverse of the previous round's lesson — there, green checks
were not evidence of health; here, red checks are not evidence of harm.

Evidence: run `33081644562` job `98550259965` (#2767), run `33080634739` job
`98546624127` (#2764), run `33059606933` job `98534630924` (#2747) — each shows
`1 fail` and that one failure is `release version line`.

## Merged-tree gate (this round's own evidence, not GitHub's)

Every PR head was fetched, merged against `dev @ 8b1b65b8d` with
`git merge-tree --write-tree`, committed as `mtp/<n>`, checked out to an isolated
worktree sharing this repo's `node_modules`, and compiled.

| PR | ahead | behind dev | merge-tree | tsc on MERGED tree |
|---|---|---|---|---|
| #2767 | 1 | 0 | CLEAN | OK |
| #2766 | 2 | 0 | CLEAN | OK |
| #2764 | 1 | 0 | CLEAN | OK |
| #2761 | 1 | 2 | CLEAN | OK |
| #2747 | 1 | 26 | CLEAN | OK |
| #2745 | 2 | 26 | CLEAN | OK |
| #2740 | 1 | 26 | CLEAN | OK |
| #2733 | 1 | 43 | CLEAN | OK |
| #2729 | 2 | 89 | CLEAN | OK |
| #2726 | 1 | 63 | CLEAN | OK |
| #2693 | 2 | 118 | CLEAN | OK |
| #2638 | 2 | 179 | CLEAN | OK |
| #2497 | 1 | **386** | **CONFLICT** | not reachable |

The typecheck gate was itself verified rather than trusted: 12 runs finishing in
~12s looked like a no-op, so a deliberate `const x: number = 'str'` was injected
into a merged worktree and `tsc` returned `error TS2322`, exit 1. The speed is
real — this repository is on the native TypeScript 7.0.2 compiler (~0.44s full
typecheck). The gate works.

## Cross-PR file contention

`src/server/responses/core.ts` — **#2745, #2638, #2497**. Pairwise
`git merge-tree` required before any second one of those lands; textual
mergeability is not behavioral compatibility on the auth/routing boundary.

`src/adapters/openai-chat.ts` — #2764 only. `src/adapters/openai-responses.ts`
— #2767 only. `src/codex/auth-context.ts` — #2638 and #2497.
No other file is touched by two in-scope PRs.

## Loop-spec

- Loop archetype: verifier-defined (spec-satisfaction repair per PR).
- Write scope: `devlog/_plan/260827_igwanu_bug_pr_merge_round/`, `src/` and
`tests/` only where needed to land or reimplement a PR, plus PR metadata on
GitHub and `codex/` topic branches.
- Out of scope: `main`, `preview`, releases, tags, npm publish, docs deploy,
enhancement PRs, force-push, history rewrite.
- Bounds: `dev` is push-protected — every lane travels a `codex/` branch and a PR
targeting `dev`. `bun test` takes a machine-wide lock: one suite at a time,
long suites on `ssh lidge` via `ocx-run`. Never `OCX_TEST_NO_QUEUE=1`.

## Work-phase map (one phase = one full PABCD cycle)

| WP | Doc | Slice | Depends on |
|----|-----|-------|------------|
| wp1 | 000 | Docs-only roadmap: intake, merged-tree gate, contention map, lanes | — |
| wp2 | 010 | **Keystone** #2766 — unblock the repository-wide CI gates | wp1 |
| wp3 | 020 | Ingwannu remainder #2761, #2764, #2767 | wp2 |
| wp4 | 030 | Clean approved lane #2733, #2726, #2747 | wp2 |
| wp5 | 040 | Maintainer changes-requested #2745, #2729 | wp2 |
| wp6 | 050 | Contributor remainder #2740, #2693, #2638 | wp2, wp5 |
| wp7 | 060 | #2497 adjudication + round close-out | all |

## Standing gates (inherited, all mandatory)

1. Compile evidence comes from the MERGED tree, never the PR head alone.
2. Any two PRs touching a shared file get `git merge-tree` before either merges.
3. Green checks are not health unless the list includes `ci` / `test N/4` /
`macos`. **Corollary discovered this round: red checks are not harm until the
shared baseline is green.**
4. One `bun test` suite at a time; remove a stale
`/tmp/opencodex-bun-test.lock` rather than bypassing the queue.
5. Every lane travels a `codex/` branch and a PR targeting `dev`.
6. A safety net that exists in code is not a safety net that functions.

## Accept criteria (mirrored into goalplan criteria[])

- c1 — all 13 PRs carry a recorded terminal disposition with SHA or reason.
- c2 — merged-tree compile gate ran for every candidate (this doc's table).
- c3 — each landed change carries a focused test receipt from the merged tree.
- c4 — `dev` advanced only through PRs targeting `dev`.
- c5 — auth/credential/OAuth surfaces are not landed autonomously.
114 changes: 114 additions & 0 deletions devlog/_plan/260827_igwanu_bug_pr_merge_round/010_phase1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# 010 — wp2: the keystone, #2766

**Lane L1 (commit-then-merge). Every other MERGE in this round serializes behind
this one.**

Precisely scoped: review, focused verification, rebases, and approval requests for
other PRs run in parallel — their changed paths are disjoint from this one's
(`package.json` plus a release-runbook document). What must wait is the act of
merging, because landing anything else first leaves `dev` sitting on known-red
release-version and privacy gates.

PR #2766 `ingw/fix-release-doc-privacy-scan-2762` — head `076ad3036`, ready
(not draft), MERGEABLE, 0 commits behind `dev`, 30 checks with **zero failures**.
It is the only PR in the round whose matrix is already green, because it is the
one that repairs the matrix.

## Why it is the keystone

Two repository-wide gates went red after the v2.34.0 release train, and they fail
on `dev` itself, not on any contributor's code:

1. `tests/release-version-line.test.ts` — `package.json` is `2.34.0` and tag
`v2.34.0` is published, so every commit after the tag "claims an
already-published version". Fails `ci`, `macos`, `test 3/4`.
2. `privacy:scan` — `devlog/_plan/260827_release_train/020_preview_release.md:36`
contains a literal scp-style SSH remote whose `user@host` principal the scanner
reads as an email address. Fails `gates`.

Confirmed inherited by #2767, #2764, #2747. Merging anything else first means
reading a red matrix that says nothing about the PR under review.

## MODIFY map (exact, already authored by the PR)

MODIFY `package.json`:

```diff
- "version": "2.34.0",
+ "version": "2.35.0",
```

MODIFY `devlog/_plan/260827_release_train/020_preview_release.md`:

The runbook's push line is rewritten to build the destination from two shell
variables (`release_host=github.com`, `release_repo=lidge-jun/opencodex.git`) and
interpolate them, so the scp-style principal never appears as one literal token.
The exact diff is on the PR; it is not reproduced here, because quoting it
verbatim would reintroduce the very literal the scan rejects — this document is
itself scanned.

The push destination is byte-identical after expansion and the deploy-key override
is preserved. This is documentation text, not executed release automation.

## Security-boundary judgement (MAINTAINERS.md)

The PR touches `package.json` version metadata and a release runbook document.
`AGENTS.md` flags release automation — `scripts/release.ts`,
`.github/workflows/release.yml` — for mandatory security review. **Neither file is
touched.** Verified: `release.yml` triggers on `workflow_dispatch` only, with an
explicit `version` input that must equal `package.json` and an immutable commit
input. A version bump on `dev` therefore cannot initiate a publish; a human
dispatch with an explicit version is required.

Dependencies and lockfiles are unchanged, and no scheduled, push-triggered,
auto-merge, or version-keyed publish path exists: `release.yml` is
`workflow_dispatch`-only and additionally rejects any ref that is not `main` or
`preview`. A version bump on `dev` cannot publish.

**It is still not unreviewed-autonomous.**
`.github/scripts/pr-sponsored-surface.cjs` lists `package.json` as a restricted
surface, and `MAINTAINERS.md` requires approval from at least one maintainer who
is not the author, plus explicit security review for release/package boundaries.
The PR body's unticked box says exactly this.

A round-level instruction to "merge the bug PRs" is not the exact-head PR approval
that `MAINTAINERS.md` and GitHub require. **Approval gate: before merge, a
non-author maintainer approves #2766 at its exact head.** `Ingwannu` is the
author, so the approval must come from another maintainer account. Cannot be
self-satisfied and cannot be inferred from this document.

## TESTS

No new test. The behavior proof is that the two already-red repository gates turn
green, which is observable on the merged tree and on post-merge `dev` CI.

## Verification (C)

```bash
# merged tree already built as mtp/2766
bun x tsc --noEmit # expect exit 0
bun test tests/release-version-line.test.ts # expect 3 pass / 0 fail
bun run privacy:scan # expect exit 0
```

Post-merge, the decisive evidence is the *next* PR's matrix: re-run CI on #2767 or
#2764 and confirm `ci`, `macos`, `test 3/4`, `gates` go green with no change to
their own diffs. That is the proof the keystone actually was the keystone.

## Lane execution

Ready, mergeable, green, 0 behind, targets `dev`, needs no rebase — so no
`codex/` branch is required.

Merge sequence, in order, none skippable:

1. Confirm the merged-tree receipts above.
2. **Obtain a non-author maintainer approval at the exact head `076ad3036`.**
`gh pr view 2766 --json reviewDecision` must read `APPROVED`, not
`REVIEW_REQUIRED`.
3. `gh pr merge 2766`.

If step 2 cannot be satisfied in this round, #2766 exits as **NEEDS_HUMAN
(approval)** — and because it is the keystone, every PR gated behind it inherits
that outcome. That is a real possible terminal state for this round, not a
formality to route around.
104 changes: 104 additions & 0 deletions devlog/_plan/260827_igwanu_bug_pr_merge_round/011_wp1_outcome.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# 011 — wp1 outcome: roadmap lock

Docs-only cycle. No production code changed. Deliverable is the plan unit itself:
`000_plan.md` plus six decade docs, locked at `77635d8c9`.

## A-gate: two independent Sol-high reviewers, four rounds

| Round | Lane | Verdict | Result |
|---|---|---|---|
| r1 | facts | NEAR-PASS | 1 correction applied (`27b040931`) |
| r1 | judgement | **FAIL** | 2 blockers, both accepted |
| — | judgement re-verify | **FAIL** | 1 blocker incompletely closed |
| — | judgement re-verify | PASS | both closed |
| r2 | judgement confirm | PASS | rebound to the repaired files |

### What the facts reviewer independently re-derived

Re-ran `git merge-tree` for all 13 PRs from `dev@8b1b65b8d` and confirmed all 12
clean tree hashes matched `mtp/<n>^{tree}` exactly before typechecking, plus the
`#2497` conflict. Counted every changed path across all 13 PRs and confirmed the
contention map is exhaustive: `src/codex/auth-context.ts` (#2638, #2497) and
`src/server/responses/core.ts` (#2745, #2638, #2497), nothing else shared.

Its correction: the plan had collapsed two distinct shared defects into one per-PR
line. `test 3/4` and `macos` fail on `release version line`; `gates` fails on
`privacy:scan`; `ci` is the fan-in. #2747 has no `gates` failure at all because
its head predates the runbook document.

### What the judgement reviewer caught — the two that mattered

**1. I violated this repository's own security rule.** The plan reproduced the
unfixed #2745 credential-boundary defect — mechanism, activation sequence,
remediation direction — inside `devlog/`, a public tracked directory, while the PR
is open. `AGENTS.md` §"Security working notes" forbids exactly that, and says so in
a section written because maintainer-authored triage had done it before.

My error in reasoning: I treated the detail as publishable because the reviewer had
already written it in a public PR comment. But the rule keys on whether the **fix
has shipped**, not on where the analysis first appeared. An open PR means
pre-disclosure.

The first repair was incomplete — the `TESTS` section still named the regression
design, which carries the activation shape without the prose. The reviewer caught
that too. Both are now in `.tmp/2745-security-triage.md` (gitignored, confirmed via
`git check-ignore`).

**2. Every merge lane skipped the approval `MAINTAINERS.md` requires.** The plan
went from "CI green" straight to `gh pr merge`. `MAINTAINERS.md:57-59` requires
approval from at least one maintainer who is not the author, and
`.github/scripts/pr-sponsored-surface.cjs:52` lists `package.json` as a restricted
surface. All four Ingwannu PRs read `REVIEW_REQUIRED`. A round-level instruction
from the user is not an exact-head PR approval.

It also refuted the release-safety framing as incomplete rather than wrong: no
scheduled, push-triggered, auto-merge, or version-keyed publish path exists
(`release.yml` is `workflow_dispatch`-only and rejects any ref that is not `main`
or `preview`), but `package.json` is still a restricted surface needing review.

### Approval path, resolved

The operator is authenticated as `lidge-jun` (`gh auth status`), listed in
`MAINTAINERS.md:10` as project owner. `Ingwannu` is a separate maintainer. A
`lidge-jun` approval of an Ingwannu-authored PR is therefore a valid non-author
maintainer approval, confirmed by the reviewer against `MAINTAINERS.md:57-59`.
The gate is satisfiable without self-approval.

## Keystone verification (full suite, remote)

`mtp/2766` pushed as `codex/mtp-2766-probe`, checked out on `lidge`
(`~/ocx-ci/opencodex`), full `bun run test` under `ocx-run`:

```
k2766: OK rc=0 finished 2026-08-28T00:25:04+09:00
15334 pass / 0 fail
```

Focused, on the same merged tree:

```
tests/release-version-line.test.ts 3 pass / 0 fail
bun run privacy:scan Privacy scan passed (exit 0)
bun x tsc --noEmit exit 0
```

On plain `dev` the same scan fails on the runbook literal, and the same test fails
repository-wide. The keystone claim is proven on both sides.

## Gate honesty note

The typecheck gate was verified rather than trusted: 12 merged trees compiling in
~12s looked like a no-op, so a deliberate `const x: number = "str"` was injected
into a merged worktree — `error TS2322`, exit 1. The speed is real; this repository
runs the native TypeScript 7.0.2 compiler at ~0.44s for a full typecheck.

## Carried into wp2

1. Merge #2766 first; it is the only PR that can produce a trustworthy green
matrix for the others. Approval at exact head `076ad3036` before merge.
2. Review, rebase, and verification of other PRs may proceed in parallel — only
the merges serialize.
3. Follow-up outside this round's scope: the same pre-disclosure material exists
in `devlog/_plan/260826_wp7e_presence_driven_oauth_failover/` and
`devlog/_plan/260827_dev_hardening/`. Pre-existing, belongs to other active
work streams, needs separate authority. **Escalate; do not silently rewrite.**
Loading
Loading