From 154dc18eb9a5c92d811d8bdc0d7986772cf4b1ba Mon Sep 17 00:00:00 2001 From: Nic O'Connor Date: Mon, 14 Sep 2026 01:19:56 -0400 Subject: [PATCH] claude-obsidian: don't count skipped empty sessions as still queued The first full drain reported "105 written, 0 failed, 9 still queued" when the 9 were empty sessions already recorded as skipped -- nothing was left. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01KF322NzozeaFjpgWvh4F4g --- .../claude-obsidian-synccpython-312.pyc | Bin 63148 -> 63244 bytes claude-obsidian/claude-obsidian-sync | 16 ++++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/claude-obsidian/__pycache__/claude-obsidian-synccpython-312.pyc b/claude-obsidian/__pycache__/claude-obsidian-synccpython-312.pyc index f3a7dcf73bf8bcf6f9332ea8724bcb14ba11875f..c8dc2039e3a2fa9e57246373619dbd2a6d6de43e 100644 GIT binary patch delta 1987 zcmZ8hdrVVT7(b`IeRF$TC@qg7R|+DC0zT2XSrz8ghzfB^e4!Kw#US1mU%OY?G;2%P zraRl5GcM|q%>_*$HxniONGj#+O3y#ehnEl%Sq;)NO$N(oR2;*l&PvvnQFBiA<3XZqMlqiZi^Fjl~^Gfck)|f@1#e^6+a$6F&_U*< z2=$W)b>lJy8IULZHIa8)&74-$R4~P`I}8JgKiry}ZWgumDSldPm_&0Ej!2SLG{UZ; zVR266NXtHF0!EEC29-cY$-KkdcqH<_1^XG&T;iOZiUc(VbK^<>s3++V=yE0V3#CVe zOJ_whE#1$PdxDdM+N_SqHkoJ1??jT5mbOHENWRc^5l0I;$huv#v6|=k?F>KuHJ+R} zc?es{^7bUH&R1PkTT3>z&&;=i8_$=5*K=|UJZOjXLS4;T@5c2$AsNoN0*3E1*zcoy zbjg{dFiG`ufCcS)(#fCgUvmStB}!3=vU*K#5&TNXC#R<9Kdn?uX$q4@dQa^y*J%nS zt2?6-=eo3==_w$eG0xV{9m{k@t6-69?-rilhCl_@q80W~Ya~*1& zAz%OgBF1_0sUN2^IE6e^#$h)}>HXEF*T9890UWRfq60AjTOc-ICk2-$sbeF3FPHa~ zU>qx-?!SPsjl4H79(emelEKdB!dnQCOM*mIEaGQV06$Hj1Af=bRP3= zeM1bHGPr16Oa=B>cI%tq0#aJVK-aL6S>hzfA#frqu>R>08$uxzvWH@y`eNjN<*7x4 zz7V-kG~6O~J6vwjLV3vQok{SC82QfNJhf>)fF?`_(1eA=J>-tB^eWXGl$u&asOzuX zTn}ob`(V3n}}DPN&j5w?OhaKq@We$(i9)<8rW{hT+SU?+u^B6H_vey3X4MvkNE&CfhC#17By1mA$`tu!(Kp zLL5NIdDGzV63Bz!-BFrb&Yac=TeR(b0vY2XnsP-sjOUWPCQg(*1 zcnJoJkVqX$DJzDcAx+uFn$14J@hoi^@G$gKsVNz;{tp#wNliN)n0aAaR zGp>Qin=pJm^8V{H@XFB{M_tM`>0}(~jVG)jAK%WyKKZBHnJT=QJi5CH*OBUbRXp#ntKCq(vZ}_P#fO>CFYqE? zxUr@@tRQ#q#hJoqSV!}ulIW3HxSAA=N0H`q%M;71)6bN#jHQe_rb=RR910 delta 1899 zcmZux4NOy46u!6bJ=(tZwS~6)v_;B4bs#WBVLBNDrlM2CY>o{a(u#t=Jc=58Pna=l zOW2ROON?=3Y|AnTIwfzLIM@UMb#c*x3Ja)-@lS>OYOT~-S0vcf3pa&+ym!6f*thl1iW zc-ZfKASjTmE|>@*#0)@-*9#&8aYzR)s0f`hbnN0 zL+jf@(R*!aa&oy=YY{rv78)`G-(U%z74PDD9@T)K1N1d3YF>5+BDTGW>Nn(~lkF*f zUX{g5ThKr42i7r6c0AR|nlsIQozW3kKdH!|GOcu%N`@C*X5#L$YO`(fuEeOUV0pKm zSh|A)v88(!iRn&K5Ir?EJ4)UYM!Y>y47T*xD5A$R*(uWB-{;7n2`%nOh0)SG9gk@^ zQ>y9lLYOG6Jl#RTI4R)l0EF|T-+xM@VK|EFeGaCh+}>Df zjQQfzFkgHQ+CKPF$eOj@V!L%1FMJB>CZ^w52 z9@!X8mb0*C3q;jJ3CpG-Q?O@{vaj97D@jZ+5g|mFh+* z07XUU@lX`|I(DDHvm#Q8zkC`dgoHQfJLvwH?AGK)*cjeKA5k_b8>)|Hd|urblYL>) z<_p1FdTAr>JiiYa6md0jA$5#xVK341AKjOO*jHeM9|k`YX<9O$wPW0=p~f1%XE^S~ z(nq}7#kn+ua>$|ft3z0>WsTC|UmQ@SuGM%nm{m<#G+`CZy|ybw?dIH?62_r@hB&3j ziYgqf6_l7b+vI_mIE{xxx38tr9(7s#6K3|nOw@6GpK2MomA7#$zZezV_z3sp*o{Qp za$-GCtc^tEqNJMZl7SV$2N0OxOD2)r!*{lUZK*o_&9pRTZkk%r9 zCcYFEj_lFRBWfZMq_y}$bZ;aT@>1O0nKD?3R*jZJC+Zn3g=UmEWpkTb&}vn zR6dpt%TUW$5==wa$9BL)=*|1bY!SriMO$DozSi)JrAf X#S{!hKRz(a7mU9FgJ2dKeqj9 diff --git a/claude-obsidian/claude-obsidian-sync b/claude-obsidian/claude-obsidian-sync index d1dcf03..fd0d5a0 100755 --- a/claude-obsidian/claude-obsidian-sync +++ b/claude-obsidian/claude-obsidian-sync @@ -611,8 +611,8 @@ SKIPPED = "(empty, skipped)" EX_TEMPFAIL = 75 # "try again later" -- systemd logs it, the next timer run retries -def run_jobs(cfg, work, fn) -> tuple[int, int, str | None]: - ok = failed = 0 +def run_jobs(cfg, work, fn) -> tuple[int, int, str | None, int]: + ok = failed = skipped = 0 quota = None stop = threading.Event() # Future.cancel() cannot stop a job a worker already picked up @@ -632,7 +632,7 @@ def run_jobs(cfg, work, fn) -> tuple[int, int, str | None]: try: result = fut.result() if result == SKIPPED: - print(f"skip {label} (no conversation content)", flush=True) + print(f"skip {label} (no conversation content)", flush=True); skipped += 1 else: print(f"ok {label} -> {result}", flush=True); ok += 1 except (QuotaExhausted, BudgetExhausted) as e: @@ -644,7 +644,7 @@ def run_jobs(cfg, work, fn) -> tuple[int, int, str | None]: pass except Exception as e: # keep going; next run retries print(f"FAIL {label}: {e}", file=sys.stderr, flush=True); failed += 1 - return ok, failed, quota + return ok, failed, quota, skipped def finish(ok: int, failed: int, quota: str | None, dry_run, remaining: int, ledger: "Ledger | None" = None) -> None: @@ -738,10 +738,10 @@ def cmd_sync(cfg, args) -> None: src = str(p).replace(str(HOME), "~") return process(cfg, llm, vault, state, key, meta, "claude-code", "Code", fp, src, mode) - ok, failed, quota = run_jobs(cfg, [(w[0].name, *w) for w in work], lambda _l, p, fp, key: one(p, fp, key)) + ok, failed, quota, skipped = run_jobs(cfg, [(w[0].name, *w) for w in work], lambda _l, p, fp, key: one(p, fp, key)) if vault and ok: write_index(cfg, vault, state) - finish(ok, failed, quota, mode, total - ok, llm.ledger) + finish(ok, failed, quota, mode, total - ok - skipped, llm.ledger) def cmd_import(cfg, args) -> None: @@ -762,12 +762,12 @@ def cmd_import(cfg, args) -> None: llm, vault = LLM(cfg), (None if args.dry_run else Vault(cfg)) if vault: vault.ping() - ok, failed, quota = run_jobs(cfg, [((m.get("title") or m["session_id"])[:50], m, fp, key) for m, fp, key in work], + ok, failed, quota, skipped = run_jobs(cfg, [((m.get("title") or m["session_id"])[:50], m, fp, key) for m, fp, key in work], lambda _l, m, fp, key: process(cfg, llm, vault, state, key, m, "claude-ai", "Web", fp, None, args.dry_run)) if vault and ok: write_index(cfg, vault, state) - finish(ok, failed, quota, args.dry_run, total - ok, llm.ledger) + finish(ok, failed, quota, args.dry_run, total - ok - skipped, llm.ledger) def main() -> None: