Repository navigation
Conversation
|
| if [ -r "$CODEX_AUTH_FILE" ]; then | ||
| # Codex needs a login to reach its composer; an auth-less start cannot prove | ||
| # that folder trust was accepted. All replay writes stay in this test store. | ||
| mkdir -p "$CODEX_HOME_DIR" | ||
| ln -s "$CODEX_AUTH_FILE" "$CODEX_HOME_DIR/auth.json" | ||
| # Silence the update nag so the only modal is the one under test. | ||
| printf 'check_for_update_on_startup = false\n' > "$CODEX_HOME_DIR/config.toml" | ||
| CODEX_LAUNCH=$(capture_launch codex-live codex) | ||
| CODEX_FLAGS=$(global_flags codex "$CODEX_LAUNCH") || fail "refusing unsafe Codex replay flags" | ||
| test_codex_dialog_gates_an_unregistered_worktree | ||
| test_codex_trust_script_removes_the_dialog | ||
| test_codex_root_entry_is_the_narrow_key | ||
| else | ||
| printf 'skip: live: codex folder trust: no readable login at %s\n' "$CODEX_AUTH_FILE" | ||
| fi | ||
|
|
||
| if [ -r "$PI_AUTH_DIR/auth.json" ]; then |
There was a problem hiding this comment.
| @@ -1236,12 +1236,15 @@ Every home requires: | |||
| - chrome-devtools-axi. | |||
| - Compatible tasks-axi, as specified in "Backlog backend" above. | |||
| - Compatible quota-axi. | |||
| - `python3` for the home's backlog tooling and raw launch-command parsing, including raw Pi and Claude launches. | |||
There was a problem hiding this comment.
Python requirement goes unchecked
This adds python3 to the universal requirements, but session-start tool detection does not check for it. On a home without Python, bootstrap can report the toolchain ready, only for a raw launch to fail during parsing instead of receiving the documented missing-tool diagnostic.
d4a2978 to
fbb6c77
Compare
Every fresh pool slot is a directory neither Codex nor Pi has seen, and both stopped there waiting for a person to press Enter, so an otherwise unattended spawn cost one human keystroke per worktree per runtime. Codex persists folder trust for the repository root, and an answer given inside a linked worktree writes that root entry, so bin/fm-codex-trust.sh registers exactly the same entry ahead of a codex launch: one write per project rather than one per slot, and never the hook-trust store, whose modal stays unautomated and whose layer the crewmate launch still disables. Pi keys project trust per directory and documents a per-run decision for automated runs, so the pi launch now carries --approve instead of a store entry this repo would have to hand-edit. It persists nothing, so trust.json keeps holding only decisions a person actually made, and a worker account pin cannot point a writer at the wrong store. tests/fm-codex-trust.test.sh pins the store write, its preservation of the operator's own config, and each structural refusal; the new tests/fm-folder-trust-live-e2e.test.sh refreshes both vendor facts against the installed binaries, including the control that an unregistered worktree really does still render the dialog.
…fe runtime replay
…e conflicting edits
…ion and encoded the heredoc backtick that broke Bash 3.2 parsing. Pinned lint, both focused behavior suites, and all 455 script parse checks passed under Bash 5.3. Bash 3.2 is unavailable on PATH, so macOS verification remains pending
…orded reasons and documented the accepted python3 prerequisite and rationale. Regression reproduction, focused trust suite, pinned lint, and documentation checks passed. The installed-binary no-login run exited cleanly; authenticated live panes were not exercised. Required PR-description text is prepared in state/ci-pr-description.md for the outer executor
…fy safe lock refusal and wait for both workers before cleanup. Controlled contention failed before the fix and passed afterward. The full presentation suite, pinned ShellCheck, and syntax checks passed locally on Herdr 0.9.3; CI’s 0.7.4 remains unverified locally
… while preserving linked-pool-only trust. All 109 focused cases, pinned lint, documentation, and coverage checks passed. The unchanged relay CI failure remains unverified: NUL handling passed locally, but missing openssl blocked full reproduction
26428bd to
ed25e1f
Compare
|
Closing this one, since both halves already have issues with PRs attached: Pi folder trust is #6084 (#4684), and Codex directory trust is #6519, where triage asked to extend #5067 instead of opening a competing PR. This branch also conflicts with main now. I added what my live runs showed about repository-root trust to #6519, and the branch stays on my fork. |
Intent
End the recurring first-launch stall that has cost a human keystroke on every fresh worktree today (six occurrences across three projects and both runtimes: Codex folder trust on three projects; Pi project trust on firstmate worktrees). Every newly spawned worker on a fresh treehouse worktree sits at its runtime's trust prompt until a person answers it - overnight that means idle lanes burning concurrency slots. Make Firstmate's own spawn machinery handle this: the trust decision is operator-consented launch plumbing for worktrees Firstmate itself created under its own disposable pool, so the change pre-trusts the worktree (or the repository root it belongs to) at spawn time for both runtimes Codex and Pi, instead of waiting on a human.
Boundary that must be preserved (from the home's harness-adapters skill): the FORBIDDEN variant is manufacturing consent for Codex's HOOK trust (writing Codex's trust store to pre-accept the "Hooks need review" dialog) - that stays forbidden and unautomated; the crewmate launch template already disables Codex's hook layer outright. This task covers FOLDER/project trust only: Codex's "Trust this folder?" dialog and Pi's "Trust project folder?" prompt.
What Changed
--approveto Pi and pi-signed. Attended checkouts retain manual approval; Codex hook trust remains unautomated.Risk Assessment
✅ Low: Trust automation remains scoped to qualifying linked pool worktrees, preserves the hook-trust boundary, and introduces no substantiated material defects.
Testing
Real Codex and Pi trust controls, approved launches, seeded-home behavior, registration boundaries, and hook configuration passed. Focused portable suites also passed, including raw-launch and store-selection cases. Runtime checks replay captured launch flags; dispatch matrices use fixtures. Five terminal captures are provided as rendered HTML rather than screenshots. Initial fixture-path setup failures were resolved before rerunning.
Evidence: Five captured live runtime terminal panes
Source: Five captured live runtime terminal panes
Evidence: Live folder-trust controls and approved launches
Source: Live folder-trust controls and approved launches
Evidence: Registration refusals and preserved operator denial
Source: Registration refusals and preserved operator denial
Evidence: Seeded Pi home live controls
Source: Seeded Pi home live controls
Evidence: Real Codex hook-layer configuration
Source: Real Codex hook-layer configuration
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
✅ No issues found.
✅ **Test** - passed
✅ No issues found.
bash tests/fm-folder-trust-live-e2e.test.shwith a disposable TMPDIR containing spacesbash tests/fm-codex-trust.test.shwith an isolated evidence-directory TMPDIREight focused Codex/Pi dispatch cases executed fromtests/fm-spawn-dispatch-profile.test.shbash tests/fm-codex-hook-layer-live-e2e.test.shLive guard invoked with explicitly selected stores lacking authenticationManual real Codex/Pi launches on a private tmux socket with a 140×40 grid; pane captures, denied registration calls, and unchanged-store assertionsRendered captured panes with headless Chromium and inspected the screenshotInitial worktree-local fixtures were re-driven after socket-length and secondmate-location setup failures; the broader dispatch run reached its time limit and was replaced by focused casesRemoved disposable fixtures and verified the worktree was clean and owned test processes had stopped✅ No issues found.
timeout -k 5s 240s bash tests/fm-codex-trust.test.shtimeout -k 5s 240s bash tests/fm-spawn-dispatch-profile.test.shpython3 ~/.no-mistakes/evidence/01M3YYK7P4G7RPC6D0H6B5QFQS/drive-live.py— runs the real folder-trust guard with TMPDIR containing spaces and captures private tmux panestimeout -k 5s 90s bash tests/fm-codex-hook-layer-live-e2e.test.shtimeout -k 5s 90s bash tests/fm-pi-seeded-home-trust-live-e2e.test.shDirectbin/fm-codex-trust.shinvocations against disposable Git repositories and stores, with exit-code and byte-preservation checksRuntests/fm-folder-trust-live-e2e.test.shwith both credential stores explicitly pointing to an empty fixture; verified successful exit and recorded skip reasonsInitial workspace-local TMPDIR attempts exposed fixture placement and Unix socket-length constraints; reruns using normal short disposable test paths passedRemoved transient workspace fixtures and verifiedgit status --shortwas clean✅ **Document** - passed
✅ No issues found.
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ No issues found.
✅ **Push** - passed
✅ No issues found.
✅ No issues found.