@aipass TDPLAN-0011 doc-drift request (repo-level doc = devpulse git territory): 1. Stage count 12->11 in rows 3.2 and 7.2 (aipass init has been 11 stages since S42; row 3.3 already said 'all stages', no numeric drift there). 2. 'drone @hooks hookstatus' -> 'drone @hooks status' in Phase 6.3 and the per-branch smoke matrix (hookstatus is Unknown on current drone — gap #9 itself). 3. Added a 'Machine pre-flight' note to the 3-layers intro: aipass init runs a layer-3-lite pre-flight, and 'aipass doctor --cross-os/--e2e/--record' is the machine sweep that augments (never replaces) the human layer-3 pass. Left the two legit 'other 12 branches' references (branch count) untouched. Closes devpulse todo #64. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013uzDhtcZ6wT1T9e2AHPQig
13 KiB
AIPass Cross-OS Acceptance Checklist
Purpose: the definition of "AIPass works on this OS." Follow this top-to-bottom on any fresh machine or VM (Windows / macOS / Linux) to verify a real end-to-end install — the things automated CI structurally cannot reach (full install, interactive flows, background daemons, audible hooks). Copy a Run Record (bottom of this file) per machine and fill it in.
Code is truth. A green checkbox here means you watched it work on that OS, not that it should.
The 3 layers of cross-OS confidence
| Layer | What | Where it runs | Catches |
|---|---|---|---|
| 1 — Static | drone @seedgo Windows-compat scan |
any OS, no execution | POSIX-only patterns (os.kill, start_new_session, /tmp, fcntl…) before you run |
| 2 — Automated | pytest tests/e2e (the e2e-wheel.yml 4-tier gate) |
CI on ubuntu+windows+macos, and locally | the wiring contract: clean-wheel install → aipass init scaffold → hook fires → drone routes |
| 3 — Manual | this checklist | a real box / VM, by hand | full install, interactive init run, daemons, sound, per-branch smoke |
Layers 1–2 are free and run on every push. This file is layer 3 — the human acceptance pass you do when you get hardware (a VM, a borrowed Mac, a new laptop).
Machine pre-flight (augments, never replaces layer 3).
aipass initnow runs a layer-3-lite pre-flight: stage 2 prints OS-relevant heads-ups for tracked gaps before scaffolding. For a fuller machine sweep,aipass doctor --cross-osreports the known-gap surface,--e2eruns the real layer-2 suite, and--record [PATH]emits a machine-filled Run Record. These front-run the obvious breakage — but the human acceptance pass below is still the real layer 3.
How to use
- Capture output. Run your shell session into a log so any crash traceback is saved:
- Linux/macOS:
script -q aipass-crossos-$(uname -s).log(then run the checks,exitwhen done) - Windows PowerShell:
Start-Transcript -Path aipass-crossos-win.log…Stop-Transcript
- Linux/macOS:
- Work through Phase 0 → 7, then the Per-branch matrix.
- For every check: run the command, compare to Expected, tick ⬜ → ✅ / ❌.
- On ❌: note the exact error in the Run Record, check the Known gap registry (it may be a tracked one), and if new, file it / email the owning branch.
- Paste the completed Run Record into the PR / DPLAN-0194 thread.
Legend: ✅ pass · ❌ fail · ⏭️ skipped (state why) · ⚠️ known-gap watch item
Phase 0 — Environment capture (record before anything)
| # | Capture | Command |
|---|---|---|
| 0.1 | OS + version | uname -a / Win: cmd /c ver + systeminfo | findstr /B /C:"OS" |
| 0.2 | Arch | uname -m / Win: echo %PROCESSOR_ARCHITECTURE% |
| 0.3 | Python | python3 --version (Win: python --version) — must be 3.10+ |
| 0.4 | Shell + terminal | which shell; is it Windows Terminal / cmd / PowerShell / iTerm? |
| 0.5 | AIPASS_HOME |
echo $AIPASS_HOME (Win: echo %AIPASS_HOME%) — note set/unset |
| 0.6 | Git | git --version |
Why terminal matters: the cp1252 stdout class of bug (fixed S190) only bites when stdout is a legacy/captured stream. Record whether you're on UTF-8-capable Windows Terminal vs legacy conhost — reds can differ.
Phase 1 — Clean install ⬜
| # | Step | Expected | Watch |
|---|---|---|---|
| 1.1 | Fresh clone or wheel copy onto the box | files present | — |
| 1.2 | Run setup.sh (or pip install -e ".[dev]") |
exits 0; .venv created with pip |
⚠️ Windows .venv symlink WinError 1314 — needs os.symlink guarded w/ copy/junction fallback (DPLAN-0194 gap) |
| 1.3 | drone --version and aipass --version |
both print a version, exit 0 | ⚠️ .venv/bin vs Scripts path resolution |
Phase 2 — Automated wiring (run the e2e suite on the real box) ⬜
| # | Step | Expected |
|---|---|---|
| 2.1 | pip install build pytest |
installed |
| 2.2 | python -m pytest tests/e2e -v |
14 passed (T0 install / T1 init scaffold / T2a hook fire / T3 drone routing) |
This re-runs the CI gate on real hardware. If CI is green but this is red, the difference is the machine (real console, real paths) — exactly what we're hunting.
Phase 3 — aipass init (real scaffold + interactive) ⬜
| # | Command | Expected | Watch |
|---|---|---|---|
| 3.1 | aipass init /tmp/demo demo (Win: a temp path) |
creates DEMO_REGISTRY.json, .aipass/, .claude/settings.json, src/demo/ + prints ✓ Project initialized |
⚠️ cp1252 banner crash (fixed S190 — verify it stays fixed) |
| 3.2 | aipass init run --dry-run |
shows the 11-stage plan, no writes | — |
| 3.3 | aipass init run --non-interactive (in a throwaway dir) |
completes all stages headless | ⚠️ symlink/daemon steps |
| 3.4 | aipass init run (interactive, manual) |
prompts render + accept input; completes | ⚠️ interactive PTY — never machine-tested; pexpect territory |
| 3.5 | aipass doctor |
health report renders, exit 0 | — |
@aipass is its own process — the user-facing concierge / onboarding CLI (
init,doctor, scanner). It's the front door you run to bootstrap a project, so it's invoked directly asaipass …and is by design not routed throughdrone @aipass(unlike the other 12 branches).
Phase 4 — drone routing ⬜
| # | Command | Expected |
|---|---|---|
| 4.1 | drone systems |
lists all registered branches + modules |
| 4.2 | drone @ai_mail --help |
help text, exit 0 (real registry-branch subprocess — the T3 path) |
| 4.3 | drone @seedgo --help |
help text, exit 0 (in-process module path) |
| 4.4 | drone @ai_mail inbox |
inbox renders (empty is fine) |
Phase 5 — Daemons / background processes ⬜
| # | Command | Expected | Watch |
|---|---|---|---|
| 5.1 | drone @ai_mail dispatch @devpulse "x-os test" "ping" then drone @ai_mail inbox |
mail sent; target woken | ⚠️ start_new_session= POSIX kwarg in ai_mail/flow daemon spawn |
| 5.2 | drone @devpulse watchdog --help then arm a watchdog |
polls lock, exits clean | ⚠️ os.kill POSIX-only; inotify vs Win file-watch |
| 5.3 | drone @prax monitor (then quit) |
live dashboard renders | ⚠️ interactive / curses-style on Win |
Phase 6 — Hooks + sound ⬜
| # | Step | Expected | Watch |
|---|---|---|---|
| 6.1 | Trigger rm_gate (attempt a raw rm -rf via the agent / fire the bridge) |
blocked; src/aipass/hooks/logs/engine.jsonl gains a record |
— |
| 6.2 | A hook with sound fires | audible cue plays | ⚠️ aplay is Linux-only — needs afplay (macOS) / winsound (Windows) |
| 6.3 | drone @hooks status |
per-project hook config renders | ⚠️ hardcoded /tmp paths |
| 6.4 | drone @hooks hooksound (mute/unmute) |
toggles without error | — |
Phase 7 — Interactive layer (manual, hardest to automate) ⬜
| # | Step | Expected | Watch |
|---|---|---|---|
| 7.1 | Launch an agent session in a terminal | starts, prompt usable | ⚠️ tmux (Linux/mac) vs Windows terminal multiplexer |
| 7.2 | aipass init run full interactive (if not done in 3.4) |
all 11 stages accept input | ⚠️ PTY/pexpect |
| 7.3 | Any prompt-driven flow (--bypass/flags where available) |
bypassable for headless | — |
Per-branch smoke matrix (all 13 branches)
Run each branch's drone @<branch> --help first (the universal resolve → subprocess → execute →
print proof), then the listed read-only commands. ⚠️ = mutates state / side-effect — run only
deliberately. Every command should exit 0 and render readable (non-mojibake) output on the OS
under test.
† aipass is the exception — it's the standalone user-facing concierge CLI, invoked directly (
aipass …), not routed throughdrone. So it has nodrone @aipass --helprow; smoke it with theaipasscommand itself. The other 12 branches all route throughdrone.
| Branch | --help ⬜ |
Read-only smoke | Side-effect (run deliberately) |
|---|---|---|---|
| drone | ⬜ | drone systems · drone list · drone --version |
drone scan @<b> · drone activate @<b> |
| seedgo | ⬜ | drone @seedgo audit · drone @seedgo standards_query · drone @seedgo diagnostics |
drone @seedgo audit aipass (full scan) |
| prax | ⬜ | drone @prax status · drone @prax dashboard · drone @prax log-audit |
drone @prax monitor (interactive) |
| cli | ⬜ | drone @cli · drone @cli display · drone @cli templates |
drone @cli display demo |
| ai_mail | ⬜ | drone @ai_mail inbox · drone @ai_mail sent · drone @ai_mail contacts |
⚠️ dispatch / email / reply / close |
| api | ⬜ | drone @api status · drone @api stats · drone @api models · drone @api list-providers |
⚠️ get-key / validate / call (touch keys/network) |
| flow | ⬜ | drone @flow list · drone @flow list open |
⚠️ create / close / restore / aggregate |
| spawn | ⬜ | drone @spawn --help · drone @spawn sync-registry |
⚠️ create / update / delete (use --dry-run) |
| trigger | ⬜ | drone @trigger errors · drone @trigger core |
⚠️ medic toggle |
| memory | ⬜ | drone @memory search "test" · drone @memory verify |
⚠️ rollover · watch (daemon) |
| aipass † | (n/a) | aipass --version · aipass --help · aipass init --help · aipass doctor |
⚠️ aipass init … (scaffolds) |
| hooks | ⬜ | drone @hooks status · drone @hooks engine |
⚠️ hooksound (mute) · claude (bridge) |
| devpulse | ⬜ | drone @devpulse feedback · drone @devpulse watchdog --help |
⚠️ watchdog agent @<b> (arms wake) |
Known cross-OS gap registry (living — update as fixed)
Tracks every confirmed/suspected portability gap so a red here is "expected, tracked" not a mystery. Source of truth: DPLAN-0194. Status: ✅ fixed · 🔧 owner assigned · ❓ suspected/untested.
| # | Gap | OS | Symptom | Owner | Status |
|---|---|---|---|---|---|
| 1 | cp1252 stdout + Rich in CLI entry points | Win | UnicodeEncodeError('charmap') on aipass init banner & drone @branch print |
aipass/drone | ✅ S190 (reconfigure(utf-8) at entry) |
| 2 | .venv symlink |
Win | setup.sh/init → WinError 1314 (no symlink priv) |
aipass | ❓ untested (CI left AIPASS_HOME unset) |
| 3 | start_new_session= kwarg |
Win | daemon spawn throws (POSIX-only) | ai_mail / flow | ❓ |
| 4 | os.kill |
Win | watchdog / daemon stop throws | flow + others | ❓ |
| 5 | .venv/bin vs Scripts |
Win | path resolution misses console scripts | memory / drone / ai_mail | ❓ |
| 6 | hardcoded /tmp |
Win | scratch-dir writes fail | hooks / seedgo | ❓ |
| 7 | aplay-only audio |
Win/mac | hook sound silent / errors | hooks (+ template hooks) | ❓ (mac needs afplay, Win winsound) |
| 8 | shell=True usage |
Win | quoting/semantics differ | hooks | ❓ |
| 9 | route_command masks errors |
all | real exceptions printed as "Unknown command" | aipass | 🔧 recommended (not fixed — hid gap #1 for hours) |
@seedgo's
windows_compat_check.pyalready scans for several of these statically — extending it to flag the cp1252/entry-point pattern (#1) and theaplay//tmp/os.killpatterns is P2.
Run Record (copy one block per machine/run)
─────────────────────────────────────────────
AIPass Cross-OS Run Record
Machine/VM :
OS + version :
Arch :
Python :
Shell / term :
AIPASS_HOME :
Commit (drone @git log -1) :
Tester : Date :
─────────────────────────────────────────────
Phase 0 env capture .......... ✅ / ❌
Phase 1 clean install ........ ✅ / ❌ notes:
Phase 2 e2e suite (14/14) .... ✅ / ❌ notes:
Phase 3 aipass init .......... ✅ / ❌ notes:
Phase 4 drone routing ........ ✅ / ❌ notes:
Phase 5 daemons .............. ✅ / ❌ notes:
Phase 6 hooks + sound ........ ✅ / ❌ notes:
Phase 7 interactive .......... ✅ / ❌ notes:
Per-branch matrix (13) ....... ✅ / ❌ reds:
─────────────────────────────────────────────
New gaps found (file + assign):
Overall verdict: PASS / PARTIAL / FAIL
─────────────────────────────────────────────
Layer 3 of cross-OS confidence. Pairs with tests/e2e/ (layer 2) and drone @seedgo Windows-compat scan (layer 1). See DPLAN-0194 for the full strategy.