Repository navigation
v1.0 exit: real-environment acceptance run of record at 093c7be (a-account environment) #143
Description
Part of #67 — the run of record, attempt 3, taken at main = 093c7be (CI green on that SHA). Attempt 1 (20260828T074856Z, at 197b1d8) died on the codex lane and produced #136. Attempt 2 (20260828T115319Z, at 0266039) came back FAIL on codex approval + codex switches and SKIPPED the realtime probe; all three were harness defects, not product defects — #140 (a run root under /tmp leaves the Codex permission targets writable, so no permission is ever raised; #141 closed as its duplicate), #142 (probe path not resolvable from a worktree, now a refusal rather than a skip). #139 (shell does not start the preflight-held engine after the credentials file is fixed by hand) landed after that run as well.
The map's exit: "the real-environment automated acceptance (docs/acceptance-design.md) runs green on Simon's machine against the installed bundle". Simon, 2026-08-30: run it.
What this ticket does
One full run of tests/acceptance on this machine, both lanes, against a bundle built from 093c7be, and the verdict recorded here verbatim. Nothing is fixed on this ticket. A red step is recorded with its evidence and handed to the advisor; a code change after the run means a re-run (#67 process rule).
Environment preconditions (new — these are what attempt 2 got wrong)
- Run under the main account's config directory.
CLAUDE_CONFIG_DIRmust be unset (default~/.claude). A shell withCLAUDE_CONFIG_DIR=~/.claude-bbridges the universe Map: v1.0 is a bridge over every Session the user starts #67 ruled out of scope, and the harness does not scrub this variable (no reference to it anywhere intests/acceptance/) — so it is the operator's precondition, not the harness's. Record the value ofCLAUDE_CONFIG_DIRbefore starting. - Run from the primary checkout
/Users/simon/Documents/coding/GPT-VoiceCoding, not a worktree — or else setGPTVOICECODING_ACCEPTANCE_REALTIME_PROBEto the legacy checkout'sscripts/rt_prototype.pyexplicitly. Since Acceptance: realtime probe SKIPPED when run from a worktree — default legacy path not found #142 a missing probe is a refusal, not a skip. - Do not set
GPTVOICECODING_ACCEPTANCE_ROOT. Use the documented default~/Library/Application Support/GPT-VoiceCoding/acceptance/. Since Acceptance harness: reject run roots that bypass Codex permission triggers #140 a root that leaves the Codex permission targets writable (e.g. anything under/tmp) is refused before either lane starts.
Procedure (docs/acceptance-design.md § Running it)
git statusclean at093c7beonmain;.venvpresent (build it the way CI does if not).- Build and install the bundle:
scripts/build-app.sh→/Applications/GPT-VoiceCoding.app, keeping the previous bundle renamed aside as the undo. Preflight refuses unless itsgpt_voicecodingis byte-identical tosrc/— record the SHA it reports. - Quit the menu-bar app (one bot, one engine). Record what was running before (
pgrep -fl 'GPTVoiceCodingShell|gpt_voicecoding'). - Export the bot token from the repo's
.env(GPTVOICECODING_TELEGRAM_TOKEN, standing authorisation on Map: v1.0 is a bridge over every Session the user starts #67) into the pytest shell only. Never print it, never write it anywhere. .venv/bin/python tests/acceptance/telegram_person.py statusmust say authorised; if not, stop and record — that is a HITL item, not yours..venv/bin/python -m pytest -m acceptance tests/acceptance -v, output captured to a file in the run directory.- Record on this ticket: run id, bundle SHA vs tree,
CLAUDE_CONFIG_DIR, the run root actually used, every step's verdict on both lanes, theenvironmentblock fromverdict.json, and the full path ofverdict.jsonandjournal.jsonl. - Relaunch the menu-bar app so the login engine is back, then record
bridge-install status. Note from attempt 2, still unexplained and not this ticket's to fix: after relaunch the shell came up but nogpt_voicecoding.engineprocess appeared.
Do not
- Kickstart, bootout or otherwise touch the Codex daemon (Simon's Sessions are on it).
- Edit any config, hook, or
~/.zshrcto make a step pass; the harness never arranges what it judges. - Change code. If a step is red, record and stop at step 8.
- Run while another consumer holds the bot; if the bot is busy, the cause is not another session — stop and record.
Done when
The verdict is on this ticket with the artifacts' paths, the login engine is back up, and the ticket is left open for the advisor to declare the exit (or file what is red).
Legacy
None — this is v1.0's own acceptance (#73).
Routing
Workflow: ops
Executor: codex
Model: gpt-5.6-sol
Effort: high
Reasons: same as #135 — mechanical run whose verdict is weighed by the advisor, not the worker; touches the real machine (quits the app, holds the bot); must run in the a account shell.
Activity
Simon-AI-coding commentedon Aug 29, 2026
Acceptance run —
20260829T233015Z— result PASS (19/19: both lanes 9/9 green, plus the realtime probe)The map's exit condition, run of record attempt 3, executed on Simon's machine per this ticket's procedure. Nothing was fixed, arranged or changed to make a step pass;
mainis byte-for-byte the tree that was built, before and after.Run id:
20260829T233015Z(16m 34s wall)Tree:
main@093c7be,git statusclean before and after the run.Bundle: rebuilt with
PATH=.venv/bin:$PATH scripts/build-app.sh,codesign --verify --deep --strictOK on the built bundle and again after install; installed bydittointo/Applications/GPT-VoiceCoding.app.Preflight provenance (
verdict.json):"the bundle's engine is byte-identical to 093c7be"—"bundle": "/Applications/GPT-VoiceCoding.app","commit": "093c7be". My owndiff -rq -x __pycache__ src/gpt_voicecoding <bundle>/…/site-packages/gpt_voicecodingagrees: the sole difference is the untrackedsrc/gpt_voicecoding/adapters/session_launcher/, which holds nothing but a stale__pycache__and no.pyat all, so preflight's.py-only compare rightly ignores it — the same artefact attempt 1 recorded.Undo kept, never deleted: the previous bundle is renamed aside at
/Applications/GPT-VoiceCoding.app.pre-143-1788046198(attempt 2's…pre-135-1787917957is also still on disk).Versions seen (
verdict.json): claude/Users/simon/.local/bin/claude: 2.1.251, codex/Users/simon/.nvm/versions/node/v24.13.0/bin/codex: codex-cli 0.150.1, bundle python3.12.14.The three preconditions this ticket added after attempt 2
CLAUDE_CONFIG_DIRwas unset for the whole run — the default~/.claude, the main-account universe, the one Map: v1.0 is a bridge over every Session the user starts #67 scopes v1.0 to. Recorded before starting, never set by me. The~/.claude-buniverse was not touched./Users/simon/Documents/coding/GPT-VoiceCoding, not a worktree, so the realtime probe resolved on its own andGPTVOICECODING_ACCEPTANCE_REALTIME_PROBEwas never set. Since Acceptance: realtime probe SKIPPED when run from a worktree — default legacy path not found #142 a missing probe is a refusal — it did not refuse, and it did not skip: it ran and passed.GPTVOICECODING_ACCEPTANCE_ROOTwas explicitly unset (as was_BUNDLE), so the documented default root was used:~/Library/Application Support/GPT-VoiceCoding/acceptance/. Nothing under/tmpwas the run root, so Acceptance harness: reject run roots that bypass Codex permission triggers #140's refusal never fired and the Codex permission targets were not world-writable — which is exactly what attempt 2 got wrong.Before the run
pgrep -fl 'GPTVoiceCodingShell|gpt_voicecoding'→ nothing. Neither the menu-bar shell nor an engine was running, so there was nothing to quit — the still-unexplained Shell: engine blocked by preflight does not start on its own after the credentials file is fixed by hand #139 aftermath this ticket says is not mine to fix. There was no second consumer of the bot at any point..env(GPTVOICECODING_TELEGRAM_TOKEN, standing authorisation on Map: v1.0 is a bridge over every Session the user starts #67) into the pytest shell alone. Never printed, never written anywhere..venv/bin/python tests/acceptance/telegram_person.py status→AUTHORISED as Simon (@None, id 8760621971); session /Users/simon/Library/Application Support/GPT-VoiceCoding/acceptance/person/person.session..venvpresent: Python 3.14.4, pytest 9.1.1.Every step's verdict, both lanes
"result": "PASS","missing": []. pytest:3 passed in 994.57s.The four evidence lines worth reading, because each closes something the map left open
0bis green.1837 remote audio frames in 30s, first frame seen(realtime-probe.log). Map: v1.0 is a bridge over every Session the user starts #67's fog carried "the realtime contract change found by acceptance step 0b (session.modelrefused) — must be resolved or the voice lane's acceptance re-scoped", re-confirmed unchanged as recently as 2026-08-26 with0 remote frames in 30s. It is no longer refusing. This is an upstream-side change measured here, not a change this repo made — nothing in093c7betouches it — so what it means for the fog entry is the advisor's call, not mine.approval item/fileChange/requestApproval:…:exec-02114493-…announced as chat message 4064,approve answered 'approved by voice',measured at sandbox 'workspace-write', approval_policy 'on-request', approvals_reviewer 'user'— read out of codex's ownturn_contextinrollout-2026-08-30T11-36-04-01a04fe1-….jsonl. That answers the fog item asking whether the step is red on that lane or unobservable on it: neither — it is green and observable.claude:a240942779a9c8a75:12508 listed under {'agent': 'claude', 'session_id': '30287fe2-…', 'pid': 12508}, no notice naming it in 120 s, and the Relay refused withis a Child Process spawned by …: it appears in the roster and is never Relayed into. The fog item said this was known only in the negative; it is now known in the positive, on both lanes (codex:codex:01a04fe8-…, same shape, same refusal).stop noticeis green on both lanes, the step Build 1/7 — Discovery, roster and reachability: lock the one Session-inspection type #74 handed on with evidence rather than a conclusion — claude bot message 4047 and codex 4063, each naming its own Session, each matched to anengine.logSession stopped: … waiting on noneline.Turns measured — claude: acknowledge 13.5s, relay 6.0s, wait-for-permission 7.5s, question 4.6s, child 19.5s. codex: boot 4.1s, acknowledge 13.6s, relay 7.5s, wait-for-permission 16.7s, child 25.8s. #44's approval directory holds nothing on both lanes.
environmentblock, verbatim{ "gen1_runtime_present": false, "gen1_hooks_in_user_settings": [], "gen1_daemon_listening": false, "shell_wrappers": [], "scrubbed_agent_markers": [ "CLAUDECODE", "CLAUDE_CODE_CHILD_SESSION", "CLAUDE_CODE_ENTRYPOINT", "CLAUDE_CODE_EXECPATH", "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS", "CLAUDE_CODE_MESSAGING_SOCKET", "CLAUDE_CODE_MESSAGING_TOKEN", "CLAUDE_CODE_SESSION_ID", "CLAUDE_EFFORT", "CLAUDE_PID" ] }Worth naming:
gen1_hooks_in_user_settingsis now empty. #73 recorded gen-1's wrapper and its four user-scope hooks in~/.claude/settings.json— two of them ADR 0011's own slots — on the verdict rather than refusing them. They are gone, and the run says so itself.Recorded, not graded (the harness's own words)
journal.jsonl;.claude.json.before-trustandconfig.toml.before-trustare in the run directory.stop noticetakes any bot message as its own Stop, including another Session's #109), nothing arrived in 90 s.Artifacts
verdict.json—/Users/simon/Library/Application Support/GPT-VoiceCoding/acceptance/20260829T233015Z/verdict.jsonjournal.jsonl—/Users/simon/Library/Application Support/GPT-VoiceCoding/acceptance/20260829T233015Z/journal.jsonl(12.8 MB)/Users/simon/Library/Application Support/GPT-VoiceCoding/acceptance/pytest-143-20260829T233014Z.logpty-claude.log,pty-codex.log,realtime-probe.log,engine-claude/,engine-codex/, both workspaces,outside-the-sandbox/Step 8 — the machine put back
open -a /Applications/GPT-VoiceCoding.app, and both processes came up — pid 1492GPTVoiceCodingShelland pid 1802…/engine/bin/python3 -m gpt_voicecoding.engine --config …/engine/config.toml. Attempt 2's unexplained note — shell up, no engine — did not recur here, on a bundle built from themainthat carries #139's fixes.bridge-install status, verbatim:The
staleline is #83's written rule doing what it was built to do, not a defect: this product neverbootouts a daemon the user's Sessions are attached to, so a re-rendered plist is written and not reloaded, andstatusasks launchd whichprogramit actually holds rather than answering a boolean. It applies at the next login. Nothing was kickstarted, booted out or otherwise done to the Codex daemon at any point in this run — Simon's Sessions stayed on it throughout.The CLI 0.150.1 / daemon 0.149.1 split that attempt 1 flagged is present again and again is not a blocker: the codex lane went 9/9 green across it.
Left for the advisor
Per this ticket's Done when, the ticket stays open: the verdict is recorded, the login engine is back up, and declaring the map's exit is the advisor's call, not the worker's. Nothing here is red, so there is nothing to file.
Simon-AI-coding commentedon Aug 30, 2026
Ruling (advisor, Simon, 2026-08-30) on run
20260829T233015Z: the exit is declared. v1.0's destination is reached.The map's exit condition is one sentence — "the real-environment automated acceptance (
docs/acceptance-design.md, reshaped for this journey) runs green on Simon's machine against the installed bundle" — and this run satisfies every clause of it literally: the real environment (main-account~/.claude, the documented run root, the real Telegram bot, the real Codex daemon), automated (pytest -m acceptance, no step arranged by hand), green (19/19,"result": "PASS","missing": []), on Simon's machine, against the installed/Applications/GPT-VoiceCoding.appthat preflight certified byte-identical to093c7be.What makes this the run of record and not merely a green run: the three failures of attempt 2 were all harness defects (#140, #141, #142), all landed, and this run was taken under the preconditions those fixes require rather than around them — so the green is the product's, not the harness's.
git statuswas clean before and after; nothing was changed to make a step pass.Closing this ticket. The map is closed alongside it; what the run answered and what it did not are recorded there.