Commit Graph
1213 Commits
Author SHA1 Message Date
AIPass e912bda85f Merge pull request #651 from AIOSAI/dev
fix(hooks): TG replies no longer overwrite the previous message — clear processing_message_id in _advance_pending after first delivery so remote/mirror/multi-Stop turns send new messages instead of re-editing. +2 regression tests, 114/114.
2026-07-05 06:09:38 -07:00
AIOSAI 3071ea8eac ci(deps): bump codeql-action init+analyze to v4.36.3 together + group future bumps
The split Dependabot PRs (#init, #analyze) each bumped one path in security.yml,
leaving the sibling at v4.36.2 -> CodeQL fails 'init and analyze must match'.
Bump both to v4.36.3 (SHA 54f647b) in one commit, and add a dependabot groups
block so codeql-action (init/analyze/upload-sarif, one monorepo release) always
lands as a single grouped PR. Fixes the two red Security Scan runs.
2026-07-05 02:07:18 -07:00
AIOSAIandClaude Opus 4.8 12e54e45f6 fix(standards): Windows CI test fixes + architecture-checker template-scaffold exemption
Follow-up to 4105a7e. CI Windows Test surfaced 3 Windows-only test failures where
the sweep cross-platformed the code but tests still asserted POSIX behavior, plus
a fleet-wide architecture ripple from the template scaffold test:

- ai_mail: 3 Popen detach sites now use creationflags=CREATE_NEW_PROCESS_GROUP on
  win32 / start_new_session on POSIX (real win32 detachment); test asserts the
  platform-correct kwargs.
- drone: test_rm.py /tmp assertions guarded to POSIX-only (win32 uses
  tempfile.gettempdir()); the swept code already dropped hardcoded /tmp on win32.
- seedgo: architecture checker exempts template scaffold test files
  (test_scaffold.py via TEMPLATE_IGNORE_PATTERNS) from branch conformance -- a
  template example test is not a structural requirement in every branch. Restores
  all 17 branches to 100%.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013uzDhtcZ6wT1T9e2AHPQig
2026-07-04 21:59:46 -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
AIPass ba817e03fb Merge pull request #654 from AIOSAI/dependabot/github_actions/github/codeql-action/upload-sarif-4.36.3
ci(deps): bump github/codeql-action/upload-sarif from 4.36.2 to 4.36.3
2026-07-04 02:08:09 -07:00
dependabot[bot] a108bc8a06 ci(deps): bump github/codeql-action/upload-sarif from 4.36.2 to 4.36.3
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.36.2 to 4.36.3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...54f647b7e1bb85c95cddabcd46b0c578ec92bc1a)

