docs(devlog): 260808 bug campaign — dispositions, execution, and faults - #1277
Conversation
Records a campaign that gave a terminal disposition to every open bug issue and bug PR at the 2026-08-08 cutoff, and what it got wrong along the way. The unit carries the inventory and disposition matrix with file:line evidence per verdict, the rebase-and-co-author republish protocol, and per-work-phase implementation docs. Execution records cover the CI approval unblock, the first CI results, and the merges and closes. What the audits overturned is the more useful half. Two issues were queued for closure as resolved and were not - #1176 carried a maintainer comment from the same morning asking for a v2.11.0 retest, and #1024 rested on an upstream attribution the plan itself proposed to test and had not tested. #1155 was queued as an unreachable path and is reachable. #1263 was diagnosed as having no defect and has a real TOCTOU race, shown by contrast experiment. #1119 was described as fully absorbed and was not, so its coverage was recreated on dev before it was closed. Two execution faults are recorded as faults: #1202 was merged without checking its exact-head CI had concluded success, violating a reading rule written earlier in this same unit; and a public comment to a contributor made a false claim about stream defaulting, corrected on the PR. A transient six-failure test run is recorded as unexplained rather than dismissed as flaky, since its log was overwritten before the names could be preserved. Nothing in the build, typecheck, or test path reads from devlog/. privacy:scan passes; repo-hygiene 11 pass / 0 fail.
|
✅ Deterministic PR hygiene checks passed. |
📝 WalkthroughWalkthroughThe PR adds a documented bug-campaign roadmap. It inventories tracked PRs and issues, defines republishing and CI gates, sequences work packages, records validation results, and updates remediation and closure decisions. ChangesBug Campaign Execution
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e7bc903ed4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| 결함은 dev에 그대로다. `src/server/live.ts:208-212` 의 `isLoopbackHost` 가 | ||
| `127.` 로 시작하는 모든 호스트명을 받아들이고, `:239-242` 가 그 판정으로 평문을 | ||
| 허용한다. |
There was a problem hiding this comment.
Move the unreleased sideband vulnerability out of devlog
This tracked _plan entry publicly identifies the still-unfixed validation flaw, the exact credential-bearing code path, and how a hostname such as 127.evil.example reaches a plaintext remote sideband; anyone reading the repository can reproduce the issue before the replacement PR ships. Remove this material from the commit and keep the investigation in .tmp/ or other scratch space until the fix is public, then publish only the shipped outcome under _fin.
AGENTS.md reference: AGENTS.md:L61-L68
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 17
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@devlog/_plan/260808_bug_campaign/002_disposition_matrix.md`:
- Around line 39-43: Update the `#1256` entry in the disposition matrix to replace
the spaced source commit identifier “50117895 6” with the valid contiguous
identifier “501178956”, matching the referenced record in
010_wp1_ci_unblock_and_small_republish.md.
In `@devlog/_plan/260808_bug_campaign/003_republish_protocol.md`:
- Around line 51-53: Resolve the contradiction between the tentative-commit
guidance in 단계 5 and the aborted-branch procedure in the later loop: when the
contributor head changes, do not publish the tentative commit, but retain it
under the designated *-aborted-* branch name for auditability. Update both
sections consistently so operators do not delete or discard the commit.
- Around line 93-94: Update the rebase failure handler around `git rebase --onto
origin/dev "$BASE_DEV_SHA"` so it does not exit immediately; preserve the
aborted branch and continue to the existing cleanup section, allowing operators
to rename it to the documented `codex/260808-<slug>-aborted-$STAMP` form.
- Around line 86-100: Harden the republish verification flow by enabling strict
shell mode with set -euo pipefail before the commands around git fetch origin
dev and the bun verification steps. Ensure git fetch origin dev, git rev-parse,
git rebase, bun install, bun run typecheck, and bun test all fail closed before
publication, without allowing stale refs or dependencies to be treated as valid.
In `@devlog/_plan/260808_bug_campaign/010_wp1_ci_unblock_and_small_republish.md`:
- Around line 141-143: Update the approval loop around the gh api approval
request and subsequent status query to capture HTTP status separately from
response headers, require a 2xx approval response, and stop or fail when
approval is unsuccessful. After each successful approval, make the existing
status verification for the run an enforced gate rather than merely recording or
displaying its result, while preserving the ledger output for successful
attempts.
In `@devlog/_plan/260808_bug_campaign/015_wp6_close_execution.md`:
- Around line 55-63: Correct the stream contract in
devlog/_plan/260808_bug_campaign/015_wp6_close_execution.md lines 55-63 to state
that omission defaults to streaming and only explicit stream: false reaches the
buffered branch; apply the same correction to the `#1155` disposition in
devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md lines 17-21.
In `@devlog/_plan/260808_bug_campaign/016_wp8_1119_replacement.md`:
- Around line 85-89: Update the “리뷰 반영” section to remove the inaccurate claim
that all volatile line references were replaced. Replace remaining references
such as :2351, :2371, :2391, and sync.ts:266-269 in the referenced review
comments with stable test or function names, or explicitly limit the statement
to only the selected comments that were updated.
In `@devlog/_plan/260808_bug_campaign/017_wp9_1245_fix.md`:
- Around line 153-161: Update the regression-test documentation so the stated
count matches the chronology: keep the original heading/table at four tests by
moving the positive forLocalRouting case to the later update section, or revise
the heading and structure to clearly distinguish the later fifth test.
In `@devlog/_plan/260808_bug_campaign/020_wp2_sse_frame_contract.md`:
- Around line 133-166: Rebase the `#1249` work onto the accepted `#1240` head
965dd990114fc6203297475142a28fcd7cb44642 rather than the discarded
codex/260808-sse-non-record-frames branch. Then revalidate
src/adapters/openai-chat.ts to ensure both empty data payloads and non-record
parsed frames return "continue" in the composed result.
In `@devlog/_plan/260808_bug_campaign/030_wp3_ci_workflow_stack.md`:
- Around line 126-136: Update the WP3 acceptance criteria to require recorded,
passing evidence for both `#1255` status behaviors: untrusted events are blocked
and trusted events remain allowed. Make this a hard gate before WP3 closes,
rather than relying only on `#1255` merge confirmation or conditional tests in
`#1185`.
- Around line 23-36: Update the `#1265` precondition checks to compare both
origin/main and origin/dev, including explicit ancestry and diff evidence
proving dev contains the required workflow changes before proceeding with `#1259`.
Extend the PR metadata/check validation to require an approved manual security
review state, while preserving the existing status, target, merge, and
recent-commit checks.
In `@devlog/_plan/260808_bug_campaign/040_wp4_catalog_sequential.md`:
- Around line 130-149: Update the plan’s MODIFY scope to include
src/codex/convergence.ts alongside src/codex/catalog/sync.ts, and require
marker-based routing detection in both stages using opencodex_catalog_kind
rather than slash presence. Ensure tests cover preservation of bare native-alias
rows through sync and convergence; if convergence remains unchanged, document
the rationale and explicitly test that behavior.
- Around line 269-283: Update the “WP4 수용 기준” section to add a per-package
activation test matrix, requiring each work package’s dedicated regression suite
in addition to the shared typecheck and codex-catalog checks. Include at minimum
the Google Vertex thought-signature, provider-management, discovery, and combo
suites for their corresponding PR stages, while preserving `#1228`’s explicitly
required cursor test set.
- Around line 241-260: Update the `#1266` sequencing entry in
040_wp4_catalog_sequential.md to explicitly depend on the final WP2 head from
020_wp2_sse_frame_contract.md and require rebasing after accepted `#1240` lands,
in addition to the existing `#1178` ordering. Also state that the Google parser
regression tests must be rerun after rebasing to verify the preserved null-frame
behavior in src/adapters/google.ts.
In `@devlog/_plan/260808_bug_campaign/050_wp5_orphan_issue_fixes.md`:
- Around line 362-369: Update
devlog/_plan/260808_bug_campaign/050_wp5_orphan_issue_fixes.md lines 362-369 to
remove `#1196` from the active direct-implementation list and revise the
acceptance criteria accordingly. In
devlog/_plan/260808_bug_campaign/018_wp10_1196_fix.md lines 1-5, preserve the
rejection as the canonical disposition and add a link to the superseded WP5
plan.
In `@devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md`:
- Around line 63-68: Reconcile the terminal-record references for `#1240` and
issue `#1219`: in devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md:63-68,
record the adopted superseding PR; in
devlog/_plan/260808_bug_campaign/019_wp11_publish.md:7-16, update the closure
evidence to the actual terminal PR/commit and remove `#1240` as merged evidence if
it was superseded. Ensure both records describe the same final state.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 73231f7f-fc14-4e6b-ac9e-a94bd1cad50b
📒 Files selected for processing (19)
devlog/_plan/260808_bug_campaign/000_plan.mddevlog/_plan/260808_bug_campaign/001_inventory.mddevlog/_plan/260808_bug_campaign/002_disposition_matrix.mddevlog/_plan/260808_bug_campaign/003_republish_protocol.mddevlog/_plan/260808_bug_campaign/010_wp1_ci_unblock_and_small_republish.mddevlog/_plan/260808_bug_campaign/011_wp1_gate_run.mddevlog/_plan/260808_bug_campaign/012_wp1_ci_first_results.mddevlog/_plan/260808_bug_campaign/013_wp1_new_prs_overlap.mddevlog/_plan/260808_bug_campaign/014_wp1_ci_final_tally.mddevlog/_plan/260808_bug_campaign/015_wp6_close_execution.mddevlog/_plan/260808_bug_campaign/016_wp8_1119_replacement.mddevlog/_plan/260808_bug_campaign/017_wp9_1245_fix.mddevlog/_plan/260808_bug_campaign/018_wp10_1196_fix.mddevlog/_plan/260808_bug_campaign/019_wp11_publish.mddevlog/_plan/260808_bug_campaign/020_wp2_sse_frame_contract.mddevlog/_plan/260808_bug_campaign/030_wp3_ci_workflow_stack.mddevlog/_plan/260808_bug_campaign/040_wp4_catalog_sequential.mddevlog/_plan/260808_bug_campaign/050_wp5_orphan_issue_fixes.mddevlog/_plan/260808_bug_campaign/060_wp6_dispositions.md
| 열린 이슈 중 버그 계열이 25건, 열린 PR 중 버그 계열이 28건이다(#1266 포함, | ||
| 종결분 제외). 그중 #1265는 `main` 타겟 릴리스 경로라 배제하므로 **실제 처리 | ||
| 대상은 27건**이다. 지난 | ||
| 캠페인들이 개별 항목을 처리했지만 이번에는 커트오프 시점의 **전량**에 터미널 | ||
| 처분을 내린다. 처분은 셋 중 하나다: 리베이스 후 공동커밋으로 재발행, 위양성 | ||
| 판정 후 close, 업스트림 차단 등으로 tracking 유지. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Create one canonical campaign inventory and derive every downstream gate from it.
The roadmap, inventory, screenshot requirements, and CI approval list contain different counts and different PR memberships. Keep one generated inventory with explicit exclusions, then derive the execution lists and acceptance counts from that source.
devlog/_plan/260808_bug_campaign/000_plan.md#L18-L23: replace the 27-item claim and reconcile the stated PR list with the canonical inventory.devlog/_plan/260808_bug_campaign/001_inventory.md#L9-L27: use the label-inclusive collection query and regenerate the 30-row inventory and target count.devlog/_plan/260808_bug_campaign/003_republish_protocol.md#L268-L269: remove merged PR#1257from the active GUI screenshot requirements.devlog/_plan/260808_bug_campaign/010_wp1_ci_unblock_and_small_republish.md#L171-L181: regenerate the approval target list and acceptance count from the canonical inventory.
🧰 Tools
🪛 LanguageTool
[grammar] ~22-~22: Ensure spelling is correct
Context: ...*전량**에 터미널 처분을 내린다. 처분은 셋 중 하나다: 리베이스 후 공동커밋으로 재발행, 위양성 판정 후 close, 업스트림 차단 등으로 tracki...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
📍 Affects 4 files
devlog/_plan/260808_bug_campaign/000_plan.md#L18-L23(this comment)devlog/_plan/260808_bug_campaign/001_inventory.md#L9-L27devlog/_plan/260808_bug_campaign/003_republish_protocol.md#L268-L269devlog/_plan/260808_bug_campaign/010_wp1_ci_unblock_and_small_republish.md#L171-L181
| **#1256** `luvs01 <luvs01@hanmail.net>` | ||
| `src/usage/log.ts:658-664` 가 "파일 전체까지" 확장한다고 명시하며 | ||
| `Buffer.alloc(size - start)` 를 호출하고, `:671` 이 창을 `size` 까지 키운다. | ||
| 64 MiB 상한이 전체 원장 읽기를 막는다. 커밋 `50117895 6`. | ||
|
|
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Correct the #1256 source commit identifier.
Line 42 records 50117895 6, but 010_wp1_ci_unblock_and_small_republish.md, Line 290, records 501178956. The spaced value cannot be copied into Git commands or used to verify the source commit.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/002_disposition_matrix.md` around lines 39 -
43, Update the `#1256` entry in the disposition matrix to replace the spaced
source commit identifier “50117895 6” with the valid contiguous identifier
“501178956”, matching the referenced record in
010_wp1_ci_unblock_and_small_republish.md.
| 5단계 커밋은 잠정이다. 이 시점에는 아직 발행하지 않는다. 원격에 나가는 행위 | ||
| (push, PR 생성)는 아래 루프를 통과한 뒤에만 일어난다. 기여자 head가 바뀌어 | ||
| 중단되면 이 로컬 커밋은 버린다. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Resolve the aborted-branch retention contradiction.
Lines 51-53 say to discard the tentative commit when the contributor head changes. Lines 111-135 say not to delete it and to retain it in an *-aborted-* branch. These instructions permit opposite operator actions and can delete audit evidence. State that the commit must not be published, but must be retained under the aborted-branch name.
Also applies to: 111-135
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/003_republish_protocol.md` around lines 51 -
53, Resolve the contradiction between the tentative-commit guidance in 단계 5 and
the aborted-branch procedure in the later loop: when the contributor head
changes, do not publish the tentative commit, but retain it under the designated
*-aborted-* branch name for auditability. Update both sections consistently so
operators do not delete or discard the commit.
| git fetch origin dev | ||
| CURRENT_DEV_SHA=$(git rev-parse origin/dev) | ||
| if [ "$CURRENT_DEV_SHA" = "$BASE_DEV_SHA" ]; then | ||
| break # 둘 다 안정. 발행 가능 | ||
| fi | ||
|
|
||
| echo "dev moved $BASE_DEV_SHA -> $CURRENT_DEV_SHA (attempt $attempt); rebasing" | ||
| git rebase --onto origin/dev "$BASE_DEV_SHA" || { | ||
| echo "ABORT: rebase conflict against new dev"; exit 1; } | ||
| BASE_DEV_SHA="$CURRENT_DEV_SHA" | ||
|
|
||
| # 새 base에서 검증을 처음부터 다시 돌린다 — 이전 결과는 무효다 | ||
| bun install | ||
| bun run typecheck || exit 1 | ||
| bun test tests/<대상>.test.ts || exit 1 |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
Fail closed when a verification command fails.
Lines 86-100 do not enable strict shell mode or check every external command. If git fetch origin dev fails, origin/dev can remain stale and Line 88 can incorrectly declare the base stable. If bun install fails, the following checks can use stale dependencies. Add set -euo pipefail and explicit checks before allowing publication.
Proposed shell hardening
+set -euo pipefail
+
git fetch origin dev
CURRENT_DEV_SHA=$(git rev-parse origin/dev)
...
bun install📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| git fetch origin dev | |
| CURRENT_DEV_SHA=$(git rev-parse origin/dev) | |
| if [ "$CURRENT_DEV_SHA" = "$BASE_DEV_SHA" ]; then | |
| break # 둘 다 안정. 발행 가능 | |
| fi | |
| echo "dev moved $BASE_DEV_SHA -> $CURRENT_DEV_SHA (attempt $attempt); rebasing" | |
| git rebase --onto origin/dev "$BASE_DEV_SHA" || { | |
| echo "ABORT: rebase conflict against new dev"; exit 1; } | |
| BASE_DEV_SHA="$CURRENT_DEV_SHA" | |
| # 새 base에서 검증을 처음부터 다시 돌린다 — 이전 결과는 무효다 | |
| bun install | |
| bun run typecheck || exit 1 | |
| bun test tests/<대상>.test.ts || exit 1 | |
| set -euo pipefail | |
| git fetch origin dev | |
| CURRENT_DEV_SHA=$(git rev-parse origin/dev) | |
| if [ "$CURRENT_DEV_SHA" = "$BASE_DEV_SHA" ]; then | |
| break # 둘 다 안정. 발행 가능 | |
| fi | |
| echo "dev moved $BASE_DEV_SHA -> $CURRENT_DEV_SHA (attempt $attempt); rebasing" | |
| git rebase --onto origin/dev "$BASE_DEV_SHA" || { | |
| echo "ABORT: rebase conflict against new dev"; exit 1; } | |
| BASE_DEV_SHA="$CURRENT_DEV_SHA" | |
| # 새 base에서 검증을 처음부터 다시 돌린다 — 이전 결과는 무효다 | |
| bun install | |
| bun run typecheck || exit 1 | |
| bun test tests/<대상>.test.ts || exit 1 |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/003_republish_protocol.md` around lines 86 -
100, Harden the republish verification flow by enabling strict shell mode with
set -euo pipefail before the commands around git fetch origin dev and the bun
verification steps. Ensure git fetch origin dev, git rev-parse, git rebase, bun
install, bun run typecheck, and bun test all fail closed before publication,
without allowing stale refs or dependencies to be treated as valid.
| git rebase --onto origin/dev "$BASE_DEV_SHA" || { | ||
| echo "ABORT: rebase conflict against new dev"; exit 1; } |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT
cd "$tmp"
git init -q
git config user.name test
git config user.email test@example.invalid
printf 'base\n' > file
git add file
git commit -qm base
base=$(git rev-parse HEAD)
git switch -q -c work
printf 'work\n' > file
git commit -qam work
git switch -q -c dev "$base"
printf 'dev\n' > file
git commit -qam dev
git switch -q work
git rebase --onto dev "$base" >/tmp/rebase.log 2>&1 || true
if git switch --detach 2>/tmp/switch.log; then
echo "detach succeeded while rebase was active"
else
echo "detach failed while rebase was active"
fi
git rebase --abort
git switch -q --detach
git branch -m work work-aborted
git show-ref --verify --quiet refs/heads/work-abortedRepository: lidge-jun/opencodex
Length of output: 195
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '--- candidate file ---\n'
if [ -f devlog/_plan/260808_bug_campaign/003_republish_protocol.md ]; then
sed -n '80,135p' devlog/_plan/260808_bug_campaign/003_republish_protocol.md | cat -n
else
fd -a '003_republish_protocol\.md$' . | sed 's#^\./##'
fi
printf '\n--- git version ---\n'
git --version
printf '\n--- deterministic git rebase/safe-branch checks ---\n'
tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT
cd "$tmp"
git init -q
git config user.name test
git config user.email test@example.invalid
printf 'base\n' > file
git add file
git commit -qm base
base=$(git rev-parse HEAD)
git switch -q -c work
printf 'old work\n' > file
git commit -qam work
git switch -q -c dev "$base"
printf 'dev\n' > file
git commit -qam dev
git switch -q work
printf 'modify for rebasable conflict\n' > file
git commit -qam 'modify work'
printf '--- failed rebase state ---\n'
git rebase --onto dev "$base" >/tmp/rebase.log 2>&1 || true
git status --short --branch
if [ -e .git/rebase-merge ] || [ -e .git/rebase-apply ]; then
printf 'active rebase directory present\n'
ls -1 .git/rebase-[map ]* .git/rebase* 2>/dev/null || true
fi
printf '--- switch --detach behavior ---\n'
if git switch --detach -q >/tmp/switch.log 2>&1; then
printf 'switch --detach succeeded\n'
git status --short --branch
else
printf 'switch --detach failed\n'
cat /tmp/switch.log
fi
printf '\n--- with --force during active rebase ---\n'
git switch -q -c work2
printf 'new work 2\n' > file
git commit -qam 'new work 2'
git switch work
git rebase --onto dev "$base" >/tmp/rebase2.log 2>&1 || true
if git switch --detach -f >/tmp/switch2.log 2>&1; then
printf 'switch --detach -f succeeded\n'
else
printf 'switch --detach -f failed\n'
cat /tmp/switch2.log
fi
cat /tmp/rebase2.log
printf '\n--- aborted branch preservation workflow ---\n'
git rebase --abort
git switch work2
git switch --detach
git branch -m work work-aborted
if git show-ref --verify --quiet refs/heads/work-aborted; then
printf 'work-aborted branch preserved\n'
else
printf 'work-aborted branch missing\n'
fi
git status --short --branchRepository: lidge-jun/opencodex
Length of output: 248
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- candidate file ---'
if [ -f devlog/_plan/260808_bug_campaign/003_republish_protocol.md ]; then
sed -n '80,135p' devlog/_plan/260808_bug_campaign/003_republish_protocol.md | cat -n
else
fd -a '003_republish_protocol\.md$' . | sed 's#^\./##'
fi
printf '%s\n' ''
printf '%s\n' '--- git version ---'
git --version
printf '%s\n' ''
printf '%s\n' '--- deterministic git rebase/safe-branch checks ---'
tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT
cd "$tmp"
git init -q
git config user.name test
git config user.email test@example.invalid
printf 'base\n' > file
git add file
git commit -qm base
base=$(git rev-parse HEAD)
git switch -q -c work
printf 'old work\n' > file
git commit -qam work
git switch -q -c dev "$base"
printf 'dev\n' > file
git commit -qam dev
git switch -q work
printf 'modify for rebasable conflict\n' > file
git commit -qam 'modify work'
printf '%s\n' '--- failed rebase state ---'
git rebase --onto dev "$base" >/tmp/rebase.log 2>&1 || true
git status --short --branch
if [ -e .git/rebase-merge ] || [ -e .git/rebase-apply ]; then
printf '%s\n' 'active rebase directory present'
ls -1 .git/rebase-[map ]* .git/rebase* 2>/dev/null || true
fi
printf '%s\n' '--- switch --detach behavior ---'
if git switch --detach -q >/tmp/switch.log 2>&1; then
printf '%s\n' 'switch --detach succeeded'
git status --short --branch
else
printf '%s\n' 'switch --detach failed'
cat /tmp/switch.log
fi
printf '%s\n' ''
printf '%s\n' '--- with --force during active rebase ---'
git switch -q -c work2
printf 'new work 2\n' > file
git commit -qam 'new work 2'
git switch work
git rebase --onto dev "$base" >/tmp/rebase2.log 2>&1 || true
if git switch --detach -f >/tmp/switch2.log 2>&1; then
printf '%s\n' 'switch --detach -f succeeded'
else
printf '%s\n' 'switch --detach -f failed'
cat /tmp/switch2.log
fi
cat /tmp/rebase2.log
printf '%s\n' ''
printf '%s\n' '--- aborted branch preservation workflow ---'
git rebase --abort
git switch work2
git switch --detach
git branch -m work work-aborted
if git show-ref --verify --quiet refs/heads/work-aborted; then
printf '%s\n' 'work-aborted branch preserved'
else
printf '%s\n' 'work-aborted branch missing'
fi
git status --short --branchRepository: lidge-jun/opencodex
Length of output: 2933
Make failure cleanup preserve the aborted branch.
devlog/_plan/260808_bug_campaign/003_republish_protocol.md exits immediately when git rebase --onto origin/dev "$BASE_DEV_SHA" fails at lines 93-94, so the cleanup section at lines 123-125 is not reached. Keep the aborted branch reachable after the failed rebase so operators can rename it to codex/260808-<slug>-aborted-$STAMP instead of re-running the procedure and losing the failed-head state.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/003_republish_protocol.md` around lines 93 -
94, Update the rebase failure handler around `git rebase --onto origin/dev
"$BASE_DEV_SHA"` so it does not exit immediately; preserve the aborted branch
and continue to the existing cleanup section, allowing operators to rename it to
the documented `codex/260808-<slug>-aborted-$STAMP` form.
| MODIFY `src/codex/catalog/sync.ts` | ||
|
|
||
| 현재 `:543-549` 의 보존 로직이 슬래시 유무로만 라우팅 행을 인식한다. Desktop | ||
| 호환을 위해서는 bare native-alias 행(슬래시 없음)이 필요한데, 그런 행은 보존 | ||
| 대상에서 탈락한다. `src/codex/convergence.ts:191-198` 도 같은 기준이다. | ||
|
|
||
| 변경: `opencodex_catalog_kind` 마커 기반으로 라우팅 행을 식별한다. 슬래시는 | ||
| 더 이상 판별 기준이 아니다. | ||
|
|
||
| 57파일 전체 목록은 원본 PR 참조. 주요 축: `src/codex/catalog/*` 8파일, | ||
| `src/combos/*`, `src/server/management/*` 3파일, `gui/*` 3파일, docs 17파일, | ||
| tests 11파일, `structure/03_catalog-and-subagents.md`. | ||
|
|
||
| GUI 스크린샷 필수. | ||
|
|
||
| 원본 리뷰에서 지적된 항목을 반드시 유지: 네이티브 복구와 백업 무결성(백업 오염과 | ||
| alias 소실 방지), native-alias 행이 라우팅으로 계수되는지. | ||
|
|
||
| 활성화 증거: bare native-alias 행이 remote `available_models` 필터링 이후에도 | ||
| 살아남는지 확인하는 테스트. 현재 코드에서 red여야 한다. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Include src/codex/convergence.ts in the #1244 scope.
The document identifies slash-only routing detection in both src/codex/catalog/sync.ts and src/codex/convergence.ts at Lines 132-134. The MODIFY list names only src/codex/catalog/sync.ts.
If src/codex/convergence.ts remains unchanged, the marker-based fix can preserve the bare native-alias row during sync and then drop it during convergence. The Line 148-149 test would still fail after the planned implementation.
Add src/codex/convergence.ts to the change scope and require coverage for both routing stages. If that file is intentionally unchanged, document the reason and test the existing behavior explicitly.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/040_wp4_catalog_sequential.md` around lines
130 - 149, Update the plan’s MODIFY scope to include src/codex/convergence.ts
alongside src/codex/catalog/sync.ts, and require marker-based routing detection
in both stages using opencodex_catalog_kind rather than slash presence. Ensure
tests cover preservation of bare native-alias rows through sync and convergence;
if convergence remains unchanged, document the rationale and explicitly test
that behavior.
| ## 040-7 · #1266 Vertex thought signature 재생 | ||
|
|
||
| 원작자 `Ingwannu <ingwannu@users.noreply.github.com>` | ||
| head `c0ffaef643aee3a6b73f93db834cc6e4749b5728` (2026-08-08T06:21:28Z 기준. | ||
| 최초 기록 `ae28b69ef` 에서 갱신됨 — 착수 전 재확인 필수) | ||
| 원본 브랜치 `lidge-jun:agent/fix-1254-vertex-thought-signature` | ||
| 새 브랜치 `codex/260808-vertex-thought-signature` | ||
| 순서: #1178 뒤 (둘 다 Google/Antigravity 경로를 건드린다) | ||
|
|
||
| 감사 라운드 5의 라이브 게이트가 잡아낸 신규 PR이다. Vertex 경로에서 thought | ||
| signature가 재생되지 않는 문제를 다룬다. | ||
|
|
||
| MODIFY `src/adapters/google.ts` | ||
| NEW `src/adapters/google-antigravity-replay.ts` | ||
| MODIFY `structure/04_transports-and-sidecars.md` | ||
| MODIFY `docs-site` 5개 로케일 `reference/adapters.md` | ||
| MODIFY `tests/google-vertex-thought-signature.test.ts` | ||
|
|
||
| #1178이 `src/adapters/google.ts` 인접 영역과 Antigravity 발견 경로를 바꾸므로 | ||
| 그 뒤에 리베이스한다. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Add the WP2 Google adapter dependency to #1266 sequencing.
devlog/_plan/260808_bug_campaign/020_wp2_sse_frame_contract.md, Lines 58-61, records accepted null-frame handling in src/adapters/google.ts. This file is also modified by #1266 at Lines 253-257.
The current order places #1266 after #1178 only. Add an explicit dependency on the final WP2 head and rebase #1266 after the accepted #1240 change lands. Then rerun the Google parser regression tests. Otherwise, #1266 can be based on an older adapter and overwrite or leave the WP2 behavior unverified.
🧰 Tools
🪛 markdownlint-cli2 (0.23.2)
[warning] 259-259: No space after hash on atx style heading
(MD018, no-missing-space-atx)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/040_wp4_catalog_sequential.md` around lines
241 - 260, Update the `#1266` sequencing entry in 040_wp4_catalog_sequential.md to
explicitly depend on the final WP2 head from 020_wp2_sse_frame_contract.md and
require rebasing after accepted `#1240` lands, in addition to the existing `#1178`
ordering. Also state that the Google parser regression tests must be rerun after
rebasing to verify the preserved null-frame behavior in src/adapters/google.ts.
| ## WP4 수용 기준 | ||
|
|
||
| - 일곱 PR이 순차로 열리고, 각각 직전 착지 head 위에 리베이스됨 | ||
| (#1224, #1226, #1178, #1266, #1244, #1163, #1228 순) | ||
| - #1228 단계는 `bun test tests/cursor-vision-wire-harness.test.ts` 를 **필수**로 | ||
| 포함한다. 이것이 protobuf wire 형식의 유일한 실증이며, `codex-catalog.test.ts` | ||
| 만으로는 Cursor 이미지 경로를 관찰하지 못한다. 함께 돌릴 것: | ||
| `tests/cursor-images.test.ts`, `tests/cursor-request-builder.test.ts`, | ||
| `tests/cursor-adapter.test.ts` | ||
| - 각 단계마다 `bun install` 후 `bun run typecheck` 와 | ||
| `bun test tests/codex-catalog.test.ts` green | ||
| - 1178 단계에서 위 보안 산출물 4종 전부 확보 | ||
| - GUI 변경 PR(1224, 1244)에 스크린샷 첨부 | ||
| - 1226은 워크트리 dirty 충돌 해소 후 진행 (사용자 확인 필요) | ||
| - 1228(Cursor 이미지, 24파일)은 대형 단독으로 마지막에 처리 (§040-6) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Require package-specific activation tests in the WP4 gate.
The work packages define dedicated activation scenarios and tests. The final gate requires bun run typecheck and tests/codex-catalog.test.ts for every stage, with explicit extra coverage only for #1228.
For example, #1266 lists tests/google-vertex-thought-signature.test.ts, but the final gate does not require it. A thought-signature regression can therefore pass the stated gate. Add a per-package test matrix. At minimum, require the dedicated Google Vertex, provider-management, discovery, and combo regression suites for their corresponding stages.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/040_wp4_catalog_sequential.md` around lines
269 - 283, Update the “WP4 수용 기준” section to add a per-package activation test
matrix, requiring each work package’s dedicated regression suite in addition to
the shared typecheck and codex-catalog checks. Include at minimum the Google
Vertex thought-signature, provider-management, discovery, and combo suites for
their corresponding PR stages, while preserving `#1228`’s explicitly required
cursor test set.
| **직접 구현 (신규 PR 생성):** | ||
|
|
||
| - 050-1(#1245 GUI), 050-4(#1196 issue-quality), 050-7(#1213 Claude Desktop), | ||
| 050-8(#1229 dedicated mode) — WP4와 병렬 가능 | ||
| - 050-6(#1145 Zen note)은 WP4 완료 후 (`registry.ts` 공유) | ||
| - 각 PR `bun install` 후 `bun run typecheck` exit 0, 대상 테스트 green | ||
| - GUI 변경(050-1, 050-7)에 스크린샷과 `bun run lint:gui` | ||
| - 조건부 분기 추가 항목(050-1, 050-7, 050-8)은 각 활성화 표의 증거 확보 |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Make the #1196 status consistent across the WP5 and WP10 records. One record still schedules the work as active, while the other rejects publication because the proposed change can cause valid issues to close automatically.
devlog/_plan/260808_bug_campaign/050_wp5_orphan_issue_fixes.md#L362-L369: remove#1196from the active direct-implementation count and update the acceptance criteria.devlog/_plan/260808_bug_campaign/018_wp10_1196_fix.md#L1-L5: retain the rejection as the canonical disposition and link to the superseded WP5 plan.
📍 Affects 2 files
devlog/_plan/260808_bug_campaign/050_wp5_orphan_issue_fixes.md#L362-L369(this comment)devlog/_plan/260808_bug_campaign/018_wp10_1196_fix.md#L1-L5
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/050_wp5_orphan_issue_fixes.md` around lines
362 - 369, Update devlog/_plan/260808_bug_campaign/050_wp5_orphan_issue_fixes.md
lines 362-369 to remove `#1196` from the active direct-implementation list and
revise the acceptance criteria accordingly. In
devlog/_plan/260808_bug_campaign/018_wp10_1196_fix.md lines 1-5, preserve the
rejection as the canonical disposition and add a link to the superseded WP5
plan.
| ### PR #1240 (snowyukitty) — 재발행으로 대체 | ||
|
|
||
| close가 아니라 **supersede**다. WP2의 `codex/260808-sse-non-record-frames` 가 | ||
| 같은 결함을 다루되 종료 대신 건너뛰기로 처리한다. 코멘트로 재발행 PR을 연결하고, | ||
| 원작자를 co-author로 보존했음을 알린다. 종료 동작이 왜 틀렸는지(후속 finish | ||
| 청크와 `[DONE]` 유실) 설명한다. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "## Relevant files"
git ls-files | rg '(^|/)260808_bug_campaign/(060_wp6_dispositions|019_wp11_publish)\.md$|021|022|023|024|025|026|027|028|029|030' || true
echo
echo "## Target snippet 060_wp6_dispositions"
for f in devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md devlog/_plan/260808_bug_campaign/019_wp11_publish.md; do
if [ -f "$f" ]; then
echo "### $f lines 1-120"
sed -n '1,120p' "$f" | nl -ba
else
echo "MISSING $f"
fi
done
echo
echo "## Search PR `#1240` / supersede references"
rg -n "`#1240`|PR `#1240`|supersede|1219|close|재발행|skip|skip|non-record" devlog/_plan/260808_bug_campaign devlog -S || true
echo
echo "## Git status/stat"
git status --short
git diff --stat HEAD~1..HEAD 2>/dev/null || trueRepository: lidge-jun/opencodex
Length of output: 11249
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "## Commit SHA for 2f0dc7cb6 in repository"
git cat-file -t 2f0dc7cb6 2>/dev/null || true
git show --no-patch 2f0dc7cb6 2>/dev/null || true
echo
echo "## Check if it is tag-ref or remote tag? No remote fetch required; inspect local refs"
git rev-parse --verify 2f0dc7cb6 2>/dev/null || true
git for-each-ref refs/tags | rg '2f0dc7cb6|1240' || true
git for-each-ref refs/remotes refs/heads refs/tags | rg '2f0dc7cb6|1240' || true || true
echo
echo "## Inspect diff introduced by commit 2f0dc7cb6 if present"
git diff --stat 2f0dc7cb6^..2f0dc7cb6 2>/dev/null || true
git show --format=full --no-patch 2f0dc7cb6 2>/dev/null | sed -n '1,120p' || trueRepository: lidge-jun/opencodex
Length of output: 1314
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "## Target snippets"
sed -n '1,140p' devlog/_plan/260808_bug_campaign/019_wp11_publish.md > /tmp/wp11_excerpt.txt && cat /tmp/wp11_excerpt.txt
printf '\n--- 060 excerpts ---\n'
sed -n '45,90p' devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md > /tmp/wp6_excerpt.txt && cat /tmp/wp6_excerpt.txt
echo
echo "## Candidate issue `#1219` references"
rg -n "1219|`#1219`|issue `#1219`|`#1219`|supersede|supersed|cross-|cross|close" devlog/_plan/260808_bug_campaign devlog/_fin -S || true
echo
echo "## PR `#1240` diff semantic context"
git show --no-patch 2f0dc7cb6 2>/dev/null | sed -n '1,180p' || true
printf '\n## Non-record handling references in diff ##\n'
git diff --unified=5 2f0dc7cb6^..2f0dc7cb6 -- src tests | rg -n -C 2 "non-record|nonrecord|skip|discard|ignore|close|finish|DONE|malformed" -S || trueRepository: lidge-jun/opencodex
Length of output: 50376
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "## Small target excerpts"
sed -n '1,120p' devlog/_plan/260808_bug_campaign/019_wp11_publish.md
echo '--- 060_wp6 excerpts ---'
sed -n '1,140p' devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md
echo '--- issue `#1219` and supersede references in campaign ---'
rg -n "(^|[^0-9])1219|(#|PR|issue) #?1240|supersede|superseded|skipp|skip|non-record|finish_reason|DONE" devlog/_plan/260808_bug_campaign/019_wp11_publish.md devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md devlog/_plan/260808_bug_campaign -S || true
echo '--- `#1240` merge commit details ---'
git cat-file -p 2f0dc7cb6 | sed -n '1,40p'
git diff --unified=5 2f0dc7cb6^..2f0dc7cb6 -- src tests | rg -n -C 3 "non-record|nonrecord|skip|ignore|malformed|finish_reason|done|DONE" -S || trueRepository: lidge-jun/opencodex
Length of output: 29110
Reconcile the #1240 terminal records before relying on issue #1219 closure. The current records describe different final states: 019_wp11_publish.md#L29 treats #1240 as a closed issue driver merged at 2f0dc7cb6, while 060_wp6_dispositions.md#L63-L68 still marks it as the PR to supersede. Update 060 to the adopted superceding PR, or change 019 so issue #1219 closure points to the actual terminal PR/commit and does not list #1240 as merged evidence.
🧰 Tools
🪛 LanguageTool
[grammar] ~66-~66: Ensure spelling is correct
Context: ...e-non-record-frames` 가 같은 결함을 다루되 종료 대신 건너뛰기로 처리한다. 코멘트로 재발행 PR을 연결하고, 원작자를 co-author로 보존했음...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
[grammar] ~67-~67: Ensure spelling is correct
Context: ...멘트로 재발행 PR을 연결하고, 원작자를 co-author로 보존했음을 알린다. 종료 동작이 왜 틀렸는지(후속 finish 청크와 [DONE] 유...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
📍 Affects 2 files
devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md#L63-L68(this comment)devlog/_plan/260808_bug_campaign/019_wp11_publish.md#L7-L16
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md` around lines 63 -
68, Reconcile the terminal-record references for `#1240` and issue `#1219`: in
devlog/_plan/260808_bug_campaign/060_wp6_dispositions.md:63-68, record the
adopted superseding PR; in
devlog/_plan/260808_bug_campaign/019_wp11_publish.md:7-16, update the closure
evidence to the actual terminal PR/commit and remove `#1240` as merged evidence if
it was superseded. Ensure both records describe the same final state.
Summary
Records the 2026-08-08 bug campaign: a terminal disposition for every open bug-labelled issue and bug-type PR at that cutoff, the execution that followed, and the mistakes made along the way.
The unit carries the inventory and disposition matrix with
file:lineevidence behind each verdict, the rebase-and-co-author republish protocol, and per-work-phase implementation docs.What the audits overturned
This is the more useful half of the record.
upstreamStreaming: parsed.streamlets an explicitstream: falserequest reach the buffered branch.devhangs where the patched head rejects in ~3ms.dev(test(catalog): pin the custom-provider reasoning-summary opt-in (#1100) #1274) before closing it.Faults recorded as faults
cancelled. The reading rule it violates was written earlier in this same unit.devwas verified green afterwards (9908 pass / 0 fail), which is luck, not process.streamdefaulting; corrected on the PR.Verification
bun run privacy:scan— passbun test tests/repo-hygiene.test.ts— 11 pass / 0 faildevlog/Checklist
Summary by CodeRabbit