pi-crew 0.11.13 → 0.11.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -633,7 +633,7 @@ ${n.map(s=>`- ${s}`).join(`
633
633
 
634
634
  Do not block shard work; summarize routing notes only.`},...o,{id:"synthesize",role:"analyst",dependsOn:o.map(s=>s.id),task:"Synthesize all dynamic shard findings. Identify common patterns, gaps, and concrete recommendations. Use discover output if available, but prioritize completed shard outputs."},{id:"write",role:"writer",dependsOn:["synthesize"],output:"research-summary.md",task:"Write a concise final summary with evidence, risks, and actionable next steps."}]}}var QF=S(()=>{"use strict"});function kee(e){return e instanceof Error&&Kje.test(e.message)}async function bee(e,t,n){for(let r=0;;r++)try{return{ok:!0,value:Ge(e,n)}}catch(o){if(!kee(o))throw o;let s=t[r];if(s===void 0)return{ok:!1,message:`run.lock busy (bounded retry budget exhausted): ${o.message}`};await See(s)}}function See(e){return new Promise(t=>setTimeout(t,e))}async function ZE(e,t,n,r){for(let o=0;;o++)try{return await Sr(e,n)}catch(s){if(!kee(s))throw s;let i=t[o];if(i===void 0)throw s;r?.(o+1,i,s),await See(i)}}var wee,XE,Kje,QE=S(()=>{"use strict";Xt();wee=[50,100,200,400,800],XE=[100,250,500,1e3,2e3,4e3],Kje=/^Run '[^']+' is locked by another operation\.$/});function ej(e,t,n,r,o=.5){let s=Co(e),i=(s?.input??0)+(s?.output??0)+(s?.cacheWrite??0),a=i>=r*t,c=!a&&i>=n*t,u=t*o,d=[];for(let l of e){if(!l.usage)continue;let f=(l.usage.input??0)+(l.usage.output??0)+(l.usage.cacheWrite??0);u>0&&f>u&&f>t*.1&&d.push(l.id)}return{abort:a,warning:c,fairShareViolators:d,totalUsed:i}}async function Yb(e,t){if(e.size===0)return[];t?.abort();let n=await Promise.allSettled([...e.values()].map(r=>r.promise));return e.clear(),n}async function tj(e,t){let n=e.dispatchedTaskIds,r=await Yb(e.pendingUnits,e.runController),o=[];for(let s of r)s.status==="fulfilled"&&o.push(s.value);if(o.length>0){let s=await ZE(e.manifest,XE,async()=>{uo();let i=j(e.manifest.cwd,e.manifest.runId),a=i?.manifest??e.manifest,c=Vl([...a.artifacts,...o.flatMap(l=>l.manifest.artifacts)]),u=Ae({...a,artifacts:c},"running","Merged in-flight results during failed-task abort."),d=Sb(i?.tasks??e.tasks,o);return await gt(u),await gn(u,d),{resultManifest:u,resultTasks:d}},(i,a,c)=>{X(e.manifest.eventsPath,{type:"run.lock_retry",runId:e.manifest.runId,message:`run.lock contention during abort drain merge (attempt ${i}); retrying in ${a}ms: ${c.message}`,data:{attempt:i,delayMs:a,site:"terminaliseRunWithDrain"}}).catch(()=>{})});e.manifest=s.resultManifest,e.tasks=s.resultTasks}return e.tasks=Bc(e.tasks,"cancelled",t.cancelMessage,s=>n.has(s.id)&&bb(s.status)),e.tasks=Uh(e.tasks,t.blockedMessage),await gn(e.manifest,e.tasks),dr(e.manifest,oa(e.manifest,e.tasks,e.runtimeKind)),e.manifest=Ae(e.manifest,"failed",t.failedReason),{manifest:e.manifest,tasks:e.tasks}}async function vee(e){let t=e.input,n=e.tasks,r=e.manifest;if(t.budgetTotal!==void 0&&t.budgetTotal>0&&t.budgetUnlimited!==!0){let o=t.budgetWarning??.8,s=t.budgetAbort??.95,i=ej(n,t.budgetTotal,o,s);if(i.abort){let c=`Per-task budget abort threshold exceeded: ${fr(i.totalUsed)}/${fr(t.budgetTotal)} (${Math.round(i.totalUsed/t.budgetTotal*100)}%)`;return v("team-runner.budget-abort",new Error(c),`runId=${r.runId}`,"warn"),await X(r.eventsPath,{type:"run.budget_abort",runId:r.runId,message:c,data:{budgetTotal:t.budgetTotal,budgetUsed:i.totalUsed,threshold:"abort"}}),{kind:"return",result:await tj(e,{cancelMessage:`Cancelled by budget abort: ${c}`,blockedMessage:`Budget abort threshold exceeded: ${c}`,failedReason:c})}}if(i.warning){let c=`Per-task budget warning threshold crossed: ${fr(i.totalUsed)}/${fr(t.budgetTotal)} (${Math.round(i.totalUsed/t.budgetTotal*100)}%)`;v("team-runner.budget-warning",new Error(c),`runId=${r.runId}`,"warn"),await X(r.eventsPath,{type:"run.budget_warning",runId:r.runId,message:c,data:{budgetTotal:t.budgetTotal,budgetUsed:i.totalUsed,threshold:"warning"}})}let a=[];for(let c of i.fairShareViolators){let u=n.find(f=>f.id===c);if(!u)continue;let d=(u.usage?.input??0)+(u.usage?.output??0)+(u.usage?.cacheWrite??0),l=`Task '${c}' consumed ${fr(d)} (${Math.round(d/t.budgetTotal*100)}% of total budget) \u2014 exceeds fair share`;v("team-runner.fair-share",new Error(l),`runId=${r.runId} taskId=${c}`,"warn"),a.push(X(r.eventsPath,{type:"task.budget_fair_share",runId:r.runId,taskId:c,message:l,data:{budgetTotal:t.budgetTotal,taskUsage:d}}).then(()=>{},f=>v("team-runner.fair-share-event",f,`taskId=${c}`)))}await Promise.all(a)}return null}var nj=S(()=>{"use strict";qe();Se();we();Ha();q();QE();st();jp();vb();_h();Eb()});function Vje(e){return e>=90?"A":e>=70?"B":e>=50?"C":e>=30?"D":"F"}function Tee(e){let t=[],n=e.tasks,r=n.length;if(r===0)return{score:100,grade:"A",penalties:[],deltas:[]};let o=n.filter(u=>u.status==="failed").length,s=n.filter(u=>u.stalledSince!==void 0&&Date.now()-u.stalledSince>3e5).length,i=o/r;i>.2&&t.push({reason:"high-failure-rate",deduction:Math.round(i*50)}),s>0&&t.push({reason:"stalled-tasks",deduction:Math.min(15,s*5)}),r>20&&t.push({reason:"large-task-count",deduction:Math.min(10,Math.floor((r-20)/10))});let a=t.reduce((u,d)=>u+d.deduction,0),c=Math.max(0,Math.min(100,100-a));return{score:c,grade:Vje(c),penalties:t,deltas:[]}}var Ree=S(()=>{"use strict"});import*as ud from"node:fs";import*as eC from"node:path";var zje,tC,Iee=S(()=>{"use strict";Ree();qe();zje="state/health",tC=class{crewRoot;constructor(t){this.crewRoot=t}healthDir(){return eC.join(this.crewRoot,zje)}saveSnapshot(t){let n=Tee(t),r={runId:t.runId,timestamp:Date.now(),score:n.score,grade:n.grade,penalties:n.penalties},o=this.healthDir();ud.mkdirSync(o,{recursive:!0});let s=eC.join(o,`${t.runId}.json`);return ye(s,JSON.stringify(r,null,2)+`
635
635
  `),r}loadLatestSnapshot(){let t=this.healthDir();if(!ud.existsSync(t))return null;let n=this.loadAllSnapshots();return n.length===0?null:(n.sort((r,o)=>o.timestamp-r.timestamp),n[0])}loadAllSnapshots(){let t=this.healthDir();if(!ud.existsSync(t))return[];let n=ud.readdirSync(t).filter(r=>r.endsWith(".json")).map(r=>{try{return JSON.parse(ud.readFileSync(eC.join(t,r),"utf8"))}catch{return null}}).filter(Boolean);return n.sort((r,o)=>r.timestamp-o.timestamp),n}}});import{execFileSync as Jje}from"node:child_process";function nC(e,t){return Jje("git",t,{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","pipe"],env:Yje,windowsHide:!0}).trim()}function xee(e,t){let n=nC(e,["rev-list","--count",t]),r=Number.parseInt(n,10);return Number.isFinite(r)?r:0}function Eee(e,t="main"){try{nC(e,["rev-parse","--is-inside-work-tree"]);let n=nC(e,["rev-parse","--abbrev-ref","HEAD"]),r=xee(e,`${n}..${t}`),o=xee(e,`${t}..${n}`),s=r>0?nC(e,["log","--format=%s",`${n}..${t}`]).split(`
636
- `).map(i=>i.trim()).filter(Boolean):[];return r===0?{status:"fresh",branch:n,mainRef:t,ahead:o,behind:r,missingFixes:s,message:`Branch '${n}' is fresh against ${t}.`}:o>0?{status:"diverged",branch:n,mainRef:t,ahead:o,behind:r,missingFixes:s,message:`Branch '${n}' diverged from ${t}: ahead=${o}, behind=${r}.`}:{status:"stale",branch:n,mainRef:t,ahead:o,behind:r,missingFixes:s,message:`Branch '${n}' is ${r} commit(s) behind ${t}.`}}catch(n){let r=n instanceof Error?n.message:String(n);return{status:"unknown",mainRef:t,ahead:0,behind:0,missingFixes:[],message:"Branch freshness could not be determined.",error:r}}}var Yje,Cee=S(()=>{"use strict";Pp();Ul();Yje=Oo(process.env,{allowList:["PATH","HOME","USER",...ks,"SHELL","TERM","LANG","LC_ALL","GIT_CONFIG_GLOBAL","GIT_CONFIG_SYSTEM","GIT_EXEC_PATH"]})});function Xje(e){return!!((e.agentProgress?.toolCount??0)>0||e.usage||e.transcriptArtifact||e.modelAttempts?.some(t=>t.success)||e.jsonEvents)}function Zje(e){return!!(e.resultArtifact&&e.resultArtifact.sizeBytes===0)}function Qje(e,t){let n=e?.effectivenessGuard;return n==="off"||n==="warn"||n==="block"||n==="fail"?n:t?.runtimeResolution?.safety==="explicit_dry_run"?"off":"warn"}function Xb(e){let t=e.tasks.filter(u=>u.status==="completed"),n=t.filter(u=>!Xje(u)||Zje(u)),r=e.tasks.filter(u=>u.agentProgress?.activityState==="needs_attention"),o=e.executeWorkers?"enabled":"disabled/scaffold",s=Qje(e.runtimeConfig,e.manifest),i=r.filter(u=>u.status==="completed").length,a=Math.max(0,t.length-n.length-i),c="ok";return e.executeWorkers&&s!=="off"&&n.length>0&&(c=s==="fail"?"failed":s==="block"?"blocked":"warning",c==="warning"&&n.some(u=>Cr(u.role)!=="read_only")&&(c="blocked")),{completed:t.length,observable:a,noObservedWorkTaskIds:n.map(u=>u.id),needsAttentionTaskIds:r.map(u=>u.id),workerExecution:o,guardMode:s,severity:c}}function Aee(e){return[`Score: ${e.observable}/${Math.max(1,e.completed)} completed task(s) with observable worker activity`,`Worker execution: ${e.workerExecution}`,`Guard: ${e.guardMode} severity=${e.severity}`,`No observable worker activity: ${e.noObservedWorkTaskIds.length?e.noObservedWorkTaskIds.join(", "):"none"}`,`Needs attention: ${e.needsAttentionTaskIds.length?e.needsAttentionTaskIds.join(", "):"none"}`]}function Pee(e){return e.severity!=="warning"&&e.severity!=="blocked"&&e.severity!=="failed"?void 0:{action:e.severity==="failed"?"fail":e.severity==="blocked"?"block":"notify",reason:"ineffective_worker",message:`Run effectiveness guard ${e.guardMode}: no observable worker activity for ${e.noObservedWorkTaskIds.join(", ")}.`,createdAt:new Date().toISOString()}}var rj=S(()=>{"use strict";Wi()});function Zb(e){return e==="cancelled"||e==="failed"||e==="completed"}async function oj(e){let t=await Promise.race([...e.pendingUnits.values()].map(a=>a.wrapped)),n=e.pendingUnits.get(t.unitKey);e.pendingUnits.delete(t.unitKey);let r=t.result?void 0:Jx(t.error),o=t.result??{manifest:e.manifest,tasks:Bc(e.tasks,"failed",t.error.message,a=>n.taskIds.includes(a.id)).map(a=>r&&a.status==="failed"?{...a,failureCause:r}:a)},s=[o],i=await ZE(e.manifest,XE,async()=>{uo();let a=j(e.manifest.cwd,e.manifest.runId),c=a?.manifest??e.manifest,u=c.artifacts,d=Vl([...u,...s.map(m=>m.manifest.artifacts)].flat()),l={...c,artifacts:d},f=Zb(c.status)?l:Ae(l,"running","Merged task updates from parallel batch."),p=Sb(a?.tasks??e.tasks,s);return await gt(f),await gn(f,p),{resultManifest:f,resultTasks:p}},(a,c,u)=>{X(e.manifest.eventsPath,{type:"run.lock_retry",runId:e.manifest.runId,message:`run.lock contention during unit merge (attempt ${a}); retrying in ${c}ms: ${u.message}`,data:{attempt:a,delayMs:c,site:"mergeUnitResult"}}).catch(()=>{})});return e.manifest=i.resultManifest,e.tasks=i.resultTasks,e.settledMerge={taskIds:n.taskIds,result:o},null}var _ee,rC=S(()=>{"use strict";qe();Se();we();ib();QE();jp();vb();Eb();_ee=oj});function Jl(e,t,n,r){return{action:e,reason:t,message:n,taskId:r,createdAt:new Date().toISOString()}}function eWe(e,t){let n=0,r=e.graph?.parentId,o=new Set;for(;r&&!o.has(r);)o.add(r),n+=1,r=t.get(r)?.graph?.parentId;return n}function Mee(e){let t=[],n=Number.isFinite(e.limits?.maxTasksPerRun)?e.limits.maxTasksPerRun:void 0;n!==void 0&&e.tasks.length>n&&t.push(Jl("block","limit_exceeded",`Run has ${e.tasks.length} tasks, exceeding maxTasksPerRun=${n}.`));let r=e.tasks.filter(i=>i.status==="running").length,o=Number.isFinite(e.limits?.maxConcurrentWorkers)?e.limits.maxConcurrentWorkers:void 0;o!==void 0&&r>o&&t.push(Jl("block","limit_exceeded",`Run has ${r} running workers, exceeding maxConcurrentWorkers=${o}.`));let s=new Map(e.tasks.map(i=>[i.id,i]));for(let i of e.tasks){if(e.limits?.maxChildrenPerTask!==void 0&&(i.graph?.children.length??0)>e.limits.maxChildrenPerTask&&t.push(Jl("block","limit_exceeded",`Task has ${i.graph?.children.length??0} children, exceeding maxChildrenPerTask=${e.limits.maxChildrenPerTask}.`,i.id)),e.limits?.maxTaskDepth!==void 0&&eWe(i,s)>e.limits.maxTaskDepth&&t.push(Jl("block","limit_exceeded",`Task graph depth exceeds maxTaskDepth=${e.limits.maxTaskDepth}.`,i.id)),i.status==="failed"){let a=i.policy?.retryCount??0,c=e.limits?.maxRetriesPerTask??0;t.push(Jl(a<c?"retry":"escalate","task_failed",i.error?`Task failed: ${i.error}`:"Task failed.",i.id))}if((i.status==="running"||i.status==="queued")&&i.heartbeat&&i.heartbeat.alive!==!1&&lI(i.heartbeat,e.limits?.heartbeatStaleMs??6e4,e.now)&&t.push(Jl("escalate","worker_stale","Worker heartbeat is stale.",i.id)),i.taskPacket?.verification){let a=bF(i.taskPacket.verification,i.verification);!a.satisfied&&i.status==="completed"&&t.push(Jl("block","green_unsatisfied",`Green contract unsatisfied: required=${a.requiredGreenLevel}, observed=${a.observedGreenLevel}.`,i.id))}}return t.length===0&&e.tasks.length>0&&e.tasks.every(i=>i.status==="completed")&&t.push(Jl("closeout","run_complete","All tasks completed and no policy blockers were found.")),t}function $ee(e){return e.map(t=>`- ${t.action} (${t.reason})${t.taskId?` ${t.taskId}`:""}: ${t.message}`)}var Oee=S(()=>{"use strict";Nu();SF()});import*as oC from"node:fs";import*as qh from"node:path";function Dee(e){return`- ${e.id}: ${e.status} (${e.role} -> ${e.agent})${e.taskPacket?` scope=${e.taskPacket.scope}`:""}${e.verification?` green=${e.verification.observedGreenLevel}/${e.verification.requiredGreenLevel}`:""}${e.error?` - ${e.error}`:""}`}function Nee(e,t,n,r){return Aee(Xb({manifest:e,tasks:t,executeWorkers:n,runtimeConfig:r}))}function tWe(e){if(!e.eventsPath)return[];let t=ja(e.eventsPath),n=t.filter(o=>o.type==="scratchpad.cell"),r=t.filter(o=>o.type==="scratchpad.restored");return n.length===0&&r.length===0?[]:["## Scratchpad (RLM adoption) \u2014 I5 metric",`- cells executed: ${n.length}`,`- snapshot restores: ${r.length}`,...n.length>0?[`- total cell time: ${Math.round(n.reduce((o,s)=>o+(s.data?.durationMs??0),0))} ms`]:[]]}function eS(e,t,n,r=!0,o){let s=new Map;for(let g of t)s.set(g.status,(s.get(g.status)??0)+1);let i=pE(t),a=new Date().toISOString(),c=[`# pi-crew progress ${e.runId}`,"",`Status: ${e.status}`,`Team: ${e.team}`,`Workflow: ${e.workflow??"(none)"}`,`Updated: ${a}`,`Task counts: ${[...s.entries()].map(([g,k])=>`${g}=${k}`).join(", ")||"none"}`,`Queue: ready=${i.ready.length}, blocked=${i.blocked.length}, running=${i.running.length}, done=${i.done.length}, failed=${i.failed.length}, cancelled=${i.cancelled.length}`,"","## Tasks",...t.map(Dee),"","## Effectiveness",...Nee(e,t,r,o),""].join(`
636
+ `).map(i=>i.trim()).filter(Boolean):[];return r===0?{status:"fresh",branch:n,mainRef:t,ahead:o,behind:r,missingFixes:s,message:`Branch '${n}' is fresh against ${t}.`}:o>0?{status:"diverged",branch:n,mainRef:t,ahead:o,behind:r,missingFixes:s,message:`Branch '${n}' diverged from ${t}: ahead=${o}, behind=${r}.`}:{status:"stale",branch:n,mainRef:t,ahead:o,behind:r,missingFixes:s,message:`Branch '${n}' is ${r} commit(s) behind ${t}.`}}catch(n){let r=n instanceof Error?n.message:String(n);return{status:"unknown",mainRef:t,ahead:0,behind:0,missingFixes:[],message:"Branch freshness could not be determined.",error:r}}}var Yje,Cee=S(()=>{"use strict";Pp();Ul();Yje=Oo(process.env,{allowList:["PATH","HOME","USER",...ks,"SHELL","TERM","LANG","LC_ALL","GIT_CONFIG_GLOBAL","GIT_CONFIG_SYSTEM","GIT_EXEC_PATH"]})});function Xje(e){return!!((e.agentProgress?.toolCount??0)>0||e.usage||e.transcriptArtifact||e.modelAttempts?.some(t=>t.success)||e.jsonEvents||e.diagnostics?.verifyGate!==void 0)}function Zje(e){return!!(e.resultArtifact&&e.resultArtifact.sizeBytes===0)}function Qje(e,t){let n=e?.effectivenessGuard;return n==="off"||n==="warn"||n==="block"||n==="fail"?n:t?.runtimeResolution?.safety==="explicit_dry_run"?"off":"warn"}function Xb(e){let t=e.tasks.filter(u=>u.status==="completed"),n=t.filter(u=>!Xje(u)||Zje(u)),r=e.tasks.filter(u=>u.agentProgress?.activityState==="needs_attention"),o=e.executeWorkers?"enabled":"disabled/scaffold",s=Qje(e.runtimeConfig,e.manifest),i=r.filter(u=>u.status==="completed").length,a=Math.max(0,t.length-n.length-i),c="ok";return e.executeWorkers&&s!=="off"&&n.length>0&&(c=s==="fail"?"failed":s==="block"?"blocked":"warning",c==="warning"&&n.some(u=>Cr(u.role)!=="read_only")&&(c="blocked")),{completed:t.length,observable:a,noObservedWorkTaskIds:n.map(u=>u.id),needsAttentionTaskIds:r.map(u=>u.id),workerExecution:o,guardMode:s,severity:c}}function Aee(e){return[`Score: ${e.observable}/${Math.max(1,e.completed)} completed task(s) with observable worker activity`,`Worker execution: ${e.workerExecution}`,`Guard: ${e.guardMode} severity=${e.severity}`,`No observable worker activity: ${e.noObservedWorkTaskIds.length?e.noObservedWorkTaskIds.join(", "):"none"}`,`Needs attention: ${e.needsAttentionTaskIds.length?e.needsAttentionTaskIds.join(", "):"none"}`]}function Pee(e){return e.severity!=="warning"&&e.severity!=="blocked"&&e.severity!=="failed"?void 0:{action:e.severity==="failed"?"fail":e.severity==="blocked"?"block":"notify",reason:"ineffective_worker",message:`Run effectiveness guard ${e.guardMode}: no observable worker activity for ${e.noObservedWorkTaskIds.join(", ")}.`,createdAt:new Date().toISOString()}}var rj=S(()=>{"use strict";Wi()});function Zb(e){return e==="cancelled"||e==="failed"||e==="completed"}async function oj(e){let t=await Promise.race([...e.pendingUnits.values()].map(a=>a.wrapped)),n=e.pendingUnits.get(t.unitKey);e.pendingUnits.delete(t.unitKey);let r=t.result?void 0:Jx(t.error),o=t.result??{manifest:e.manifest,tasks:Bc(e.tasks,"failed",t.error.message,a=>n.taskIds.includes(a.id)).map(a=>r&&a.status==="failed"?{...a,failureCause:r}:a)},s=[o],i=await ZE(e.manifest,XE,async()=>{uo();let a=j(e.manifest.cwd,e.manifest.runId),c=a?.manifest??e.manifest,u=c.artifacts,d=Vl([...u,...s.map(m=>m.manifest.artifacts)].flat()),l={...c,artifacts:d},f=Zb(c.status)?l:Ae(l,"running","Merged task updates from parallel batch."),p=Sb(a?.tasks??e.tasks,s);return await gt(f),await gn(f,p),{resultManifest:f,resultTasks:p}},(a,c,u)=>{X(e.manifest.eventsPath,{type:"run.lock_retry",runId:e.manifest.runId,message:`run.lock contention during unit merge (attempt ${a}); retrying in ${c}ms: ${u.message}`,data:{attempt:a,delayMs:c,site:"mergeUnitResult"}}).catch(()=>{})});return e.manifest=i.resultManifest,e.tasks=i.resultTasks,e.settledMerge={taskIds:n.taskIds,result:o},null}var _ee,rC=S(()=>{"use strict";qe();Se();we();ib();QE();jp();vb();Eb();_ee=oj});function Jl(e,t,n,r){return{action:e,reason:t,message:n,taskId:r,createdAt:new Date().toISOString()}}function eWe(e,t){let n=0,r=e.graph?.parentId,o=new Set;for(;r&&!o.has(r);)o.add(r),n+=1,r=t.get(r)?.graph?.parentId;return n}function Mee(e){let t=[],n=Number.isFinite(e.limits?.maxTasksPerRun)?e.limits.maxTasksPerRun:void 0;n!==void 0&&e.tasks.length>n&&t.push(Jl("block","limit_exceeded",`Run has ${e.tasks.length} tasks, exceeding maxTasksPerRun=${n}.`));let r=e.tasks.filter(i=>i.status==="running").length,o=Number.isFinite(e.limits?.maxConcurrentWorkers)?e.limits.maxConcurrentWorkers:void 0;o!==void 0&&r>o&&t.push(Jl("block","limit_exceeded",`Run has ${r} running workers, exceeding maxConcurrentWorkers=${o}.`));let s=new Map(e.tasks.map(i=>[i.id,i]));for(let i of e.tasks){if(e.limits?.maxChildrenPerTask!==void 0&&(i.graph?.children.length??0)>e.limits.maxChildrenPerTask&&t.push(Jl("block","limit_exceeded",`Task has ${i.graph?.children.length??0} children, exceeding maxChildrenPerTask=${e.limits.maxChildrenPerTask}.`,i.id)),e.limits?.maxTaskDepth!==void 0&&eWe(i,s)>e.limits.maxTaskDepth&&t.push(Jl("block","limit_exceeded",`Task graph depth exceeds maxTaskDepth=${e.limits.maxTaskDepth}.`,i.id)),i.status==="failed"){let a=i.policy?.retryCount??0,c=e.limits?.maxRetriesPerTask??0;t.push(Jl(a<c?"retry":"escalate","task_failed",i.error?`Task failed: ${i.error}`:"Task failed.",i.id))}if((i.status==="running"||i.status==="queued")&&i.heartbeat&&i.heartbeat.alive!==!1&&lI(i.heartbeat,e.limits?.heartbeatStaleMs??6e4,e.now)&&t.push(Jl("escalate","worker_stale","Worker heartbeat is stale.",i.id)),i.taskPacket?.verification){let a=bF(i.taskPacket.verification,i.verification);!a.satisfied&&i.status==="completed"&&t.push(Jl("block","green_unsatisfied",`Green contract unsatisfied: required=${a.requiredGreenLevel}, observed=${a.observedGreenLevel}.`,i.id))}}return t.length===0&&e.tasks.length>0&&e.tasks.every(i=>i.status==="completed")&&t.push(Jl("closeout","run_complete","All tasks completed and no policy blockers were found.")),t}function $ee(e){return e.map(t=>`- ${t.action} (${t.reason})${t.taskId?` ${t.taskId}`:""}: ${t.message}`)}var Oee=S(()=>{"use strict";Nu();SF()});import*as oC from"node:fs";import*as qh from"node:path";function Dee(e){return`- ${e.id}: ${e.status} (${e.role} -> ${e.agent})${e.taskPacket?` scope=${e.taskPacket.scope}`:""}${e.verification?` green=${e.verification.observedGreenLevel}/${e.verification.requiredGreenLevel}`:""}${e.error?` - ${e.error}`:""}`}function Nee(e,t,n,r){return Aee(Xb({manifest:e,tasks:t,executeWorkers:n,runtimeConfig:r}))}function tWe(e){if(!e.eventsPath)return[];let t=ja(e.eventsPath),n=t.filter(o=>o.type==="scratchpad.cell"),r=t.filter(o=>o.type==="scratchpad.restored");return n.length===0&&r.length===0?[]:["## Scratchpad (RLM adoption) \u2014 I5 metric",`- cells executed: ${n.length}`,`- snapshot restores: ${r.length}`,...n.length>0?[`- total cell time: ${Math.round(n.reduce((o,s)=>o+(s.data?.durationMs??0),0))} ms`]:[]]}function eS(e,t,n,r=!0,o){let s=new Map;for(let g of t)s.set(g.status,(s.get(g.status)??0)+1);let i=pE(t),a=new Date().toISOString(),c=[`# pi-crew progress ${e.runId}`,"",`Status: ${e.status}`,`Team: ${e.team}`,`Workflow: ${e.workflow??"(none)"}`,`Updated: ${a}`,`Task counts: ${[...s.entries()].map(([g,k])=>`${g}=${k}`).join(", ")||"none"}`,`Queue: ready=${i.ready.length}, blocked=${i.blocked.length}, running=${i.running.length}, done=${i.done.length}, failed=${i.failed.length}, cancelled=${i.cancelled.length}`,"","## Tasks",...t.map(Dee),"","## Effectiveness",...Nee(e,t,r,o),""].join(`
637
637
  `),u=jI(c),f=Qb.get(e.runId)===u?(()=>{let g=e.artifacts.find(k=>k.kind==="progress");return g?{...g,createdAt:new Date().toISOString()}:ge(e.artifactsRoot,{kind:"progress",relativePath:"progress.md",producer:n,content:c})})():ge(e.artifactsRoot,{kind:"progress",relativePath:"progress.md",producer:n,content:c});Qb.set(e.runId,u);let p=new Map;for(let g of e.artifacts)g.kind==="progress"&&g.path===f.path||p.set(g.path,g);p.set(f.path,f);let m=[...p.values()];return{...e,updatedAt:a,artifacts:m}}function nWe(e,t,n){let r=Eee(e.cwd),o=ge(e.artifactsRoot,{kind:"metadata",relativePath:"metadata/branch-freshness.json",producer:"branch-freshness",content:`${JSON.stringify(r,null,2)}
638
638
  `}),s=Mee({manifest:e,tasks:t,limits:n});if(r.status==="stale"||r.status==="diverged"){let u={action:"notify",reason:"branch_stale",message:r.message,createdAt:new Date().toISOString()};s=[...s,u],Me(e.eventsPath,{type:"branch.stale",runId:e.runId,message:r.message,data:{branchFreshness:r}}).catch(d=>v("finalize-run.buffered",d,"type=branch.stale"))}let i=ge(e.artifactsRoot,{kind:"metadata",relativePath:"policy-decisions.json",producer:"policy-engine",content:`${JSON.stringify(s,null,2)}
639
639
  `}),a=xI(s),c=ge(e.artifactsRoot,{kind:"metadata",relativePath:"recovery-ledger.json",producer:"recovery-engine",content:`${JSON.stringify(a,null,2)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-crew",
3
- "version": "0.11.13",
3
+ "version": "0.11.14",
4
4
  "description": "Pi extension for coordinated AI teams, workflows, worktrees, and async task orchestration",
5
5
  "author": "baphuongna",
6
6
  "license": "MIT",
@@ -22,7 +22,16 @@ export function taskHasObservableWorkerActivity(task: TeamTaskState): boolean {
22
22
  task.usage ||
23
23
  task.transcriptArtifact ||
24
24
  task.modelAttempts?.some((attempt) => attempt.success) ||
25
- task.jsonEvents,
25
+ task.jsonEvents ||
26
+ // U13 deterministic verify_gate: a gated verifier does real work
27
+ // (typecheck/test exit codes via ctx.executeTool) WITHOUT spawning an
28
+ // LLM worker — no usage/transcript by design. The gate verdict recorded
29
+ // in task.diagnostics.verifyGate is the observable-work evidence.
30
+ // Live-caught 2026-10-10 (T7 battery, runs team_20261010161149 +
31
+ // team_20261010162310): green-gated verifier tasks were false-blocked
32
+ // here ("no observable worker activity") → run stuck non-terminal
33
+ // "blocked" → sync team calls hung forever.
34
+ task.diagnostics?.verifyGate !== undefined,
26
35
  );
27
36
  }
28
37