---
updated-dependencies:
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.36.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 08:02:57 +00: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 776e53044c docs(cross-os): fix CROSS_OS_TESTING.md drift — 11 stages, @hooks status, pre-flight note
@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
2026-07-03 10:32:35 -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 f42a98b887 fix(hooks): TG replies no longer overwrite the previous message
_advance_pending kept the pending file with a frozen processing_message_id, so
any Stop firing without a fresh placeholder (remote/mirror input or multi-Stop
turns) re-edited the same Telegram message instead of posting a new one. Clear
processing_message_id after the first delivery so subsequent Stops fall through
to send a new message. Live-proven on the devpulse bot; +2 regression tests
in TestAdvancePending (114/114).
2026-07-02 20:19:14 -07:00
AIPass 708ed38229 Merge pull request #650 from AIOSAI/dev
Add drone @git tag verb (guarded release-tag automation) + merge playbook update
2026-07-02 19:27:54 -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 f83a003a73 feat(drone): add 'drone @git tag <vX.Y.Z>' — guarded release-tag push, automate the merge playbook's last manual step
devpulse-tier (owner) verb: fetch origin, VERSION GUARD (tag X.Y.Z must match origin/main pyproject + __init__), EXISTS GUARD (refuse if tag exists), tag origin/main + push -> fires publish.yml. 'tag --list' is global tier. Removes the last user-input step from releases (Patrick request, S274). Merge playbook (merge.md) updated to use it. Verb proven live: cut v2.6.1.
2026-07-02 19:02:02 -07:00
AIPass f62fbcfc17 Merge pull request #646 from AIOSAI/dev
Todo burn-down (S245-S246): seedgo readme/bypass fixes, dead trigger handler, dispatch-footer plan-close scope, backup docs sweep, README roster to 17 agents, /prep todo-reconciliation
v2.6.1
2026-07-02 17:56:16 -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 194410d467 fix(skills): deterministic LF in test_streaming byte-offset tests (Windows CRLF)
test_partial_line_not_consumed asserted +1 byte for the newline, but write_text() text mode translates \n->\r\n on Windows (2 bytes) -> off-by-one, failing windows-setup only. Switched both transcript write sites to write_bytes() for deterministic LF cross-platform. Production _tail_transcript_bytes is already CRLF-safe (reads rb, splits b'\n', strips \r) — test-only fix.
2026-07-02 16:46:47 -07:00
AIOSAI e5e740765d fix(spawn): track template scaffolding orphaned by builder->aipass_framework rename
.gitignore exceptions still pointed at templates/builder/ after the TDPLAN-0010 rename (13463c0), so DASHBOARD.local.json + 10 other template dirs/files under templates/aipass_framework/ were silently gitignored — on disk (dirty tree passed) but absent in clean clones/CI. Result: spawn produced no DASHBOARD.local.json and test_full_spawn failed only in a clean checkout. Fixed all 23 .gitignore exception paths + tracked the now-visible template files (all placeholder/seed content: {{BRANCHNAME}}/{{DATE}}/{{CITIZEN_NUMBER}}).
2026-07-02 16:15:05 -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
AIOSAIandClaude Opus 4.8 e1ac4e365f docs(prompts): .trinity entry-cap awareness — point at live *_meta line, no hardcoded numbers
Navmap (@hooks): one bullet in the Memory section — caps are hook-enforced,
the live cap is rendered in each file's *_meta line; read it before writing,
draft to ~80%, one-pass rewrite if rejected. Devpulse branch prompt: same
behavior, explicitly notes caps are NOT listed (single source =
memory.config.json → entry_limits, auto-rendered by @memory's tab_renderer).
Change the config → enforcement + in-file docs follow mechanically; prompts
never go stale.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q3mZT61WsKVN3srCwVDBiW
2026-07-02 05:41:24 -07:00
AIOSAIandClaude Opus 4.8 301f3fcb93 feat(backup): share <file> — single-file Drive upload + shareable webViewLink (FPLAN-0298)
New 'drone @backup share <file_path> [--public]': uploads a single file to Drive
(AIPass Backups/Shared), sets a read permission (default: restricted to the
authenticated user; --public: anyone-with-link), returns the webViewLink
(webContentLink fallback). Reuses upload_single_file + DriveClient; idempotent
via _find_existing_file; fail-loud on every path. 21 new tests, all Drive API
mocked (zero live calls). Existing commands untouched. DPLAN-0230 v1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q3mZT61WsKVN3srCwVDBiW
2026-07-01 19:56:56 -07:00
AIOSAIandClaude Opus 4.8 a5ede6fbf4 feat(skills/telegram): opt-in live streaming edit-in-place for TG bot (FPLAN-0297, DPLAN-0229)
Repurpose the heartbeat into a ~2s transcript-tail loop that edits the "Processing" message in place (block-level: thinking/tool/text), plain text, coalesced, no-op-skipped, 429 retry_after aware, with 4096 rollover. Opt-in per-bot "stream" flag, default OFF; batch path byte-for-byte unchanged. @hooks reviewed: no change needed (already edits processing_message_id for the single-chunk final). Race hardened: re-check delivered before each edit. 37/37 streaming + 653/653 TG tests green; live-proven on the devpulse bot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q3mZT61WsKVN3srCwVDBiW
2026-07-01 18:40:32 -07:00
AIOSAI 337f31ddab fix(prax): per-bot telegram log attribution via AIPASS_BOT_ID/AIPASS_LOG_NAME in get_caller_info — bots no longer collapse into shared skills_base_bot.log 2026-07-01 16:07:22 -07:00
AIOSAI fca1105ed9 docs(pkg): aipass/__init__ docstring clone-only, drop 'pip install aipass' (TDPLAN-0010) 2026-07-01 09:49:36 -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 fd41320e3c chore(spawn): seedgo bypass for stale post-rename 'builder' architecture finding (TDPLAN-0010) 2026-07-01 09:11:59 -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
AIOSAIandClaude Opus 4.8 61f958c17e feat(seedgo): stale-template audit checker — advisory flag for unrendered template markers in local prompts/config (DPLAN-0228)
New auto-discovered advisory standard: warns (never blocks) when a branch
still carries unrendered template markers, so a citizen that never customized
its scaffold no longer fails silently. Adds template_content.py + template.md
standard doc + test_template_check.py.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EccxENcB3KtyT9XuT4ybPz
2026-07-01 06:11:51 -07:00
AIOSAI f6cbe34b61 feat(bridge): DPLAN-0226 unified TG<->CC bridge — CC-native session discovery, live-proven round-trip (FPLAN-0290/0291/0292) 2026-07-01 04:33:05 -07:00
AIOSAIandClaude Opus 4.8 91cb59154d fix(e2e): rm_gate block contract is exit 2, not exit 0 (FPLAN-0289 CI)
beb048d made the Claude bridge propagate a hook's exit code so presence_gate's
UserPromptSubmit block can cancel a prompt. Every security gate
(rm/git/edit/subagent/presence) already returned exit_code 2 for a block, but
the old bridge swallowed it — so test_t2a_rm_gate_blocks pinned exit 0. Update
the e2e contract to expect exit 2 + the stdout decision JSON, which is the real,
live-proven block signal.

Sole CI red on the P1-activation commits: 1 failed, 10116 passed. Fixes both
e2e-wheel (all 3 OSes) and Windows Test (full suite includes tests/e2e).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GmDj4eu8aFFVP2rapovqkg
2026-06-30 04:36:01 -07:00
AIOSAIandClaude Opus 4.8 dc5c1d23fc fix(hooks): presence keys the persistent claude session PID, not the ephemeral hook PID (FPLAN-0289 P1)
Final activation fix. The gate recorded os.getpid(), but the hook runs as a
short-lived subprocess (python3 -> sh -> claude) that dies in milliseconds, so
every later session saw the prior holder's PID as dead, reclaimed it, and never
blocked. claim()/release() now resolve the owning session via _resolve_session_pid():
walk the /proc parent chain (PPid from /proc/<pid>/status) up to the comm=claude
ancestor and record THAT pid. Fails OPEN if no claude ancestor (non-Linux, or an
unexpected process tree). handle_stop() is now a no-op: Stop fires every assistant
turn, so releasing there would free the slot mid-session; stale-detection (the
claude pid going away) reclaims on real exit instead.

PROVEN LIVE — real two-session interactive test (the unit blind spot that a
long-lived-holder harness masks):
  session 1 in branch X resolves chain 731814:python3 -> 731813:sh -> 730933:claude,
    records pid 730933 (comm=claude, cwd=X); work_dir=X, cwd_match True.
  session 2 in branch X resolves its own claude pid, sees X occupied by live
    730933, and Claude Code blocks the prompt in the UI:
    "UserPromptSubmit operation blocked by hook: ztest... already live at PID 730933
     - attach, do not spawn."
  session 2 did NOT clobber session 1; a different branch is unaffected.
Added 9 tests modelling the ephemeral-PID lifecycle (54 presence tests total);
seedgo @hooks 100%.

Activation is a machine-local provider-settings change (presence_gate wired first
in ~/.claude/settings.json UserPromptSubmit) — not tracked in the repo; the code
landing here is what makes it correct.

Design: DPLAN-0225 / FPLAN-0289 P1. Build by @hooks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CqoxFdbDMirzkQ5kjRVVos
2026-06-29 18:38:02 -07:00
AIOSAIandClaude Opus 4.8 beb048dadf fix(hooks): presence_gate keys per-branch via hook_data cwd; engine propagates block exit code (FPLAN-0289 P1)
Activation fixes for the single-session presence gate. Two bugs blocked it,
both caught by live testing after all units were green:

1) Wrong branch key. presence_gate used Path.cwd().name, but under the Claude
   Code bridge the hook process cwd is the project root, so every session keyed
   to "AIPass": the gate never enforced one-live-session-per-branch and would
   have rejected sessions project-globally (any 2nd interactive session in any
   branch). Now _resolve_branch(hook_data) reads the event payload's cwd (the
   real session dir) and walks up to the branch root (.trinity/ or apps/),
   mirroring branch_loader. Applied in handle() and handle_stop().

2) Block never reached Claude Code. engine.dispatch() returned only stdout, so
   the bridge could not surface a non-zero exit. dispatch() now returns
   (stdout, exit_code) and the bridge exits with it on a block. Pre-existing gap
   affecting every block hook on every event; now fixed engine-wide. An
   intentional block (exit 2 + {"decision":"block"}) propagates; a crashing hook
   (exit 2, non-JSON stdout) is logged and falls through, so the gate fails open.

Proven: 110 hooks unit tests pass (6 new for branch resolution); seedgo @hooks
100%, no type errors. Live bridge end-to-end (real live holder + real bridge):
duplicate into a held branch -> exit 2 + block reason naming the branch; a
different free branch -> exit 0 (per-branch isolation intact). Gate remains
dormant: not yet wired into provider settings.

Design: DPLAN-0225 / FPLAN-0289 P1 activation. Build by @hooks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CqoxFdbDMirzkQ5kjRVVos
2026-06-29 17:46:09 -07:00
AIOSAIandClaude Opus 4.8 8d775b4bd2 feat(skills): TG bot follows PRESENCE pointer, retire legacy own-spawn (FPLAN-0289 P2)
The Telegram bot becomes a thin durable relay: it follows the live Claude session
via .ai_central/PRESENCE.central.json and never starts its own brain.
ensure_tmux_session resolves in 3 strategies (central pointer -> shared_session
config -> already-running own tmux), re-binding to the live session on every message
(handover-safe). The legacy AIPASS_SESSION_TYPE=telegram own-session spawn is retired:
replaced with a clear "no live session to mirror" error; an absent/stale pointer falls
back gracefully and never starts a session. on_session_create (which injected "hi"
after self-start) removed as obsolete -- attaching to a live session injects nothing.

