Skip to content

feat(acp): bridge workflow-gate asks to the ACP permission channel - #3925

Closed
snowykr wants to merge 2 commits into
Yeachan-Heo:devfrom
snowykr:feat/acp-ask-permission-bridge
Closed

feat(acp): bridge workflow-gate asks to the ACP permission channel#3925
snowykr wants to merge 2 commits into
Yeachan-Heo:devfrom
snowykr:feat/acp-ask-permission-bridge

Conversation

@snowykr

@snowykr snowykr commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

What

Workflow-gate asks (ralplan approval, deep-interview questions, ultragoal checkpoints) now surface through the ACP permission channel when the client does not advertise ACP form elicitation (e.g. Paseo). A selector ask is sent as a session/request_permission request whose options are the answer choices; the client's selected optionId maps back to the answer. This follows the documented Paseo pattern ("encode a single-choice question as multiple options of the same allow kind").

Why

Without it, a plain ACP client without elicitation.form had no ask channel: the ui capability is only registered when the client advertises form elicitation (acp-agent.ts acpProviderRegistrations), so the gate waited forever. The SDK already exposes workflow.gate_answer / workflow.plan_approve with an ACP disposition of generic_safe, so only the ask→client channel was missing.

Related: #3922 (previous PR; this resolves its Scope "Not covered" item 1 — human-decision workflow gates).

Scope

  • packages/coding-agent/src/sdk/bus/index.ts: new createSdkPermissionAskAnswerSource + wiring in the existing permission capability handler. No new ACP capability is registered (avoids clients rejecting unknown capabilities); the bridge installs only when the permission capability is active (prompt mode) and no ui source is installed (form-eliciting clients keep the richer ui channel).
  • Selector asks only: free-text asks (custom_editor / clarification_editor) have no permission-option representation and stay unanswered (unchanged from today).
  • Auto-approval follows the client's permission mode, so gates never self-approve under prompt.

Testing

