Repository navigation
CodeQL dispatch terminal status publication remains unproven across repositories #1929
Description
현재 상태 — 2026-09-07
원래 actor allowlist 불일치는 복구됐다. Live OPENCODE_REPOSITORY_DISPATCH_ACTOR는 github-actions[bot]과 opencode-agent[bot]을 허용하며, canary run 34069437294는 actor validation을 통과한 뒤 queue 동안 변경된 live head 불일치에서 fail-closed했다.
Issue는 완료되지 않았다. 아직 다음 두 증거가 필요하다.
- 동일 저장소에서 실제 scan/SARIF upload 뒤 base/head/language/workflow/run-bound terminal receipt가 게시되는 unchanged-head canary.
- cross-repository commit-status publication의 HTTP 403 수리와 unchanged-head terminal proof. 실패 증거는 runs
34017996201,34018021069이다.
.github#1902@4b025af481f3a4fb0bdb4d400a7e055066a496a2는 stale-base terminal reuse를 차단하는 receipt contract를 추가했지만, publication credential 403을 우회하거나 해결한 것으로 간주하지 않는다.
최초 incident 기록
요약
opencode-review-dispatch.yml의 인가 게이트가 현재 디스패처 신원을 거부합니다. 허용 목록 변수는 github-actions[bot]인데 실제 디스패처는 opencode-agent[bot]입니다. 그 결과 verdict가 생산되지 않고, 상위 opencode-review job이 Fail closed without a current-head OpenCode verdict로 종료됩니다.
이것이 열린 PR 어느 것도 리뷰 증거를 얻지 못하는 이유입니다.
증거
변수 OPENCODE_REPOSITORY_DISPATCH_ACTOR = github-actions[bot] (updated 2026-07-16)
opencode-review-dispatch.yml 누적: success 466 / failure 9611 / completed 17311 (실패율 95.4%)
repository_dispatch run 표본 각 40건:
success actor: github-actions[bot] 40건 최신 2026-08-26T18:22:23Z
failure actor: opencode-agent[bot] 27건 / github-actions[bot] 11 / seonghobae 2
최신 2026-09-05T07:07:04Z
최근 실패 10건 전부 첫 job에서 종료:
validate-pr-metadata → "Bind workflow inputs to live organization pull request metadata"
게이트 조건(.github/workflows/opencode-review-dispatch.yml:107 이하):
if [ -z "$ALLOWED_DISPATCH_ACTOR" ] ||
[ "$DISPATCH_ACTOR" != "$ALLOWED_DISPATCH_ACTOR" ] ||
[ "$DISPATCH_SENDER" != "$ALLOWED_DISPATCH_ACTOR" ]; then
exit 1디스패치를 보내는 쪽은 opencode-review.yml:431이고 앱 토큰을 씁니다:
GH_TOKEN="$app_token" gh api -X POST repos/ContextualWisdomLab/.github/dispatches --input -그 앱 토큰 경로는 4a5dfd82 (2026-08-31, #1497)에서 도입됐고, 그때부터 sender가 opencode-agent[bot]이 됩니다. 허용 목록은 그보다 6주 전에 마지막으로 갱신됐습니다.
하류 영향 (다른 세션들이 측정한 값)
- 열린 non-draft PR 99건 중 현재 head에 성공한 opencode-review run을 가진 것 0건
- 그중 24건은 현재 head에
failure가 있는데, 표본 12건 전부 실패 스텝이Fail closed without a current-head OpenCode verdict - 해당 job들은
steps=4에 실제runner_id를 받았습니다 — 러너 기아가 아니라 상류 verdict 부재입니다
즉 지금까지 "리뷰가 큐에서 굶는다"로 설명하던 것의 상당 부분이, 실제로는 verdict 생산자가 인가 단계에서 거부되는 것입니다.
주장하지 않는 것
이것이 유일한 원인이라고 주장하지 않습니다. 마지막 성공이 2026-08-26이고 앱 토큰 전환은 2026-08-31이라 그 사이 5일의 실패는 이 설명으로 덮이지 않습니다. 실패 표본에 github-actions[bot] 11건이 있는 것도 같은 이야기입니다 — 그 건들은 신원이 일치하는데도 실패했으므로 별개의 원인이 최소 하나 더 있습니다(대상 허용 목록, 또는 이후 스텝).
확정된 것은 이것뿐입니다: 현재 디스패처 신원은 현재 허용 목록과 일치하지 않으며, 그 조건에서 모든 앱 토큰 디스패치가 첫 게이트에서 거부됩니다.
수정 방향 — 소유자 판단 필요
두 갈래이고, 어느 쪽이 옳은지는 앱 토큰 전환의 의도에 달려 있어 제가 정할 수 없습니다.
opencode-agent[bot]이 의도된 신원이라면 →OPENCODE_REPOSITORY_DISPATCH_ACTOR를 그 값으로 갱신. 한 줄이지만 인가 허용 목록이라 자가 승인하지 않았습니다.github-actions[bot]이 유지돼야 한다면 →opencode-review.yml:431이 앱 토큰 대신github.token으로 디스패치해야 합니다. 다만 #1497이 앱 토큰을 도입한 이유가 따로 있을 것이므로 그 근거를 먼저 봐야 합니다.
어느 쪽이든 두 값을 일치시키는 계약 테스트를 함께 넣는 것을 권합니다. 이 저장소는 이미 같은 계열의 드리프트를 한 번 겪었고(#1747: 스케줄러 매트릭스와 OPENCODE_REPOSITORY_DISPATCH_TARGETS 변수가 갈라져 매시간 조용히 fail-closed), 그때의 처방이 두 목록을 계약으로 묶는 것이었습니다. 이번은 같은 패턴의 신원 축 버전입니다.
재현
gh api repos/ContextualWisdomLab/.github/actions/variables/OPENCODE_REPOSITORY_DISPATCH_ACTOR --jq .value
gh api "repos/ContextualWisdomLab/.github/actions/workflows/opencode-review-dispatch.yml/runs?status=failure&per_page=5" \
--jq '.workflow_runs[]|"\(.created_at) \(.triggering_actor.login)"'
Activity
seonghobae commentedon Sep 5, 2026
같은 근본 원인을 #1927이 먼저 등록해 두었습니다 — 독립적으로 도달했고 커밋(
4a5dfd82, 2026-08-31)까지 같습니다.#1927이 추가로 담고 있는 것:
opencode-review-dispatch.yml:116,codeql-scan-dispatch.yml:142,pr-review-fix-scheduler.yml:115.pr-review-fix-scheduler는 마지막 성공이 2026-08-16으로 20일째입니다.codeql-pr.yml:258도 같은 앱 토큰 패턴으로 디스패치하고, 최근codeql-scan-dispatchrun 8건이 전부actor=opencode-agent[bot]입니다.codeql-scan-dispatch는 지금 149행SUPPLIED_MATRIX템플릿 오류로 인가 검사에 도달조차 못 합니다(인가 검사가 같은run:스크립트 안이라 env 평가 실패 시 한 줄도 실행 안 됨). #1925의toJSON()수정이 들어가면 155행 인가 검사에 도달하고, 이 변수가 그대로면 실패 지점이 한 칸 이동할 뿐 초록이 되지 않습니다.이 이슈가 #1927보다 나은 것: 실패율 95.4% 정량화, 그리고 **실패 표본 40건 중 11건이
github-actions[bot]**이라는 반례. 후자가 중요합니다 — 신원이 맞는데도 실패한 경로가 최소 하나 더 있다는 뜻이고, 변수만 고쳐서는 안 끝난다는 근거입니다. #1927 제목이 "every dispatch is rejected"로 되어 있는데 그건 과한 표현이라 그쪽에 정정 코멘트를 달았습니다.어느 쪽도 닫지 않는 편이 낫겠습니다 — 범위가 다르고(이쪽은 단일 워크플로 심층, 저쪽은 소비처 전체 + 순서 의존), 증거가 상호 보완적입니다. 조치하실 때 둘을 함께 보시면 됩니다.
관련: #1927, #1925
seonghobae commentedon Sep 5, 2026
수정 방향 정정 — 값을 바꾸면 다른 디스패처가 막힙니다
위에서 제가 제시한 선택지 1("변수를
opencode-agent[bot]로 갱신")은 그대로 적용하면 안 됩니다. 디스패처가 하나가 아닙니다.두 개의 디스패처
event_type: opencode-review를 보내는 워크플로가 둘입니다.그리고 인가 변수는 단일 값입니다(쉼표 구분 목록이 아닙니다):
게이트는
DISPATCH_ACTOR와DISPATCH_SENDER가 둘 다 그 하나의 값과 같아야 통과시킵니다.실측 근거
repository_dispatch실패 run 100건 표본의 신원 분포와 시간축입니다.두 신원이 실제로 디스패치해 왔습니다. 그리고 실패 지점이 서로 다릅니다 —
opencode-agent[bot]은 첫 job의 인가 스텝에서 전량 죽고,github-actions[bot]은 인가를 통과한 뒤coverage-evidence/opencode-review의 실제 작업 스텝에서 죽습니다(별도 원인, 아래 참조).즉 현재 허용 목록은 스케줄러 경로에 대해서는 올바르게 작동하고 있고,
opencode-review.yml의 앱 토큰 경로에 대해서만 틀렸습니다. 값을opencode-agent[bot]로 교체하면 방향만 뒤집혀 스케줄러 디스패치가 막힙니다.그래서 수정은 셋 중 하나입니다
ALLOWED_DISPATCH_TARGETS가 이미 쉼표 목록 파싱을 하므로 같은 형태로 액터도 목록화. 두 신원 모두 인가.opencode-review.yml을 스케줄러와 같은 토큰 우선순위로 맞추거나 그 반대. #1497이 앱 토큰을 도입한 이유를 먼저 확인해야 합니다.1번이 가장 작고 되돌리기 쉽지만, 인가 면적을 넓히는 변경이라 그 자체가 소유자 판단입니다.
확정과 추정 구분
github-actions[bot]디스패치가 스케줄러 경로에서 온다는 것. 스케줄러의 토큰이 시크릿 존재 여부에 따라 넷 중 하나로 해소되므로 런타임 신원을 정적으로 확정하지 못했습니다. 다만opencode-review.yml이 앱 토큰 고정이므로github-actions[bot]디스패치는 그쪽에서 올 수 없습니다.두 번째 원인은 이미 해소된 것으로 보입니다
별도 세션이 추적한 결과,
github-actions[bot]실패 44건은 전부#1883병합(2026-09-05T08:10:23Z) 이전이고 최신도 15시간 앞섭니다. 그 실패들이 죽는Measure test and docstring evidence는 병합 전main의 coverage 99% / interrogate 98.3% 상태와 일치하며,#1883이후 fresh clone 측정은 2883 passed / 100% / 100% 입니다.다만 검증된 적은 없습니다 —
#1883병합 이후 인가를 통과한 dispatch가 0건이라(전부opencode-agent[bot]이라 A에서 먼저 걸림) B의 해소는 실행으로 확인되지 않았습니다. 정확한 표현은 **"A를 고치면 B는 이미 해소돼 있을 가능성이 높고, 아니라면 그때 드러나는 것이 세 번째 원인"**이며, A 수정이 진단 도구를 겸합니다.seonghobae commentedon Sep 5, 2026
원인이 셋입니다 — 이 이슈는 그중 하나입니다
다른 세션이
github-actions[bot]실패 44건을 전수 분류했습니다. 의존 순서(validate-pr-metadata → coverage-source-tree → coverage-evidence → opencode-review)에서 처음 실패한 job으로 재분류해 하류 캐스케이드를 제거한 결과입니다.세 원인은 독립입니다. A를 고쳐도 C는 남고,
#1883은 B만 덮습니다.원인 C에 대해 이 이슈가 기여하는 사실 하나
C의 실패는 이 형태입니다 — 인가는 통과하고 그 다음 단계에서 죽습니다.
검증 코드를 하류까지 따라가면 이렇습니다.
base_sha는 하류에서 실제로 쓰이지만, 넘어가는 값은live_base_sha입니다.SUPPLIED_BASE_SHA는 비교에만 쓰이고 버려집니다. 즉 동등성 요구는 데이터 의존이 아니라 staleness 정책이고, 그것을 풀어도 파이프라인은 live 값으로 정상 동작합니다.head_sha는 다릅니다 — exact-head 규율의 근간이므로 엄격히 유지해야 합니다.드리프트 빈도(오늘
origin/main시간당 커밋):09시 2 · 10시 2 · 11시 6 · 13시 5 · 14시 6 · 17시 11. 관측된 완주 실행이 15시간 37분 걸렸으므로 그 대기에서 base가 안 움직일 확률은 사실상 0입니다.이 이슈의 범위
이 이슈는 원인 A(인가 변수)만 다룹니다. C는 검증 의미론에 대한 설계 결정이라 별도로 추적하는 것이 맞고, 측정한 세션이 별건으로 올립니다. A를 고쳐도 C가 남는다는 것이 요점이므로, A 수정으로 이 이슈가 닫혀도 C는 닫히지 않아야 합니다.
다만 순서는 A 먼저입니다. 지금은 앱 토큰 디스패치가 인가 단계에서 전량 죽어 C가 얼마나 남는지 실행으로 보이지 않습니다. A 수정이 C의 진단 도구를 겸합니다.
seonghobae commentedon Sep 5, 2026
원인 C가 #1931로 별건 등록됐습니다. 위 분류표의 이슈 대응은 이렇습니다.
관련: #1925(codeql-scan-dispatch 미실행), #1928(게이팅하지 않는 저장소가 큐의 약 47%).
A를 고쳐 이 이슈가 닫혀도 #1931은 닫히면 안 됩니다. 세 원인이 독립이고, 지금은 A가 앞단에서 전량 차단해 C가 얼마나 남는지 실행으로 보이지 않을 뿐입니다. 순서는 A 먼저이고, A 수정이 C의 진단 도구를 겸합니다.
seonghobae commentedon Sep 5, 2026
원인 A의 코드 측 수정: #1932
게이트가 여러 신원을 표현할 수 있도록 하는 PR을 올렸습니다 —
ALLOWED_DISPATCH_ACTOR를ALLOWED_DISPATCH_TARGETS와 동일하게 쉼표 구분 목록으로 파싱합니다. 의미는 보존됩니다(actor·sender가 같은 목록 항목과 일치해야 하고, 빈 목록은 아무것도 허용하지 않으며, 단일 값 변수는 그대로 동작).변수는 손대지 않았습니다. 어떤 신원을 목록에 올릴지는 인가 결정이라 소유자 몫입니다. #1932는 그 결정을 내렸을 때 게이트가 받아들일 수 있게 하는 것뿐입니다.
수정 후 필요한 소유자 조치는 하나입니다:
검증: 확장 계약 테스트가 수정 전 게이트에서는 실패(음성 대조군), 2890 passed / coverage 100% / interrogate 100%. 이 파일의 100~140행을 건드리는 열린 PR 없음(7개 전수 확인).
seonghobae commentedon Sep 5, 2026
Wardnet adds a fresh exact downstream acceptance specimen after the earlier runner queue cleared.
ContextualWisdomLab/wardnet#155remains Ready/mergeable at exact unchanged headf74ff25a321dfb1d7109719e2a1fc77e47dc4898on protectedmain@5829a0f08d78de464dd24393ce5d0f25fba9d126. Wardnet-owned exact-head lanes are terminal GREEN: CI33904633002, Fuzz33904632999, Security Scan33904633208, and SAST Semgrep33904633082all succeeded.Required OpenCode run
33904630655has now fully materialized, so the oldcoverage-evidencequeue specimen is superseded. Bootstrap, cancellation guard, exact-head admission,coverage-source-tree, andcoverage-evidenceall completed SUCCESS. The sole failing job isopencode-review101281544719.That job acquired a real Ubuntu 24.04 runner, verified the live open/Ready PR and exact head, loaded the trusted receipt gate, found no current-head substantive receipt, obtained OIDC and the repository-scoped app token, and successfully POSTed
event_type=opencode-reviewtoContextualWisdomLab/.github/dispatcheswith exact repository/PR/base/head/run identity. Four seconds later the fail-closed verifier found noAPPROVEDorCHANGES_REQUESTEDreview fromopencode-agenton the same SHA and terminated with:No APPROVED or CHANGES_REQUESTED from opencode-agent on the current head. The dispatch workflow will rerun this failed job after publishing an authenticated exact-head verdict.So for this current specimen the consumer-side required workflow and runner are healthy through dispatch; the missing artifact is specifically the authenticated downstream verdict. Branch-side reruns or source churn are non-causal.
GREEN acceptance from Wardnet: repair the dispatcher identity contract without breaking the scheduler dispatcher, then on unchanged
#155@f74ff25a...allow the repository_dispatch handler to bind the exact payload, execute the substantive current-head review, publish its authenticated receipt/review, and rerun only the failed requiredopencode-reviewjob to terminal success. Preserve the already-green coverage and repository/security evidence; do not synthesize approval or use predecessor/model-fallback evidence.seonghobae commentedon Sep 5, 2026
#1932 범위를 소비 워크플로 셋 전부로 넓혔습니다(
d44aa07d). 다른 세션이 짚은 대로 같은 변수를codeql-scan-dispatch.yml:155와pr-review-fix-scheduler.yml:156도 읽고 있었고, 하나만 고치면 그 둘은 계속 거부합니다. 세 게이트가 동일한 쉼표 목록 파싱을 쓰고, 각각 계약 테스트가 확장돼 있으며, 셋 다 수정 전 게이트에서는 실패합니다(음성 대조군). 2891 passed / 100% / 100%. 변수는 여전히 미변경입니다.fix(dispatch): parse the trusted-dispatcher allowlist identically in …
seonghobae commentedon Sep 5, 2026
Additional current consumer evidence:
ContextualWisdomLab/ConceptWeave#35@a31ae0c2df920f2794f7ddb456795b04797ab472dispatched central CodeQL run33961083940asopencode-agent[bot]. The run finally acquiredubuntu-24.04and completed at 2026-09-05T13:28:49Z, but died earlier at the independentSUPPLIED_MATRIXsequence-to-envtemplate defect tracked by #1926, so the authorization gate was still not reached. Central main now contains #1932's multi-identity parser (6f8c51d7389c22ebaf294fe8fe9ef495257883c0), but #1932 explicitly does not changeOPENCODE_REPOSITORY_DISPATCH_ACTOR. Therefore this ConceptWeave specimen provides a concrete next validation target after #1926 merges: the dispatcher identity reaching the gate will beopencode-agent[bot]. I am not changing the authorization variable from the consumer repo.seonghobae commentedon Sep 5, 2026
Wardnet owner-path handoff after #1932/#1926
The live Wardnet execution contract makes this a central control-plane repair, not a user-choice blocker. The owner plane should decide and execute the least-widening reversible authorization repair from live evidence.
Fresh evidence:
6f8c51d7389c22ebaf294fe8fe9ef495257883c0) and all three consumers can now parse a comma-separated trusted-dispatcher list while still requiringactor == senderfor one listed identity.3f88e13af9dcde4b9da6958c02a78ce3b5c85800), so CodeQL's array-valued matrix no longer dies in theenv:binding before authorization.d386d6f57e0c8de3e4839d6c61b593e41f9d7e20, ⚡ Bolt: [성능 개선] REST API 병렬 호출 최적화 #934775abc66e5350bdbf07ccefca74c10ddb03701a, fix: use PR base SHA for manual Strix targets #135fb24394308ccdc835cce344b7e945f5537e99756, and [codex] Bound scheduler review dispatches #155f74ff25a321dfb1d7109719e2a1fc77e47dc4898.Given the already-proven two trusted dispatcher paths (
github-actions[bot]scheduler path andopencode-agent[bot]app-token path), the minimal current owner-plane acceptance is to express both identities inOPENCODE_REPOSITORY_DISPATCH_ACTOR, not replace one with the other. Keep the same-identity actor/sender check, exact repository/PR/head binding, and fail-closed behavior for unlisted identities.GREEN: after the live variable is reconciled, an unchanged Wardnet specimen must pass the repository_dispatch authorization stage and publish an authenticated exact-head CodeQL/OpenCode verdict; only the failed consumer job should be rerun. If it then fails on base-SHA drift, hand that distinct structural failure to #1931 rather than broadening this allowlist or touching Wardnet source.
seonghobae commentedon Sep 5, 2026
Wardnet consumer handoff after the source-side parser repair:
.github#1932is now merged to protected main (6f8c51d7389c22ebaf294fe8fe9ef495257883c0) and deliberately supports the same comma-separated trusted-dispatcher allowlist inopencode-review-dispatch,codeql-scan-dispatch, and the review-fix scheduler..github#1926is also merged (3f88e13af9dcde4b9da6958c02a78ce3b5c85800), so the remaining authorization setting is no longer a Wardnet/user product decision.The live architecture already establishes two intended trusted senders: the OpenCode GitHub App path emits
opencode-agent[bot], while the scheduler path emitsgithub-actions[bot]. Replacing one with the other would knowingly break the second path; the now-merged #1932 grammar exists specifically to represent both without weakening the actor==sender invariant. Owner RED is the still-single-valued setting plus exact-head dispatch failures. Owner GREEN is the least-privilege settings reconciliation to the exact two identitiesgithub-actions[bot],opencode-agent[bot], followed by authenticated current-head canaries through both dispatch paths and CodeQL dispatch, with unlisted/mismatched actor-sender negatives still rejected. Do not make leaf repositories rerun repeatedly before that settings convergence is verified.seonghobae commentedon Sep 5, 2026
Status after
#1932(6f8c51d7, list parsing merged) — the variable is still the single value, and every dispatch since is dying on it. Counted independently by host 1 and host 2 with server-side filters (actions/workflows/<file>/runs?status=…&created=>…&per_page=1→total_count), 2026-09-05 ~16:50Z:codeql-scan-dispatch.yml#1926merged 13:57:04Zcodeql-scan-dispatch.yml#1932landed)opencode-review-dispatch.ymlNewest CodeQL failure, run
33974047812(15:11:42Z,repository_dispatch, actoropencode-agent[bot]): jobvalidate-dispatchfails at step Bind workflow inputs to live organization pull request metadata withauthorization rejected actor=opencode-agent[bot] sender=opencode-agent[bot] because both must match one configured scheduler identity; theCodeQL dispatch scanmatrix job is skipped. That is the gate#1932widened, doing exactly what it should with a one-entry list — and it means#1926'stoJSONfix has not executed once since it merged; its behavioural proof is blocked here, not pending. Host 2's probe run33969658525(15:07Z) was rejected with the same text.OPENCODE_REPOSITORY_DISPATCH_ACTORreadsgithub-actions[bot], last updated 2026-07-16T01:02:39Z. The one-line change from the issue body is unchanged and remains the owner's decision:Until it is set, no PR in the organization can obtain an OpenCode verdict or a dispatched CodeQL scan regardless of queue health (
#1937is confirmed working; the queue is draining), so this is now the sole remaining blocker on the review path.seonghobae commentedon Sep 5, 2026
Status 2026-09-06: the workflow side is done; the only remaining action is the variable's value.
#1932(6f8c51d7, merged 2026-09-05 13:35Z) made all three consumers parseOPENCODE_REPOSITORY_DISPATCH_ACTORas a comma-separated allowlist (IFS=',' read -r -a allowed_dispatch_actors).#1926(merged 13:57Z) fixed theenv:template error that had preventedcodeql-scan-dispatch's validate step from ever running. 10 of 10 completed runs since now execute the script and fail at the allowlist check:So the list is parsed but has one entry, and the dispatcher's identity is not in it.
codeql-scan-dispatch,opencode-review-dispatch, andpr-review-fix-schedulerare all blocked on exactly this.Remaining action (repository admin, authorization boundary — not performed by me): set the variable to
github-actions[bot],opencode-agent[bot](or toopencode-agent[bot]alone if thegithub-actions[bot]dispatcher is retired). Keeping both is the conservative choice while the 11github-actions[bot]failures noted on #1927 are still unexplained — those passed authorization and died later, so they will persist after the variable change and are the next thing to look at once dispatches flow.Verification after the change: one
repository_dispatchshould show step 3 passing the authorization block and reaching the matrix/metadata validation for the first time.seonghobae commentedon Sep 5, 2026
Correction to my previous comment: the allowlist needs to cover three identities, not two. I had recommended
github-actions[bot],opencode-agent[bot]. With that value,pr-review-fix-schedulerwould still be rejected.Every dispatching identity actually observed, last 100 runs per workflow (
triggering_actor.login, grouped):opencode-review-dispatch.ymlopencode-agent[bot]92 ·github-actions[bot]8codeql-scan-dispatch.ymlopencode-agent[bot]100pr-review-fix-scheduler.ymlseonghobae100The third row is the standalone
repository_dispatchpath, sent frompr-review-merge-scheduler.ymlwithPR_REVIEW_MERGE_TOKEN— a user-account token, so the dispatch arrives as the user, not as an app orgithub-actions[bot]. The earlier comment on this thread about "two dispatchers ofopencode-review" pointed at exactly this and I did not follow it through.This makes the remaining step a real authorization decision, not a mechanical append. Listing an app (
opencode-agent[bot]) grants that app's installation. Listing a user account grants anything holding that user's tokens. The owner has at least three coherent options:github-actions[bot],opencode-agent[bot],seonghobae— restores all three paths as they dispatch today; widest.github-actions[bot],opencode-agent[bot]plus migratingpr-review-merge-scheduler.yml's review-fix dispatch to the app token — keeps the allowlist bot-only; needs one workflow change.opencode-agent[bot]alone plus the same migration — narrowest; retires the legacygithub-actions[bot]path (8 of the last 100opencode-review-dispatchruns).Not performed by me. Verification after whichever lands: one dispatch on each of the three workflows should pass step 3's authorization block.
seonghobae commentedon Sep 5, 2026
Fresh ConceptWeave consumer specimen after the earlier queue wait: central OpenCode owner run
33977685099forContextualWisdomLab/ConceptWeave#35@a31ae0c2df920f2794f7ddb456795b04797ab472is no longer queued. It acquired a realubuntu-24.04runner at 2026-09-05T18:32:33Z and completedfailurefour seconds later.Job
validate-pr-metadata(101337170669) completed app-token exchange successfully, then failed exactly atBind workflow inputs to live organization pull request metadata; all downstreamcoverage-source-tree,coverage-evidence, andopencode-reviewjobs were skipped. Run actor and triggering actor areopencode-agent[bot]. ConceptWeave #35's live base/head are stillmain@f4f440dd58c77d7cd90dff8a1eb2eeb9a9940425/a31ae0c2df920f2794f7ddb456795b04797ab472, so this specimen does not introduce a head/base drift explanation.Given the already-recorded owner evidence on this issue that
OPENCODE_REPOSITORY_DISPATCH_ACTORis still the single valuegithub-actions[bot], and the current workflow checks actor/sender allowlisting before target/live-PR metadata, this is a current post-#1932 ConceptWeave acceptance specimen for the unresolved authorization decision rather than a runner/token/leaf-source failure. I am not changing the central variable or broadening the allowlist from the consumer repository, and I am not replaying this unchanged failed owner run.422 remaining items
seonghobae commentedon Sep 27, 2026
Fresh unchanged-head CodeQL terminal-publication canary —
j-planner#2040a97f235f6d7e5eec7d696c7560c87a6cc7608gh-pages@ec030872a0762af8af54d359c88e4c90239e05e4108400768211(actions)108448280654Boundary trace
codeql-dispatch/actionsterminal status and no matching completed central dispatch job, emittedVERDICT_STATE=pending, and failed closed at 2026-09-26T17:08:51Z.event_type=codeql-scanat 2026-09-26T23:21:22Z.codeql-dispatch/actionscontext exists.This is an exact controlled canary for the still-open owner acceptance gap: dispatch transport succeeds, but terminal cross-repository status publication and automatic exact-job settlement remain unproven. The leaf stays fail-closed; no rerun, dummy commit, workflow copy, or gate weakening was performed.
seonghobae commentedon Sep 27, 2026
Fresh same-repository acceptance canary from foundation PR #2385:
ContextualWisdomLab/.github#2385@8e1aba9ce1d52acb36f095da32511da06958733f, protected basemain@e6334e229581a918e2f22de18733b76fa65d7e7136233219805108403723721and actions108403723725: terminal FAILURE afterRead current-head CodeQL dispatch verdictsucceeded; both enforce steps receivedDISPATCH_OUTCOME=success,VERDICT_STATE=pending108465173387: later acquired a runner and completed the exactrepository_dispatchsuccessfullycodeql-dispatch/pythonorcodeql-dispatch/actionsterminal context existsThe PR is now Draft/Proposed. This specimen isolates the remaining owner lifecycle gap after successful transport: the canonical producer has not published/settled a terminal language verdict onto the exact required shards. Runtime Quality, Security Scan, SAST Semgrep, and Python Security are GREEN, so the available evidence does not establish a source/SARIF defect. No manual rerun, synthetic status, no-op wake, bypass, or merge was used.
seonghobae commentedon Sep 30, 2026
A new protected-main prerequisite was reproduced and repaired in Draft PR #2532 (
25af103312a0b837dd55ff19aefcdfb7954b54ab): Python 3.14 exposed unclosed file-likeHTTPErrorresponses in both authenticated GitHub REST clients after fail-closed redirect refusal. Exact protectedmain@37b10243...RED was8 failed, 26 passed; the repair gives34 passedfor that contract and preserves no-second-request/no-bearer-forwarding behavior. #2040 must adopt the protected merge before regenerating terminal-status evidence; stale predecessor reruns are not acceptance.seonghobae commentedon Sep 30, 2026
Fresh exact-head handoff specimen:
ContextualWisdomLab/Orgmetra#448@8f3cc0d7fd217cbc7f3b70431286110bbce71f4736275869718108800170144, python job108800170151DISPATCH_OUTCOME=successandVERDICT_STATE=pending, then failed withCodeQL scan dispatched. The dispatch workflow will rerun this exact failed CodeQL job after publishing its terminal verdict.The Orgmetra PR remains Draft and now links this canonical owner incident. No leaf rerun, no-op commit, predecessor evidence transfer, or success claim was used.
seonghobae commentedon Sep 30, 2026
Fresh exact-head terminal-receipt specimen — 2026-09-30T12:52Z
Target:
ContextualWisdomLab/.github#2532Exact head:
9d3ec75d6fbca20a6ac56de37408997fcafb01eaRequired CodeQL run:
36682527016, attempt 2Both compatibility shards failed at the same authenticated-receipt boundary:
109836593136109836593228Observed facts:
codeql-dispatch/<language>/<live_base_sha>;cwl1;h=9d3ec75d...;w=codeql-scan-dispatch;r=36682527016;s=<live_merge_sha>;RUN_ATTEMPT=2, both jobs correctly failed closed with:Exact CodeQL job was rerun without an authenticated terminal verdict;This is not evidence that the scan passed or failed, and it does not yet distinguish a still-queued/cancelled handler from a completed handler whose status publication/settlement failed. The complete producer run/job/artifact identity is still required before choosing a source repair. No manual rerun, synthetic status, permission broadening, or stale predecessor transfer was performed.
The merged #2405 complete-proof boundary is behaving correctly: incomplete producer evidence remains RED rather than false GREEN. #1929 remains open for the producer publication/settlement completion path.
seonghobae commentedon Sep 30, 2026
새로운 unchanged-head 소비자 증거입니다.
ContextualWisdomLab/learning-record-store#1exact heade916fa0f8214ff3e43e2a6f54a0773e95a0fd488, required CodeQL run33889519102(2026-09-30).Detect CodeQL languages와Dispatch current-head CodeQL scan은 성공했습니다.CodeQL compatibility analysis (python)job109848222111과(actions)job109848222250은 attempt 3에서 모두 실패했습니다.Exact CodeQL job was rerun without an authenticated terminal verdict; GHAS identity and preserved SARIF are required for authenticated terminal proof.DISPATCH_OUTCOME=failure, 빈VERDICT_STATE를 보고했습니다.33889519233, Security33889519453, Semgrep33889519344은 성공했습니다. 따라서 이 표본은 learning-record-store 소스 결함 또는 CodeQL 취약점 결과가 아니라, dispatch 후 authenticated terminal receipt 부재입니다.PR #1은 Draft/open으로 유지했고 CodeQL 실패를 성공으로 승격하거나 no-op commit/rerun으로 우회하지 않았습니다. #1929의 cross-repository terminal publication 및 unchanged-head proof acceptance가 충족되기 전에는 병합 근거가 아닙니다.
seonghobae commentedon Sep 30, 2026
Fresh unchanged-head canary from ContextualWisdomLab/ThreadWeave#44 (2026-09-30 UTC) confirms the terminal publication/wake gap remains reachable. Exact head
afa5378ec807fc69d6a394215b428e7f6367f120; CodeQL PR run36735357962. Detect job109955495217succeeded. Both compatibility jobs failed only atRelease runner or enforce current-head CodeQL verdict: python109955683373, actions109955683651. The fan-inDispatch current-head CodeQL scanjob109956035636completed success, but after the run became terminal no compatibility job had been rerun and no terminal current-head verdict was visible to the caller. Peer exact-head repository gates are clean: CI36735357918success (Python 3.10–3.14 + package), SAST36735358065success, Security36735358071success. This is not a ThreadWeave source finding; keep ThreadWeave#44 unmerged until an authenticated exact-head terminal CodeQL result exists.seonghobae commentedon Sep 30, 2026
새 unchanged-head CodeQL terminal-publication RCA (2026-10-01):
ContextualWisdomLab/learning-record-store#1@e916fa0f8214ff3e43e2a6f54a0773e95a0fd488의 CodeQL run 33889519102에서 python job 109848222111과 actions job 109848222250은 dispatch 뒤 세 번째 attempt까지Exact CodeQL job was rerun without an authenticated terminal verdict; GHAS identity and preserved SARIF are required로 fail-closed했습니다. 같은 exact head의 Quality 33889519233, SAST 33889519344, Security 33889519453은 success이므로 leaf source failure로 축소할 수 없습니다. 재실행만 반복하지 않았고, GHAS identity/SARIF-bound terminal receipt 수리가 canonical owner에서 필요합니다.seonghobae commentedon Sep 30, 2026
새 unchanged-head 소비자 증거입니다 (2026-10-01 KST).
ContextualWisdomLab/cwl-telemetry#1exact headab81a4d4d7b0754ec1064c2862a2fe27b69338b5, required CodeQL run36756390363.Detect CodeQL languagesjob110027600118은 성공했습니다.CodeQL compatibility analysis (python)job110027944286과(actions)job110027944330은 attempt 1에서 모두 실패했습니다.DISPATCH_OUTCOME=success,VERDICT_STATE=pending이며, exact error는CodeQL scan dispatched. The dispatch workflow will rerun this exact failed CodeQL job after publishing its terminal verdict.입니다.Dispatch current-head CodeQL scanjob110028879560은 성공했습니다. live PR/base/head 재검증, OIDC, repo-scoped app token, language matrix와 required job ID를 포함한repository_dispatch(codeql-scan-v2)전송까지 완료됐습니다.36756390393, SAST Semgrep36756390392, Security Scan36756390284은 성공했습니다.따라서 이 표본의 실패 경계는 leaf 소스/SARIF finding이 아니라 canonical
.githubterminal publication/continuation 경로입니다. manual rerun, no-op push, synthetic status, 권한 확대, 실패 Check 우회는 하지 않았습니다. acceptance는 unchanged head에 authenticated terminal verdict가 게시되고 동일 compatibility job이 그 증거를 소비해 재개되는 것입니다.seonghobae commentedon Oct 1, 2026
Fresh downstream evidence from ContextualWisdomLab/cwl-telemetry PR #1 at exact head
88d3fda62bd35a8808c2eaab0ad5cc590b705e5f:No manual rerun, empty commit, permission broadening, synthetic status, or gate bypass was used. This remains a canonical workflow trigger/terminal-evidence gap; the leaf PR stays unmerged pending a real exact-head result.
seonghobae commentedon Oct 1, 2026
Fresh cross-repository terminal-publication evidence routed from #2537 comment 5938121109 to this canonical owner.
Four current-head caller runs share the same causal boundary: repository dispatch succeeds, then the Python/Actions compatibility jobs fail at
Release runner or enforce current-head CodeQL verdictbecause no authenticated terminal verdict settles..github#2261@5f71d5f0…: CodeQL PR 36873538750; dispatch job110407534397GREEN; enforcement jobs110407190249/110407190617RED..github#2550@4743e7f8…: CodeQL PR 36872425316; dispatch110403499053GREEN; enforcement110403398483/110403398648RED.fast-mlsirm#2070@d42f64a0…: CodeQL PR 36892998059; dispatch110474201970GREEN; enforcement110473891881/110473891844RED.fast-mlsirm#2314@0538c1ec…: CodeQL PR 36882464526; dispatch110437854458GREEN; enforcement110437628981/110437629028RED.Standalone security/CodeQL evidence elsewhere does not satisfy the exact caller contract. This is continuation/terminal-receipt evidence, not a leaf source finding or permission for source-neutral reruns, synthetic status, or bypass. All four consumers remain Draft/merge HOLD.
seonghobae commentedon Oct 1, 2026
Fresh same-head terminal-publication canary from .github #2554 at exact
23fd3dd74181b816049bac4037ca4d696fcd551a:actionsandpythonsuccessfully.110585778515completed successfully after live head/base/source validation, OIDC acquisition, repository-scoped App token exchange, andcodeql-scan-v2publication bound to required run36926646328.110585680344(actions) and110585681209(python) both failed with exactDISPATCH_OUTCOME=success,VERDICT_STATE=pending:CodeQL scan dispatched. The dispatch workflow will rerun this exact failed CodeQL job after publishing its terminal verdict.36926646476, SAST36926646343, and Python Security36926646401succeeded.The PR is now Draft / merge HOLD. This is a canonical terminal-publication/continuation failure, not a sidecar-source vulnerability and not authority for manual rerun, no-op commit, synthetic status, or gate bypass.
seonghobae commentedon Oct 1, 2026
Fresh unchanged-head terminal-publication evidence from clearfolio#662 at exact
b1905cfb4b6500eb048f9829648e75096ed5e666:python,javascript-typescript,actions, andjava-kotlin.Release runner or enforce current-head CodeQL verdict; Python job110588179436recordsDISPATCH_OUTCOME=success,VERDICT_STATE=pending.110591410665revalidated the live exact head/base/source, obtained OIDC and the repository-scoped App token, bound the exact required job IDs, and successfully submitted onecodeql-scan-v2request.36926553965, Security36926553916, SAST36926554001, and fuzz36926553970are terminal GREEN.This is another canonical terminal-publication/continuation failure, not a leaf source or SARIF finding. The consumer remains Ready for review admission but unmerged. No manual rerun, no-op commit, synthetic status, state toggle, bypass, or predecessor evidence transfer was used.
seonghobae commentedon Oct 2, 2026
Current-head Ready admission gap — Korean writing skills #4 (2026-10-02 KST)
Actual ordinary repair
e59806d7abf3c7f13478e5997b4d0cbdb20f3ba6fixes 13 full-PR whitespace errors and preserves original evaluation hashes. Remote push and a single Ready transition are verified; no lifecycle cycling or no-op commit was used.The synchronize workflows captured Draft before Ready and no Ready-event successor appeared in the freshly enumerated consumer run list. Exact-head CodeQL run
36966902575is wholly SKIPPED, not GREEN. Strix36966901142and OpenCode36966901145also skipped actual model execution; Noema36966901172success is not an approval. SAST36966902465and Security Scan36966902494are terminal SUCCESS but cannot substitute for the missing scans/review.The canonical central
merge-schedulerhandler's actual protected-main source requiresOPENCODE_REPOSITORY_DISPATCH_TARGETSmembership. A direct read confirmsContextualWisdomLab/korean-writing-skillsis absent. I did not alter that authorization allowlist or send a request guaranteed to fail it. Please identify the authorized central operator and restore normal current-head required-workflow admission/CodeQL evidence via the existing owner path; do not reuse predecessor producer36930131832, synthesize a status, or manually rerun a compatibility shard without its bound terminal receipt.Independent approval and Strix scan can proceed independently: new supported, exact-target central requests were accepted and actually admitted as Noema
36967223479and Strix36967224264. Both have started real steps against this exact head, but no final verdict/approval is claimed yet. No duplicate requests will be submitted while these are active.PR #4 remains OPEN/Ready/BLOCKED/REVIEW_REQUIRED, Issue #2 remains OPEN, and no skill is installed. The two skill packages are locally verified and byte-identical to the reviewed predecessor; Mac/S1/S2 transfer dry-runs succeeded. Normal merge and actual merged-main deployment remain the completion condition.