Commit Graph
154 Commits
Author SHA1 Message Date
AIOSAI 0886c9013c #620: git_gate block messages guide instead of dead-end — explain WHY git is enforced, list key drone @git commands, point to --help, show disable path (git_gate.enabled=false in .aipass/hooks.json, verified engine skips disabled hooks per-hook). Split GIT_GH_REDIRECT -> GIT_REDIRECT + GH_REDIRECT; EDIT_REDIRECT shows disable too. Init notice in project_hooks.json template, on/off in README. 6 tests, seedgo 31/31. 2026-07-10 21:30:35 -07:00
AIOSAI b4e2370ee8 #644: gate Telegram /create + /cancel to base @aipass bot only — base_bot.py guards on branch_name (branch bots return False in _dispatch_command + omit from get_custom_commands; base bot None still routes both). Rides along @skills #669.2/#669.3 fail-loud (botfather_client _load_telethon_config raises RuntimeError naming config path vs silent None) + #668 offset tests. 133 TG tests, seedgo 31/31 both files. 2026-07-10 21:19:04 -07:00
AIOSAI c8b7250995 #675: seedgo skips throwaway code — is_throwaway_path (cross-plat temp+scratchpad) + is_prototype_file (# seedgo: prototype marker) in skip_dirs.py; wired into branch_audit._collect_py_files + checklist --prototype early-return. A disposable POC no longer fires 8 violations. 6 tests, live-verified skip. 2026-07-10 21:16:02 -07:00
AIOSAI d8aa300d6b #666: claude() boot shim now ships + installs on onboarding — root .gitignore negation tracks only hooks/tools/install_boot_shim.sh (README stays ignored); setup.sh runs it after hook install (idempotent marker check, non-fatal, venv resolved from script location). Fixes dev-local-only boot feature (macOS user couldn't attach/resume). @hooks did gitignore+installer, devpulse wired setup.sh. 2026-07-10 21:01:07 -07:00
AIOSAI d229ee5df5 #680: cross-platform _is_branch_occupied + _read_session_type (wake.py + daemon.py) — extracted _get_pid_cwd (Linux /proc, macOS lsof -Fn) + _read_session_type_darwin (ps -wwE); macOS occupancy no longer always-False so wake-back won't double-session an interactive branch. Fail-safe on unreadable cwd/env. +11 tests, seedgo 31/31 both files. 2026-07-10 20:43:01 -07:00
AIOSAI 39d979302c #606: SubagentStop gate skips ~600ms seedgo check on empty agent_type (internal CC turns) — early-return _ALLOW at top of handle(); real sub-agents (non-empty agent_type) still get the full modified-files check, Piper untouched (separate hook). +3 tests, 17/17 green, seedgo 31/31. 2026-07-10 20:39:25 -07:00
AIOSAI a4d00e2068 CHANGELOG: #684 os.kill(pid,0) fleet migration (9 sites Windows-guarded, git_lock_tool -> #687). 2026-07-10 19:00:11 -07:00
AIOSAI cac79b4b1a CHANGELOG: record this session's closes — #682 os.kill detector, #665 (full close, items 1/2/4/5/8), #685 subcommand_help standard, #673 append_jsonl + sweep + fleet adoption. 2026-07-10 18:37:22 -07:00
AIOSAI 01fe4fe6e3 #665 (items 6-7) install progress + README audit command fix.
Item 6 — aipass install pip step looked hung. setup.sh ran the heavy editable install of the [dev,memory] extras with pip --quiet, so it went SILENT for minutes during memory wheel builds (looks frozen to a first-time user). Dropped --quiet on that step so pip streams progress, and set the expectation in the echo ('can take a few minutes while the memory wheels build'). Left the fast pip-upgrade step quiet.

Item 7 — README quick-start command errored. README.md:147 showed 'drone @seedgo audit my_project', but audit takes a registered PACK name, so it fails with Unknown pack. Corrected to 'audit aipass' (matches the working example at :119).

Remaining #665 items (version hardcode, --help command names, subcommand --help contract, placeholder descriptions, bare-mode hints, crash-vs-unknown) span aipass/drone/daemon/memory/spawn and stay open for a coordinated per-owner pass. setup.sh syntax-checked (bash -n).