New helpers: _find_presence_file, _read_presence_pointer (PID-liveness via os.kill),
_find_tmux_for_presence (attach_handle preferred, tmux-CWD-scan fallback).

601 TG + 252 skills tests pass; seedgo Unused_Function 100% (overall 99%; residual is
a pre-existing Json_Handler item in unrelated modules). Live mirror proof to follow.
Design: DPLAN-0225 / FPLAN-0289 P2. Build by @skills.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GFihce1oLtp6UDAPGryYSv
2026-06-29 14:54:50 -07:00
AIOSAIandClaude Opus 4.8 13983b614a fix(hooks): presence tests cross-platform — patch _presence_lock not fcntl (FPLAN-0289 P1)
Windows CI was red on f460cd5: the patch_flock fixture patched presence.fcntl,
which only exists on POSIX (msvcrt on win32), erroring all 16 presence-test
setups. Now patches the platform-agnostic _presence_lock context manager
(-> nullcontext per call) and skips the inherently-POSIX flock-acquire test on
win32. Dormant prod code unchanged.

705 tests pass, seedgo 100%. Fix by @hooks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GFihce1oLtp6UDAPGryYSv
2026-06-29 14:16:02 -07:00
AIOSAIandClaude Opus 4.8 f460cd577e feat(hooks): presence service + single-session gate, dormant (FPLAN-0289 P1)
One live Claude runtime per branch. presence.py manages .ai_central/PRESENCE.central.json
(claim/release/refresh, PID + /proc/cwd liveness, stale-reclaim, PID-guarded release so a
non-holder can never release the holder). presence_gate.py: UserPromptSubmit blocks a
duplicate (exit 2 + decision:block), Stop releases; skips sub-agents + dispatched/daemon.

SessionStart can't block in Claude Code (inject-only) → gate is UserPromptSubmit, like the
edit/git gates. NOT wired into hooks.json yet — dormant, zero behavior change until enabled.

