* feat(system): fix(windows-ci): combine pip bootstrap fix + venv activation in Verify step
Combines both fixes needed to get windows-test.yml actually passing:
1. setup.sh: stop swallowing ensurepip errors (quiet + 2>/dev/null + || true was
hiding real failures — pip was silently not installed). Add get-pip.py fallback
and hard pip verification.
2. windows-test.yml: add 'source .venv/Scripts/activate' to Verify step. Each CI
step gets a fresh shell — setup.sh's venv activation doesn't carry over, so
drone wasn't on PATH in the subsequent step.
Together, these should take Windows CI from the 'silent failure every run since
creation' state to actually green. Supersedes PRs #330 and #331 which had the
fixes on separate branches (neither green alone).
Co-Authored-By: @devpulse <devpulse@aipass>
* feat(system): chore(lint): ruff auto-fix sweep — 303 errors across 178 files (F401 unused imports + F541 f-string placeholders + F811 redefined); restored report_error re-export + added logger call in errors.py
Co-Authored-By: @devpulse <devpulse@aipass>
---------
Co-authored-by: @devpulse <devpulse@aipass>
feat(system): fix(windows): hooks use venv python not python3 (#307), identity_injector reads identity.name fallback (#309), Path.rename→os.replace for Windows (#310), RotatingFileHandler catches PermissionError on rotation (#311)
feat(system): ci: add Windows setup test workflow — runs setup.sh + drone CLI verification on windows-latest GitHub Actions runner. Triggers on changes to setup.sh, handler __init__.py files, cli.py, or pyproject.toml. Closes the 'we never tested on Windows' gap.
* feat(system): ci: add Windows setup test workflow — runs setup.sh + drone CLI verification on windows-latest GitHub Actions runner. Triggers on changes to setup.sh, handler __init__.py files, cli.py, or pyproject.toml. Closes the 'we never tested on Windows' gap.
Co-Authored-By: @devpulse <devpulse@aipass>
* feat(system): fix(windows): SIGPIPE guard in flow.py (#301) + fcntl platform guards in trigger/config.py and watchdog/registry.py (#302) — lazy import fcntl on Unix only, no-op on Windows. inbox_lock.py already cross-platform (msvcrt). ai_mail.py already guarded (hasattr check).
Co-Authored-By: @devpulse <devpulse@aipass>
* feat(system): fix(windows): handler guard backslash path fix — all 11 __init__.py files (#304). caller_file.replace('\\', '/') normalizes Windows paths before the same-branch check. This is the actual fix for #293 which was incorrectly closed. drone is completely broken on Windows without this.
Co-Authored-By: @devpulse <devpulse@aipass>
---------
Co-authored-by: @devpulse <devpulse@aipass>
feat(system): fix(windows): PYTHONUTF8=1 in drone cli.py for Rich Unicode on Windows (#296) + STATUS.md reset to stub (#291) + README.md platform honesty (Linux tested, macOS untested, Windows in progress)
feat(system): fix(setup): Windows 10 hardening — python3 MS Store alias fallback (#292), venv file-locking workaround (#294-C), pip bootstrap via explicit venv python (#294-B/E), strip stale .venv from PATH (#294-D), PYTHONUTF8 for Rich Unicode (#296). All fixes from Input-X's Windows 10 test session. Linux path unchanged — same python3 detection, same venv flow.
* feat(system): fix(windows): PYTHONUTF8=1 in drone cli.py for Rich Unicode on Windows (#296) + STATUS.md reset to stub (#291) + README.md platform honesty (Linux tested, macOS untested, Windows in progress)
Co-Authored-By: @devpulse <devpulse@aipass>
* feat(system): fix: gitignore STATUS.md + STATUS.local.md — interim fix for #291/#298. Auto-generated status files contain developer session data that shouldn't ship in the public repo. Will be un-gitignored when prax sync produces clean public output.
Co-Authored-By: @devpulse <devpulse@aipass>
---------
Co-authored-by: @devpulse <devpulse@aipass>
feat(system): fix(setup): remove stale bootstrap_branch calls for backup, daemon, commons, skills — these branches were removed in S82/S87 and moved to external repos. setup.sh was creating ghost directories with .trinity/ scaffolding that confused new users and made drone route to non-existent agents. Also removed commons/skills from registry generator. Fixes#294 Part 2, relates to #291.
Email delivery to external branches (e.g. @strategy in Vera-Studio) worked
because delivery.py already had a caller-registry fallback, but wake failed
with "Branch not found" because resolve_branch() only checked AIPASS_REGISTRY.
Extracted the shared registry-walking logic into
registry/read.py::get_caller_project_branches(), then:
- wake.py resolve_branch() now checks AIPASS_REGISTRY first, then falls back
to the caller's project registry via AIPASS_CALLER_CWD (cross-project wake)
- delivery.py _load_caller_project_branches() delegates to the shared function
(eliminates duplicate implementation)
Fixes#283.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add checklist, proof, proof_query, test_map to the Commands list (were
missing from the branch prompt even though the commands work)
- Note that proof/proof_query/test_map are not in --help output yet (TODO)
- Add Hook Ownership section: full inventory of the 8 hooks seedgo owns,
their wiring state (including the unwired subagent_stop_gate), and the
three-location drift. Points at DPLAN-0131 for the consolidation plan.
- Update audit line count from "all branches" to "all 11 agents (33 audit
lines)" to match current reality
- Remove a 38-line branch section from STATUS.md that belongs to an
external private project
- Strip scattered external-project mentions from devpulse session logs in
STATUS.md (S87/S88 entries, DPLAN-0128 T4 line, S90 prax delivery notes,
Track G log leak references)
- Remove an injected reference from .aipass/aipass_global_prompt.md that
pointed at an out-of-scope style guide
- Remove unverified "original convention" literature from
.aipass/PROMPT_STYLE.md
- Remove matching external-project reference from README.md project status
- Remove matching reference from HERALD.md S74 session line
- Add policy note to .aipass/.gitignore: do not add other exceptions here
Empty __init__.py files were failing both checkers as false positives:
- imports: zero-check result scored 0% and reported "Failed (no details)"
- naming: __init__ fails snake_case regex ^[a-z][a-z0-9_]*$
Python package markers don't require imports by convention and cannot
be renamed (Python-reserved). Short-circuit both checkers to return
PASS for any file named __init__.py.
Reported by @devpulse while adding navigator/__init__.py to compass.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Root cause: get_module_logs_dir() last fallback unconditionally created
src/aipass/{name}/logs/ for any unknown module name, causing AIPL polyglot
agents (running with AIPASS_HOME set for cross-project access) to dump logs
into src/aipass/unknown_branch/logs/ inside the AIPass source tree.
Fix in apps/handlers/config/load.py:
- Check AIPASS_CALLER_CWD env var (set by drone during cross-project dispatch,
DPLAN-0121) and walk up to caller project root (.git or pyproject.toml)
- Final fallback: system_logs/external/{module_name} — never creates unknown
directories in ECOSYSTEM_ROOT
- Added inspect.stack() auto-detection when module_name is not provided
- Added _warn_routing() helper for lazy prax logger access (avoids circular
import: logger.py imports load.py at module level)
Also in this PR:
- Regression tests: test_unknown_module_routes_to_system_logs_external and
test_aipass_caller_cwd_routes_to_caller_project (38 tests, all green)
- bypass.json: architecture + documentation exemptions for tests/test_config.py
Cleanup (done separately on main): 27 leaked AIPL polyglot logs moved from
src/aipass/unknown_branch/ to /tmp/aipl_leaked_logs/; directory removed.
CC @polyglot: if AIPL sets AIPASS_CALLER_CWD during drone dispatch, logs will
route to ~/Projects/AIPL/ automatically. No AIPL changes required for the base
fix — the system_logs/external/ fallback already prevents pollution.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root cause: get_module_logs_dir() last fallback unconditionally created
src/aipass/{name}/logs/ for any unknown module, causing external projects
(AIPL polyglot) running with AIPASS_HOME set to pollute the AIPass src tree
with src/aipass/unknown_branch/logs/*.
Fix (already committed in 3c5ac29):
- Check AIPASS_CALLER_CWD env var (set by drone during cross-project dispatch,
DPLAN-0121) and walk up to the caller's project root (.git/pyproject.toml)
- Final fallback: system_logs/external/{module_name} — never create unknown
dirs in the AIPass source tree
- Added inspect.stack() auto-detection when module_name is not provided
- Added _warn_routing() helper for lazy prax logger access (avoids circular
imports — logger.py imports load.py at module level)
This PR:
- Regression tests: test_unknown_module_routes_to_system_logs_external and
test_aipass_caller_cwd_routes_to_caller_project (both green)
- Cleanup: moved 27 leaked AIPL polyglot logs from src/aipass/unknown_branch/
to /tmp/aipl_leaked_logs/ for AIPass Developer review; removed directory
- bypass.json: architecture + documentation exemptions for tests/test_config.py
CC @polyglot: AIPL-side logger config may need AIPASS_CALLER_CWD set during
cross-project dispatch so logs route to ~/Projects/AIPL/ correctly. The fix
is transparent if drone sets AIPASS_CALLER_CWD; no AIPL changes required for
the basic fix, but explicit env var support improves log placement accuracy.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>