[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71S3E067YRRFH7304VYYF32":3,"skill-same:01M71S3E067YRRFH7304VYYF32":70},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":6,"ownerHtmlUrl":52,"ownerBlogUrl":53,"ownerDescription":54,"updatedAt":55,"install":56,"resources":69},"01M71S3E067YRRFH7304VYYF32","vivi-loop-native",null,"Load in Vivi's V (Verify) phase. The core capability that distinguishes Vivi from its predecessor APIVR-Δ: drive the closed, autonomous, bounded edit-run-test loop (`eidolons sandbox loop`) as its `--fix-hook`, consuming localized feedback, retrying in fresh context, refusing to game the tests, and gating on pass^k. Use whenever the task has an executable test oracle and a loop-competent host.","Rynaro\u002Fprisma","Rynaro","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5271543?v=4","01M70CFYFMB316W23THVQAQ42M","Henrique A. Lavezzo","01M71RXA8ZHEPZR3GERY09ERGD",1,"MIT","https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma\u002Fblob\u002Fmain\u002F.eidolons\u002Fvivi\u002Fskills\u002Floop-native\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"vivi loop native","loop","native","task","phase","gating","load","host","fresh","as","tests","oracle","use","fix","autonomous","feedback","game","core","test","sandbox","2026-11-10 13:02:02",false,"---\nname: vivi-loop-native\ndescription: \"Load in Vivi's V (Verify) phase. The core capability that distinguishes Vivi from its predecessor APIVR-Δ: drive the closed, autonomous, bounded edit-run-test loop (`eidolons sandbox loop`) as its `--fix-hook`, consuming localized feedback, retrying in fresh context, refusing to game the tests, and gating on pass^k. Use whenever the task has an executable test oracle and a loop-competent host.\"\nmetadata:\n  methodology: Vivi\n  phase: V-Verify\n---\n\n# Loop-Native Verify Skill\n\nThe closed execution-feedback loop is the most-replicated performance lever for code agents (RLEF; S\\*; SE-agent survey) — but only when it is **external-feedback-driven** (intrinsic self-correction degrades — Kamoi TACL'24, Huang ICLR'24) and **localized** (a model fixes an error when told *where* it is — Tyen et al.). APIVR-Δ deliberately left this loop \"out of scope (nexus gap R1)\"; **Vivi makes it the core of the V phase.** The nexus ships the substrate (`eidolons sandbox loop`) and the contract (`roster\u002Faci.yaml` `loop_contract`); Vivi is the loop-native coder that drives it.\n\n> **Host-contingency (read first).** The loop's gain belongs to an **RL-trained \u002F loop-competent host** (on a prompt-only host the inference-time loop is neutral-to-negative — RLEF Table 2). Vivi *exploits* a capable host's loop competence; it does not manufacture it. If the host is loop-incompetent, or no adequate isolation is available, **degrade gracefully**: fall back to APIVR-Δ's emit-then-hand-back posture (or recommend `eidolons add apivr`).\n\n---\n\n## 1 — The loop is the V phase\n\nAfter the P-phase test-anchors exist and the I-phase produced an initial edit, the V phase **delegates running to the substrate** and Vivi acts as the edit step:\n\nVivi picks the **loop shape by host tier** (Stage 2 — host-adaptive):\n\n**ITERATE** (thinking \u002F loop-competent host):\n```\neidolons sandbox loop \\\n  --via \"\u003Cisolation>\"                     # microVM\u002Fcontainer — REQUIRED for untrusted code (R8-03)\n  --tests \"\u003Cthe test command>\"            # or --regression \u003Ccmd> --reproduction \u003Ccmd>\n  --protect \"\u003Cglob of the anchoring tests>\"   # anti-reward-hacking\n  --require-red                           # red gate: the repro anchor must FAIL on base first\n  --k 2                                   # pass^k: a flaky green is BLOCKED\n  --max-attempts 3                        # reconciled with the ≤3-same-category budget\n  --judge-hook \"\u003Cexternal diff judge>\"    # layered hack detection (when available)\n  --fix-hook \"\u003Cinvoke Vivi's repair step>\"    # THIS skill, per iteration\n```\n\n**FANOUT** (standard \u002F weak host — parallel-sample-and-select):\n```\neidolons sandbox loop \\\n  --via \"\u003Cisolation>\" --tests \"...\" --protect \"...\" --require-red --k 2 \\\n  --fanout 3 --max-attempts 1 \\\n  --judge-hook \"\u003Cexternal diff judge>\" \\\n  --fix-hook \"\u003Cinvoke Vivi's candidate step>\"   # THIS skill, once per candidate\n```\n\nOn a weak host, self-repair iteration is the WRONG shape — feeding failures back\ninjects new errors (RLEF; self-repair degrades below ~strong-tier). Fanout\nreplaces the retry chain with N **independent fresh-context candidates** from\nthe same base tree + the same localized base-failure feedback; the SUBSTRATE\nselects the survivor externally (tests + pass^k + sealed holdout + judge). The\nmodel never judges its own retry.\n\n> **Declared, not just prose (`roster\u002Frouting.yaml` 1.1).** The above host-tier\n> branch is no longer methodology guidance alone — the nexus roster encodes it\n> as DATA. `roster\u002Frouting.yaml` declares `vivi.degraded_mode: fanout`: FANOUT\n> is the declared default loop shape on a weak or undeclared host tier. It also\n> declares `vivi.fallback: apivr`: the kernel's **S1.7 host-tier gate**\n> (`cli\u002Fsrc\u002Frun.sh`) routes to APIVR-Δ as the *declared* conservative peer\n> (`fallthrough_reason: \"declared-fallback\"`) when the gate trips, rather than\n> a generic next-ranked pick. This skill's ITERATE\u002FFANOUT split is Vivi's\n> in-loop implementation of the same shape the kernel already dispatches on.\n\nThe substrate owns the bounded control flow, isolation, diff-not-apply, and the VIGIL escalation; **Vivi owns the reasoning inside `--fix-hook`.** The nexus never edits or merges.\n\n## 2 — Each `--fix-hook` invocation: fresh context, localized feedback\n\nThe loop invokes the fix-hook once per failing iteration. Vivi's invocation MUST be:\n\n- **Fresh-context by default — enforced by `EIDOLONS_SANDBOX_FRESH_CONTEXT`.**\n  Read the env var at the START of every fix-hook invocation:\n\n  ```\n  if [ \"${EIDOLONS_SANDBOX_FRESH_CONTEXT:-}\" = \"true\" ]; then\n    # DECLINE to inject the prior attempt's error transcript or reasoning.\n    # Seed the retry with ONLY:\n    #   1. $EIDOLONS_SANDBOX_FEEDBACK  (the localized substrate signal)\n    #   2. The task\u002Facceptance spec (the original requirements)\n    #   3. The current working tree state (read as needed, via atlas-aci view_file)\n    # Do NOT load: prior attempt diffs, prior hypothesis text, prior error reasoning.\n  fi\n  ```\n\n  **Anti self-conditioning discipline.** The substrate already exports ONLY the\n  localized feedback vars (no prior-reasoning transcript is ever exported). The\n  `EIDOLONS_SANDBOX_FRESH_CONTEXT=true` flag makes this discipline EXPLICIT and\n  ENFORCEABLE: when it is set, the fix-hook MUST decline to inject any prior-attempt\n  reasoning it may have available in its own context. The purpose is to break the\n  accumulating self-correction cycle that the science shows degrades performance\n  (Kamoi TACL'24, Huang ICLR'24). Treat this as a hard rule, not a preference.\n\n  **Default path: FRESH CONTEXT.** Even when `EIDOLONS_SANDBOX_FRESH_CONTEXT` is\n  unset or empty, apply the fresh-context discipline. The flag is a substrate signal;\n  the withholding discipline is Vivi's methodology. Absence of the flag does NOT mean\n  \"load all prior transcripts.\"\n\n- **Localized.** Read the structured feedback the substrate exports:\n\n  ```\n  $EIDOLONS_SANDBOX_FEEDBACK      # JSON: {failing, loci:[file:line...], test_name:[...],\n                                  #        assertion:[...], full_log, output_tail, phase, attempt}\n  $EIDOLONS_SANDBOX_FULL_LOG      # the COMPLETE captured output (never just a tail)\n  $EIDOLONS_SANDBOX_LAST_OUTPUT   # the most recent command output\n  $EIDOLONS_SANDBOX_ATTEMPT       # current attempt number (1-indexed)\n  $EIDOLONS_SANDBOX_BASE          # base directory of the sandbox\n  ```\n\n  Target the reported `loci` (exact failing assertion \u002F file:line frame). Load\n  `skills\u002Fcontext-engineering\u002FSKILL.md` for the atlas-aci-driven in-loop loci assembly\n  procedure — do NOT re-read whole files.\n\n- **Per-iteration crystalium recall (before the edit — S1.9).**\n  After reading feedback and BEFORE making any code edit, perform the hard-precision-gated\n  failure-signature recall from `skills\u002Fmemory-management\u002FSKILL.md §Per-Iteration Failure-Signature\n  Recall`. Procedural\u002Fsemantic hits short-circuit re-derivation. Ignore low-confidence hits.\n  Never let a memory miss block the edit step.\n\n- **EVIDENCE GATE (mandatory — backported from the APIVR-Δ spine).** If\n  `$EIDOLONS_SANDBOX_FEEDBACK` is missing, empty, or unparseable, do **NOT**\n  guess a fix from memory of the task. A repair without concrete failure\n  evidence is speculation — read `$EIDOLONS_SANDBOX_FULL_LOG` directly; if that\n  too is absent, make NO edit and exit non-zero so the loop records a failed\n  attempt and escalates on cap. Never hallucinate a failure to fix.\n\n- **Fanout candidate discipline (`EIDOLONS_SANDBOX_CANDIDATE` set).** You are\n  ONE independent candidate, not a retry chain: produce one coherent, COMPLETE\n  fix in a single shot — there is no second pass to finish a half-edit.\n  **Diversify by candidate index:** candidate 1 implements the P-phase\n  top-ranked strategy; candidate 2 the runner-up; candidate 3+ the next ranked\n  (or a materially different decomposition). N samples of the SAME strategy\n  waste the fanout; the selection gate can only pick a survivor that exists.\n\n## 3 — Anti-reward-hacking obligations (the loop AMPLIFIES gaming)\n\nA closed loop with a pass\u002Ffail oracle is precisely what incentivizes evaluator-gaming (a structural equilibrium, not a correctable bug). Vivi's inherited anti-overfit spine is the guardrail; in the loop it is **mechanically enforced** by the substrate, and Vivi must never attempt to circumvent it:\n\n- **Never edit the anchoring tests.** They are passed to `--protect`; a mutation aborts the loop and escalates to VIGIL. Fix the *implementation*, not the oracle.\n- **Regression-first, then reproduction.** Success requires the pre-existing suite to pass **and** the newly-anchored acceptance test. Passing only the new test FAILS.\n- **No always-pass shims, no peeking** at future commits \u002F gold patches.\n- **Red gate (`--require-red`).** A reproduction anchor that passes on the base\n  tree is VACUOUS — the substrate blocks the run (`final=vacuous-reproduction`).\n  Return to P and re-derive the anchor; never weaken a repro test to \"make the\n  gate happy\".\n- **Judge gate (`--judge-hook`).** A candidate that survives visible tests +\n  pass^k + holdout may still be a heuristic non-fix; an external diff-review\n  judge can reject it (`judge-rejected`). The judge's verdict is final for that\n  candidate — do not argue with it, produce a better fix.\n\n## 4 — pass^k before accepting\n\nA single green run is necessary but not sufficient. With `--k > 1`, a candidate must pass `k` re-runs; a non-deterministic pass is **flaky → BLOCKED**, not merged. Treat a flaky green as a failed attempt (route to R — Reflect), never as success.\n\n**Vivi's default: `--k 2`.** The fix-hook invocation (§1) always passes `--k 2`. This is a methodology default (not the substrate's default of k=1) — Vivi owns it explicitly. A single green run is not enough to trust a loop-derived fix.\n\n## 5 — Escalation (bounded; reconciled)\n\nVivi's methodology owns the **≤3-same-category** retry budget (the authority); the substrate's `--max-attempts` is the ceiling. Whichever trips first ends the loop and emits the existing ECL `repair-failed-report` to **VIGIL** (no new performative; the closed 10-set is preserved). Provide the localized feedback + the candidate diff in the hand-off. **Oscillation flag (backported from the APIVR-Δ spine):** if the attempts alternated between two states (fix A breaks test B, fix B breaks test A — same loci flip-flopping across feedback), set `loop_detected: true` in the report payload so VIGIL starts from the oscillation, not from the last symptom. ISE sidecar: `ise.assertion_grade=\"self-attested\"` (ECL v2.0 §6.5.2) — the escalation is Vivi's own bounded-failure judgement, not an externally-gated pass.\n\n## 6 — Output\n\nOn success: the loop emits a **candidate diff** for review — Vivi does **not** apply or merge it (diff-not-apply; the human apply-gate is aligned with governed-autonomy). Emit the `vivi-completion-report` ECL envelope to IDG. On cap-out: the VIGIL hand-off above.\n\n**ISE grade on the completion envelope (ECL v2.0 §6.5.2).** `vivi-completion-report` sets `ise.assertion_grade=\"validated\"` — this is the ONLY one of Vivi's three envelope kinds that earns it, because it is the only one gated by pass^k (§4): the loop only reaches this exit after the candidate passed the substrate's spec-mandated regression-first-then-reproduction verification `k` times over, external to Vivi's own say-so. That is precisely what `validated` requires (\"emitter ran spec-mandated gates\") — it is not a self-report. `reasoning-request` and `repair-failed-report` are `self-attested`: neither exits through the pass^k gate (one precedes verification, the other is the verification failing out). All three set `ise.receiver_authorization = {auto_route: true, auto_merge: false, auto_deploy: false}` — diff-not-apply means Vivi never authorizes a receiver to merge or deploy on its behalf.\n\n**Mandatory post-pass^k commit (S1.9).** Immediately after `final=\"passed\"` (pass^k-green confirmed), Vivi MUST call `mcp__crystalium__commit(layer=procedural, ...)` as specified in `skills\u002Fmemory-management\u002FSKILL.md §Mandatory Post-pass^k Commit`. This is NOT discretionary — it is a methodology obligation on every successful loop exit. The verified fix-pattern (diff + anchoring tests + failure_signature) is the most reliable learning signal available; committing it makes it available for future Vivi sessions and for VIGIL cross-Eidolon pattern reuse. **ADAPTER-NOT-ENGINE: the CODER (Vivi) issues this call; sandbox.sh never does.**\n\n---\n\n*Loop-Native Skill — external-feedback-driven, localized, EIDOLONS_SANDBOX_FRESH_CONTEXT-gated (prior-transcript DECLINED), hard-precision-gated crystalium recall, mandatory post-pass^k procedural commit, anti-gaming, pass^k-gated. The capability APIVR-Δ refused; the reason Vivi exists.*\n","# Loop-Native Verify Skill\n\nThe closed execution-feedback loop is the most-replicated performance lever for code agents (RLEF; S\\*; SE-agent survey) — but only when it is **external-feedback-driven** (intrinsic self-correction degrades — Kamoi TACL'24, Huang ICLR'24) and **localized** (a model fixes an error when told *where* it is — Tyen et al.). APIVR-Δ deliberately left this loop \"out of scope (nexus gap R1)\"; **Vivi makes it the core of the V phase.** The nexus ships the substrate (`eidolons sandbox loop`) and the contract (`roster\u002Faci.yaml` `loop_contract`); Vivi is the loop-native coder that drives it.\n\n> **Host-contingency (read first).** The loop's gain belongs to an **RL-trained \u002F loop-competent host** (on a prompt-only host the inference-time loop is neutral-to-negative — RLEF Table 2). Vivi *exploits* a capable host's loop competence; it does not manufacture it. If the host is loop-incompetent, or no adequate isolation is available, **degrade gracefully**: fall back to APIVR-Δ's emit-then-hand-back posture (or recommend `eidolons add apivr`).\n\n---\n\n## 1 — The loop is the V phase\n\nAfter the P-phase test-anchors exist and the I-phase produced an initial edit, the V phase **delegates running to the substrate** and Vivi acts as the edit step:\n\nVivi picks the **loop shape by host tier** (Stage 2 — host-adaptive):\n\n**ITERATE** (thinking \u002F loop-competent host):\n```\neidolons sandbox loop \\\n  --via \"\u003Cisolation>\"                     # microVM\u002Fcontainer — REQUIRED for untrusted code (R8-03)\n  --tests \"\u003Cthe test command>\"            # or --regression \u003Ccmd> --reproduction \u003Ccmd>\n  --protect \"\u003Cglob of the anchoring tests>\"   # anti-reward-hacking\n  --require-red                           # red gate: the repro anchor must FAIL on base first\n  --k 2                                   # pass^k: a flaky green is BLOCKED\n  --max-attempts 3                        # reconciled with the ≤3-same-category budget\n  --judge-hook \"\u003Cexternal diff judge>\"    # layered hack detection (when available)\n  --fix-hook \"\u003Cinvoke Vivi's repair step>\"    # THIS skill, per iteration\n```\n\n**FANOUT** (standard \u002F weak host — parallel-sample-and-select):\n```\neidolons sandbox loop \\\n  --via \"\u003Cisolation>\" --tests \"...\" --protect \"...\" --require-red --k 2 \\\n  --fanout 3 --max-attempts 1 \\\n  --judge-hook \"\u003Cexternal diff judge>\" \\\n  --fix-hook \"\u003Cinvoke Vivi's candidate step>\"   # THIS skill, once per candidate\n```\n\nOn a weak host, self-repair iteration is the WRONG shape — feeding failures back\ninjects new errors (RLEF; self-repair degrades below ~strong-tier). Fanout\nreplaces the retry chain with N **independent fresh-context candidates** from\nthe same base tree + the same localized base-failure feedback; the SUBSTRATE\nselects the survivor externally (tests + pass^k + sealed holdout + judge). The\nmodel never judges its own retry.\n\n> **Declared, not just prose (`roster\u002Frouting.yaml` 1.1).** The above host-tier\n> branch is no longer methodology guidance alone — the nexus roster encodes it\n> as DATA. `roster\u002Frouting.yaml` declares `vivi.degraded_mode: fanout`: FANOUT\n> is the declared default loop shape on a weak or undeclared host tier. It also\n> declares `vivi.fallback: apivr`: the kernel's **S1.7 host-tier gate**\n> (`cli\u002Fsrc\u002Frun.sh`) routes to APIVR-Δ as the *declared* conservative peer\n> (`fallthrough_reason: \"declared-fallback\"`) when the gate trips, rather than\n> a generic next-ranked pick. This skill's ITERATE\u002FFANOUT split is Vivi's\n> in-loop implementation of the same shape the kernel already dispatches on.\n\nThe substrate owns the bounded control flow, isolation, diff-not-apply, and the VIGIL escalation; **Vivi owns the reasoning inside `--fix-hook`.** The nexus never edits or merges.\n\n## 2 — Each `--fix-hook` invocation: fresh context, localized feedback\n\nThe loop invokes the fix-hook once per failing iteration. Vivi's invocation MUST be:\n\n- **Fresh-context by default — enforced by `EIDOLONS_SANDBOX_FRESH_CONTEXT`.**\n  Read the env var at the START of every fix-hook invocation:\n\n  ```\n  if [ \"${EIDOLONS_SANDBOX_FRESH_CONTEXT:-}\" = \"true\" ]; then\n    # DECLINE to inject the prior attempt's error transcript or reasoning.\n    # Seed the retry with ONLY:\n    #   1. $EIDOLONS_SANDBOX_FEEDBACK  (the localized substrate signal)\n    #   2. The task\u002Facceptance spec (the original requirements)\n    #   3. The current working tree state (read as needed, via atlas-aci view_file)\n    # Do NOT load: prior attempt diffs, prior hypothesis text, prior error reasoning.\n  fi\n  ```\n\n  **Anti self-conditioning discipline.** The substrate already exports ONLY the\n  localized feedback vars (no prior-reasoning transcript is ever exported). The\n  `EIDOLONS_SANDBOX_FRESH_CONTEXT=true` flag makes this discipline EXPLICIT and\n  ENFORCEABLE: when it is set, the fix-hook MUST decline to inject any prior-attempt\n  reasoning it may have available in its own context. The purpose is to break the\n  accumulating self-correction cycle that the science shows degrades performance\n  (Kamoi TACL'24, Huang ICLR'24). Treat this as a hard rule, not a preference.\n\n  **Default path: FRESH CONTEXT.** Even when `EIDOLONS_SANDBOX_FRESH_CONTEXT` is\n  unset or empty, apply the fresh-context discipline. The flag is a substrate signal;\n  the withholding discipline is Vivi's methodology. Absence of the flag does NOT mean\n  \"load all prior transcripts.\"\n\n- **Localized.** Read the structured feedback the substrate exports:\n\n  ```\n  $EIDOLONS_SANDBOX_FEEDBACK      # JSON: {failing, loci:[file:line...], test_name:[...],\n                                  #        assertion:[...], full_log, output_tail, phase, attempt}\n  $EIDOLONS_SANDBOX_FULL_LOG      # the COMPLETE captured output (never just a tail)\n  $EIDOLONS_SANDBOX_LAST_OUTPUT   # the most recent command output\n  $EIDOLONS_SANDBOX_ATTEMPT       # current attempt number (1-indexed)\n  $EIDOLONS_SANDBOX_BASE          # base directory of the sandbox\n  ```\n\n  Target the reported `loci` (exact failing assertion \u002F file:line frame). Load\n  `skills\u002Fcontext-engineering\u002FSKILL.md` for the atlas-aci-driven in-loop loci assembly\n  procedure — do NOT re-read whole files.\n\n- **Per-iteration crystalium recall (before the edit — S1.9).**\n  After reading feedback and BEFORE making any code edit, perform the hard-precision-gated\n  failure-signature recall from `skills\u002Fmemory-management\u002FSKILL.md §Per-Iteration Failure-Signature\n  Recall`. Procedural\u002Fsemantic hits short-circuit re-derivation. Ignore low-confidence hits.\n  Never let a memory miss block the edit step.\n\n- **EVIDENCE GATE (mandatory — backported from the APIVR-Δ spine).** If\n  `$EIDOLONS_SANDBOX_FEEDBACK` is missing, empty, or unparseable, do **NOT**\n  guess a fix from memory of the task. A repair without concrete failure\n  evidence is speculation — read `$EIDOLONS_SANDBOX_FULL_LOG` directly; if that\n  too is absent, make NO edit and exit non-zero so the loop records a failed\n  attempt and escalates on cap. Never hallucinate a failure to fix.\n\n- **Fanout candidate discipline (`EIDOLONS_SANDBOX_CANDIDATE` set).** You are\n  ONE independent candidate, not a retry chain: produce one coherent, COMPLETE\n  fix in a single shot — there is no second pass to finish a half-edit.\n  **Diversify by candidate index:** candidate 1 implements the P-phase\n  top-ranked strategy; candidate 2 the runner-up; candidate 3+ the next ranked\n  (or a materially different decomposition). N samples of the SAME strategy\n  waste the fanout; the selection gate can only pick a survivor that exists.\n\n## 3 — Anti-reward-hacking obligations (the loop AMPLIFIES gaming)\n\nA closed loop with a pass\u002Ffail oracle is precisely what incentivizes evaluator-gaming (a structural equilibrium, not a correctable bug). Vivi's inherited anti-overfit spine is the guardrail; in the loop it is **mechanically enforced** by the substrate, and Vivi must never attempt to circumvent it:\n\n- **Never edit the anchoring tests.** They are passed to `--protect`; a mutation aborts the loop and escalates to VIGIL. Fix the *implementation*, not the oracle.\n- **Regression-first, then reproduction.** Success requires the pre-existing suite to pass **and** the newly-anchored acceptance test. Passing only the new test FAILS.\n- **No always-pass shims, no peeking** at future commits \u002F gold patches.\n- **Red gate (`--require-red`).** A reproduction anchor that passes on the base\n  tree is VACUOUS — the substrate blocks the run (`final=vacuous-reproduction`).\n  Return to P and re-derive the anchor; never weaken a repro test to \"make the\n  gate happy\".\n- **Judge gate (`--judge-hook`).** A candidate that survives visible tests +\n  pass^k + holdout may still be a heuristic non-fix; an external diff-review\n  judge can reject it (`judge-rejected`). The judge's verdict is final for that\n  candidate — do not argue with it, produce a better fix.\n\n## 4 — pass^k before accepting\n\nA single green run is necessary but not sufficient. With `--k > 1`, a candidate must pass `k` re-runs; a non-deterministic pass is **flaky → BLOCKED**, not merged. Treat a flaky green as a failed attempt (route to R — Reflect), never as success.\n\n**Vivi's default: `--k 2`.** The fix-hook invocation (§1) always passes `--k 2`. This is a methodology default (not the substrate's default of k=1) — Vivi owns it explicitly. A single green run is not enough to trust a loop-derived fix.\n\n## 5 — Escalation (bounded; reconciled)\n\nVivi's methodology owns the **≤3-same-category** retry budget (the authority); the substrate's `--max-attempts` is the ceiling. Whichever trips first ends the loop and emits the existing ECL `repair-failed-report` to **VIGIL** (no new performative; the closed 10-set is preserved). Provide the localized feedback + the candidate diff in the hand-off. **Oscillation flag (backported from the APIVR-Δ spine):** if the attempts alternated between two states (fix A breaks test B, fix B breaks test A — same loci flip-flopping across feedback), set `loop_detected: true` in the report payload so VIGIL starts from the oscillation, not from the last symptom. ISE sidecar: `ise.assertion_grade=\"self-attested\"` (ECL v2.0 §6.5.2) — the escalation is Vivi's own bounded-failure judgement, not an externally-gated pass.\n\n## 6 — Output\n\nOn success: the loop emits a **candidate diff** for review — Vivi does **not** apply or merge it (diff-not-apply; the human apply-gate is aligned with governed-autonomy). Emit the `vivi-completion-report` ECL envelope to IDG. On cap-out: the VIGIL hand-off above.\n\n**ISE grade on the completion envelope (ECL v2.0 §6.5.2).** `vivi-completion-report` sets `ise.assertion_grade=\"validated\"` — this is the ONLY one of Vivi's three envelope kinds that earns it, because it is the only one gated by pass^k (§4): the loop only reaches this exit after the candidate passed the substrate's spec-mandated regression-first-then-reproduction verification `k` times over, external to Vivi's own say-so. That is precisely what `validated` requires (\"emitter ran spec-mandated gates\") — it is not a self-report. `reasoning-request` and `repair-failed-report` are `self-attested`: neither exits through the pass^k gate (one precedes verification, the other is the verification failing out). All three set `ise.receiver_authorization = {auto_route: true, auto_merge: false, auto_deploy: false}` — diff-not-apply means Vivi never authorizes a receiver to merge or deploy on its behalf.\n\n**Mandatory post-pass^k commit (S1.9).** Immediately after `final=\"passed\"` (pass^k-green confirmed), Vivi MUST call `mcp__crystalium__commit(layer=procedural, ...)` as specified in `skills\u002Fmemory-management\u002FSKILL.md §Mandatory Post-pass^k Commit`. This is NOT discretionary — it is a methodology obligation on every successful loop exit. The verified fix-pattern (diff + anchoring tests + failure_signature) is the most reliable learning signal available; committing it makes it available for future Vivi sessions and for VIGIL cross-Eidolon pattern reuse. **ADAPTER-NOT-ENGINE: the CODER (Vivi) issues this call; sandbox.sh never does.**\n\n---\n\n*Loop-Native Skill — external-feedback-driven, localized, EIDOLONS_SANDBOX_FRESH_CONTEXT-gated (prior-transcript DECLINED), hard-precision-gated crystalium recall, mandatory post-pass^k procedural commit, anti-gaming, pass^k-gated. The capability APIVR-Δ refused; the reason Vivi exists.*\n",{"name":5,"metadata":44,"description":7},{"phase":45,"methodology":46},"V-Verify","Vivi","main","42ce382409178ece647a93f841a86119e8d74a65",".eidolons\u002Fvivi\u002Fskills\u002Floop-native",0,"https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma","https:\u002F\u002Fgithub.com\u002FRynaro","https:\u002F\u002Fhlavezzo.me","A Code Alchemist with a passion for weaving tales and inscribing transmutation circles in pure code.","2026-10-18 20:39:25",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add Rynaro\u002Fprisma --skill vivi-loop-native",{"tool":62,"command":63},"bunx","bunx skills add Rynaro\u002Fprisma --skill vivi-loop-native",{"tool":65,"command":66},"pnpm","pnpm dlx skills add Rynaro\u002Fprisma --skill vivi-loop-native","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma\u002Fblob\u002Fmain\u002F.eidolons\u002Fvivi\u002Fskills\u002Floop-native\u002FSKILL.md",true,[],[71,97,124,148,178,198],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":39},"01M71S3X05FSJA01D22MH39Y0W","vivi-verify-incoming","Load when reading any upstream artefact handed off to Vivi that carries a sibling .envelope.json. BLOCKING per ECL §6.2.2: the orchestrator MUST have verified the envelope's SHA-256 (eidolons verify-envelope --block \u002F eidolons run --verify) and recorded a verify_pass before dispatch. If no verify_pass exists for the message_id, or a verify_fail is present, REFUSE to process the payload and hand back to the orchestrator. Symmetric receiver gate — every Eidolon enforces it identically.","https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma\u002Fblob\u002Fmain\u002F.eidolons\u002Fvivi\u002Fskills\u002Fverify-incoming\u002FSKILL.md",[],[78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,25,95,96],"verify","vivi verify incoming","verify incoming","run","sha-256","json","orchestrator","process","dispatch","back","message","upstream","id","receiver","block","ecl","hand","for","when",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":108,"publishedAt":39},"01M71S3S2E46S6AZEV07AJ75TK","vivi-parallel-tracks","Load ONLY under TRANCE authorization when the Plan phase yields N independent, non-overlapping implementation tracks (disjoint file sets). Operationalizes the TRANCE G4 form — parallel multi-track implementation in mandatory git-worktree isolation, max 5 clean-context tracks, a per-track verifier cascade, a non-fungible per-track ≤3 reflection budget, explicit stop conditions, and a single-threaded merge\u002Faggregation step. Absent TRANCE gating, Vivi runs exactly as today: single-track A→P→I→V→Δ\u002FR.","https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma\u002Fblob\u002Fmain\u002F.eidolons\u002Fvivi\u002Fskills\u002Fparallel-tracks\u002FSKILL.md",[103],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000040","财务","PROFESSION","适用职业",[109,110,111,112,113,114,115,116,117,28,118,119,120,25,121,122,24,123,23,96],"parallel","tracks","parallel tracks","vivi parallel tracks","file","only","reflection","clean","plan phase","verifier","form","multi","worktree isolation","track","single",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":39},"01M71S3N09VY1H2QHXXP4SKY2X","vivi-methodology","Full Vivi cycle reference — A(nalyze) → P(lan) → I(mplement) → V(erify) → Δ(Delta)\u002FR(eflect). Use when the task is a non-trivial feature implementation in a brownfield codebase and you need the complete methodology reference: complexity routing, evidence-grounded planning rules, test-anchoring requirements, and failure-escalation thresholds.","https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma\u002Fblob\u002Fmain\u002F.eidolons\u002Fvivi\u002Fskills\u002Fmethodology\u002FSKILL.md",[],[131,132,133,134,135,31,136,137,138,22,139,140,141,142,143,144,145,146,147,96],"methodology","vivi methodology","planning","escalation","Rules","evidence","complexity","delta","cycle","feature implementation","brownfield","full","requirements","feature","complete","thresholds","you",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":159,"publishedAt":39},"01M71S3GT0M84EHZ2SJZKV61N9","vivi-memory-management","Load at Vivi session start, session end, or when you notice a repeating pattern across tasks. CRYSTALIUM-primary memory protocol: when mcp__crystalium__* tools are available, route ALL memory through CRYSTALIUM (recall\u002Fcommit\u002Fingest\u002Fplan_checkpoint\u002Fsession_end). The local agents\u002Fmemories\u002F*.md files are the standalone fallback for when CRYSTALIUM is absent — EIIS conformance. Never write both.","https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma\u002Fblob\u002Fmain\u002F.eidolons\u002Fvivi\u002Fskills\u002Fmemory-management\u002FSKILL.md",[154],{"categoryNo":155,"categoryName":156,"taxonomyType":157,"taxonomyTypeDesc":158},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,147,176,177,96],"memory","management","memory management","vivi memory management","MCP","commit","tasks","plan","write","never","files","route","across","local","end","session start","standalone","at",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":184,"publishedAt":39},"01M71S3AEKYH0JD0CFJ4GHA98E","vivi-failure-recovery","Load when the Vivi Verify phase produces failures — test fails, lint error, build break, or three consecutive unsuccessful attempts at the same category. Provides the failure classification taxonomy, bounded debugging protocol, and escalation thresholds. Use to avoid the 'random retries' anti-pattern.","https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma\u002Fblob\u002Fmain\u002F.eidolons\u002Fvivi\u002Fskills\u002Ffailure-recovery\u002FSKILL.md",[],[185,186,187,134,188,189,31,190,191,146,192,193,194,25,177,195,196,23,96,197],"recovery","vivi failure recovery","debugging","classification","taxonomy","three","pattern","error","retries","random","break","bounded","same",{"skillNo":199,"name":200,"nameZh":6,"description":201,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":202,"categories":203,"keywords":205,"publishedAt":39},"01M71S387B7BTVXATQBANHR6R1","vivi-esl-hop","ESL lifecycle hop — when the cortex routes a non-trivial change to Vivi in an ESL-enabled project (tonberry MCP available), Vivi owns the in_progress (implement) hop as the MAKER: declare has_code, run the loop-native A→P→I→V→Δ\u002FR cycle in an isolated worktree, hand off to the CHECKER (never self-verify). Absent tonberry → implement normally (ESL opt-in).","https:\u002F\u002Fgithub.com\u002FRynaro\u002Fprisma\u002Fblob\u002Fmain\u002F.eidolons\u002Fvivi\u002Fskills\u002Fesl-hop\u002FSKILL.md",[204],{"categoryNo":155,"categoryName":156,"taxonomyType":157,"taxonomyTypeDesc":158},[206,207,208,164,209,210,211,212,20,169,139,213,214,215,28,94,216,96,217,218],"hop","esl","vivi esl hop","implement","code","lifecycle","cortex","self","maker","project","checker","opt","owns"]