705 tests pass, seedgo 100%. Live cross-process block + PID-guard verified (devpulse).
Design: DPLAN-0225. Next: P2 telegram relay follows the pointer (@skills).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GFihce1oLtp6UDAPGryYSv
2026-06-29 13:51:48 -07:00
AIPass 90157ed29e Merge pull request #647 from AIOSAI/dependabot/github_actions/actions/setup-python-6.3.0
ci(deps): bump actions/setup-python from 6.2.0 to 6.3.0
2026-06-29 10:58:32 -07:00
AIOSAI 2217b96054 fix(skills): Windows CI — mirror transcript slug strips backslashes; tests drop platform tricks (TDPLAN-0009)
base_bot.py _resolve_active_transcript: slug replaces both backslash and / (Windows work_dir paths left backslashes → wrong projects_dir; POSIX no-op). test_mirror_session.py: slug matches production + mkdir exist_ok=True (dir pre-created on Windows → WinError183). test_monitor.py: mock _save_monitor_subscription→False instead of /dev/null OSError trick. 578 TG + 252 skills green on Linux; Windows-safe by construction. Fix by @skills, verified by devpulse.
2026-06-29 10:46:54 -07:00
AIOSAI bd57573764 fix(seedgo): audit always ignores .archive/ — full stop (Patrick directive)
readme_check.py: _count_test_functions now skips any path with a SOURCE_SKIP_DIRS segment (.archive) — root cause of the local-vs-CI test-count mismatch (daemon counted 486 local incl archived dead tests vs 300 in CI clean checkout). test_quality_check.py: _find_test_files_broad replaced __pycache__-only skip with _should_skip_dir() on all path parts. Daemon 486→300, audit 100%, 17-branch audit zero regressions. CI-neutral (clean checkout has no .archive). Fix by @seedgo, verified by devpulse.
2026-06-29 10:30:37 -07:00
AIOSAI 8d2dcdcc77 fix(daemon): README test count 486→300 (live count; 486 wrongly included .archive dead tests)
CI's clean checkout counts 300 live tests (matches pytest); README claimed 486 because the count included 6 archived dead-test files under tests/.archive/ (186 tests). 300 is the true live/CI count. Root-cause framework fix (audit must always ignore .archive) dispatched to @seedgo separately.
2026-06-29 10:17:20 -07:00
AIOSAI 3d66e8397b fix(daemon): seedgo 100% — archive dead cron orphans, queue introspection bypass, exception-contract test, README count (TDPLAN-0008)
Diagnostics 65%→100%: archived dead orphans scheduler_cron.py + modules/scheduler_ops.py (+ their test_scheduler_cron.py) — old cron scheduler superseded by queue/run_tick (S254), imported only by already-archived files; cleared 7 pyright unresolved-import errors. Introspection 98%→100%: bypass queue.py (td-47 — bare invocation renders operational Rich table). Test_quality 98%→100%: added test_invalid_mode_raises. README count fixed. Cleaned 6 stale bypass entries. Audit @daemon=100% (38 standards), 300 tests green. Fix by @daemon, verified by devpulse.
2026-06-29 10:00:07 -07:00
AIOSAI 9e988a63b3 fix(daemon): CI green — .archive-existence tests → import-path assertions; bare 'queue' renders Rich table (TDPLAN-0008, td-47)
test_scheduler_bot.py: replaced test_data_files_archived + test_handler_files_archived (asserted gitignored .archive paths → failed in CI clean checkout) with test_task_registry_not_importable + test_actions_registry_not_importable (assert ImportError — env-independent). queue.py: bare 'drone @daemon queue' now renders the Rich table instead of print_introspection (matches --help). 24 scheduler_bot tests green. Fix by @daemon, verified by devpulse.
2026-06-29 09:37:43 -07:00
AIOSAI 88e99efe4c feat(skills,hooks): TDPLAN-0009 Telegram session mirror — bidirectional, live-proven @api
@skills: dup-spawn fix (run() lock-collision exit 0), attach_only + launch_mirror_session (--dangerously-skip-permissions), _config_chat_id init bug + /proc active-transcript baseline, systemctl start. @hooks: extract_mirror_turn cursor clamp + baseline reset on delivery, mirror-file unlink guards. +4 test files. 578 skills / 112 hooks green.
2026-06-29 08:53:03 -07:00
dependabot[bot] aea90da5c6 ci(deps): bump actions/setup-python from 6.2.0 to 6.3.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/a309ff8b426b58ec0e2a45f0f869d46889d02405...ece7cb06caefa5fff74198d8649806c4678c61a1)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-27 08:02:22 +00:00
AIOSAI 4363f9824a fix(skills): SchedulerBot.run() crash-looped on real ExecStart — wrap super().run() (TDPLAN-0008)
- run() called a non-existent self._poll_loop() AND duplicated the parent lifecycle incompletely (missing signal handlers, offset load/save) — bot exited 1 in <1s under systemd. Now wraps super().run() with digest start/stop only.
- Fixed broken 'from .json import json_handler' (relative path did not exist) → absolute import; log queue_requested op so json_structure standard is met by use, not noqa
- Added missing docstrings: handle_message / handle_file / get_custom_commands
- ROOT CAUSE: 26 unit tests never executed run() (it blocks on polling) → green tests, failing ExecStart (key-learning #77: test the real ExecStart, not the drone/mocked form). Verified live: bot now active+polling via systemd, 26 tests + seedgo 30 still green.
2026-06-25 17:04:31 -07:00
AIOSAI d252403d37 feat(skills): Scheduler Bot Phase 2 — dedicated bot /queue + hourly digest (TDPLAN-0008)
- SchedulerBot(BaseBot): rejects free-text (NO tmux/Claude spawn), /queue shells 'drone @daemon queue --json', hourly digest thread, chunked output
- base_bot __main__: _BOT_CLASSES maps bot_id->SchedulerBot for systemd launch; passes config chat_id for digest target
- bot registered (telegram-bot@scheduler), systemd unit installed (NOT started)
- 26 new tests (519 telegram / 252 skills green), seedgo 99%

fix(daemon): queue --json emits valid JSON at module level — flatten prompt_preview (collapse newlines) + soft_wrap/markup off. Verified valid via 'python -m'. NOTE: the drone router still re-wraps sub-command stdout at width 80, corrupting machine --json for ALL consumers routed through drone (separate @drone core bug; skills mitigates with strict=False JSON parse).
2026-06-25 16:56:56 -07:00