[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M799Z20DSMDXSHREF1S8MP0B":3,"skill-same:01M799Z20DSMDXSHREF1S8MP0B":49},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":29,"repositoryHtmlUrl":30,"repositoryHomepageUrl":31,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M799Z20DSMDXSHREF1S8MP0B","andon-loop",null,"Runs or resumes an evidence-grounded hardening loop over a repository's value stream (its stages and the wires between them), closing one gap per stage and refusing to advance past a broken or unproven wire. Use when the user wants to harden a repo, run the andon loop, resume the ledger, scan for gaps and fix them in order, or iterate a multi-stage codebase closing gaps while proving each handoff before moving on. Not for applying a single authorized phase from MODERNIZATION_BRIEF.md -- use befund-transform-execute for that, then return here (or to andon-verify) for the proof.","Anselmoo\u002Fwerkstoff","Anselmoo","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13209783?v=4","01M799YTB3D7RZ4P3B8CSR2X85","Anselm Hahn","01M799YTBRAM6719D9V0NRGB4R",1,"MIT","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Fplugins\u002Fandon\u002Fskills\u002Fandon-loop\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: andon-loop\ndescription: \"Runs or resumes an evidence-grounded hardening loop over a repository's value stream (its stages and the wires between them), closing one gap per stage and refusing to advance past a broken or unproven wire. Use when the user wants to harden a repo, run the andon loop, resume the ledger, scan for gaps and fix them in order, or iterate a multi-stage codebase closing gaps while proving each handoff before moving on. Not for applying a single authorized phase from MODERNIZATION_BRIEF.md -- use befund-transform-execute for that, then return here (or to andon-verify) for the proof.\"\nallowed-tools: \"Read, Write, Edit, Bash(python3 -B \\\"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fandon_core.py\\\":*), Bash(python3 -B \\\"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fbuild_symbol_index.py\\\":*), Glob, Grep, Agent\"\nargument-hint: \"[stage-or-gap-filter]\"\n---\n\n# andon-loop\n\nOrchestrates Phases 0-6 below over the OKF ledger. This skill is the **sole\nwriter** to the ledger. `andon-propose` and `andon-verify` only ever return\nstructured results for you (the orchestrator) to persist -- never call them\nexpecting them to write files.\n\nEvery phase below names the exact `andon_core.py` subcommand that performs\nthe mechanical check. Treat a non-zero exit code or `\"allowed\": false` in its\nJSON output as a hard stop, not a suggestion: do not re-derive the decision\nin prose, and do not proceed past it without the specific explicit-user-input\nthe phase describes.\n\n`SCRIPTS` below means `${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fandon_core.py`.\n\n## Phase -1: settings gate (every invocation, before anything else)\n\n```\npython3 SCRIPTS enforce-enabled \u003Crepo_root>\n```\n\nIf this exits non-zero, the settings file has `enabled: false`. Print the\nerror message verbatim and **stop** -- do not run Phase 0 or any later phase,\ndo not read the repo, do not touch the ledger. This is not a soft suggestion;\nthe script raised, so you halt.\n\nIf it succeeds, its JSON `settings` object gives you `output_dir`,\n`ledger_dir`, `authorization_level`, `skip_verification`, `gap_source`, and\n`befund_output_dir` for every phase below (defaults documented in\n`${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fokf-ledger-schema.md` apply when the\nsettings file is absent -- the script already applied them, just use the\nreturned values).\n\n## Phase 0: topology detection\n\nIf `gap_source` is `befund-brief` (ingest mode), **skip all heuristic\nsteps below** and check the prerequisite in code first:\n\n```\npython3 SCRIPTS check-ingest-prereqs \u003Crepo_root> \u003Cgap_source> \u003Cbefund_output_dir>\n```\n\nIf this exits non-zero, `MODERNIZATION_BRIEF.md` or `transform_brief_summary.json`\nis missing from `befund_output_dir`. **Stop** and tell the user to run\n`befund:befund-transform-brief` first -- never silently fall back to\nself-scan; that silent fallback is exactly the failure mode this check exists\nto prevent. If it succeeds, take the stream from the brief's phases (already\nleaf-first \u002F Kahn-sorted) with confidence `befund-backed`, and go straight\nto Phase 1 using those stages.\n\nOtherwise (`gap_source: self-scan`, the default), detect stages and wires:\n\n1. Prefer dispatching the `befund:stage-mapper` agent if the `befund`\n   plugin is installed. Confidence: `befund-backed`.\n2. If unavailable, degrade to a built-in heuristic: `Glob` for manifest files\n   (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `Gemfile`, ...)\n   and cluster by directory. Confidence: `heuristic` (flag this in the stage\n   docs you write in Phase 1 -- the `confidence` field is a required,\n   first-class key on every stage doc, never a prose caveat).\n3. A repo with exactly one package is valid as a single stage with no\n   inter-stage wire. Confidence: `single-package`.\n4. If the user declared an explicit stream (stage list) in their request,\n   that overrides detection entirely.\n\n## Phase 1: ledger init or resume\n\n```\npython3 SCRIPTS init-or-resume \u003Crepo_root> \u003Cledger_dir>\n```\n\nIf `resumed: false`, this already created `ledger_dir\u002F{stages,gaps,evidence}`\nand an empty `log.md`. Immediately write one `type: stage` doc per detected\nstage using `write-doc` (below) -- `order` and `confidence` are required\nfields, not optional metadata.\n\nIf `resumed: true`, its JSON gives you `stages`, `gaps`, `evidence`, and a\nreconstructed `cursor` -- derived from the first `status:open` gap doc in\nstage order, or `{\"state\": \"converged, no open gaps\"}`. **Never guess the\ncursor yourself**; this script's reconstruction is the only source of truth\n(`ledger-cursor-reconstruction-from-gaps`).\n\nTo write any OKF doc (stage, gap, or evidence), always go through:\n\n```\npython3 SCRIPTS write-doc \u003Crepo_root> \u003Cledger_dir> \u003Crelative_path> '\u003Cfields_json>' [--body TEXT]\n```\n\n`\u003Crelative_path>` is relative to `\u003Cledger_dir>` itself, e.g. `stages\u002Fs1.md`,\n`gaps\u002Fg1.md`, `evidence\u002Fev1.md` -- the script joins it onto `ledger_dir`\nbefore validating, matching the on-disk layout\n`ledger_dir\u002F{stages,gaps,evidence}\u002F*.md`.\n\nThis validates write-scope (rejects traversal\u002Fabsolute\u002Foutside-ledger paths)\nand the OKF schema (rejects a doc missing a gating field) **before** touching\ndisk. If it exits non-zero, the doc was not written -- fix the fields, don't\nretry with a workaround.\n\n## Phase 2: scan the cursor's stage for gaps\n\nScan **only** the cursor's current stage -- never re-scan completed stages\nevery pass. In self-scan mode look for: failing tests, wires with no\nevidence doc or a red\u002Funknown one, TODOs, schema drift, dead handoffs. In\ningest mode, gaps come from the brief's Work Items for this phase instead\n(pre-classified: code-idiom\u002Flint\u002Fui-audit\u002Fzeugnis findings become `kind:bug`,\narchitectural Merge\u002FSplit\u002Flayering decisions become `kind:wire`,\ndocumented-absent behavior becomes `kind:feature`; carry `file:line` and the\nfix-owner agent name into the gap doc; the phase's Behavior Contract becomes\nthe wire's verification contract; Advisory notes go on the stage doc's body,\nnever converted into auto-fixable gaps).\n\nClassify each gap with exactly one `kind` (`bug`, `feature`, or `wire`) and\nwrite it with `status: open` via `write-doc`. `select-next-gap` enforces\npriority when more than one gap is found:\n\n```\npython3 SCRIPTS select-next-gap '\u003Cjson array of {kind, on_constraint, blast_radius, slug}>'\n```\n\nPriority is fixed in code: `on_constraint:true` first, then wire before bug\nbefore feature, then smallest blast radius as tiebreak. Do not eyeball a\n\"more important-looking\" gap instead.\n\n## Phase 3: propose\n\nDispatch the `andon-propose` skill with the selected gap, the stage doc, and\nany linked gap\u002Fevidence docs. It returns a proposal (fix description, files\ntouched, chosen `andon-verify` strategy + rationale, and **exactly one**\nblast-radius tag). Record the proposal onto the gap doc via `write-doc`\n(this re-validates the blast-radius tag as part of schema validation -- a\nproposal with zero, two, or an undefined tag is rejected, not coerced).\n\n**Stop condition 2 check**, before doing anything else with this proposal:\n\n```\npython3 SCRIPTS check-stop-conditions --verdict unknown \\\n  --blast-radius \u003Ctag> --authorization-level \u003Csettings.authorization_level>\n```\n\nIf this exits non-zero, the blast radius exceeds the configured\nauthorization level. Halt and ask the user to either explicitly confirm\nraising authorization (`--confirm-authorization-raise` on the recheck) or\nexplicitly skip this gap. Do not apply the fix in the meantime.\n\n## Phase 4: verify\n\nBefore dispatching, resolve or build the shared symbol-index snapshot. Read\n`analysis\u002Fandon\u002Fcurrent.json`; if missing or its `source_fingerprint` no\nlonger matches, run\n\n```\npython3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fbuild_symbol_index.py\" --repo-path . --plugin-name andon\n```\n\n(single-flight lock makes concurrent callers safe -- see\n`references\u002Fparallel-safe-research-protocol.md`). For a repo well under\n~50 tracked files the build overhead may not be worth it -- skip this and\ntell `andon-verify` no snapshot is available.\n\nDispatch the `andon-verify` skill with the wire, its contract, the proposed\nfix, and (when resolved) the snapshot path as additional evidence context.\nAlso pass the gap doc's recorded `verify_strategy` \u002F `verify_strategy_rationale`\n(from Phase 3) as read-only audit context only -- `andon-verify` still routes\nthe wire itself via its own classifier and must never skip or default to the\nproposed strategy. Record both strategies verbatim in the evidence doc (e.g.\n\"proposed strategy: X, actual routed strategy: Y\") so a mismatch is visible\nin the ledger. It returns a verdict (`green`\u002F`red`\u002F`unknown`) plus evidence\ncontent -- **you** persist it via `write-doc` into `evidence\u002F`, never\n`andon-verify` itself. Pass its `tier_ceiling` through unchanged: for\nstrategy `e`, `write-doc` refuses a doc without one or with a `tier`\nstronger than it.\n\nRun the full stop-condition check now that you have a real verdict and tier:\n\n```\npython3 SCRIPTS check-stop-conditions --verdict \u003Cverdict> \\\n  --blast-radius \u003Ctag> --authorization-level \u003Csettings.authorization_level> \\\n  [--tier \u003C1|2|3>] [--non-overridable]\n```\n\n- Non-zero + `condition_1_red_verdict`: halt. Do not advance past this wire.\n  It may only advance later on an explicit user re-run with new evidence, or\n  an explicit user override\u002Fdefer of the gap.\n- Non-zero + `condition_3_tier1_non_overridable`: halt, **permanently, for\n  this evidence**. There is no flag on this script that waives it, by\n  construction -- do not attempt to route around it by re-running with\n  different arguments or asking the adjudicator to reconsider.\n- Success: close the gap (`status: closed`, `resolved_by: [[evidence\u002F\u003Cslug>]]`)\n  via `write-doc`.\n\n**Sub-cycle backtracking**: if the fix touched a contract an upstream wire\ndepends on,\n\n```\npython3 SCRIPTS track-subcycle \u003Crepo_root> \u003Cledger_dir> \u003Cwire_id> \u003Crequested_upstream_depth>\n```\n\n`effective_upstream_depth` is clamped to at most 2 stages back, regardless of\nwhat you requested -- never re-verify further upstream than that. If\n`escalate: true` (this wire has now reopened 3+ times), **stop sub-cycling\nit**: record the escalation as the active constraint in `log.md` instead of\nlooping again. Every sub-cycle attempt gets its own `log.md` entry\n(`append-log ... sub-cycle ...`), win or lose.\n\n## Phase 5: advance cursor, log the pass\n\n```\npython3 SCRIPTS append-log \u003Crepo_root> \u003Cledger_dir> pass '\u003Cfields_json>'\n```\n\nRequired fields: `stage`, `wire`, `gap`, `strategy`, `verdict`, `next_cursor`,\n`cycle`, `pass_number`. This appends -- it never rewrites `log.md`; the hook\nin `hooks\u002F` will independently refuse a `Write` that would overwrite an\nexisting `log.md`, so there is no path to \"fixing\" a bad entry by rewriting\nthe file. Advance the cursor to the next stage; wrap to the first stage past\nthe last one.\n\n## Phase 6: convergence check\n\nAt each pass boundary (cursor wraps to the first stage), tally\n`gaps_closed_this_pass` from the `pass` log entries appended since the last\npass boundary, and build the wire-status array from each inter-stage wire's\nlatest evidence-doc verdict -- the same derivation `andon-status\u002FSKILL.md`\nalready documents (its stream-table step: \"each wire's status is derived\nfrom its latest evidence doc\"); do not re-derive that rule here, just apply\nit:\n\n```\npython3 SCRIPTS check-convergence \u003Cgaps_closed_this_pass> '\u003Cjson array of wire statuses>'\n```\n\nOnly when `converged: true` (zero gaps closed this pass AND every inter-stage\nwire is green) do you declare \"Cycle N converged\" and append a\n`cycle-converged` log entry (`passes`, `cycle` fields required). Otherwise,\nstart the next pass in the same cycle.\n\n## Reference\n\nSee `${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fokf-ledger-schema.md` for the doc schema\nand settings defaults, and `${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fandon-rule.md`\nfor the three stop conditions in full. Do not duplicate that content here --\nread it when a decision needs it.\n","# andon-loop\n\nOrchestrates Phases 0-6 below over the OKF ledger. This skill is the **sole\nwriter** to the ledger. `andon-propose` and `andon-verify` only ever return\nstructured results for you (the orchestrator) to persist -- never call them\nexpecting them to write files.\n\nEvery phase below names the exact `andon_core.py` subcommand that performs\nthe mechanical check. Treat a non-zero exit code or `\"allowed\": false` in its\nJSON output as a hard stop, not a suggestion: do not re-derive the decision\nin prose, and do not proceed past it without the specific explicit-user-input\nthe phase describes.\n\n`SCRIPTS` below means `${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fandon_core.py`.\n\n## Phase -1: settings gate (every invocation, before anything else)\n\n```\npython3 SCRIPTS enforce-enabled \u003Crepo_root>\n```\n\nIf this exits non-zero, the settings file has `enabled: false`. Print the\nerror message verbatim and **stop** -- do not run Phase 0 or any later phase,\ndo not read the repo, do not touch the ledger. This is not a soft suggestion;\nthe script raised, so you halt.\n\nIf it succeeds, its JSON `settings` object gives you `output_dir`,\n`ledger_dir`, `authorization_level`, `skip_verification`, `gap_source`, and\n`befund_output_dir` for every phase below (defaults documented in\n`${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fokf-ledger-schema.md` apply when the\nsettings file is absent -- the script already applied them, just use the\nreturned values).\n\n## Phase 0: topology detection\n\nIf `gap_source` is `befund-brief` (ingest mode), **skip all heuristic\nsteps below** and check the prerequisite in code first:\n\n```\npython3 SCRIPTS check-ingest-prereqs \u003Crepo_root> \u003Cgap_source> \u003Cbefund_output_dir>\n```\n\nIf this exits non-zero, `MODERNIZATION_BRIEF.md` or `transform_brief_summary.json`\nis missing from `befund_output_dir`. **Stop** and tell the user to run\n`befund:befund-transform-brief` first -- never silently fall back to\nself-scan; that silent fallback is exactly the failure mode this check exists\nto prevent. If it succeeds, take the stream from the brief's phases (already\nleaf-first \u002F Kahn-sorted) with confidence `befund-backed`, and go straight\nto Phase 1 using those stages.\n\nOtherwise (`gap_source: self-scan`, the default), detect stages and wires:\n\n1. Prefer dispatching the `befund:stage-mapper` agent if the `befund`\n   plugin is installed. Confidence: `befund-backed`.\n2. If unavailable, degrade to a built-in heuristic: `Glob` for manifest files\n   (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, `Gemfile`, ...)\n   and cluster by directory. Confidence: `heuristic` (flag this in the stage\n   docs you write in Phase 1 -- the `confidence` field is a required,\n   first-class key on every stage doc, never a prose caveat).\n3. A repo with exactly one package is valid as a single stage with no\n   inter-stage wire. Confidence: `single-package`.\n4. If the user declared an explicit stream (stage list) in their request,\n   that overrides detection entirely.\n\n## Phase 1: ledger init or resume\n\n```\npython3 SCRIPTS init-or-resume \u003Crepo_root> \u003Cledger_dir>\n```\n\nIf `resumed: false`, this already created `ledger_dir\u002F{stages,gaps,evidence}`\nand an empty `log.md`. Immediately write one `type: stage` doc per detected\nstage using `write-doc` (below) -- `order` and `confidence` are required\nfields, not optional metadata.\n\nIf `resumed: true`, its JSON gives you `stages`, `gaps`, `evidence`, and a\nreconstructed `cursor` -- derived from the first `status:open` gap doc in\nstage order, or `{\"state\": \"converged, no open gaps\"}`. **Never guess the\ncursor yourself**; this script's reconstruction is the only source of truth\n(`ledger-cursor-reconstruction-from-gaps`).\n\nTo write any OKF doc (stage, gap, or evidence), always go through:\n\n```\npython3 SCRIPTS write-doc \u003Crepo_root> \u003Cledger_dir> \u003Crelative_path> '\u003Cfields_json>' [--body TEXT]\n```\n\n`\u003Crelative_path>` is relative to `\u003Cledger_dir>` itself, e.g. `stages\u002Fs1.md`,\n`gaps\u002Fg1.md`, `evidence\u002Fev1.md` -- the script joins it onto `ledger_dir`\nbefore validating, matching the on-disk layout\n`ledger_dir\u002F{stages,gaps,evidence}\u002F*.md`.\n\nThis validates write-scope (rejects traversal\u002Fabsolute\u002Foutside-ledger paths)\nand the OKF schema (rejects a doc missing a gating field) **before** touching\ndisk. If it exits non-zero, the doc was not written -- fix the fields, don't\nretry with a workaround.\n\n## Phase 2: scan the cursor's stage for gaps\n\nScan **only** the cursor's current stage -- never re-scan completed stages\nevery pass. In self-scan mode look for: failing tests, wires with no\nevidence doc or a red\u002Funknown one, TODOs, schema drift, dead handoffs. In\ningest mode, gaps come from the brief's Work Items for this phase instead\n(pre-classified: code-idiom\u002Flint\u002Fui-audit\u002Fzeugnis findings become `kind:bug`,\narchitectural Merge\u002FSplit\u002Flayering decisions become `kind:wire`,\ndocumented-absent behavior becomes `kind:feature`; carry `file:line` and the\nfix-owner agent name into the gap doc; the phase's Behavior Contract becomes\nthe wire's verification contract; Advisory notes go on the stage doc's body,\nnever converted into auto-fixable gaps).\n\nClassify each gap with exactly one `kind` (`bug`, `feature`, or `wire`) and\nwrite it with `status: open` via `write-doc`. `select-next-gap` enforces\npriority when more than one gap is found:\n\n```\npython3 SCRIPTS select-next-gap '\u003Cjson array of {kind, on_constraint, blast_radius, slug}>'\n```\n\nPriority is fixed in code: `on_constraint:true` first, then wire before bug\nbefore feature, then smallest blast radius as tiebreak. Do not eyeball a\n\"more important-looking\" gap instead.\n\n## Phase 3: propose\n\nDispatch the `andon-propose` skill with the selected gap, the stage doc, and\nany linked gap\u002Fevidence docs. It returns a proposal (fix description, files\ntouched, chosen `andon-verify` strategy + rationale, and **exactly one**\nblast-radius tag). Record the proposal onto the gap doc via `write-doc`\n(this re-validates the blast-radius tag as part of schema validation -- a\nproposal with zero, two, or an undefined tag is rejected, not coerced).\n\n**Stop condition 2 check**, before doing anything else with this proposal:\n\n```\npython3 SCRIPTS check-stop-conditions --verdict unknown \\\n  --blast-radius \u003Ctag> --authorization-level \u003Csettings.authorization_level>\n```\n\nIf this exits non-zero, the blast radius exceeds the configured\nauthorization level. Halt and ask the user to either explicitly confirm\nraising authorization (`--confirm-authorization-raise` on the recheck) or\nexplicitly skip this gap. Do not apply the fix in the meantime.\n\n## Phase 4: verify\n\nBefore dispatching, resolve or build the shared symbol-index snapshot. Read\n`analysis\u002Fandon\u002Fcurrent.json`; if missing or its `source_fingerprint` no\nlonger matches, run\n\n```\npython3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fbuild_symbol_index.py\" --repo-path . --plugin-name andon\n```\n\n(single-flight lock makes concurrent callers safe -- see\n`references\u002Fparallel-safe-research-protocol.md`). For a repo well under\n~50 tracked files the build overhead may not be worth it -- skip this and\ntell `andon-verify` no snapshot is available.\n\nDispatch the `andon-verify` skill with the wire, its contract, the proposed\nfix, and (when resolved) the snapshot path as additional evidence context.\nAlso pass the gap doc's recorded `verify_strategy` \u002F `verify_strategy_rationale`\n(from Phase 3) as read-only audit context only -- `andon-verify` still routes\nthe wire itself via its own classifier and must never skip or default to the\nproposed strategy. Record both strategies verbatim in the evidence doc (e.g.\n\"proposed strategy: X, actual routed strategy: Y\") so a mismatch is visible\nin the ledger. It returns a verdict (`green`\u002F`red`\u002F`unknown`) plus evidence\ncontent -- **you** persist it via `write-doc` into `evidence\u002F`, never\n`andon-verify` itself. Pass its `tier_ceiling` through unchanged: for\nstrategy `e`, `write-doc` refuses a doc without one or with a `tier`\nstronger than it.\n\nRun the full stop-condition check now that you have a real verdict and tier:\n\n```\npython3 SCRIPTS check-stop-conditions --verdict \u003Cverdict> \\\n  --blast-radius \u003Ctag> --authorization-level \u003Csettings.authorization_level> \\\n  [--tier \u003C1|2|3>] [--non-overridable]\n```\n\n- Non-zero + `condition_1_red_verdict`: halt. Do not advance past this wire.\n  It may only advance later on an explicit user re-run with new evidence, or\n  an explicit user override\u002Fdefer of the gap.\n- Non-zero + `condition_3_tier1_non_overridable`: halt, **permanently, for\n  this evidence**. There is no flag on this script that waives it, by\n  construction -- do not attempt to route around it by re-running with\n  different arguments or asking the adjudicator to reconsider.\n- Success: close the gap (`status: closed`, `resolved_by: [[evidence\u002F\u003Cslug>]]`)\n  via `write-doc`.\n\n**Sub-cycle backtracking**: if the fix touched a contract an upstream wire\ndepends on,\n\n```\npython3 SCRIPTS track-subcycle \u003Crepo_root> \u003Cledger_dir> \u003Cwire_id> \u003Crequested_upstream_depth>\n```\n\n`effective_upstream_depth` is clamped to at most 2 stages back, regardless of\nwhat you requested -- never re-verify further upstream than that. If\n`escalate: true` (this wire has now reopened 3+ times), **stop sub-cycling\nit**: record the escalation as the active constraint in `log.md` instead of\nlooping again. Every sub-cycle attempt gets its own `log.md` entry\n(`append-log ... sub-cycle ...`), win or lose.\n\n## Phase 5: advance cursor, log the pass\n\n```\npython3 SCRIPTS append-log \u003Crepo_root> \u003Cledger_dir> pass '\u003Cfields_json>'\n```\n\nRequired fields: `stage`, `wire`, `gap`, `strategy`, `verdict`, `next_cursor`,\n`cycle`, `pass_number`. This appends -- it never rewrites `log.md`; the hook\nin `hooks\u002F` will independently refuse a `Write` that would overwrite an\nexisting `log.md`, so there is no path to \"fixing\" a bad entry by rewriting\nthe file. Advance the cursor to the next stage; wrap to the first stage past\nthe last one.\n\n## Phase 6: convergence check\n\nAt each pass boundary (cursor wraps to the first stage), tally\n`gaps_closed_this_pass` from the `pass` log entries appended since the last\npass boundary, and build the wire-status array from each inter-stage wire's\nlatest evidence-doc verdict -- the same derivation `andon-status\u002FSKILL.md`\nalready documents (its stream-table step: \"each wire's status is derived\nfrom its latest evidence doc\"); do not re-derive that rule here, just apply\nit:\n\n```\npython3 SCRIPTS check-convergence \u003Cgaps_closed_this_pass> '\u003Cjson array of wire statuses>'\n```\n\nOnly when `converged: true` (zero gaps closed this pass AND every inter-stage\nwire is green) do you declare \"Cycle N converged\" and append a\n`cycle-converged` log entry (`passes`, `cycle` fields required). Otherwise,\nstart the next pass in the same cycle.\n\n## Reference\n\nSee `${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fokf-ledger-schema.md` for the doc schema\nand settings defaults, and `${CLAUDE_PLUGIN_ROOT}\u002Freferences\u002Fandon-rule.md`\nfor the three stop conditions in full. Do not duplicate that content here --\nread it when a decision needs it.\n",{"name":5,"description":7,"allowed-tools":24,"argument-hint":25},"Read, Write, Edit, Bash(python3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fandon_core.py\":*), Bash(python3 -B \"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fbuild_symbol_index.py\":*), Glob, Grep, Agent","[stage-or-gap-filter]","main","6158c1e4e112c06af2c7ac01b13b2ed7214c0fcf","plugins\u002Fandon\u002Fskills\u002Fandon-loop",0,"https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff","https:\u002F\u002Fanselmoo.github.io\u002Fwerkstoff\u002F","https:\u002F\u002Fgithub.com\u002FAnselmoo","Likes to Develop","2026-11-02 04:20:59",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add Anselmoo\u002Fwerkstoff --skill andon-loop",{"tool":41,"command":42},"bunx","bunx skills add Anselmoo\u002Fwerkstoff --skill andon-loop",{"tool":44,"command":45},"pnpm","pnpm dlx skills add Anselmoo\u002Fwerkstoff --skill andon-loop","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Fplugins\u002Fandon\u002Fskills\u002Fandon-loop\u002FSKILL.md",true,[],[50,57,64,69,74,79],{"skillNo":51,"name":52,"nameZh":6,"description":53,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":56,"publishedAt":19},"01M79AJTRBNBX03WWKYJ8ENM45","toy-check","A skill that checks things in the repository and reports what it finds.","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fworkflows\u002Ffixtures\u002Ftoy-plugin\u002Fskills\u002Ftoy-check\u002FSKILL.md",[],[],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":19},"01M79AJS292F3HTDRXWZVRSN5B","demo-check","Reports which generated files changed since the last generation run. Use when the user asks what drifted. Read-only; never edits a file.","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fplugins\u002Ffixtures\u002Fnacharbeit-uncompleted-run\u002Fplugins\u002Fdemo\u002Fskills\u002Fdemo-check\u002FSKILL.md",[],[],{"skillNo":65,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":19},"01M79AJP4TFQXKT1AAK1WC1JYK","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fplugins\u002Ffixtures\u002Fnacharbeit-stale-lock\u002Fplugins\u002Fdemo\u002Fskills\u002Fdemo-check\u002FSKILL.md",[],[],{"skillNo":70,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":19},"01M79AJM6Y50WP3G2BR4H0M60Z","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fplugins\u002Ffixtures\u002Fnacharbeit-preflight-mixed\u002Fplugins\u002Fdemo\u002Fskills\u002Fdemo-check\u002FSKILL.md",[],[],{"skillNo":75,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":19},"01M79AJGR6DMT8KCCK071V78XM","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Ftest\u002Fplugins\u002Ffixtures\u002Fnacharbeit-hooks-shape\u002Fplugins\u002Fdemo\u002Fskills\u002Fdemo-check\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":19},"01M79AJBJ4CHC4PZVWKERWF3HF","zirkel-verify-assumptions","Checks exactly ONE named assumption against real evidence in at most 3 steps and reports one outcome: confidence raised (>=90), reading changed, or still unresolved. Use to resolve a single load-bearing uncertainty — typically a blocking entry surfaced by zirkel-clarify-scope: \"verify this one assumption\", \"is it actually true that X\", \"check this before we rely on it\". For multiple uncertainties, invoke once per uncertainty — the step budget is never shared.","https:\u002F\u002Fgithub.com\u002FAnselmoo\u002Fwerkstoff\u002Fblob\u002Fmain\u002Fplugins\u002Fzirkel\u002Fskills\u002Fzirkel-verify-assumptions\u002FSKILL.md",[],[]]