Rides PR#659 (issue-clearing, no main-merge).
2026-07-10 10:37:01 -07:00
AIOSAI 4d9e691e04 #668+#669 skills/telegram: poll offset re-drain, systemd suicide-loop, silent config fallback.
#668 — poll loop re-drained a rate-limited backlog in a flood loop. The offset advanced AFTER process_update, so a rate-limited/rejected/erroring update never advanced it and the same backlog was re-fetched. Fix: advance the offset BEFORE process_update, so a consumed update never pins it (base_bot.py run loop).

#669 — three fixes: (1) systemd unit gets KillMode=process so a Restart is not killed by the old instance's cgroup teardown (the suicide-loop); (2) create_bot_via_botfather now RAISES RuntimeError with an actionable message (names the set-secret command) instead of silently returning None when telethon config is missing/unready — fail-honestly (botfather_client.py); (3) stale config-mechanism docstrings corrected (bot_factory/bot_operations).

Bonus (unbriefed but correct + beneficial): @skills also Windows-hardened _is_pid_alive (OpenProcess+GetExitCodeProcess on win32, os.kill moved into the POSIX branch) + refactored _check_lock to use it, and switched TEMP_DIR to tempfile.gettempdir(). Side effect: base_bot.py os.kill is now platform-guarded.

Built by @skills, verified by devpulse: 653 telegram tests green (incl lock/pid tests exercising the refactor); #668 offset-before-process verified by inspection; #669.2 raise covered by test_botfather_client. Note: @skills dispatch bounced on a usage-limit retry AFTER completing the work — verified the on-disk result independently.

Rides PR#659 (issue-clearing, no main-merge). Source: devpulse todos #41/#52.
2026-07-10 10:32:20 -07:00
AIOSAI e302df6ec0 #683 hooks: rollover _find_repo_root fails loud + edit_gate soft entry-count guard (#664 follow-up).
Two hardening items surfaced during #664 that @memory could not touch (cross-branch edit gate blocked it).

ITEM 1 — _find_repo_root fail-loud (lifecycle/rollover.py). The PreCompact rollover hook's _find_repo_root() returned None SILENTLY when AIPASS_HOME/cwd was wrong -> rollover no-ops invisibly (the exact silent-skip that hid #664 for months). Now logs a logger.error with the AIPASS_HOME value + cwd before returning None (still degrades, just visibly).

ITEM 2 — edit_gate soft entry-count guard (security/edit_gate.py). edit_gate enforced per-entry CHARACTER caps but not entry COUNTS, so a branch could drift past its count cap between rollovers. New _check_section_counts warns (NEVER blocks) when a rolling section exceeds its cap, reading the SAME memory.config.json rollover caps @memory uses (config_loader.section('rollover') -> per_branch/defaults -> count); wrapped so a config-import failure degrades silently.

Built by @hooks, verified by devpulse: 70 tests green (+14 incl never-blocks guarantee, boundary cases, per-branch override, import-failure resilience); LIVE repro proves item1 logs the error on a bad root and item2 warns over-cap (20/15) without blocking; config structure confirmed to match memory's real caps (not inert).

Rides PR#659 (issue-clearing, no main-merge). Source: #664 verify (S292).
2026-07-10 10:27:03 -07:00
AIOSAI a3a476f59d #679 spawn: is_owner() case-folds — is_owner('DEVPULSE') == is_owner('devpulse').
registry.is_owner (apps/handlers/registry.py:382) @-normalized the email but never lowercased, so a mixed-case branch name (registry names are mixed-case: DEVPULSE vs devpulse) returned False against the seated owner while the lowercase form returned True. Harmless today — the only live caller (@ai_mail dispatch_monitor._wake_sender) lowercases first — but the frozen TDPLAN-0012 contract promises a normalized email, and PART-4 owner-gating of watchdog/feedback may pass a raw branch name.

Fix: lowercase BOTH sides of the comparison (passed-in email AND registry owner email), @-strip preserved. +1 case-insensitivity test. Built by @spawn, verified by devpulse: LIVE repro — every case variant of the owner (DEVPULSE/@DEVPULSE/DevPulse) resolves True, non-owners (seedgo/@SEEDGO) and empty stay False; 316 spawn tests green (+1), seedgo 100%.

