GPT Pro Review Probe
Use this skill for the high-frequency review loop: repeatedly send a specific
idea, proposal, or atomic sub-task to GPT Pro as an adversarial reviewer, across
several research lines running in parallel.
A Review Probe is a standalone, single-round Bridge Thread. It never
attaches to a Bridge Project, so it never consults Project source-sync and is
never blocked when unrelated shared Project sources are stale or missing.
Each probe is its own thread with its own ledger, so many probes run in parallel
safely; only browser-mutating critical sections are serialized by a
repository-local advisory lease. Across worktrees, use one declared dispatcher.
This skill builds on gpt-pro-question-window
for the browser and persistence seam. Read
its bridge protocol
for IDs, events, and invariants.
When to use it
- Reviewing one mature idea, proposal, or atomic sub-task from one line.
- Running several such reviews across research lines at the same time.
- Any round where GPT Pro only needs the scoped bundle, not shared Project context.
Do NOT use it when the round genuinely needs shared durable Project sources
(a project brief, glossary, standing PRD). Use gpt-pro-project-workspace then.
Never let a probe author research judgment: its result is external pressure only,
recorded in the owning research system, never a decision.
Probe identity
bridge_thread_id = <track>-<candidate>-<probe-slug>-<yyyymmdd>
e.g. m-ai-c14-reward-leakage-20260809
track and candidate are opaque passthrough labels; Bridge never parses them.
One probe = one thread = one codex-snapshot → gpt-exchange → codex-verdict
round = disposable.
Required flow
Open the probe — writes the immutable Codex snapshot and the standalone bundle:
python3 .agents/skills/gpt-pro-review-probe/scripts/open_review_probe.py \
--repo . \
--track m-ai --candidate c14 --probe-slug reward-leakage \
--goal "<what GPT Pro should review>" \
--question "<focused question>" \
--summary-file /tmp/probe-notes.md \
--mode algorithm_review --repo-context auto
It prints probe_thread_id, codex_notes, and bundle. It never runs
source-sync and never asks for Project confirmation.
Use the DevTools-first route in the Question Window's
browser adapter reference,
then acquire the browser lease before touching the signed-in Chrome profile:
python3 .agents/skills/gpt-pro-question-window/scripts/manage_browser_lease.py \
--repo . acquire --holder <worker-id> \
--bridge-thread-id <probe_thread_id> \
--expected-conversation-id <reserved-chat-id>
Chrome DevTools MCP is the primary route. The connector is permitted only
for the documented pre-submit fallback. The lease serializes browser
mutations within this repository regardless of route. Across repositories,
worktrees, or SSH execution hosts that share one browser profile, use one
declared dispatcher.
Upload the bundle through DevTools MCP and a visible semantic control.
Record devtools-mcp-upload-file; record codex-chrome-visible-menu only
when the compatibility fallback was actually required. When execution is
remote over SSH, first stage the bundle on the browser host and verify its
digest. Then gate the submission with
check_browser_preflight.py, passing --repo, --bridge-thread-id, the
--browser-lease-token, --expected-conversation-id, and the
--observed-conversation-id read from the browser. The gate fails closed on
an expired/wrong lease, the wrong model, the wrong attachment, or the wrong
chat. Before Send, also save the existing turn IDs or cursor and prompt
digest as the pre-submit boundary.
Send once. After ChatGPT visibly accepts the prompt, record the submission
time and target turn ID when available, then release the lease immediately:
python3 .agents/skills/gpt-pro-question-window/scripts/manage_browser_lease.py \
--repo . release --token <token>
Use Codex's native read_thread on the exact reserved ChatGPT conversation.
Match the new user turn after the saved boundary, pin its remote turn ID, and
accept only its completed, untruncated assistant reply. Then capture with
save_bridge_turn.py --standalone --single-round --capture-route native-read-thread --remote-turn-id <turn-id>. Do not pass the released
browser token. Record the Codex verdict separately.
If the native result is unavailable, ambiguous, or truncated, acquire a
new browser lease, locate the already pinned turn by ID and prompt
fingerprint, and capture its full direct reply with --capture-route browser-fallback --remote-turn-id <same-turn-id> --browser-lease-token <new-token>. Never use the page's latest response by position. Release the
new lease in all terminal paths.
When an immediate bounded wait is not appropriate, use one current-task
heartbeat to poll read_thread. Keep unchanged checks silent and retain the
returned automation ID. On capture, explicit failure, or timeout, delete the
heartbeat before the single terminal notification. If deletion fails on any
terminal path, pause it and report that cleanup failure once. Never let it
resubmit.
open_review_probe.py prints a handoff outline for steps 2–7 with the resolved
thread id and bundle path; scheduled-task creation and browser actions remain
host-tool operations rather than shell commands.
Parallel operation
- Runs in parallel across lines:
open_review_probe.py (snapshot + bundle),
and the local Codex verdict. Each probe is a distinct thread with its own lock
and ledger, so concurrent probes never fork or block each other.
- Serialized on one resource: each browser-mutating window (attach/upload/
preflight/Send, plus a browser fallback capture) is behind the browser lease.
The lease is released while remote generations run, so several generations
may remain in flight without several workers driving Chrome at once.
- SSH boundary: remote repository or compute work may run in parallel, but
the browser-host dispatcher owns staging, upload, preflight, and Send. A
remote Codex process does not inherit access to the operator's local Chrome.
- Contamination guard: the conversation-id gate makes "right Project, wrong
chat" fail closed, so a probe's result can never be recorded against the wrong
chat. Record
observed_conversation_id on each turn for later reconciliation.
Non-negotiable checks
- A probe is standalone: it must not attach to a Bridge Project.
--standalone
fails closed if the thread is attached.
- One round per probe:
--single-round refuses a second exchange on a thread.
- Verify locally before trusting a result; keep GPT Pro output as pressure only.
- Never send while another probe holds the browser lease; never bypass the
conversation-id gate.
- Never capture "the latest turn" by position alone; bind the response to the
post-submit remote turn ID. A truncated native item is not a raw answer.
1---2name: gpt-pro-review-probe3description: Fast lane for high-frequency, fine-grained, parallel GPT Pro review. Send one mature idea, research proposal, or atomic sub-task from one research line to GPT Pro as a standalone, single-round Review Probe that never touches the Bridge Project source-sync gate, so unrelated stale shared sources never block it and many probes run in parallel. Use when reviewing per-idea/per-proposal/per-task across several research lines at once; use gpt-pro-question-window or gpt-pro-project-workspace when a round genuinely needs shared durable Project context.4---56# GPT Pro Review Probe78Use this skill for the high-frequency review loop: repeatedly send a specific9idea, proposal, or atomic sub-task to GPT Pro as an adversarial reviewer, across10several research lines running in parallel.1112A **Review Probe** is a `standalone`, single-round Bridge Thread. It never13attaches to a Bridge Project, so it never consults Project source-sync and is14**never blocked when unrelated shared Project sources are stale or missing**.15Each probe is its own thread with its own ledger, so many probes run in parallel16safely; only browser-mutating critical sections are serialized by a17repository-local advisory lease. Across worktrees, use one declared dispatcher.1819This skill builds on [gpt-pro-question-window](../gpt-pro-question-window/SKILL.md)20for the browser and persistence seam. Read21[its bridge protocol](../gpt-pro-question-window/references/bridge_protocol.md)22for IDs, events, and invariants.2324## When to use it2526- Reviewing one mature idea, proposal, or atomic sub-task from one line.27- Running several such reviews across research lines at the same time.28- Any round where GPT Pro only needs the scoped bundle, not shared Project context.2930Do NOT use it when the round genuinely needs shared durable Project sources31(a project brief, glossary, standing PRD). Use `gpt-pro-project-workspace` then.32Never let a probe author research judgment: its result is external pressure only,33recorded in the owning research system, never a decision.3435## Probe identity3637```text38bridge_thread_id = <track>-<candidate>-<probe-slug>-<yyyymmdd>39 e.g. m-ai-c14-reward-leakage-2026080940```4142`track` and `candidate` are opaque passthrough labels; Bridge never parses them.43One probe = one thread = one `codex-snapshot → gpt-exchange → codex-verdict`44round = disposable.4546## Required flow47481. Open the probe — writes the immutable Codex snapshot and the standalone bundle:4950 ```bash51 python3 .agents/skills/gpt-pro-review-probe/scripts/open_review_probe.py \52 --repo . \53 --track m-ai --candidate c14 --probe-slug reward-leakage \54 --goal "<what GPT Pro should review>" \55 --question "<focused question>" \56 --summary-file /tmp/probe-notes.md \57 --mode algorithm_review --repo-context auto58 ```5960 It prints `probe_thread_id`, `codex_notes`, and `bundle`. It never runs61 source-sync and never asks for Project confirmation.62632. Use the DevTools-first route in the Question Window's64 [browser adapter reference](../gpt-pro-question-window/references/browser_adapters.md),65 then acquire the browser lease before touching the signed-in Chrome profile:6667 ```bash68 python3 .agents/skills/gpt-pro-question-window/scripts/manage_browser_lease.py \69 --repo . acquire --holder <worker-id> \70 --bridge-thread-id <probe_thread_id> \71 --expected-conversation-id <reserved-chat-id>72 ```7374 Chrome DevTools MCP is the primary route. The connector is permitted only75 for the documented pre-submit fallback. The lease serializes browser76 mutations within this repository regardless of route. Across repositories,77 worktrees, or SSH execution hosts that share one browser profile, use one78 declared dispatcher.79803. Upload the bundle through DevTools MCP and a visible semantic control.81 Record `devtools-mcp-upload-file`; record `codex-chrome-visible-menu` only82 when the compatibility fallback was actually required. When execution is83 remote over SSH, first stage the bundle on the browser host and verify its84 digest. Then gate the submission with85 `check_browser_preflight.py`, passing `--repo`, `--bridge-thread-id`, the86 `--browser-lease-token`, `--expected-conversation-id`, and the87 `--observed-conversation-id` read from the browser. The gate fails closed on88 an expired/wrong lease, the wrong model, the wrong attachment, or the wrong89 chat. Before Send, also save the existing turn IDs or cursor and prompt90 digest as the pre-submit boundary.91924. Send once. After ChatGPT visibly accepts the prompt, record the submission93 time and target turn ID when available, then release the lease immediately:9495 ```bash96 python3 .agents/skills/gpt-pro-question-window/scripts/manage_browser_lease.py \97 --repo . release --token <token>98 ```991005. Use Codex's native `read_thread` on the exact reserved ChatGPT conversation.101 Match the new user turn after the saved boundary, pin its remote turn ID, and102 accept only its `completed`, untruncated assistant reply. Then capture with103 `save_bridge_turn.py --standalone --single-round --capture-route104 native-read-thread --remote-turn-id <turn-id>`. Do not pass the released105 browser token. Record the Codex verdict separately.1061076. If the native result is unavailable, ambiguous, or `truncated`, acquire a108 new browser lease, locate the already pinned turn by ID and prompt109 fingerprint, and capture its full direct reply with `--capture-route110 browser-fallback --remote-turn-id <same-turn-id> --browser-lease-token111 <new-token>`. Never use the page's latest response by position. Release the112 new lease in all terminal paths.1131147. When an immediate bounded wait is not appropriate, use one current-task115 heartbeat to poll `read_thread`. Keep unchanged checks silent and retain the116 returned automation ID. On capture, explicit failure, or timeout, delete the117 heartbeat before the single terminal notification. If deletion fails on any118 terminal path, pause it and report that cleanup failure once. Never let it119 resubmit.120121`open_review_probe.py` prints a handoff outline for steps 2–7 with the resolved122thread id and bundle path; scheduled-task creation and browser actions remain123host-tool operations rather than shell commands.124125## Parallel operation126127- **Runs in parallel across lines:** `open_review_probe.py` (snapshot + bundle),128 and the local Codex verdict. Each probe is a distinct thread with its own lock129 and ledger, so concurrent probes never fork or block each other.130- **Serialized on one resource:** each browser-mutating window (attach/upload/131 preflight/Send, plus a browser fallback capture) is behind the browser lease.132 The lease is released while remote generations run, so several generations133 may remain in flight without several workers driving Chrome at once.134- **SSH boundary:** remote repository or compute work may run in parallel, but135 the browser-host dispatcher owns staging, upload, preflight, and Send. A136 remote Codex process does not inherit access to the operator's local Chrome.137- **Contamination guard:** the conversation-id gate makes "right Project, wrong138 chat" fail closed, so a probe's result can never be recorded against the wrong139 chat. Record `observed_conversation_id` on each turn for later reconciliation.140141## Non-negotiable checks142143- A probe is standalone: it must not attach to a Bridge Project. `--standalone`144 fails closed if the thread is attached.145- One round per probe: `--single-round` refuses a second exchange on a thread.146- Verify locally before trusting a result; keep GPT Pro output as pressure only.147- Never send while another probe holds the browser lease; never bypass the148 conversation-id gate.149- Never capture "the latest turn" by position alone; bind the response to the150 post-submit remote turn ID. A truncated native item is not a raw answer.