Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
f45391d
fix(opencode): bound the required-verdict poll by wall clock, not jus…
seonghobae Sep 2, 2026
56258e2
merge: reconcile #1706 with current protected main
seonghobae Sep 2, 2026
ab0c19f
test(opencode): require event-driven verdict continuation before repair
seonghobae Sep 2, 2026
11600db
ci(temp): repair PR1706 one-shot runner release
seonghobae Sep 2, 2026
6934b0c
ci(temp): repair PR1706 repair-workflow parse failure
seonghobae Sep 2, 2026
30d50e9
ci(temp): retire failed PR1706 repair workflow
seonghobae Sep 2, 2026
874d5bd
ci(temp): add deterministic PR1706 repair driver
seonghobae Sep 2, 2026
0b533b2
ci(temp): rerun PR1706 repair with durable driver
seonghobae Sep 2, 2026
fd33bab
ci(temp): repair PR1706 workflow validation
seonghobae Sep 2, 2026
003d819
ci(temp): retire invalid PR1706 workflow identity
seonghobae Sep 2, 2026
3f0e03e
ci(temp): run PR1706 one-shot repair on fresh workflow identity
seonghobae Sep 2, 2026
323f002
ci(temp): fix PR1706 stale poll-test repair
seonghobae Sep 2, 2026
83b589b
test(opencode): bind exact-run wake to PR head association
seonghobae Sep 2, 2026
74886f6
fix(temp): harden PR1706 exact-run wake repair
seonghobae Sep 2, 2026
a49b52b
fix(temp): verify and self-retire PR1706 repair
seonghobae Sep 2, 2026
e80bf50
fix(opencode): repair one-shot wake and transport bounds
seonghobae Sep 2, 2026
afd936a
fix(opencode): repair deterministic publisher syntax
seonghobae Sep 2, 2026
7c50deb
fix(opencode): preserve stacked PR1706 repair responsibilities
seonghobae Sep 2, 2026
f103b1f
fix(temp): stop repaired PR1706 head from retriggering RED publisher
seonghobae Sep 2, 2026
4a36b89
fix(opencode): least-privilege PR1706 publisher
seonghobae Sep 2, 2026
b495148
ci(opencode): move PR1706 owner repair to slim runner
seonghobae Sep 2, 2026
d5c2dfd
fix(opencode): scope one-shot live PR repair
seonghobae Sep 2, 2026
45db4b3
fix(opencode): make exact-run wake resilient to transient lookup fail…
seonghobae Sep 2, 2026
29fa230
fix(opencode): restore valid source-fix workflow and lock wake retry …
seonghobae Sep 2, 2026
e6baae2
fix(opencode): repair exact-run wake and stale identity regressions
seonghobae Sep 2, 2026
31561b8
fix(opencode): simplify source-fix execution after parser failures
seonghobae Sep 2, 2026
044443c
fix(opencode): scope bounded transport repair to verdict job
seonghobae Sep 2, 2026
de9127d
fix(opencode): bind PR identity in every wake regression fixture
seonghobae Sep 2, 2026
c270fb4
ci(opencode): repair exact-run wake blob contract
seonghobae Sep 2, 2026
404e5b8
fix(opencode): require workflow-triggering repair publish
seonghobae Sep 2, 2026
1838f32
fix(opencode): unblock verified runner-release publication
seonghobae Sep 2, 2026
4b8692e
merge: reconcile PR1706 with protected main
seonghobae Sep 2, 2026
b8f8e6d
fix(opencode): publish verified repair through Git data handoff
seonghobae Sep 2, 2026
840845f
test(opencode): forbid heuristic wake retry allocation
seonghobae Sep 2, 2026
7318190
fix(opencode): stage event-driven verdict wake repair
seonghobae Sep 2, 2026
f097615
ci(opencode): execute event-driven wake RED-to-GREEN repair
seonghobae Sep 2, 2026
21bf1f7
fix(opencode): repair event wake source writer
seonghobae Sep 2, 2026
462857e
Merge remote-tracking branch 'origin/main' into HEAD
automation Sep 2, 2026
ec1f339
fix(opencode): reconcile required verdict by exact events
automation Sep 2, 2026
94a7504
fix(opencode): repair exact-head verdict reconciliation
seonghobae Sep 2, 2026
9d86a38
fix(opencode): stage formal-verdict source repair
seonghobae Sep 2, 2026
f16e5dd
fix(opencode): make formal-verdict materializer minimal
seonghobae Sep 2, 2026
1c1123c
fix(opencode): unify formal verdict authority repair
seonghobae Sep 2, 2026
31f2014
fix(opencode): make reconciliation repair executable
seonghobae Sep 2, 2026
e9bda72
test(opencode): unify formal verdict authority across reconciliation
seonghobae Sep 2, 2026
c0b5c57
fix(opencode): verify canonical formal-verdict regressions
seonghobae Sep 2, 2026
1046fa8
merge(main): reconcile OpenCode runner-release control plane
seonghobae Sep 2, 2026
d73a76d
fix(ci): harden PR 1706 repair publication
seonghobae Sep 2, 2026
b049398
test(opencode): fix stripped empty-verdict oracle
seonghobae Sep 2, 2026
c6b4e42
test(opencode): cover formal verdict publisher and timestamp races
seonghobae Sep 2, 2026
ca18858
test(opencode): align formal verdict contract with receipt authority
seonghobae Sep 2, 2026
af1b738
ci(opencode): trigger exact repair from PR synchronization
seonghobae Sep 2, 2026
b22b2a7
chore(opencode): retire unsafe PR1706 repair workflow
seonghobae Sep 2, 2026
a365362
fix(opencode): run formal-verdict owner repair on slim runner
seonghobae Sep 2, 2026
57e242f
test(opencode): reproduce formal-verdict reconciliation drift
seonghobae Sep 2, 2026
5c8e088
fix(temp): admit pre-existing PR1706 RED regression
seonghobae Sep 2, 2026
54b6f6a
fix(temp): make PR1706 transition guard exact
seonghobae Sep 2, 2026
aa1cd79
chore(temp): retire unregistered PR1706 repair workflow
seonghobae Sep 2, 2026
69a1a03
fix(temp): admit committed PR1706 RED contract
seonghobae Sep 2, 2026
39d542d
fix(opencode): reconcile exact-head formal verdict authority
seonghobae Sep 2, 2026
9b59c0d
Merge remote-tracking branch 'origin/main' into fix/opencode-poll-wal…
seonghobae Sep 4, 2026
90a2803
fix(review): narrow this PR to only the still-real allowlist gap
seonghobae Sep 4, 2026
5057df6
Merge branch 'main' into fix/opencode-poll-wall-clock-bound
opencode-agent[bot] Sep 5, 2026
0dc3605
Merge branch 'main' into fix/opencode-poll-wall-clock-bound
opencode-agent[bot] Sep 5, 2026
6c2e64a
Merge branch 'main' into fix/opencode-poll-wall-clock-bound
opencode-agent[bot] Sep 5, 2026
5a2b334
Merge branch 'main' into fix/opencode-poll-wall-clock-bound
opencode-agent[bot] Sep 5, 2026
ed5e201
merge: main@f2f91b80 into #1706 (fix/opencode-poll-wall-clock-bound)
seonghobae Sep 5, 2026
125c2a7
test(opencode): contract workflow actor verdict authority
seonghobae Sep 6, 2026
14344f7
test(opencode): cover both workflow verdict states
seonghobae Sep 7, 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
4 changes: 2 additions & 2 deletions .github/workflows/opencode-review.yml
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,7 @@ jobs:
.[]
| select(
(.user.login // "" | ascii_downcase) as $user
| $user == "opencode-agent" or $user == "opencode-agent[bot]"
| $user == "opencode-agent" or $user == "opencode-agent[bot]" or $user == "github-actions[bot]"
)
| select((.commit_id // "" | ascii_downcase) == ($sha | ascii_downcase))
| select(.state == "APPROVED" or .state == "CHANGES_REQUESTED")
Expand All @@ -505,7 +505,7 @@ jobs:
end
')"
if [ -z "$verdict" ]; then
echo "::error::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."
echo "::error::No APPROVED or CHANGES_REQUESTED from an authorized OpenCode formal-review publisher on the current head. The dispatch workflow will rerun this failed job after publishing an authenticated exact-head verdict."
exit 1
fi
echo "Current-head OpenCode verdict: ${verdict}."
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
### CodeQL scan dispatch matrix serialisation

- Serialised the dispatched CodeQL matrix with `toJSON()` in `codeql-scan-dispatch.yml`. `codeql-pr.yml` sends `client_payload.matrix` as an array and the handler assigned it straight into `env:`, where a value must be a scalar, so GitHub rejected the step with "A sequence was not expected" and the dispatched scan never ran -- 0 successes against 136 failures since the handler was added in #1776. The validate step already consumes the value through `jq`, so JSON text is the shape it was written for and no consumer changes. Added a string contract test, because neither `yaml.safe_load` nor `actionlint` 1.7.12 flags this: it is an Actions template rule, so only GitHub's own validator rejects it and no local gate catches the class.
### Required OpenCode formal-review publisher alignment

- **Accept `github-actions[bot]` in the required OpenCode check's own verdict lookup.** `scripts/ci/opencode_review_receipt_gate.py`'s `FORMAL_AUTHORS` allowlist already accepted `github-actions[bot]` as a formal reviewer, but the required check's own jq verdict-matching in `opencode-review.yml` only recognized `opencode-agent`/`opencode-agent[bot]` — so the receipt gate could wake a run for a `github-actions[bot]` review that the required job's own admission logic would never actually recognize. Fixed the inconsistency; no other behavior change.
Comment thread
seonghobae marked this conversation as resolved.

### Contextual-orchestrator pin refresh

Expand Down
9 changes: 9 additions & 0 deletions docs/product-technical-gap-baseline.md
Original file line number Diff line number Diff line change
Expand Up @@ -2649,6 +2649,15 @@ Higgins, S. S., Crepalde, N., & Fernandes, L. (2021). Segmented multiplexity: A

**Follow-up.** If the organization later solves free+ZDR routing robustly enough to deliberately widen required-review CI to `orchestrator/auto` (e.g. once a spend ceiling and reviewer-visible cost evidence exist for that path), the change is exactly one `case` arm plus the corresponding assertions in `test_sidecar_pins_the_pool_to_free_for_github_actions` — this entry is the record of *why* it was narrowed, not a permanent prohibition.


### OPENCODE-EVENT-DRIVEN-REQUIRED-WAKE-2026-09-02 (reconciled 2026-09-05, scope narrowed)
- Gap, as originally scoped: Required OpenCode verdict admission occupied a hosted runner while waiting; an intermediate repair then introduced fixed dispatch retry/sleep/transport allocations (`12`, `5s`, `30s`) without a governing model or standard; the required check's own verdict lookup was also inconsistent with `scripts/ci/opencode_review_receipt_gate.py`'s `FORMAL_AUTHORS` allowlist.
- Causal owner: `ContextualWisdomLab/.github` required review and merge-control workflows.
- **2026-09-05 reconciliation: two of this PR's three proposed changes are now superseded by separately-merged, later work; only the allowlist fix survives.** `#1830` ("release required runner after dispatch," merged 2026-09-04) independently rewrote `opencode-review.yml`'s fail-closed step to one live PR read plus one Reviews read with immediate fail-closed, achieving the runner-release goal a different way, and its own `tests/test_opencode_required_rerun_capacity.py` still expects `opencode-review-dispatch.yml`'s wake step to keep its original 12-attempt loop and `.head_sha`-based run matching — this PR's proposed single-lookup/`pull_requests[]`-matching replacement for that step directly contradicts that already-tested, already-shipping design, so it was dropped rather than pushed through over a live test disagreement. Separately, `#1840` ("stop required-check completion fanout," merged 2026-09-04) deliberately removed every `workflow_run:` listener from `pr-review-merge-scheduler.yml` in favor of GitHub's native auto-merge; this PR's proposed `reconcile-opencode-required-verdict` `workflow_run: completed` handler would reintroduce exactly the mechanism `#1840` retired, so it was also dropped. Both reverted pieces' dedicated test files (`test_opencode_event_driven_required_wake.py`, `test_opencode_formal_verdict_authority_contract.py`, `test_opencode_required_verdict_reconciliation_contract.py`, `test_opencode_required_verdict_runner_release.py`) were removed with them rather than left testing dead code.
- Repair proposed on this PR branch: the required check's verdict lookup in `opencode-review.yml` accepts `github-actions[bot]` alongside `opencode-agent`/`opencode-agent[bot]`, matching the receipt gate's own allowlist. Nothing else changes.
- Verification contract: `tests/test_opencode_required_verdict_regression.py` directly executes the production jq filter and requires an exact-head `github-actions[bot]` `APPROVED` verdict to be admitted, while its existing negative actor and stale/fallback cases remain fail-closed. Fresh hosted checks on the unchanged final head remain authoritative.
- Status: Proposed on this PR branch and not yet protected-main authority. Integrate only through ordinary protection after fresh exact-head checks and review are terminal-clean; the other two proposed changes are superseded and not pursued further.

## 2026-09-02 org-queue-sweep investigation: historical conclusion superseded by PR #1821

**Current status (2026-09-04).** The conclusion below was invalidated by live queue evidence. PR #1821 removed the organization-wide Actions-run inventory and cancellation block from `org-queue-sweep` and merged as `11bb6a7871f4d95ab8a3eab616b4264d02327010`. Native per-PR concurrency and the current-head coalescer now own stale-run cancellation; the scheduled sweep retains only missed review, merge, and branch-update recovery. Focused ownership contracts passed 78 tests before merge. This preserves the event-gap recovery described below without paying the repository-wide run-listing and cancellation API cost.
Expand Down
11 changes: 11 additions & 0 deletions tests/test_opencode_required_verdict_regression.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,17 @@ def test_runtime_required_verdict_ignores_later_nonformal_current_head_comment(
) == state


@pytest.mark.parametrize("state", ("APPROVED", "CHANGES_REQUESTED"))
def test_runtime_required_verdict_accepts_github_actions_formal_publisher(
state: str,
) -> None:
"""The canonical workflow actor can publish either exact-head formal verdict."""
body = "deterministic fallback approval" if state == "CHANGES_REQUESTED" else ""
workflow_actor = review(state=state, body=body)
workflow_actor["user"] = {"login": "github-actions[bot]"}
assert runtime_verdict([workflow_actor]) == state


def test_runtime_required_verdict_rejects_other_actor() -> None:
"""A non-OpenCode formal review cannot satisfy the runtime filter."""
human = review(state="APPROVED")
Expand Down
Loading