Rides PR#659 (issue-clearing, no main-merge). Source: #678/TDPLAN-0012 verify.
2026-07-10 04:06:19 -07:00
AIOSAI c970c5761f #634 devpulse: watchdog stall detector — kill false-positives on long tool calls + surface stall live.
Two rough edges on the JSONL stall detector, both hardened in one pass on my own module (apps/handlers/watchdog/agent.py).

PART 1 (false-positive): _has_jsonl_activity inferred liveness purely from JSONL file-size growth over the 120s window. An agent doing ONE genuinely long operation (big Read, long Bash, heavy compute) writes no new JSONL lines for that span -> read as idle -> STALLED fires WHILE the agent is actively working. Fix: watch_agent now also treats an in-flight tool_use as activity. While a tool runs, the assistant's tool_use is the last transcript entry; new _last_entry_is_inflight_tool() tail-reads the newest .jsonl and detects it (fully defensive -> False on any parse/shape drift, degrading to size-based). LIVE-PROVEN against real Claude Code transcripts: sampled my own session across a 10s in-flight bash -> tool_use line is written at tool START and persists the whole call (the sub-second flush lag is irrelevant at the 120s horizon).

PART 2 (invisible stall): the stall only hit _stderr()+logger. The Monitor tool that arms the watchdog turns each STDOUT line into a live event but only captures stderr to a file (never surfaced) -> devpulse never saw the stall until the 600s timeout. Fix: new _stdout_event() emits the stall (+ a long-running-tool advisory for a possibly-hung tool, + a resumed signal) to stdout so Monitor relays it live; the verbose trail stays on stderr+logger.

Stall logic extracted into a StallTracker class (kills deep-nesting). +9 tests (unit + full-loop stdout proofs + real-transcript schema check); 142 watchdog tests green, seedgo audit 100%, no type errors.