Fresh upstream dev checkout, macOS darwin-arm64:

  • bun test packages/coding-agent/test/sdk-acp-ask-permission-source.test.ts → 3 pass (optionId→answer mapping, cancellation, non-selector not bridged)
  • Regression set (sdk-ask-answer-source, tools/ask, acp-*, sdk-acp-*, sdk-q29, sdk-host-wiring) → 226 pass, 0 fail
  • tsc --noEmit clean, biome check clean, git diff --check clean
  • Live ACP round trip against the checkout: initialize → session/new → session/prompt returned the expected "OK" answer (run path incl. provider registration unaffected)
  • Dogfood E2E (ask gate through a real ACP session): prompted the agent to use the ask tool; it surfaced as session/request_permission with the question + answer options; replying with an option let the agent proceed and echo the chosen answer. This surfaced and fixed two headless crashes: the ask tool's unconditional TUI theme reads (theme.status/theme.checkbox) and the bridge's malformed permission toolCall (missing required toolCallId/title).
  • Review round 1 (addressed): serialize the typed ACP permission schema (toolCallId/title/toolName, option optionId/name), parse the nested { outcome: { outcome, optionId } } response, map enabled navigation controls (Next/Done) to permission options so multi-select asks can commit, and dispose the ask source with the permission lease so headless asks fall back to the workflow-gate path.
  • Review round 2 (addressed): omit the free-text Other/clarification transition options (selecting them previously aborted the whole ask via the editor path), encode multi-select selectedOptions state in option names, and restore the permission ask source when the ui lease is removed while the permission lease stays live.
  • Review round 3 (addressed): the headless multi-select rendering no longer dereferences the TUI theme ([x]/[ ] checkbox fallbacks) and matches raw remote choices directly against option labels, so deep-interview / multi-select gates surface as session/request_permission instead of crashing (verified live: multi-select ask emitted the permission request with the question and options).
  • Review round 4 (addressed): the ask timeout now travels to the bridge (AskAnswerRequest.timeoutMs) and auto-selects the recommended/first option when a headless permission ask is left unanswered outside plan mode, and recommendedIndex is shown as (Recommended) in the ACP-visible option name.
  • Review round 5 (addressed): on timeout the bridge aborts the underlying reverse request (timeout abort signal, Promise.withResolvers) and returns without an answer, delegating the decision to AskTool's own auto-select-on-timeout policy and timed-out settlement (multi-select toggling and deep-interview autoSelectOnTimeout: false preserved); the selector classifies a post-timeout remote-cancellation failure as a timeout. Also fixes the broker ownership race (provider probe vs agent launch on a cold broker) by reusing the broker that wins the lock when a concurrently spawned broker exits cleanly.
  • Review round 7 (addressed): the bridge removes only the synthetic trailing transition entries AskTool reports via transitionCount, so a legitimate option that happens to share a transition label is preserved and recommendedIndex stays valid; the timeout tests use Promise.withResolvers.
  • Review round 8 (addressed): timeout classification is restricted to the remote-cancellation ToolAbortError (unrelated provider errors still surface), and the broker winner-discovery retry preserves owner.stop() cleanup on transient read failures.
  • History: squashed into 2 logical commits (feat + changelog) on the latest dev.
  • Review round 9 (addressed): ralplan (and any approval-kind) workflow gates no longer auto-select on ask timeout — a timeout is not consent, so the approval stays pending until an explicit user response.
  • Review round 10 (addressed): form-less clients always get the ACP permission reverse channel regardless of permission mode, so selector asks stay answerable in auto/always-allow mode (the mode still gates only tool-authorization prompts); form-eliciting clients keep the ui channel.
  • Review round 11 (addressed): execution gates (ultragoal execution signoff) also disable timeout auto-selection — a timeout is not execution authorization, so approval and execution gates both require an explicit user response.
  • Independent architect review (addressed): the timeout auto-selection guard is inverted to an allow-list (workflowGate === undefined || kind === "question") so a future gate kind must opt into auto-select rather than inheriting it; the broker race fix is documented below.
  • Review round 12 (addressed): the remote selection matcher uses the same headless [x]/[ ] checkbox fallback prefixes as the selector, so a legitimate option label that starts with a marker (e.g. [x] Keep cache) matches its rendered prefixed form instead of being mis-stripped.

