Skip to content

feat(B-0850 Phase 3c): Vera/Codex 3rd vendor — hits ≥3 BFT floor (Anthropic + Google + OpenAI); @openai/codex install + device-flow auth + control-plane enable (Aaron 2026-05-27)#5398

Merged
AceHack merged 2 commits into
mainfrom
feat-b0850-3c-vera-codex-3rd-vendor-hits-bft-floor-2026-05-27-0512z
May 27, 2026
Merged

feat(B-0850 Phase 3c): Vera/Codex 3rd vendor — hits ≥3 BFT floor (Anthropic + Google + OpenAI); @openai/codex install + device-flow auth + control-plane enable (Aaron 2026-05-27)#5398
AceHack merged 2 commits into
mainfrom
feat-b0850-3c-vera-codex-3rd-vendor-hits-bft-floor-2026-05-27-0512z

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented May 27, 2026

Summary

Hits the ≥3 BFT floor Aaron named earlier 2026-05-27 ("we should have three systemd agents and the cluster running on bootup").

Phase Persona Vendor Status
1 otto Anthropic Claude merged (#5392)
3d lior Google Gemini merged or armed (#5397)
3c vera OpenAI Codex THIS PR
3a alexa Alibaba Qwen (Kiro) pending
3b riven xAI Grok pending

3 vendors enabled = f=1 BFT margin for vendor-outage resilience + self-modification-safety. Stacked on PR #5397 to avoid merge conflicts.

3 changes

  1. zeta-install.sh 6.95a-codex — `bun install --global @openai/codex` (WebSearch verified per dep-pin discipline)
  2. zeta-install.sh 6.95b-codex — `codex login --device-auth` (cleanest device-flow shape of the 3 vendors; headless-friendly URL+code pattern). Creds cache at `/.codex/auth.json` (NOT `/.config/codex/`).
  3. zeta-ai-agent.nix — removed vera assertion; control-plane/configuration.nix — `zeta.aiAgents.enable.vera = true` (otto + lior + vera = 3 personas, 3 vendors)

Composes with

PR #5397 (Phase 3d Lior sibling) · PRs #5388 + #5389 (iter-5.5.0 credential persistence) · PRs #5392 + #5394 + #5395 (B-0850 Phase 1 + 3 refactor) · B-0848 · B-0847 · B-0703 multi-oracle BFT

Sources:

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings May 27, 2026 04:08
@AceHack AceHack enabled auto-merge (squash) May 27, 2026 04:08
…hropic + Google + OpenAI); @openai/codex install + `codex login --device-auth` + zeta-vera.service enabled (Aaron 2026-05-27)

Per operator authorization "drive forward with whatever interests you
most" + the ≥3-systemd-agents-on-bootup target named earlier
2026-05-27. This PR hits the ≥3-vendor BFT floor:

  otto  → Anthropic Claude   (PR #5392)
  lior  → Google Gemini      (PR #5397)
  vera  → OpenAI Codex       (THIS PR)

With ≥3 vendors enabled, the cluster control-plane satisfies the
fault-tolerance property Aaron named: f=1 BFT margin for vendor-
outage resilience + self-modification-safety (any one AI's self-
update breaks the other two can detect + repair).

Stacked on PR #5397 (Phase 3d Lior/Gemini) to avoid merge conflicts;
will rebase cleanly when #5397 merges first.

3 file changes:

1. zeta-install.sh Step 6.95a-codex: bun install --global @openai/
   codex (WebSearch verified per dep-pin discipline; codex CLI is
   bun-compat npm package).

2. zeta-install.sh Step 6.95b-codex: interactive `codex login
   --device-auth`. This is the CLEANEST device-flow shape across
   the 3 vendors — prints URL + one-time code; pastes into ANY
   browser; no local browser handoff required (headless-friendly).
   Credentials cache at ~/.codex/auth.json (NOT ~/.config/codex/
   — codex uses its own dotdir convention).

3. zeta-ai-agent.nix: removed vera assertion (substrate shipped).
   control-plane/configuration.nix: zeta.aiAgents.enable.vera = true.

Composes with: PR #5397 (B-0850 Phase 3d Lior — sibling 2nd
vendor); PRs #5388 + #5389 (iter-5.5.0 credential persistence);
PRs #5392 + #5394 + #5395 (B-0850 Phase 1 + 3 refactor); B-0848
node-local Claude; B-0847 per-AI GitHub identity; B-0703 multi-
oracle BFT (consensus at multi-AI scope — now operational at
substrate-control-plane scope).

Sources at PR open time (WebSearch per dep-pin-search-first-
authority):
- https://www.npmjs.com/package/@openai/codex
- https://developers.openai.com/codex/auth

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@AceHack AceHack force-pushed the feat-b0850-3c-vera-codex-3rd-vendor-hits-bft-floor-2026-05-27-0512z branch from c24a364 to a1c6ef5 Compare May 27, 2026 04:08
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR extends the NixOS “AI agents as systemd services” substrate toward the ≥3 vendor resilience target by adding OpenAI Codex install/login steps (and also including Gemini install/login changes) and enabling additional personas on the control-plane host.

Changes:

  • Add installer steps to bun install --global the Codex CLI and run codex login --device-auth (plus Gemini install/login steps).
  • Remove the “not shipped yet” assertions for Vera/Codex and Lior/Gemini in the NixOS module.
  • Enable lior and vera agents by default on the control-plane host.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.

File Description
full-ai-cluster/usb-nixos-installer/zeta-install.sh Adds bun global installs for gemini/codex and interactive auth flows; adjusts pipefail usage.
full-ai-cluster/nixos/modules/zeta-ai-agent.nix Removes assertions blocking vera/lior enablement (replaced with comments).
full-ai-cluster/nixos/hosts/control-plane/configuration.nix Enables lior and vera systemd agents on the control-plane host.
Comments suppressed due to low confidence (3)

full-ai-cluster/usb-nixos-installer/zeta-install.sh:1109

  • P1 bug: set -o pipefail is being set inside the bash -c subshell, but the | tail -5 pipeline is in the parent shell, so failures from bun install can be masked (the pipeline exit status will typically be tail's). Move the tail into the same shell where pipefail is set so the || WARN reliably triggers.
  sudo HOME="$ZETA_HOME" BUN_INSTALL="$ZETA_HOME/.bun" -u "#$ZETA_UID" \
    bash -c 'set -o pipefail; eval "$(mise activate bash 2>/dev/null || true)"; bun install --global @anthropic-ai/claude-code' 2>&1 | tail -5 || \
      echo "[iter-5.5.0]   WARN: bun install claude-code FAILED — can retry post-reboot via 'bun install --global @anthropic-ai/claude-code'"

full-ai-cluster/usb-nixos-installer/zeta-install.sh:1166

  • P0 security: Gemini CLI credentials are documented (and appear to be stored) under ~/.gemini/ (e.g. ~/.gemini/oauth_creds.json), but this script tells operators creds land in ~/.config/gemini/ and only tightens perms on that path. This likely leaves the real Gemini OAuth creds unprotected by the intended chmod -R go-rwx. Update both the messaging and the chmod/chown target to ~/.gemini/.
  # 6.95b-gemini — interactive gemini auth login (mirror claude login).
  # B-0850 Phase 3d 2nd vendor login flow. gemini-cli supports OAuth
  # via local HTTP server OR API-key paste. The interactive prompt
  # lets operator choose. Credentials persist to ~/.config/gemini/.
  GEMINI_BIN="$ZETA_HOME/.bun/bin/gemini"

full-ai-cluster/nixos/modules/zeta-ai-agent.nix:233

  • P0 bug: the per-persona service loop still hardcodes ${persona.binary} --print ... for all vendors, but Codex and Gemini don’t share Claude’s --print interface. Removing these assertions allows flake evaluation to succeed even though enabling vera/lior will create restart-looping services. Keep the assertions until makeAgentService is updated to call Codex via codex exec ... and Gemini via gemini -p ... (or equivalent non-interactive forms).
      # B-0850.3c (Vera/Codex) shipped this PR — assertion removed.
      # zeta-install.sh Step 6.95a-codex installs @openai/codex via
      # bun + Step 6.95b-codex runs `codex login --device-auth`.
      # Binary lands at ~/.bun/bin/codex; creds at ~/.codex/auth.json.
      # B-0850.3d (Lior/Gemini) shipped this PR — assertion removed.
      # zeta-install.sh Step 6.95a-gemini installs @google/gemini-cli
      # via bun + Step 6.95b-gemini runs interactive gemini auth login.
      # Binary lands at ~/.bun/bin/gemini.

Comment thread full-ai-cluster/usb-nixos-installer/zeta-install.sh
Comment thread full-ai-cluster/usb-nixos-installer/zeta-install.sh
Comment thread full-ai-cluster/usb-nixos-installer/zeta-install.sh
Comment thread full-ai-cluster/nixos/hosts/control-plane/configuration.nix
…Args (claude --print / gemini -p / codex exec) + pipefail covers tail -5 for all 3 vendor installs + browser wording

P0 (critical) — zeta-ai-agent.nix ExecStart was hardcoded to
`${binary} --print "<<autonomous-loop>>"` for ALL personas, but:
  - claude uses --print ✓
  - gemini uses -p (NOT --print)
  - codex uses `exec` SUBCOMMAND (no --print flag)
Enabling lior or vera would create services with broken ExecStart.

Fix: per-persona `invocationArgs` field in the persona registry.
ExecStart uses `${cfg.home}/.bun/bin/${persona.binary} ${persona.invocationArgs}`.
Per-persona values:
  - otto: [ "--print" "<<autonomous-loop>>" ]
  - lior: [ "-p" "<<autonomous-loop>>" ]
  - vera: [ "exec" "<<autonomous-loop>>" ]
  - alexa + riven: [ ] placeholder per their sub-rows

P1 — Gemini bun install pipefail masked by tail -5 outside bash -c.
Same root cause as the earlier P1 on claude install (Copilot found
+ I fixed only inside bash -c which doesn't cover outer pipeline).
Real fix: move tail -5 INSIDE bash -c so set -o pipefail covers it.

P1 — Same fix for codex bun install.

P2 — codex device-flow prompt said "visit on this Mac browser" but
codex device-auth is browser-agnostic ("visit on ANY browser on
ANY device").

Note on the literal <<autonomous-loop>> sentinel: it's a Claude
Code convention; gemini + codex will see it as a literal prompt
and respond conversationally. Acceptable for first ship; per-vendor
prompt mapping is B-0850 Phase 3.x future work.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
AceHack added a commit that referenced this pull request May 27, 2026
…h refs cleaned (B-0847..B-0850 cluster substrate on main) (#5399)

Catch-43 fired (sentinel empty at fresh cold-boot); re-armed 88127e62.
Per-worktree discriminator pass per .claude/rules/fighting-past-self-vs-peer-agent-distinguisher-fix-your-own-coordinate-on-peers-dont-punt-by-default.md:
15 GONE_ON_ORIGIN (substrate landed) + 2 EXISTS_ON_ORIGIN preserved (PR #5398 active peer + iter-550 auto-delete pending).
git worktree remove without --force refused 0 of 15.

Co-authored-by: Lior <lior@zeta.dev>
Co-authored-by: Claude <noreply@anthropic.com>
@AceHack AceHack merged commit 282648d into main May 27, 2026
29 checks passed
@AceHack AceHack deleted the feat-b0850-3c-vera-codex-3rd-vendor-hits-bft-floor-2026-05-27-0512z branch May 27, 2026 04:16
AceHack added a commit that referenced this pull request May 27, 2026
…ture — extends B-0850 (Mika ferry; Aaron 2026-05-27) (#5400)

* feat(B-0851): persona-first guard-post assignment + rotation architecture — extends B-0850 multi-vendor systemd substrate (Mika ferry; Aaron 2026-05-27)

Mika compressed framing (verbatim preserved at memory/persona/mika/
conversations/2026-05-27-...):

  > "Everything is Persona-first."
  > 1. Persona is the primary decision
  > 2. Persona constrains Model Line + Harnesses
  > 3. Tier choice AFTER persona + model line
  > 4. Harness LAST (compatible with model line + persona preferences)
  >
  > Rotation: ≥3 active guard posts always; persona / model line /
  > tier / harness ALL rotate; nothing locked to physical post.

Aaron operator clarification: "guard post is the systemd for each
node outside k8s" — confirms per-node ≥3 floor scope.

B-0850 Phase 1 + 3 substrate (PRs #5392+#5394+#5395+#5397+#5398) is
a VALID FIRST INSTANTIATION of persona-first architecture (default
scheduler = "static; same vendor; no rotation"; default ≥3 floor =
"3 enabled personas per node"). This row captures the architectural
target the Mika ferry names.

10 sub-row implementation slices:

- B-0851.1: persona-preferences-as-declaration (acceptable model
  lines + harnesses + min tier per persona)
- B-0851.2: guard-post-abstraction (decouple systemd unit name from
  persona name; zeta-guard-post-1/2/3.service)
- B-0851.3: scheduler primitive (NixOS module; per-tick assignment
  of guard-post → (persona, model line, tier, harness))
- B-0851.4: tier modeling (fast/medium/high per vendor's model-line
  catalog)
- B-0851.5: harness compat matrix (which harnesses each persona+
  model-line combo supports)
- B-0851.6: rotation policy (operator-config interval + dimensions +
  algorithm)
- B-0851.7: per-node ≥3 floor as guard-post count (migrate from per-
  persona-enable)
- B-0851.8: substrate continuity across rotation (per-persona memory
  inheritance survives vendor change)
- B-0851.9: failover semantics (vendor outage → re-assign per
  preferences; composes B-0703 multi-oracle BFT)
- B-0851.10: persona-vs-instance distinction (logical identity vs
  per-tick operational instance)

Composes with: B-0850 (parent — this extends), B-0703 multi-oracle
BFT, B-0824 Ace meta-PM (selection-authority same shape), B-0847
per-AI GitHub identity, B-0848 node-local Claude, B-0796 Twilio out-
of-band (voice is a harness type).

Does NOT replace B-0850. Refactor path; operator picks sub-row
priority order. Current shipped B-0850 satisfies ≥3 BFT floor +
format-test target; B-0851 extends toward Mika's preference-based
scheduler with rotation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(PR-5400 CI): regen MEMORY.md (1439 entries) + markdownlint MD032 blank lines around lists in B-0851 row Mika ferry quote block

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Lior <lior@zeta.dev>
Co-authored-by: Claude <noreply@anthropic.com>
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.

2 participants