Rides PR#659 (issue-clearing campaign, no main-merge).
2026-07-10 03:57:19 -07:00
AIOSAI cded2993f5 #664 memory: external-project branches now auto-roll (rollover discovery no longer cwd-scoped). Branch discovery only saw registries reachable by walking up from the caller cwd, so branches living solely in an external project's *_REGISTRY.json were never reached by rollovers fired from the AIPass tree (PreCompact hook runs cwd=repo root) — their .trinity grew unbounded (one hit 110 key_learnings vs a 15 cap) and vectors went stale. @memory added a persisted known_registries.json (gitignored per-install data) recording every external registry seen via the cwd walk, so discovery reaches them regardless of caller cwd; stale/deleted paths filtered on load. Plus a soft entry-COUNT guard at write time (warns, never blocks) since gates only enforced char caps. Remaining hooks-side harden (_find_repo_root fail-loud + edit_gate count-guard) filed for @hooks. Built by @memory, verified by devpulse: 70 changed-file tests green (+12), memory_json gitignored (data local, code ships), LIVE REPRO proves a rollover fired from AIPass root now reaches an external-registry branch (was invisible before). 2026-07-10 03:28:34 -07:00
AIOSAI 0878afbc81 #676 aipass: init update now refreshes AGENTS.md + prunes stale managed cruft. GAP1 — update_project synced AGENTS.md from a .aipass/project_AGENTS.md template that never existed, so AGENTS.md was a SILENT no-op on every 'aipass init update' (only CLAUDE.md, whose template exists, synced). Added the template + reconciled create/update to one source. GAP2 — update was additive-only; added a whitelist-scoped cleanup pass (_STALE_MANAGED_FILES, currently the retired aipass_global_prompt.md) that removes only positively-identified managed artifacts, logs each removal, never touches user files (registry/README/.gitignore/src/.trinity). SHIP-GAP caught in verify: .aipass/project_AGENTS.md was gitignored by the .aipass/.gitignore allowlist — added !project_AGENTS.md negation or the template would never distribute (the fix would be inert on real installs). Built by @aipass, verified by devpulse: 83 bootstrap tests green (+7), seedgo 31/31, live repro proves update emits AGENTS.md (name-interpolated) AND removes a planted cruft file. 2026-07-10 03:07:01 -07:00
AIOSAI 739dada015 #671 prax: single-instance lock on the monitor — stop duplicate/orphan monitors from double-sending Telegram relay. New instance_lock handler writes a liveness-checked pidfile (prax_json/monitor.pid, outside the tailed system_logs/): acquire() before relay init refuses to start (fail-loud, names the holding PID) when a live monitor holds the lock, reclaims a stale pidfile on a dead PID, release() clears it on shutdown. Liveness probe platform-branched — POSIX os.kill(pid,0), Windows OpenProcess/GetExitCodeProcess (a raw os.kill(pid,0) TERMINATES the target on Windows; reused the canonical devpulse/watchdog/agent.py:137 impl). monitor.py split under the 600-line limit (pid_cache extracted). Built by @prax, verified by devpulse: 120 tests green across the 4 touched files (+25 new incl 3 Windows-path), seedgo 31/31 on all 3 sources. Verify caught the Windows os.kill hazard on the first pass; filed the seedgo windows_compat detector gap as #682. 2026-07-10 02:53:29 -07:00
AIOSAI 10a8f738a0 #660 install: aipass install no longer hard-exits 2 (silently) when it cannot create global symlinks. setup.sh runs under set -euo pipefail; the #660 safe_symlink refactor returns 2 on ln failure, but the call sites read rc on the NEXT line (rc=$?) — so set -e killed the installer at the symlink step BEFORE the ~/.local/bin fallback (built for exactly the no-sudo case) could run. Any sudo-less env (containers, CI, locked-down machines) got a silent exit 2 + no symlinks despite an otherwise-complete install. Fixed all 3 call sites to rc=0; safe_symlink ... || rc=$? (set-e-safe). Found by the #678 owner-capability docker verify. +tests/docker_owner_verify.sh (owner-capability SOP harness) +tests/_install_diag.sh. 2026-07-10 01:07:35 -07:00
AIOSAI 550839003e changelog: 2026-07-10 — #678 owner-capability model + #661 watchdog exit-code fix 2026-07-10 00:47:10 -07:00
AIOSAI 6a757a21f1 #674 trigger: debounce trigger_data.json writes + confirm bulletin_created retired. Branch log watcher persisted dedup hashes + positions with 2 full-file rewrites PER log event (44K file churned 1-2x/sec under load). Now: dirty-flag + coalesced writer, both keys in ONE atomic write at most every 5s, force-flush on watcher stop. bulletin_created confirmed retired (archived, 0 live refs, 0 warnings on load). Built by @trigger, verified by devpulse: 564 tests (+6 debounce), seedgo 31/31 on changed file (output_routing clean), live load 0 bulletin warnings, correct live file (branch watcher, not stale dup). 2026-07-09 22:06:17 -07:00
AIOSAI f5554158f9 #660 install: aipass install no longer silently repoints global drone/aipass symlinks. setup.sh safe_symlink guard refuses to hijack a symlink pointing at a DIFFERENT install (loud from->to warning, left untouched) unless --force-symlink; --no-symlink opts out entirely. Both flags thread through install.py -> _run_setup. Fresh/same-location installs unchanged. +tests/setup_symlink_guard_test.sh (10 asserts) +3 flag-forwarding tests; touched install output migrated to cli success() (#661). Verified: 635 aipass tests, seedgo 31/31, live dry-run forwarding + guard test all-pass. 2026-07-09 21:34:17 -07:00
AIOSAI bc0d403da9 #662 flow: close no longer false-reports 'timed out after 30s' on a committed close. close_plan_impl now honors spawn_background — single close fires the detached _spawn_background_runner (same path as close_all) and returns right after archive; the synchronous 30s 'drone @memory process-plans' that drone was killing is gone. Removed cross-handler imports (archive/trigger injected). Fix built by @flow, verified by devpulse: 730 flow tests green (+2), seedgo 31/31 x3, live repro close=5.1s exit 0 (was 30s-timeout->false exit 1). 2026-07-09 21:15:18 -07:00
AIOSAI 26a5f3a2ee #663 doctor: isatty guard — aipass doctor no longer hangs on non-interactive/blocking stdin. prompt_auto_wire now declines auto-wire when stdin isn't a tty (was: input() blocked forever on a stdin that never EOFs — read as a crash to CI/subprocess callers of the flagship health command). +3 regression tests; output_routing migrated to cli success(). Live-repro proven: blocking non-tty stdin completes instead of hanging. 2026-07-09 20:50:47 -07:00
AIOSAIandClaude Opus 4.8 d2d1adca0a #661 exit-code foundation: @cli resolve_exit + error() auto-trip (inert) + @seedgo output_routing checker + devpulse reference adoption
- @cli: process failure-flag + resolve_exit(handled)->0/1/2; error() auto-trips the flag; inert until a branch adopts it; 10 tests, seedgo 100%
- @seedgo: new output_routing standard (39th checker) flags user-facing status output bypassing cli helpers; 254-site per-branch migration checklist; precise (0 FP, dogfooded on devpulse); 1178 tests
- devpulse: first adopter — main()->reset_command_state()+resolve_exit(); feedback module+handlers migrated raw-red/logger.error->error(); exit 2/0/1 verified; 380 tests green; seedgo 100%
- CHANGELOG updated. Fleet migration (remaining 13 branches) to follow. Tracked in DPLAN-0236.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HeaAmr3oj2ZexB6ng311Vj
2026-07-09 19:38:17 -07:00
AIOSAI f0fc282630 CHANGELOG: silent hook-wiring break fix + json_handler empty-guard (#667) + wire_verify checker under 2026-07-09 2026-07-09 16:27:25 -07:00
AIOSAI d0a31fd862 hooks: boot-shim installer resolves venv python from script location — kills hardcoded /home/patrick path (POSIX + Windows aware) 2026-07-09 13:16:36 -07:00
AIOSAI 08d87d95e9 hooks: macOS session lock-out fix — /proc→ps portable ancestry walk, actionable boot/presence-gate messages, dedupe doubled --permission-mode (built by @hooks) 2026-07-09 11:35:53 -07:00
AIOSAI 195b9f081c backup: drive-sync respects .backupignore on sync path + PosixPath log fix — stale-store junk can't cause 8hr syncs (built by @backup) 2026-07-07 21:18:39 -07:00
AIOSAI a20d191f87 tests: dev-docker verify script (bridge-era, 19 assertions) — proven vs real dev clone; supersedes stale docker_clone_test.sh 2026-07-07 20:07:32 -07:00
AIOSAI 5fd8c6a015 cadence fresh-context reset + aipass misroute guidance: SessionStart wiring (handler/config/setup.sh), loaders period-5, kernel+navmap aipass-exception, guide-not-crash (drone/aipass) 2026-07-07 20:02:45 -07:00
AIOSAI 47b5b2d871 prax: log watchdog covers branch logs/ dirs — .jsonl runaway growth caught (built by @prax)
- Root cause: rotation .log-hardcoded; .jsonl files are raw open('a') appenders bypassing prax; watchdog only scanned system_logs
- New: scan_branch_log_files (WARN 1MB / CRITICAL 10MB unrotated), enforce_branch_log_limits (tail-keep 5000 lines), branch health summary, log-audit shows both scopes
- 11 new tests, prax suite 947 green (61/61 verified in touched files by devpulse)
- Offender writers routed to owners: @hooks engine.jsonl+telegram_delivery.jsonl, @backup operations.jsonl, @trigger medic_suppressed.log
2026-07-06 10:16:11 -07:00
AIOSAI ce1a138cdf README: restore HVTrust badge — hvtracker issue #109 fixed upstream 2026-07-05 23:02:17 -07:00
AIOSAI 6200e01522 setup.sh: OS-aware hook bridge — Windows venv python is Scripts/python.exe (DPLAN-0234 Strand C)
- bash passes IS_WINDOWS into the hook-install heredoc; bridge string picks .venv/Scripts/python.exe vs .venv/bin/python3
- @hooks assessment: $AIPASS_HOME expansion fine (CC runs hooks via Git Bash on Windows), bridge has zero POSIX assumptions — interpreter path was the only gap
- Verified both OS modes + merge-marker/custom-hook regression
2026-07-05 17:36:19 -07:00
AIOSAI 18dea21726 setup.sh: merge user hooks instead of overwriting (DPLAN-0234 Strand C fix)
- AIPass bridge entries (bridges/claude.py marker) refreshed on every install; user-wired hooks and custom events preserved
- Fixture-verified: customs survive, stale bridge entries replaced no-dupe, fresh-install output shape-identical
- Context: full 17/17 hook fire-test passed on fresh Linux Docker install
2026-07-05 17:15:38 -07:00
AIOSAI c8e1f07fdb ./aipass repo-root launcher — cold-clone entry (DPLAN-0234 Strand B, built by @aipass)
- New stdlib-only bash launcher at repo root: pre-setup only 'install' works (delegates to setup.sh, full flag pass-through); post-setup execs the venv aipass binary transparently
- 13 launcher tests (tests/test_launcher.py), bypass.json architecture entry for the test file
- README Quick Start leads with ./aipass install; CHANGELOG entry
2026-07-05 15:50:01 -07:00
AIOSAI 5503b42806 setup.sh chains into aipass init run — clone-first one-command install (DPLAN-0234 Strand A)
- setup.sh: --no-init / --with-init / --project flags + init-chain tail (interactive-on, CI/headless auto-skip)
- install.py: passes --no-init to setup.sh (install owns its handoff — no double-scaffold)
- README Quick Start + CHANGELOG updated to the one-command flow
- Clean-room Docker proven: bare headless run skips (CI path unchanged), --with-init chains to '✓ Project initialized.', both exit 0; 39/39 install tests, seedgo 30/30
2026-07-05 15:28:36 -07:00
AIOSAI 49700670b9 feat(aipass): aipass install one-command bootstrap (DPLAN-0233) + hide bugged HVTrust badge + devpulse prompt clarity
- aipass install: pip install aipass && aipass install → clone, setup.sh, verify, auto-launch init. Clean-room Docker proven (2 runs, exit 0). 39 tests, seedgo 30/30.
- README: comment out HVTrust badge (hvtracker v4.1 grade bug, issue #109 filed)
- CHANGELOG: 2026-07-05 section
- devpulse local prompt: sole-git-writer dirty-tree note
2026-07-05 12:29:57 -07:00
AIOSAIandClaude Opus 4.8 4105a7e8a7 chore(standards): all 17 branches to 100% — Windows-compat sweep + checker getattr fix
Windows-compat hardening across every branch to reach 100% on the seedgo
standards audit:
- UTF-8 stdout/stderr reconfigure guards (getattr form) on Rich/CLI entry points
- platform-branched POSIX-only subprocess kwargs (start_new_session ->
  CREATE_NEW_PROCESS_GROUP on win32)
- seedgo windows_compat checker: credit the getattr reconfigure form + locking test
- commons: shared-init test-suite speedup
- spawn: aipass_framework template — strip pytest.ini inline comments + add scaffold smoke test
- includes in-progress cross-OS testing work (doctor/init_flow/cross_os handlers + tests)

Verified: full audit 17/17 at 100%, pyright clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013uzDhtcZ6wT1T9e2AHPQig
2026-07-04 21:15:12 -07:00
AIOSAIandClaude Opus 4.8 8630cd90a3 config(prompts): configure cli/drone/prax branch prompts (were spawn stubs)
The 3 branches the template checker correctly flagged had never had their
.aipass/aipass_local_prompt.md filled in — they booted with a NEEDS CONFIGURATION
placeholder and no branch-specific identity. Each branch wrote its own real prompt
(identity, key commands, architecture, critical rules, integration points;
~63-67 lines, PROMPT_STYLE.md format).

Dispatched @cli/@drone/@prax (each owns its identity); verified independently —
0 stub markers, all three Template 100%, real coherent content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013uzDhtcZ6wT1T9e2AHPQig
2026-07-03 12:18:47 -07:00
AIOSAIandClaude Opus 4.8 bf9ef340b6 fix(seedgo): template checker — strip markdown code before definitive scan too
Pass 3 / final. The definitive-marker scan still matched {{BRANCH}} inside markdown
inline code — spawn's README documents 'Replace `{{BRANCH}}` in...', which is
scaffolding docs, not an un-rendered stub (spawn scored 66%). For .md files, fenced
+ inline code is now stripped once up front before BOTH the definitive and
single-curly scans; passport.json (JSON) still scans raw. Safe because real stubs
carry markers in prose/headings (the '## Status: NEEDS CONFIGURATION' line), never
exclusively in code.

Verified system-wide: Template avg 80%→94%; spawn + seedgo cleared to 100%; only
the three genuine unconfigured prompt stubs (cli/drone/prax) still flag. +3 tests
(24/24), full suite green (1132). Completes the checker-solid work begun in 26893fb.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013uzDhtcZ6wT1T9e2AHPQig
2026-07-03 09:18:27 -07:00
AIOSAIandClaude Opus 4.8 26893fb66a fix(seedgo): template checker — stop false-flagging memory prose + README code
The advisory 'template' stale-checker matched marker strings anywhere in a file,
firing on documentation ABOUT templates rather than un-rendered stubs. Two root
causes fixed:

1. Scanned .trinity/*.json (all memory) — local.json/observations.json accumulate
   marker mentions (seedgo's own note about the checker, prax's template_pusher
   note). Now scans passport.json only, the sole spawn-templated trinity file.
2. Single-curly {…} regex ran on every .md, matching inline JSON/f-strings/code
   paths in READMEs. Now single-curly detection runs on the branch prompt only
   (README template has no single-curly placeholders) and strips fenced + inline
   code first.

Definitive-marker detection unchanged — real stubs (cli/drone/prax prompts) still
flag. Verified live: seedgo 100%, drone/prax flag only the real prompt stub.
+4 tests (21/21). Dispatched to @seedgo (owner), verified independently.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013uzDhtcZ6wT1T9e2AHPQig
2026-07-03 09:01:59 -07:00
AIOSAI 5b04c2125c docs(changelog): open [2026-07-03] period — TG reply-overwrite fix
New post-2.6.1 changelog period (unreleased, merge held for later). Documents the
_advance_pending processing_message_id fix under Fixed (@hooks, f42a98b, PR #651).
2026-07-02 22:01:09 -07:00
AIOSAI ea2f7a49a7 docs(changelog): document drone @git tag verb under 2026-07-02 (no bump) 2026-07-02 19:13:55 -07:00
AIOSAI 55bc4d0bb1 chore(release): bump 2.6.0 -> 2.6.1 for the DPLAN-0226/FPLAN-0289/TDPLAN-0010 batch merge
PATCH bump riding into PR#646 so main's merge commit carries the release version. pyproject + __init__ = 2.6.1 (must match the v2.6.1 tag). CHANGELOG [2026-07-02] leads with the release rollup + all 6 CI-stabilization fixes.
2026-07-02 17:41:16 -07:00
AIOSAI e92dcaff12 fix(ci): restore green — advisory template checker no longer gates audit + 3 test/module regressions
Root-cause fixes for PR#646 red (dev broke after DPLAN-0226/FPLAN-0289/TDPLAN-0010 batch):
- seedgo: branch_audit honors ADVISORY (template_check no longer averaged into gate) + presence_gate added to hooks-snapshot fixture (4 tests)
- hooks: cc_sessions README entry + seedgo modules bypass (reads external ~/.claude, not branch data)
- spawn: retire passport(disabled).py/passport_ops(disabled).py to .archive/ (disabled suffix kept broken cross-import visible to type checker)
- ai_mail: broker-fd test gives testbranch a real .trinity/passport.json for the new marker-walk resolution (f914ab6)
2026-07-02 15:47:53 -07:00
AIOSAI df5a1493bb docs(readme): remove pip entirely — clone-only install, badges + version + uninstall purged (TDPLAN-0010) 2026-07-01 09:44:23 -07:00
AIOSAI f914ab616e refactor(drone): .trinity/-marker walk-ups replace src/aipass hardcodes — portable resolution + access checks (TDPLAN-0010, FPLAN-0296) 2026-07-01 08:54:05 -07:00
AIOSAI 13463c0ce0 feat(spawn): rename builder->aipass_framework, {{CITIZEN_CLASS}} placeholder, retire birthright, per-project registry targeting (TDPLAN-0010, FPLAN-0294) 2026-07-01 08:16:54 -07:00
AIOSAI 5a3d01efb1 feat(aipass): aipass init template selector — empty-project default + stage gating (TDPLAN-0010, FPLAN-0295) 2026-07-01 08:09:30 -07:00
AIOSAI a2812abc90 refactor(ai_mail): portable find_repo_root() marker-walk replaces fixed-depth _REPO_ROOT (TDPLAN-0010 foundation, FPLAN-0293) 2026-07-01 07:26:16 -07:00
AIOSAIandClaude Opus 4.8 2a5a370185 fix(drone): --json pass-through uses sys.stdout.write, no Rich mid-string wrap (td-49)
--json was routed through Rich console.print(), which defaults to width 80 on
a non-TTY and hard-wraps mid-string, producing invalid JSON (e.g. 'Security
\nScan'). Write raw JSON with sys.stdout.write() in the pass-through paths
(drone.py + router.py); keep Rich for drone's own human UI. Verified live.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EccxENcB3KtyT9XuT4ybPz
2026-07-01 06:12:02 -07:00