[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C44STY0AEYA6229QYWYMCM":3,"skill-same:01M6C44STY0AEYA6229QYWYMCM":66},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":6,"ownerHtmlUrl":36,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":37,"install":38,"resources":51},"01M6C44STY0AEYA6229QYWYMCM","frame-spine-lookup",null,"Frame spine lookup methodology for mid-turn slice retrieval by spine-aware specialists. Use when a dispatched specialist needs to fetch an addressable plan slice from the durable plan-issue comment. DO NOT USE FOR: authoring plan spines, emitting frame credits, frame-port adapter declarations, or custom transport implementation.","Grimblaz\u002Fagent-orchestra","Grimblaz","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F74755849?v=4","01M6C430M9XZDHGHPWQVTQ3KMA","01M6C430RJY3MMX0QAZ3X8DR3Y",3,"MIT","https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fframe-spine-lookup\u002FSKILL.md",[],[18,19,20,21,22,23,24,25],"lookup","frame spine lookup","methodology","plan","fetch","use","issue comment","credits","2026-11-10 10:12:30",false,"---\nname: frame-spine-lookup\ndescription: \"Frame spine lookup methodology for mid-turn slice retrieval by spine-aware specialists. Use when a dispatched specialist needs to fetch an addressable plan slice from the durable plan-issue comment. DO NOT USE FOR: authoring plan spines, emitting frame credits, frame-port adapter declarations, or custom transport implementation.\"\n---\n\n\u003C!-- platform-assumptions: markdown skill guidance for Claude Code specialist shells with Read and Bash access in Agent Orchestra. -->\n\u003C!-- markdownlint-disable-file MD041 MD003 -->\n\n# Frame Spine Lookup\n\nMethodology for retrieving addressable frame-spine slices during a specialist\nturn without loading the full implementation plan.\n\n## When to Use\n\n- When Code-Conductor dispatches a specialist with a frame spine, an active\n  slice, and the durable plan comment id.\n- When a specialist needs a depth-1 dependency slice or another explicitly\n  addressable slice during the same turn.\n- When the specialist must verify that the dispatched spine is still current\n  before relying on a slice fetched from GitHub.\n\n## Purpose\n\nKeep specialist prompts focused while preserving plan traceability. The durable\nplan-issue comment remains the source of truth; this skill defines how a\nspecialist fetches that comment, asks the production parser helpers for the\nneeded step, and handles stale-spine detection.\n\n## Dispatch Inputs\n\nCode-Conductor must provide the specialist with:\n\n- Repository owner and name.\n- The GitHub issue comment id for the `\u003C!-- plan-issue-{ID} -->` comment.\n- The GitHub issue comment id for the `\u003C!-- frame-slices-{ID} -->` sibling\n  comment, required when the dispatched spine's `slice_comment_id` field is\n  present. Code-Conductor already has the `\u003C!-- frame-spine ... -->` block in\n  its own dispatch context (see `agents\u002FCode-Conductor.agent.md`) and reads\n  `slice_comment_id` from it directly to populate this input — the specialist\n  never reads `slice_comment_id` itself. Absent when the spine has no\n  `slice_comment_id` (legacy\u002Funsplit plan); see Operational Contract step 1\n  for the resulting single-fetch behavior.\n- The target spine step id, such as `s4`.\n- The spine `generated_at` value captured at dispatch time.\n\nThe specialist must carry the dispatched `generated_at` into lookup. The lookup\nuses `generated_at` to compare the dispatch-time spine against the current\nplan-issue comment body.\n\n## Operational Contract\n\n1. Fetch the durable plan payload with the GitHub issue comments API. See\n   `platforms\u002Fclaude.md` and `platforms\u002Fcopilot.md` for tool-specific invocations.\n\n   Read the response body field as the plan-issue comment body. Do not parse\n   issue timelines or search results when the comment id is already known.\n\n   When a sibling comment id was dispatched (the spine's `slice_comment_id` was\n   present at dispatch time), also fetch the `\u003C!-- frame-slices-{ID} -->`\n   sibling comment body, keyed on the dispatched sibling id, with the same\n   GitHub issue comments API. Before concatenating, verify the fetched sibling\n   body carries a `\u003C!-- frame-slices-{ID} -->` marker whose `{ID}` matches the\n   dispatched issue number. If the marker is absent or names a different\n   issue, stop before invoking `-Op Lookup` and report\n   `sibling-identity-mismatch` to Conductor rather than proceeding with a body\n   that may belong to the wrong issue — a copy-pasted or stale sibling id is a\n   zero-adversary path to executing a foreign requirement contract. This check\n   runs at the shim, before `frame-spine-core.ps1` is invoked: the core script\n   has no issue-number parameter to perform it, and adding one would widen the\n   signature the shim concatenation approach was chosen to avoid.\n\n   When the identity check passes, concatenate the plan-issue comment body and\n   the sibling body with a single blank line (`\\n\\n`) between them — plan body\n   first, sibling body second — and pass the concatenated text to `-Op Lookup`\n   as a single comment body. When no sibling id was dispatched (legacy plan,\n   no `slice_comment_id` on the spine), fetch only the plan comment and pass\n   it unchanged; this is the current single-fetch behavior and its shape does\n   not change.\n\n2. Invoke the production frame-spine parser helpers through the lookup\n   operation. The command shape must match this contract:\n\n   ```powershell\n   pwsh -File .github\u002Fscripts\u002Flib\u002Fframe-spine-core.ps1 -Op Lookup -CommentBodyPath {path} -GeneratedAt {generated_at} -StepId {id} -Format Json\n   ```\n\n   The implementation may pass the fetched body by a supported path or stream\n   (`-CommentBodyPath` for file-based, `-CommentBodyStdin` for piped stdin), but\n   the operation remains `-Op Lookup` against `frame-spine-core.ps1`, with the\n   dispatched `generated_at` value and requested `-StepId {id}` present in the\n   lookup invocation. When a sibling was fetched, the body passed here is the\n   step-1 concatenation of the plan comment and the sibling comment — the\n   command shape and `-Op Lookup`\u002F`-StepId {id}` invocation are unchanged\n   either way; only the content behind `-CommentBodyPath`\u002F`-CommentBodyStdin`\n   differs. Always pass `-Format Json` so the response is machine-\n   parseable JSON regardless of platform; parse the returned `status` field to\n   determine the lookup outcome (do not rely on exit code alone — see Exit Codes\n   below).\n\n3. Use the returned slice content as the only additional plan context for the\n   current turn. Do not manually parse `\u003C!-- frame-spine -->` or\n   `\u003C!-- frame-slice -->` blocks in specialist prompt logic — this includes the\n   spine's `slice_comment_id` field. The specialist obtains the sibling\n   comment id exclusively from the Dispatch Inputs Conductor supplies, never\n   by reading the spine block itself: the Lookup CLI's JSON payload is closed\n   (`frame-spine-core.ps1`'s `-Op` parameter is `[ValidateSet('Lookup')]`) and\n   exposes no \"parsed spine field\" operation, so there is no lawful shim-side\n   path to derive `slice_comment_id`.\n\n4. On generated_at mismatch, respect the F2.2 hash-elision filter before\n   declaring staleness. If the lookup result is `stale-spine`, stop specialist\n   work and return control to Conductor for re-dispatch with a fresh spine.\n\n## Exit Codes and Status Values\n\nAlways parse the JSON `status` field to determine the lookup outcome. Do not\nbranch on exit code alone — `stale-spine` exits 0, not 1.\n\n| Status                | Exit code | Meaning                                                                                                    |\n| --------------------- | --------- | ------------------------------------------------------------------------------------------------------------ |\n| `ok`                  | 0         | Slice retrieved successfully; `slice` field contains content.                                             |\n| `stale-spine`         | 0         | Dispatched spine is no longer current, or the fetched sibling's `frame-slices-generated-at` stamp diverges from the spine's `generated_at`; return to Conductor. |\n| `missing-spine`       | 1         | Comment body contains no `\u003C!-- frame-spine -->` block.                                                    |\n| `invalid-spine`       | 1         | Spine block is present but malformed (parse error).                                                       |\n| `sibling-unstamped`   | 1         | Spine carries `slice_comment_id` but the concatenated body has no `frame-slices-generated-at` marker — a writer defect, not legacy history (863-D3\u002FAC5). |\n| `missing-slice`       | 1         | Spine is valid but the requested step id was not found.                                                   |\n| `duplicate-slice-id`  | 1         | The concatenated corpus carries two or more `\u003C!-- frame-slice -->` blocks for the requested step id.      |\n| `error`               | 1         | Unexpected error; `message` field contains the reason.                                                    |\n\nWrapper-level error codes (when the outer process fails before the script\ncan run) are surfaced by the platform shim — see `platforms\u002Fcopilot.md` and\n`platforms\u002Fclaude.md` for `gh-not-installed`, `gh-auth-expired`,\n`pwsh-not-found`, and `sibling-identity-mismatch` error handling. The last is\na shim-level check (see Operational Contract step 1) — it never reaches\n`frame-spine-core.ps1`, so it is not one of the core `status` values above.\n\n## Stale-Spine Handling\n\n`generated_at` can change when the plan is amended or re-emitted. Lookup must\nnot treat timestamp-only churn as a semantic change until the F2.2\nhash-elision filter has ignored transport-only `generated_at` differences. If\nthe filtered comparison still shows that the dispatched spine is no longer the\ncurrent plan spine, lookup returns `stale-spine`.\n\nSpecialist response on `stale-spine` is intentionally narrow:\n\n- Do not continue implementation, tests, refactoring, or documentation from the\n  stale slice.\n- Report that the lookup returned `stale-spine`.\n- Return control to Conductor so Conductor can re-dispatch the specialist with\n  current spine context.\n\n## Tool-Grant Verification\n\nThe specialist shells that can perform lookup already have the required tool grants.\n\nClaude Code specialists (`Read` and `Bash`):\n\n- `agents\u002Fcode-smith.md`\n- `agents\u002Ftest-writer.md`\n- `agents\u002Fdoc-keeper.md`\n- `agents\u002Frefactor-specialist.md`\n\nCopilot specialists (`execute\u002FrunInTerminal` or `execute` wildcard):\n\n- `agents\u002FCode-Smith.agent.md`\n- `agents\u002FTest-Writer.agent.md`\n- `agents\u002FDoc-Keeper.agent.md`\n- `agents\u002FRefactor-Specialist.agent.md`\n- `agents\u002FSpecification.agent.md`\n- `agents\u002FUI-Iterator.agent.md`\n- `agents\u002FExperience-Owner.agent.md`\n\n`agents\u002FResearch-Agent.agent.md` is excluded: it has only `read`, `edit`, `search`, and\n`web` grants — no `execute\u002F*`. Copilot spine lookup for Research-Agent is deferred to\n[#544](https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fissues\u002F544).\n\nDo not edit specialist shells for this contract unless a future test proves the grants drifted.\n\n## Non-Goals and Deferred Work\n\n- Copilot parity shims for spine lookup shipped in #514. Research-Agent Copilot\n  spine lookup is deferred to [#544](https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fissues\u002F544).\n- A custom MCP server lookup path is deferred and is a non-goal for this skill.\n- This skill is supporting methodology only. It declares no `provides:` field\n  and does not fill a frame port.\n- **Goal-contract plans (issue #872) are out of scope for this skill's slice\n  dispatch.** A `plan-variant: goal-contract` plan (see\n  `skills\u002Fplan-authoring\u002FSKILL.md § Goal-contract plan variant`) carries no\n  `\u003C!-- frame-spine ... -->` block and no `\u003C!-- frame-slices-{ID} -->` sibling\n  comment — the `\u003C!-- goal-contract -->` block replaces both (872-D8). Such\n  plans are never slice-dispatched through this skill's Operational Contract.\n  `Invoke-FSCSpineLookupCli` returning `missing-spine` (§ Exit Codes and\n  Status Values above) for a goal-contract-only plan body is the **intended\n  fail-loud backstop, not a bug** (872-D7 item 2): no code change closes this\n  path, because a goal-contract plan is meant to be executed by the future\n  goal-run harness (#874), not walked by Spine-Runner or looked up\n  mid-turn by a specialist.\n- **The credit-ledger degradation note below covers the brief too.**\n  `Get-FCLLatestParsedFrameSpine` returning `$null` for a brief is the same\n  expected behavior it is for a goal-contract plan, and for the same reason:\n  no spine exists to parse, so zero spine-sourced credit rows is the correct\n  answer rather than a defect. Recorded here because #942 deletes the only\n  shape that note currently names.\n- **Brief plans (issue #941) are out of scope for the same reason.** A\n  `plan-variant: brief` plan (see `skills\u002Fplan-authoring\u002FSKILL.md § Brief plan\n  variant`) carries no `\u003C!-- frame-spine ... -->` block and no\n  `\u003C!-- frame-slices-{ID} -->` sibling, because it has no numbered\n  implementation steps to route. `missing-spine` is the intended fail-loud\n  backstop here too; a brief is read whole by its executor rather than\n  slice-dispatched.\n- **Spine-reader enumeration (872-D7 \u002F AC2).** The production readers of the\n  frame-spine mechanism, in full, are: `frame-validate-core.ps1` (the\n  structural-coverage validator, `.github\u002Fscripts\u002Flib\u002Fframe-validate-core.ps1`),\n  `orchestra-spine.ps1` (`.github\u002Fscripts\u002Forchestra-spine.ps1`, the\n  human-readable spine renderer), `frame-credit-ledger.ps1`\n  (`.github\u002Fscripts\u002Fframe-credit-ledger.ps1`, the terminal-credit harvester),\n  and `Invoke-FSCSpineLookupCli` — the lookup shim implemented in\n  `frame-spine-core.ps1` that this skill's Operational Contract dispatches to.\n  This is the shipped home for that enumeration; AC2's \"spine-reader\n  enumeration documented\" requirement is satisfied here rather than living\n  only inside the #872 plan comment.\n- **Credit-ledger degradation note (872-D7 item 3).** `frame-credit-ledger.ps1`'s\n  `Get-FCLLatestParsedFrameSpine` (`.github\u002Fscripts\u002Fframe-credit-ledger.ps1:623-637`)\n  already degrades to returning `$null`\u002F`$null.Ports` gracefully when no spine\n  is found (`.github\u002Fscripts\u002Fframe-credit-ledger.ps1:673-674`:\n  `if ($null -eq $spine -or $null -eq $spine.Ports) { return @() }`) — for a\n  goal-contract (spine-less) plan, this is **expected behavior, not a\n  defect**: the ledger silently contributes zero spine-sourced credit rows for\n  that plan rather than throwing, which is documented here rather than fixed,\n  since a goal-contract plan legitimately has no spine-sourced credits to\n  harvest.\n\n## Platform-specific invocation\n\nSee `platforms\u002Fclaude.md` for Claude Code tool bindings (`Bash` and `Read`) and\n`platforms\u002Fcopilot.md` for Copilot VS Code tool bindings (`execute\u002FrunInTerminal`).\nPlatform shims are the only location where tool names appear; the Operational\nContract above is tool-agnostic.\n\n## Gotchas\n\n| Trigger                       | Gotcha                                                               | Fix                                                               |\n| ----------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| Specialist sees a stale slice | Continuing from old context can apply the wrong requirement contract | Return control to Conductor for re-dispatch                       |\n| Comment id is available       | Searching issue comments can select an older plan marker             | Fetch `gh api repos\u002F{owner}\u002F{repo}\u002Fissues\u002Fcomments\u002F{id}` directly |\n","\u003C!-- platform-assumptions: markdown skill guidance for Claude Code specialist shells with Read and Bash access in Agent Orchestra. -->\n\u003C!-- markdownlint-disable-file MD041 MD003 -->\n\n# Frame Spine Lookup\n\nMethodology for retrieving addressable frame-spine slices during a specialist\nturn without loading the full implementation plan.\n\n## When to Use\n\n- When Code-Conductor dispatches a specialist with a frame spine, an active\n  slice, and the durable plan comment id.\n- When a specialist needs a depth-1 dependency slice or another explicitly\n  addressable slice during the same turn.\n- When the specialist must verify that the dispatched spine is still current\n  before relying on a slice fetched from GitHub.\n\n## Purpose\n\nKeep specialist prompts focused while preserving plan traceability. The durable\nplan-issue comment remains the source of truth; this skill defines how a\nspecialist fetches that comment, asks the production parser helpers for the\nneeded step, and handles stale-spine detection.\n\n## Dispatch Inputs\n\nCode-Conductor must provide the specialist with:\n\n- Repository owner and name.\n- The GitHub issue comment id for the `\u003C!-- plan-issue-{ID} -->` comment.\n- The GitHub issue comment id for the `\u003C!-- frame-slices-{ID} -->` sibling\n  comment, required when the dispatched spine's `slice_comment_id` field is\n  present. Code-Conductor already has the `\u003C!-- frame-spine ... -->` block in\n  its own dispatch context (see `agents\u002FCode-Conductor.agent.md`) and reads\n  `slice_comment_id` from it directly to populate this input — the specialist\n  never reads `slice_comment_id` itself. Absent when the spine has no\n  `slice_comment_id` (legacy\u002Funsplit plan); see Operational Contract step 1\n  for the resulting single-fetch behavior.\n- The target spine step id, such as `s4`.\n- The spine `generated_at` value captured at dispatch time.\n\nThe specialist must carry the dispatched `generated_at` into lookup. The lookup\nuses `generated_at` to compare the dispatch-time spine against the current\nplan-issue comment body.\n\n## Operational Contract\n\n1. Fetch the durable plan payload with the GitHub issue comments API. See\n   `platforms\u002Fclaude.md` and `platforms\u002Fcopilot.md` for tool-specific invocations.\n\n   Read the response body field as the plan-issue comment body. Do not parse\n   issue timelines or search results when the comment id is already known.\n\n   When a sibling comment id was dispatched (the spine's `slice_comment_id` was\n   present at dispatch time), also fetch the `\u003C!-- frame-slices-{ID} -->`\n   sibling comment body, keyed on the dispatched sibling id, with the same\n   GitHub issue comments API. Before concatenating, verify the fetched sibling\n   body carries a `\u003C!-- frame-slices-{ID} -->` marker whose `{ID}` matches the\n   dispatched issue number. If the marker is absent or names a different\n   issue, stop before invoking `-Op Lookup` and report\n   `sibling-identity-mismatch` to Conductor rather than proceeding with a body\n   that may belong to the wrong issue — a copy-pasted or stale sibling id is a\n   zero-adversary path to executing a foreign requirement contract. This check\n   runs at the shim, before `frame-spine-core.ps1` is invoked: the core script\n   has no issue-number parameter to perform it, and adding one would widen the\n   signature the shim concatenation approach was chosen to avoid.\n\n   When the identity check passes, concatenate the plan-issue comment body and\n   the sibling body with a single blank line (`\\n\\n`) between them — plan body\n   first, sibling body second — and pass the concatenated text to `-Op Lookup`\n   as a single comment body. When no sibling id was dispatched (legacy plan,\n   no `slice_comment_id` on the spine), fetch only the plan comment and pass\n   it unchanged; this is the current single-fetch behavior and its shape does\n   not change.\n\n2. Invoke the production frame-spine parser helpers through the lookup\n   operation. The command shape must match this contract:\n\n   ```powershell\n   pwsh -File .github\u002Fscripts\u002Flib\u002Fframe-spine-core.ps1 -Op Lookup -CommentBodyPath {path} -GeneratedAt {generated_at} -StepId {id} -Format Json\n   ```\n\n   The implementation may pass the fetched body by a supported path or stream\n   (`-CommentBodyPath` for file-based, `-CommentBodyStdin` for piped stdin), but\n   the operation remains `-Op Lookup` against `frame-spine-core.ps1`, with the\n   dispatched `generated_at` value and requested `-StepId {id}` present in the\n   lookup invocation. When a sibling was fetched, the body passed here is the\n   step-1 concatenation of the plan comment and the sibling comment — the\n   command shape and `-Op Lookup`\u002F`-StepId {id}` invocation are unchanged\n   either way; only the content behind `-CommentBodyPath`\u002F`-CommentBodyStdin`\n   differs. Always pass `-Format Json` so the response is machine-\n   parseable JSON regardless of platform; parse the returned `status` field to\n   determine the lookup outcome (do not rely on exit code alone — see Exit Codes\n   below).\n\n3. Use the returned slice content as the only additional plan context for the\n   current turn. Do not manually parse `\u003C!-- frame-spine -->` or\n   `\u003C!-- frame-slice -->` blocks in specialist prompt logic — this includes the\n   spine's `slice_comment_id` field. The specialist obtains the sibling\n   comment id exclusively from the Dispatch Inputs Conductor supplies, never\n   by reading the spine block itself: the Lookup CLI's JSON payload is closed\n   (`frame-spine-core.ps1`'s `-Op` parameter is `[ValidateSet('Lookup')]`) and\n   exposes no \"parsed spine field\" operation, so there is no lawful shim-side\n   path to derive `slice_comment_id`.\n\n4. On generated_at mismatch, respect the F2.2 hash-elision filter before\n   declaring staleness. If the lookup result is `stale-spine`, stop specialist\n   work and return control to Conductor for re-dispatch with a fresh spine.\n\n## Exit Codes and Status Values\n\nAlways parse the JSON `status` field to determine the lookup outcome. Do not\nbranch on exit code alone — `stale-spine` exits 0, not 1.\n\n| Status                | Exit code | Meaning                                                                                                    |\n| --------------------- | --------- | ------------------------------------------------------------------------------------------------------------ |\n| `ok`                  | 0         | Slice retrieved successfully; `slice` field contains content.                                             |\n| `stale-spine`         | 0         | Dispatched spine is no longer current, or the fetched sibling's `frame-slices-generated-at` stamp diverges from the spine's `generated_at`; return to Conductor. |\n| `missing-spine`       | 1         | Comment body contains no `\u003C!-- frame-spine -->` block.                                                    |\n| `invalid-spine`       | 1         | Spine block is present but malformed (parse error).                                                       |\n| `sibling-unstamped`   | 1         | Spine carries `slice_comment_id` but the concatenated body has no `frame-slices-generated-at` marker — a writer defect, not legacy history (863-D3\u002FAC5). |\n| `missing-slice`       | 1         | Spine is valid but the requested step id was not found.                                                   |\n| `duplicate-slice-id`  | 1         | The concatenated corpus carries two or more `\u003C!-- frame-slice -->` blocks for the requested step id.      |\n| `error`               | 1         | Unexpected error; `message` field contains the reason.                                                    |\n\nWrapper-level error codes (when the outer process fails before the script\ncan run) are surfaced by the platform shim — see `platforms\u002Fcopilot.md` and\n`platforms\u002Fclaude.md` for `gh-not-installed`, `gh-auth-expired`,\n`pwsh-not-found`, and `sibling-identity-mismatch` error handling. The last is\na shim-level check (see Operational Contract step 1) — it never reaches\n`frame-spine-core.ps1`, so it is not one of the core `status` values above.\n\n## Stale-Spine Handling\n\n`generated_at` can change when the plan is amended or re-emitted. Lookup must\nnot treat timestamp-only churn as a semantic change until the F2.2\nhash-elision filter has ignored transport-only `generated_at` differences. If\nthe filtered comparison still shows that the dispatched spine is no longer the\ncurrent plan spine, lookup returns `stale-spine`.\n\nSpecialist response on `stale-spine` is intentionally narrow:\n\n- Do not continue implementation, tests, refactoring, or documentation from the\n  stale slice.\n- Report that the lookup returned `stale-spine`.\n- Return control to Conductor so Conductor can re-dispatch the specialist with\n  current spine context.\n\n## Tool-Grant Verification\n\nThe specialist shells that can perform lookup already have the required tool grants.\n\nClaude Code specialists (`Read` and `Bash`):\n\n- `agents\u002Fcode-smith.md`\n- `agents\u002Ftest-writer.md`\n- `agents\u002Fdoc-keeper.md`\n- `agents\u002Frefactor-specialist.md`\n\nCopilot specialists (`execute\u002FrunInTerminal` or `execute` wildcard):\n\n- `agents\u002FCode-Smith.agent.md`\n- `agents\u002FTest-Writer.agent.md`\n- `agents\u002FDoc-Keeper.agent.md`\n- `agents\u002FRefactor-Specialist.agent.md`\n- `agents\u002FSpecification.agent.md`\n- `agents\u002FUI-Iterator.agent.md`\n- `agents\u002FExperience-Owner.agent.md`\n\n`agents\u002FResearch-Agent.agent.md` is excluded: it has only `read`, `edit`, `search`, and\n`web` grants — no `execute\u002F*`. Copilot spine lookup for Research-Agent is deferred to\n[#544](https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fissues\u002F544).\n\nDo not edit specialist shells for this contract unless a future test proves the grants drifted.\n\n## Non-Goals and Deferred Work\n\n- Copilot parity shims for spine lookup shipped in #514. Research-Agent Copilot\n  spine lookup is deferred to [#544](https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fissues\u002F544).\n- A custom MCP server lookup path is deferred and is a non-goal for this skill.\n- This skill is supporting methodology only. It declares no `provides:` field\n  and does not fill a frame port.\n- **Goal-contract plans (issue #872) are out of scope for this skill's slice\n  dispatch.** A `plan-variant: goal-contract` plan (see\n  `skills\u002Fplan-authoring\u002FSKILL.md § Goal-contract plan variant`) carries no\n  `\u003C!-- frame-spine ... -->` block and no `\u003C!-- frame-slices-{ID} -->` sibling\n  comment — the `\u003C!-- goal-contract -->` block replaces both (872-D8). Such\n  plans are never slice-dispatched through this skill's Operational Contract.\n  `Invoke-FSCSpineLookupCli` returning `missing-spine` (§ Exit Codes and\n  Status Values above) for a goal-contract-only plan body is the **intended\n  fail-loud backstop, not a bug** (872-D7 item 2): no code change closes this\n  path, because a goal-contract plan is meant to be executed by the future\n  goal-run harness (#874), not walked by Spine-Runner or looked up\n  mid-turn by a specialist.\n- **The credit-ledger degradation note below covers the brief too.**\n  `Get-FCLLatestParsedFrameSpine` returning `$null` for a brief is the same\n  expected behavior it is for a goal-contract plan, and for the same reason:\n  no spine exists to parse, so zero spine-sourced credit rows is the correct\n  answer rather than a defect. Recorded here because #942 deletes the only\n  shape that note currently names.\n- **Brief plans (issue #941) are out of scope for the same reason.** A\n  `plan-variant: brief` plan (see `skills\u002Fplan-authoring\u002FSKILL.md § Brief plan\n  variant`) carries no `\u003C!-- frame-spine ... -->` block and no\n  `\u003C!-- frame-slices-{ID} -->` sibling, because it has no numbered\n  implementation steps to route. `missing-spine` is the intended fail-loud\n  backstop here too; a brief is read whole by its executor rather than\n  slice-dispatched.\n- **Spine-reader enumeration (872-D7 \u002F AC2).** The production readers of the\n  frame-spine mechanism, in full, are: `frame-validate-core.ps1` (the\n  structural-coverage validator, `.github\u002Fscripts\u002Flib\u002Fframe-validate-core.ps1`),\n  `orchestra-spine.ps1` (`.github\u002Fscripts\u002Forchestra-spine.ps1`, the\n  human-readable spine renderer), `frame-credit-ledger.ps1`\n  (`.github\u002Fscripts\u002Fframe-credit-ledger.ps1`, the terminal-credit harvester),\n  and `Invoke-FSCSpineLookupCli` — the lookup shim implemented in\n  `frame-spine-core.ps1` that this skill's Operational Contract dispatches to.\n  This is the shipped home for that enumeration; AC2's \"spine-reader\n  enumeration documented\" requirement is satisfied here rather than living\n  only inside the #872 plan comment.\n- **Credit-ledger degradation note (872-D7 item 3).** `frame-credit-ledger.ps1`'s\n  `Get-FCLLatestParsedFrameSpine` (`.github\u002Fscripts\u002Fframe-credit-ledger.ps1:623-637`)\n  already degrades to returning `$null`\u002F`$null.Ports` gracefully when no spine\n  is found (`.github\u002Fscripts\u002Fframe-credit-ledger.ps1:673-674`:\n  `if ($null -eq $spine -or $null -eq $spine.Ports) { return @() }`) — for a\n  goal-contract (spine-less) plan, this is **expected behavior, not a\n  defect**: the ledger silently contributes zero spine-sourced credit rows for\n  that plan rather than throwing, which is documented here rather than fixed,\n  since a goal-contract plan legitimately has no spine-sourced credits to\n  harvest.\n\n## Platform-specific invocation\n\nSee `platforms\u002Fclaude.md` for Claude Code tool bindings (`Bash` and `Read`) and\n`platforms\u002Fcopilot.md` for Copilot VS Code tool bindings (`execute\u002FrunInTerminal`).\nPlatform shims are the only location where tool names appear; the Operational\nContract above is tool-agnostic.\n\n## Gotchas\n\n| Trigger                       | Gotcha                                                               | Fix                                                               |\n| ----------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| Specialist sees a stale slice | Continuing from old context can apply the wrong requirement contract | Return control to Conductor for re-dispatch                       |\n| Comment id is available       | Searching issue comments can select an older plan marker             | Fetch `gh api repos\u002F{owner}\u002F{repo}\u002Fissues\u002Fcomments\u002F{id}` directly |\n",{"name":5,"description":7},"main","d5486aacc32c9ca1b07173cfd530f8fe75c29e58","skills\u002Fframe-spine-lookup",0,"https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra","https:\u002F\u002Fgithub.com\u002FGrimblaz","2026-08-16 01:12:46",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":50},[40,43,46],{"tool":41,"command":42},"npx","npx skills add Grimblaz\u002Fagent-orchestra --skill frame-spine-lookup",{"tool":44,"command":45},"bunx","bunx skills add Grimblaz\u002Fagent-orchestra --skill frame-spine-lookup",{"tool":47,"command":48},"pnpm","pnpm dlx skills add Grimblaz\u002Fagent-orchestra --skill frame-spine-lookup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fframe-spine-lookup\u002FSKILL.md",true,[52,58,62],{"path":53,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":56,"sourceHtmlUrl":57},"platforms\u002Fclaude.md","REFERENCE","参考文档",4377,"https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fframe-spine-lookup\u002Fplatforms\u002Fclaude.md",{"path":59,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":60,"sourceHtmlUrl":61},"platforms\u002Fcopilot.md",5025,"https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fframe-spine-lookup\u002Fplatforms\u002Fcopilot.md",{"path":63,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":64,"sourceHtmlUrl":65},"references\u002Fdetailed-guide.md",14560,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-n8n-mcp-tools-expert\u002Freferences\u002Fdetailed-guide.md",[67,101,126,141,169,190],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":81,"publishedAt":26},"01M6C48YMJVFHM7DVGG1WWW5RJ","webapp-testing","Playwright end-to-end testing guidance for web apps, with practical patterns and setup steps. Use when creating or improving browser-based E2E coverage, test stability, and CI execution. DO NOT USE FOR: React component tests (use ui-testing), canvas game interaction (use browser-canvas-testing), TDD workflow (use test-driven-development), debugging failures (use systematic-debugging), or randomized property tests (use property-based-testing).","https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fwebapp-testing\u002FSKILL.md",[73,78],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":79,"categoryName":80,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000009","前端开发",[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,23],"testing","webapp testing","webapp","canvas","tdd","workflow","playwright","test","web","react","component","debugging","development","browser","ci","execution","e2e","game","coverage",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":26},"01M6C48TNNP2KCSQXV8YK7SK49","verification-before-completion","Evidence-based verification checklist before marking work complete. Use before PRs, releases, marking tickets done, or any \"I'm finished\" declaration; also when naming a baseline commit for a differential suite claim, when designing a mutation campaign or red-run evidence, when making an absence claim, a universal claim, or a one-time demonstration offered as a standing guarantee, when attributing a measurement or claiming a sweep or verification loop is complete, and when stating what a check or a CI suite will do about a change. DO NOT USE FOR: post-merge cleanup or archival (use post-pr-review) or processing GitHub review comments (use code-review-intake).","https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fverification-before-completion\u002FSKILL.md",[],[108,109,110,111,112,113,114,115,116,117,118,119,96,120,121,122,123,23,124,125],"verification","verification before completion","review","change","commit","merge","pr","cleanup","run","code","code-review","intake","loop","verification loop","work","check","evidence","campaign",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":26},"01M6C48QZWNTP7JGKD32QZAKKX","validation-methodology","Reusable validation and review methodology for staged validation, failure triage, and prosecution-depth setup. Use when running validation ladders, triaging failures, or executing adversarial review passes. DO NOT USE FOR: CE Gate orchestration, specialist dispatch ownership, or step execution flow (keep those in Code-Conductor).","https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fvalidation-methodology\u002FSKILL.md",[],[133,20,134,110,135,136,137,138,117,139,97,23,140],"validation","validation methodology","triage","orchestration","setup","adversarial review","flow","dispatch",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":155,"publishedAt":26},"01M6C48MCAHG5Z79BJ369CRYRZ","upstream-onboarding","Shared opening-phase protocol for upstream agents (Experience-Owner, Solution-Designer, Issue-Planner) and Code-Conductor when invoked on an existing GitHub issue. Renders a scaled context brief and runs a standards check on inherited work at each phase boundary. Use when a user-invocable agent receives a request referencing an existing GitHub issue and must load solution-authoring and upstream-onboarding at the opening phase. DO NOT USE FOR: subagent dispatches (which already operate within an assessed session context); post-merge review (use post-pr-review); research or non-tree subagents.","https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fupstream-onboarding\u002FSKILL.md",[147,150],{"categoryNo":148,"categoryName":149,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":151,"categoryName":152,"taxonomyType":153,"taxonomyTypeDesc":154},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[156,157,110,158,159,113,160,114,117,161,162,163,164,165,166,122,123,167,168,23],"onboarding","upstream onboarding","github","research","standards check","protocol","brief","boundary","designer","subagent","planner","user","session",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":183,"publishedAt":26},"01M6C48GPVE120TGPMD1CS365H","ui-testing","Resilient React component testing strategies focusing on user behavior. Use when writing or reviewing component-level React tests, fixing flaky component tests, or establishing React testing patterns. DO NOT USE FOR: Playwright E2E tests (use webapp-testing), canvas game interaction (use browser-canvas-testing), TDD workflow (use test-driven-development), debugging failures (use systematic-debugging), UI component design (use frontend-design), or randomized property tests (use property-based-testing).","https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fui-testing\u002FSKILL.md",[175,176,177,180],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},{"categoryNo":79,"categoryName":80,"taxonomyType":76,"taxonomyTypeDesc":77},{"categoryNo":178,"categoryName":179,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":181,"categoryName":182,"taxonomyType":153,"taxonomyTypeDesc":154},"01JBSEEDCAT000000000000032","设计师",[82,184,185,186,187,188,85,87,88,89,91,92,93,94,95,189,98,99,23,84],"ui","ui testing","frontend","design","writing","testing patterns",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":198,"publishedAt":26},"01M6C48DRJ9XBDR2FW0W37DY53","ui-iteration","Reusable screenshot-driven UI polish workflow for iterative visual refinement. Use when improving layout, hierarchy, spacing, feedback, or Tailwind-based presentation through repeated review-and-adjust passes. DO NOT USE FOR: functional bug fixing, accessibility-only audits, or major redesign strategy work (use Code-Smith or frontend-design).","https:\u002F\u002Fgithub.com\u002FGrimblaz\u002Fagent-orchestra\u002Fblob\u002Fmain\u002Fskills\u002Fui-iteration\u002FSKILL.md",[196,197],{"categoryNo":79,"categoryName":80,"taxonomyType":76,"taxonomyTypeDesc":77},{"categoryNo":181,"categoryName":182,"taxonomyType":153,"taxonomyTypeDesc":154},[184,199,186,187,110,87,200,117,201,202,203,204,205,122,206,207,23,208],"ui iteration","accessibility","screenshot","Tailwind","polish","ui polish","feedback","redesign","strategy","only"]