
ECC loop-status 全解析巡检自主循环、定位挂起的 ScheduleWakeup 与 Bash 调用【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECCloop-status是 ECCThe agent harness performance optimization system提供的一套循环运行状态巡检能力既包含会话内可直接执行的/loop-status斜杠命令也包含可跨会话、跨终端运行的打包 CLI。它的用途非常聚焦扫描本地 Claude 转录transcriptJSONL 文件识别计划唤醒ScheduleWakeup已超期但助手没有任何后续进展、Bash 工具调用迟迟没有 tool_result 回执以及转录文件解析异常等失败信号并输出当前活跃循环所处的状态、最近一次成功检查点与推荐处置动作。读完本文你将掌握 loop-status 的全部命令行参数、退出码语义、JSON 输出结构、监听模式与快照文件机制并能在 watchdog 脚本、兄弟终端或 CI 流程中把它当作可靠的循环健康探针来使用。一、这个命令解决什么问题ECC 的自主循环autonomous loop通常以/loop-startcommands/loop-start.md启动支持sequential、continuous-pr、rfc-dag、infinite等模式并依赖安全默认值、质量门禁与显式停止条件来约束运行。在这种长时间运行的会话中最怕的不是报错而是无声挂起助手安排了一次延时唤醒唤醒时刻已过却没有任何后续消息或者一次 Bash 调用发出后一直等不到工具结果循环静默卡死。这类问题在会话自身视角内往往无法自愈——因为它已经楔住了无法再排队处理新的命令。这正是 loop-status 的存在价值。它不去干预运行中的工具调用而是旁路读取转录文件用时间阈值做判定把状态是 ok 还是 attention、有哪些失败信号、建议如何处置一次性呈现出来。你不需要信任某个卡住会话的自我报告转录文件本身就是最客观的证据源。二、快速上手两种运行方式方式一会话内斜杠命令/loop-status [--watch]在正常工作的会话内可以直接把/loop-status排进队列执行。原文档明确给出一个关键前提This slash command can only run after the current session dequeues it.也就是说这条斜杠命令只有在当前会话真的把它出队执行时才有效。如果当前会话本身已经楔住wedged或者你需要检查另一个兄弟会话sibling session那就必须换用下面的跨会话 CLI。方式二跨会话打包 CLInpx --package ecc-universal ecc loop-status --jsonnpx --package ecc-universal会临时拉取并运行ecc-universal这个 npm 包即当前仓库发布名见 package.json再由其ecc二进制入口把命令分发给loop-status子命令。仓库中 scripts/ecc.js 的 COMMANDS 注册表把loop-status映射到loop-status.js描述为Inspect Claude transcripts for stale loop wakeups and pending tool results并把它列入了PRIMARY_COMMANDSscripts/ecc.js和帮助示例ecc loop-status --jsonscripts/ecc.js。该 CLI 会在本地~/.claude/projects/**下递归扫描 Claude 转录 JSONL 文件这是源码findTranscriptPaths的默认行为见 scripts/loop-status.js报告两类核心失效信号过期的ScheduleWakeup调用没有匹配tool_result的Bash工具调用。在另一个终端里运行它就可以检查任何一个本地 Claude 会话是否健康完全不依赖被检查会话本身能否响应。三、底层检测原理三类失败信号如何产生要正确解读输出先理解判定逻辑。核心实现位于 scripts/loop-status.js 的analyzeTranscriptscripts/loop-status.js。它逐行解析 JSONL用两张账本追踪工具生命周期extractToolUsesscripts/loop-status.js从每条记录的message.content内容块、顶层tool_use/toolUse字段以及type tool_use的记录中提取工具调用登记进pendingToolsMapkey 为toolUseIdextractToolResultIdsscripts/loop-status.js负责把每条记录里出现的tool_result回执 ID 从pendingTools中删除配对成功。一轮扫描结束后仍然留在pendingTools里、且满足阈值条件的调用就是可疑对象。三类信号汇总如下信号 1schedule_wakeup_overdue计划唤醒超期当转录中出现名为ScheduleWakeup的工具调用时源码读取其输入中的delaySeconds兼容delay_seconds/seconds/delay等别名见readDelaySeconds计算dueAt scheduledAt delaySeconds × 1000。判定超期需要同时满足当前时间已超过scheduledAt delaySeconds × wakeGraceMultiplier宽限期倍率默认2且在唤醒到期时刻之后没有检测到任何助手侧进展latestAssistantProgressAt早于dueAt。第二条是关键去噪规则如果唤醒已经触发、助手随后正常输出了消息即使现在时间很晚也不该报 alarm——这说明循环继续活着。对应测试见 tests/scripts/loop-status.test.js。信号 2pending_bash_tool_result挂起的 Bash 调用凡是发出后始终没有收到tool_result的Bash工具调用都会被留下但如果它存在的时间尚未超过--bash-timeout-seconds默认1800 秒就不会报警。只有年龄达到阈值才会产生信号并携带完整上下文工具调用 ID、实际执行的command、起始时间与判定阈值见 scripts/loop-status.js。测试用例演示了一个 50 分钟前发出、至今未回执的 Bash 调用ageSeconds 3000被准确标记tests/scripts/loop-status.test.js。信号 3transcript_parse_errors转录解析异常逐行JSON.parse失败的行数会被累计readJsonlEntriesscripts/loop-status.js一旦大于 0 就产生该信号。这说明转录文件本身可能被并发写入截断或损坏值得人工检查对应测试见 tests/scripts/loop-status.test.js。每条转录最终得到state有任何信号即为attention否则为ok同时recommendedAction会给出可读的处置建议见buildRecommendationscripts/loop-status.js例如有pending_bash_tool_result→Open the transcript or interrupt the parked session; the Bash result appears stale.有schedule_wakeup_overdue→Open the transcript or interrupt the parked session; the scheduled wake is overdue.有transcript_parse_errors→Inspect the transcript; some JSONL lines could not be parsed.干净 →No stale ScheduleWakeup or Bash waits detected.四、输出解读报告里应该关注什么原文档要求/loop-status的输出至少覆盖五个维度这也是任何一次巡检后你应向团队或自己汇报的要点报告项含义对应输出位置active loop pattern当前正在运行的循环模式会话启动上下文配合 commands/loop-start.md 的模式定义current phase and last successful checkpoint当前阶段与最近一次成功检查点转录中最近的助手进展时间、事件数failing checks (if any)若有具体哪些检查失败JSON 的signals数组 / 文本行的signals:estimated time/cost drift时间/成本漂移估计由lastEventAt、挂起时长等时间戳推算recommended intervention (continue/pause/stop)推荐处置继续 / 暂停 / 停止JSON 的recommendedAction文本输出示例不带--json时输出是人类可读格式实现见formatTextscripts/loop-status.jsECC loop status (2026-04-30T10:00:00.000Z) - session-a [attention] /home/you/.claude/projects/-repo/session-a.jsonl last event: 2026-04-30T09:00:00.000Z; events: 12 signals: schedule_wakeup_overdue action: Open the transcript or interrupt the parked session; the scheduled wake is overdue.如果扫描目录下没有任何可读转录会给出相应提示部分转录读取失败时失败项会集中在Skipped transcript errors:段落里而不是中断整个扫描。JSON 输出结构与字段--json时输出的顶层 payload 的schemaVersion为ecc.loop-status.v1结构如下字段均来自源码buildStatus/analyzeTranscript{ schemaVersion: ecc.loop-status.v1, generatedAt: 2026-04-30T10:00:00.000Z, errors: [], sessions: [ { sessionId: session-a, state: attention, transcriptPath: /home/you/.claude/projects/-repo/session-a.jsonl, projectSlug: -repo, eventCount: 12, lastEventAt: 2026-04-30T09:00:00.000Z, latestWake: { toolUseId: toolu_wake, scheduledAt: 2026-04-30T09:00:00.000Z, delaySeconds: 300, dueAt: 2026-04-30T09:05:00.000Z, reason: Iter 15: continue autonomous loop }, pendingTools: [ { toolUseId: toolu_bash, name: Bash, command: pytest tests/integration/test_pipeline.py, startedAt: 2026-04-30T09:10:00.000Z, ageSeconds: 3000 } ], signals: [ { type: pending_bash_tool_result, toolUseId: toolu_bash, command: pytest tests/integration/test_pipeline.py, startedAt: 2026-04-30T09:10:00.000Z, thresholdSeconds: 1800, ageSeconds: 3000 } ], parseErrors: 0, recommendedAction: Open the transcript or interrupt the parked session; the Bash result appears stale. } ], source: { homeDir: /home/you, transcriptRoot: /home/you/.claude/projects, transcriptCount: 1, limit: 10, bashTimeoutSeconds: 1800, wakeGraceMultiplier: 2 } }几个值得注意的实现细节排序buildStatus先把attention状态的会话排在最前同状态内再按最近事件时间倒序scripts/loop-status.js方便你优先处理异常会话 ID 识别getSessionId会依次尝试sessionId/session_id/session.id/message.sessionId最后才回退到转录文件名scripts/loop-status.js时间戳解析getEntryTimestamp兼容timestamp、createdAt、created_at、message.timestamp多种写法扫描容错单个目录不可读如权限不足只记录进errors不拖垮整轮扫描scripts/loop-status.js对应测试见 tests/scripts/loop-status.test.js。五、完整命令行参数参考原文档列出的参数均直接映射到 scripts/loop-status.js 的参数解析器其中数字型参数会做严格的正数/正整数校验如--limit 1.5会直接报错退出。下面把文档参数与源码中暴露的附加参数合并成完整参考表参数说明默认值--json输出机器可读 JSON单次运行为格式化 JSONwatch 模式下每轮刷新输出一行紧凑 JSON关闭--home dir指定要扫描的其他主目录用于检查另一个本地配置或挂载的工作区$HOME/$USERPROFILE/os.homedir()--transcript session.jsonl直接指定单条转录文件检查可重复传入多条无默认走目录扫描--limit n最多检查最近多少条转录按修改时间倒序取前 N10--bash-timeout-seconds n挂起 Bash 调用被判为 stale 的年龄阈值秒1800--wake-grace-multiplier nScheduleWakeup 的宽限期倍率实际等待delaySeconds × multiplier后才判定超期2--now time覆盖当前时间ISO 时间串、epoch 毫秒或字面量now便于测试与回放系统当前时间--exit-code启用退出码语义见下文关闭--watch周期性刷新状态直到被中断或达到--watch-count关闭--watch-count n有界刷新次数watch 停止的轮数上限无限制配合--exit-code时必填--watch-interval-seconds nwatch 模式下两次刷新之间的间隔秒5--write-dir dir写入快照目录见第七节关闭-h/--help打印 usage 帮助—其中--limit、--wake-grace-multiplier、--now、--watch-interval-seconds等参数虽未逐一出现在原文档正文中但都由同一解析器原生支持并配有对应单元测试tests/scripts/loop-status.test.js可作为文档的补充能力使用。参数校验的两个硬性规则同样值得注意数字参数必须为正数/正整数--exit-code与--watch同时出现时必须提供--watch-count否则直接报错scripts/loop-status.js。六、退出码语义把巡检接进脚本原文档定义了两种非零退出码配合源码getStatusExitCodescripts/loop-status.js可以得到完整的三态语义退出码触发条件0一切正常没有任何 attention 会话也没有扫描错误1转录无法扫描存在 errors但没有任何 attention 会话2发现 stale 循环信号或挂起工具信号存在attention会话优先级上attention高于扫描错误即使同时存在 unreadable 错误与 attention 会话也返回2对应测试 tests/scripts/loop-status.test.js。这套语义使 loop-status 可以直接作为 CI、cron 或 watchdog 的判定源例如ecc loop-status --json --exit-code echo exit$? # 0健康, 1扫描异常, 2发现卡住的循环七、Watch 模式持续刷新与有界监听带上--watch后命令会按照--watch-interval-seconds默认 5 秒周期性重建状态。实现上runWatchscripts/loop-status.js每轮调用buildStatus并将该轮产生的最高退出码一路累计结束后返回。关键组合用法# 持续刷新直到 Ctrl-C ecc loop-status --watch # 有界刷新 3 次供脚本与交接handoff消费 ecc loop-status --watch --watch-count 3 # 有界刷新 3 次后以观察到的最高状态码退出配合 watchdog ecc loop-status --watch --watch-count 3 --exit-code当--watch与--json同时出现时每轮刷新只输出一行紧凑 JSON 对象形成逐行 JSON 流JSON Lines另一个终端或脚本可以逐行消费。watch 与--exit-code组合时强制要求--watch-count正是为了避免 watchdog 脚本无限期等待一个永不退出的进程——这在 tests/scripts/loop-status.test.js 中被显式校验同时测试也验证了 watch 两轮会输出两帧、且携带相同schemaVersion与sessionIdtests/scripts/loop-status.test.js。八、Snapshot 文件让兄弟进程免排队读取状态--write-dir dir是原文档重点介绍的能力。它的动机与第一节呼应当另一个进程需要检查循环状态、却不想等待当前 Claude 会话出队执行/loop-status时就可以让 loop-status CLI 把分析结果落盘。指定目录后工具会写入两类文件文件内容schemaVersionindex.json每个被检查会话一行索引记录含sessionId、state、signalTypes、transcriptPath、snapshotPath等ecc.loop-status.index.v1session-id.json该会话的完整状态载荷ecc.loop-status.session.v1ecc loop-status --watch --write-dir ~/.claude/loops写入过程有几点实现上的工程考量原子写入每个快照先写临时文件再rename避免兄弟进程读到半截 JSONatomicWriteJsonscripts/loop-status.jsrename 失败时会清理临时文件并告警对应测试 tests/scripts/loop-status.test.js写失败不阻断主输出即使快照目录不可写stdout 上的正常状态结果依然完整输出只在 stderr 打一条[loop-status] WARNINGtryWriteStatusSnapshotsscripts/loop-status.js测试见 tests/scripts/loop-status.test.js文件名清理会话 ID 会被清洗成安全的文件基名对于 Windows 保留名con、prn、aux、nul、com1-9、lpt1-9、超长名或空名会自动追加 8~12 位 SHA-256 哈希后缀规避冲突sanitizeSnapshotNamescripts/loop-status.jsindex.json本身也作为保留名不会被会话占用tests/scripts/loop-status.test.js。必须强调一个重要边界这些快照只是本地转录分析的产物它们不会控制或超时 Claude Code 运行时中的真实工具调用。也就是说 loop-status 是观测器而非控制器——它告诉你某次 Bash 已经挂起 3000 秒但终止该调用仍需你打开对应转录/会话去干预。九、自动化落地watchdog 与兄弟终端组合示例把上述能力拼起来可以形成几种典型运维模式# 模式一轮询 快照 退出码适合 cron/CI 每 N 分钟探活 ecc loop-status --json --exit-code --write-dir ~/.claude/loops # 模式二有界监听适合前台脚本等待循环收敛 ecc loop-status --watch --watch-count 20 --watch-interval-seconds 10 --json \ | while IFS read -r line; do echo $line; done # 模式三有界监听并反映最高异常等级 ecc loop-status --watch --watch-count 5 --exit-code; echo watchdog exit$? # 模式四从另一个终端直接盯一个指定转录文件 ecc loop-status --transcript ~/.claude/projects/-repo/session.jsonl --watch --json配合 scripts/ecc.js 的命令注册还可以用统一的ecc入口把它们嵌入现有的 ECC 运维脚本链。巡检到attention状态后推荐处置链是先看recommendedAction决定继续/暂停/停止再回到出问题的转录定位具体工具调用若属于/loop-start管理的自主循环可结合该模式的安全门禁决定是否重启一轮新循环而不是盲目重试同一会话。十、验证与进一步阅读loop-status 的行为有完整测试覆盖测试可直接运行node tests/scripts/loop-status.test.js测试套件 tests/scripts/loop-status.test.js 覆盖了本文涉及的全部关键路径ScheduleWakeup 超期报警与唤醒后有进展则不报警的去噪、挂起 Bash 识别与配平回执后的豁免、直接转录文件检查、文本输出断言、不可读目录/缺失文件容错、JSONL 解析异常信号、退出码 0/1/2 语义、watch 有界帧输出、快照写入与文件名碰撞规避等是理解本文所有结论的最权威佐证。相关源码与文档入口scripts/loop-status.js完整 CLI 实现含默认常量DEFAULT_BASH_TIMEOUT_SECONDS、DEFAULT_WAKE_GRACE_MULTIPLIER、DEFAULT_WATCH_INTERVAL_SECONDS、DEFAULT_LIMITtests/scripts/loop-status.test.js行为级测试套件可直接运行验证scripts/ecc.jsecc主 CLI 对loop-status子命令的注册与帮助文案package.jsonecc-universal包名与ecc/ecc-universalbin 映射支撑npx --package ecc-universal ecc loop-status用法commands/loop-start.md与loop-status配对的循环启动命令定义了sequential/continuous-pr/rfc-dag/infinite模式与安全门禁构成启动—巡检—干预闭环。结语loop-status 的价值可以用一句话概括在自主循环不可自述病情的场景里用转录文件的客观证据回答循环还活着吗、卡在哪了、该怎么办。把会话内斜杠命令、跨会话 CLI、watch 模式、快照落盘与退出码语义组合起来你就能为 ECC 的自主循环建立一条不依赖故障会话自身响应能力的旁路观测通道——这正是长时间无人值守循环能够被安全托管的底层保障之一。【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考