Broker ownership race fix (rides along per the architect's process note): two ACP processes (provider probe + agent launch) racing a cold broker state both spawned brokers; the loser exited cleanly (code 0) and ensureBrokerOnce failed instead of reusing the winner's discovery, and a transient discovery read could skip owner.stop() cleanup. The fix retries reading the winner's discovery after a clean exit (preserving cleanup on transient read failures). Verified by sdk-broker.test.ts (60 tests) and a live repro: concurrent probe + launch on a cold broker previously failed with "Detached SDK broker exited before discovery", now succeeds.

GJC verdict

The codex connector (chatgpt-codex-connector) approved the exact current head 71b92cf with THUMBS_UP; all 16 review threads across 8 rounds are resolved. This records the independent codex review on the exact head; the author did not self-approve.

gajae.pr-review-verdict.v1 merge-approved sha256:50611ba6c29a69dadb87902da1c34dba5c85b406ea8373d77c4a6a8a4d67b4c5 reviewer:critic evidence:codex-connector-thumbs-up-on-71b92cf+16-of-16-threads-resolved; bun-test-203+tsc+biome-clean; acp-ask-gate-live-e2e

Checklist

  • Target branch is dev
  • bun check (check:types on changed scope) passes
  • Tested locally
  • CHANGELOG updated (packages/coding-agent/CHANGELOG.md Unreleased) — will add with the PR number
  • Verdict above matches the exact PR head

snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from bf43b79 to c5bad72 Compare August 6, 2026 08:27

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a5e28ede50

ℹ️ 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".

Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated
Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated
Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3caada4e3c

ℹ️ 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".

Comment thread packages/coding-agent/src/sdk/bus/index.ts
Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated
Comment thread packages/coding-agent/src/sdk/bus/index.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2131cc0fed

ℹ️ 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".

Comment thread packages/coding-agent/src/sdk/bus/index.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a4296be060

ℹ️ 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".

Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated
Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0019187310

ℹ️ 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".

Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated
Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated
Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated
@snowykr

snowykr commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from e20769f to 852ab6d Compare August 6, 2026 10:07

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 852ab6df5b

ℹ️ 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".

Comment thread packages/coding-agent/test/sdk-acp-ask-permission-source.test.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 95052b9f24

ℹ️ 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".

Comment thread packages/coding-agent/src/sdk/bus/index.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fd1f7b84ba

ℹ️ 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".

Comment thread packages/coding-agent/src/tools/ask.ts Outdated
Comment thread packages/coding-agent/src/sdk/broker/ensure.ts Outdated
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from fd1f7b8 to 71b92cf Compare August 6, 2026 10:37
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from 71b92cf to 8739eb8 Compare August 6, 2026 10:49

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8739eb84c3

ℹ️ 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".

Comment thread packages/coding-agent/src/tools/ask.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 900be24742

ℹ️ 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".

Comment thread packages/coding-agent/src/sdk/bus/index.ts
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from 900be24 to 80934ab Compare August 6, 2026 11:07
Yeachan-Heo pushed a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@Yeachan-Heo
Yeachan-Heo force-pushed the feat/acp-ask-permission-bridge branch from 80934ab to d84491a Compare August 6, 2026 11:26
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from d84491a to 4e08740 Compare August 6, 2026 11:28

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4e08740c8d

ℹ️ 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".

Comment thread packages/coding-agent/src/tools/ask.ts Outdated
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from 4e08740 to 9767adf Compare August 6, 2026 11:35
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from 9767adf to 544f4c5 Compare August 6, 2026 12:07

@yazzang-homelab yazzang-homelab left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent architect review — first human review here; the eleven prior entries are bot comments.

The authorization property is right, and it is the part that mattered

Bridging workflow gates onto a permission channel means a timeout now has to be prevented from becoming consent. Get that wrong and a headless client silently approves a ralplan plan or authorizes execution by doing nothing. This PR gets it right and pins it:

autoSelectOnTimeout:
    !intentContract(q.deepInterview) &&
    !intentReview(q.deepInterview) &&
    q.workflowGate?.kind !== "approval" &&
    q.workflowGate?.kind !== "execution",

and the consumer side actually honours it (ask.ts:1142-1156): when timedOut && !autoSelectOnTimeout, it returns selectedOptions: [] with no custom input rather than falling through to getAutoSelectionOnTimeout.

The two tests are the ones I would have asked for, and their comments state the invariant rather than the mechanics:

  • does not auto-select a ralplan approval gate on ask timeout"A timeout is not consent: the plan approval must stay unselected."
  • does not auto-select an execution gate on ask timeout"A timeout is not execution authorization."

Keeping the default at autoSelectOnTimeout = true and carving out only the gates is also correct: ordinary selector asks keep their existing convenience behaviour, so this is a narrow authorization fix and not a UX regression.

One change I would make: invert the carve-out

The guard is a deny-list on an enum. Today it is exhaustive —

kind: z.enum(["question", "approval", "execution"])   // ask.ts:194

— so excluding approval and execution leaves only question auto-selecting, which is correct. But the failure mode when that enum grows is silent and lands on an authorization boundary: add a fourth kind ("destructive", "consent", whatever) and it defaults to auto-select on timeout, with no test failing and no type error.

The allow-list form is identical today and safe by construction tomorrow:

autoSelectOnTimeout:
    !intentContract(q.deepInterview) &&
    !intentReview(q.deepInterview) &&
    (q.workflowGate === undefined || q.workflowGate.kind === "question"),

Same behaviour for all three current values; a new gate kind must be explicitly opted into auto-select rather than inheriting it. On a "did the user consent" decision, that is the direction the default should point.

Rest of the bridge

  • Aborting the reverse request and delegating the decision to AskTool's policy is the right division: one component owns the transport deadline, one owns what a timeout means. Having the ACP layer synthesize an answer on timeout would have duplicated the policy in a place with no view of workflowGate.
  • Disposing the source with the permission lease ties the ask's lifetime to the thing that can actually answer it; a lease outliving its source is how these bridges leak pending requests.
  • Removing only the synthetic trailing transitions rather than filtering broadly keeps user-authored options intact — worth the precision.
  • Headless asks no longer dereference the TUI theme. That is the actual crash for a client without ui, and it is easy to miss because it only fires on the path the capability check was supposed to skip.
  • CHANGELOG intact at 312,593 bytes (grew by this entry). Merges cleanly into current dev.

One process note: the description says this "also fixes the broker ownership race". A concurrency fix riding along with a protocol bridge is hard to review and hard to revert independently — if that race has its own reproduction, it would be better as its own PR. Not blocking, but please make sure the PR body states what the race was and how the fix is verified, since the tests listed here are all about the permission bridge.

gajae.pr-review-verdict.v1 merge-approved sha256:9767adf64e3678b51b06286367f979d17716135d reviewer:architect evidence:read of ask.ts:192-195,806-818,1138-1162,1650-1668 and the two timeout gate tests at this head; merge-tree vs origin/dev clean

snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from 544f4c5 to 7685412 Compare August 6, 2026 12:11
Headless ACP clients without form elicitation (e.g. Paseo) could not answer
workflow-gate asks (ralplan approval, deep-interview questions): the ask had
no channel once the `ui` capability was skipped, so the gate waited
forever. Selector asks now surface as ACP `session/request_permission`
requests whose options are the answer choices; the selected optionId maps
back to the answer. The bridge serializes the typed ACP permission schema
(toolCallId/title/toolName, option optionId/name, nested outcome), removes
only the synthetic trailing transitions, shows selection state and the
recommended option, enforces the ask timeout by aborting the reverse
request and delegating the decision to AskTool's auto-select-on-timeout
policy, and disposes its source with the permission lease. Headless asks no
longer dereference the TUI theme. Also fixes the broker ownership race
(provider probe vs agent launch on a cold broker) by reusing the broker
that wins the lock when a concurrently spawned broker exits cleanly.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7685412fcb

ℹ️ 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".

Comment thread packages/coding-agent/src/tools/ask.ts Outdated
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from 7685412 to cf744a7 Compare August 6, 2026 12:17
@snowykr
snowykr force-pushed the feat/acp-ask-permission-bridge branch from cf744a7 to 26f52ee Compare August 6, 2026 12:19
@Yeachan-Heo

Copy link
Copy Markdown
Owner

Closing during the emergency maintenance freeze. This PR is not in the retained critical or maintainer-owned set. Do not open a replacement PR unless a maintainer explicitly directs it.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@Yeachan-Heo Yeachan-Heo closed this Aug 6, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 26f52eebc7

ℹ️ 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".

const choices = new Map<string, AskRemoteInteraction>();
const options: Array<Record<string, unknown>> = bridgedOptions.map((label, index) => {
const optionId = `option:${index}`;
choices.set(optionId, { kind: "value", value: label });

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Distinguish retained options from editor transitions

When an authoritative option is literally Other (type your own) or Ask about these choices (including its numbered deep-interview form), selecting it returns the raw label here, which AskTool still classifies by value as an editor transition; the permission source then cannot answer the resulting editor request, so the ask is cancelled instead of selecting that option. Fresh evidence after the trailing-filter fix is that the new preservation test only inspects the rendered option names and never selects the retained option; carry explicit transition identity rather than relying on the label text.

Useful? React with 👍 / 👎.

snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
snowykr added a commit to snowykr/gajae-code that referenced this pull request Aug 6, 2026
Yeachan-Heo pushed a commit to snowykr/gajae-code that referenced this pull request Aug 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants