ワンクリックで
avatar-regression-probes
Validate Squad avatar regressions with alias-resolution probes and source assertions around reset paths.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Validate Squad avatar regressions with alias-resolution probes and source assertions around reset paths.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
{what this skill teaches agents}
Use stable agent identity fields for metadata joins and reserve instance ids for runtime bookkeeping.
Render live sub-agent badges from resolved identity, current model, and active work state.
Protect persisted voice selections when async voice lists reload or the active TTS engine changes.
Replay extension state only after the webview page declares its own ready flag.
Keep avatar window chrome and topmost behavior driven by one explicit rule.
| name | avatar-regression-probes |
| description | Validate Squad avatar regressions with alias-resolution probes and source assertions around reset paths. |
| domain | testing, extension-ui |
| confidence | high |
| source | earned |
Use this when CopilotAvatar changes touch Squad identity, sub-agent badges, or session-to-session replay behavior. The repo has no built-in test suite for the extension, so reliable review work needs a compact probe that exercises both the data seam and the UI-state seam.
node --check on .github/extensions/copilot-avatar/main.mjs, .github/extensions/copilot-avatar/lib/squad-context.mjs, and .github/extensions/copilot-avatar/content/main.js before trusting anything else.loadSquadContext() from the repo root and from a clearly non-Squad cwd to verify both the positive and negative paths.resolveSquadAgentMetadata() against casting aliases like lead, backend-dev, and tester so roster-name regressions show up immediately.main.mjs, clear non-root avatars in content/main.js, and keep the reset wired to session start, context change, and scope drift.assistant.turn_start must clear sub-agent runtime state before any Squad-context refresh or replay hook runs, or prior-turn Copilot-presence/tool state can resurrect a whole graveyard of cards for one ugly flash.subagent.completed / subagent.failed, the extension still needs a fallback retire path instead of leaving an idle ghost on screen until the next directive.session.getMessages() back into an open webview, clear non-root avatars and reset backend sub-agent caches so idle background agents from older turns cannot survive as fake live cards.setAgentIntent / setAgentActivity / setAgentThinking for a missing non-root agentId, rendering a generic stale card, calling clearSubagents({ preserveRoot: true }), then re-adding that same agentId with a real name. The card must come back Idle with empty detail, proving both visible ghosts and pending UI caches were actually wiped.assistant.usage / tool.execution_complete / session.model_change, and getAvatarBadgeText() should still prefer current activity text.statusText / detailText in the runtime payload and make the webview honor explicit empty strings instead of reviving fallback copy like Squad ready.subagent.started should be enough to drive addSubagent for a Copilot-owned runtime agent, with no extra first-render debounce or tool-evidence gate layered on top.task, agent, and runSubagent should not mirror into the root badge/subtask overlay unless the product explicitly wants that orchestration text visible.agentId values that both resolve to the same cast identity (for example Tony Stark) must not remain visible together unless the product explicitly wants parallel clones.ROOT_AGENT_ID, then toggled from window.setSquadContext(payload.active) instead of any separate cwd sniff inside the webview.webview.show(), add a page-owned readiness latch (for example window.__copilotAvatarReady) and wait for it before sending root-only state like setSquadContext(). A live handle or websocket alone does not prove the page module has finished defining its API.initializeRootAvatar() / root-avatar creation so the first visible frame picks up the correct chrome.setAgentThinking / setAgentIntent / setAgentActivity against a missing non-root agentId, assert no .subagent-label[data-agent-id="..."] exists yet, then send addSubagent with the resolved Squad payload and verify the card appears with the cast name, visible thinking/running badge state, and the assigned work description in .agent-detail..subagent-label cards immediately during that overlap window.clearSubagents({ preserveRoot: true }), addSubagent, setAgentIntent, and setAgentActivity after the real probe. Use it to make Tony/Howard/etc. visibly inspectable, but never mistake that demo for evidence that the runtime event pipeline is healthy.copilot-avatar extension process is actually running and reload extensions after local .github/extensions/copilot-avatar/*.mjs edits. A live avatar window can keep stale extension behavior even when the on-disk source already contains the identity fix.0x1c1c1c). Extend the boom curve from the temple/ear region down to the mouth with 5–6 CatmullRom points for a natural arc without an ear-ring anchor..github/extensions/copilot-avatar/lib/squad-context.mjs should resolve tester → Howard the Duck, backend-dev → Peter Parker, lead → Tony Stark..github/extensions/copilot-avatar/main.mjs should call resetSubagentRuntimeState({ clearUi: true }) before rehydrating later views..github/extensions/copilot-avatar/main.mjs should clear non-root cards, reset sub-agent caches, and then hydrate from session.getMessages() when a late-open/reload path rebuilds the avatar window..github/extensions/copilot-avatar/main.mjs should run resetSubagentRuntimeState({ clearUi: true }) inside assistant.turn_start before refreshVisibleSquadContext() / syncKnownSubagents() can replay anything..github/extensions/copilot-avatar/main.mjs should call ensureSubagentVisible() from subagent.started instead of waiting for tool.execution_start / tool.execution_progress to unlock first render..github/extensions/copilot-avatar/lib/squad-context.mjs can keep getSquadWindowContext() active while sending blank statusText / detailText, and .github/extensions/copilot-avatar/content/main.js should preserve those blanks instead of falling back to Squad ready..github/extensions/copilot-avatar/content/main.js should expose clearSubagents({ preserveRoot: true }) so stale Squad cards disappear when Squad turns off..github/extensions/copilot-avatar/main.mjs can gate root-level setAgentActivity / setSubtask calls behind a helper like shouldMirrorRootToolActivity() so wrapper tools do not flash task on the root overlay..github/extensions/copilot-avatar/main.mjs should not rely on tool.execution_complete as a cosmetic-only event; if the SDK skips a terminal sub-agent event, a visible card still needs a fallback way to retire..github/extensions/copilot-avatar/content/main.js can attach createSquadMicBoom() inside createAvatarInstance() for the root avatar, then flip it through updateRootSquadMicBoom() when window.setSquadContext() changes..github/extensions/copilot-avatar/main.mjs can poll window.__copilotAvatarReady === true before calling window.setSquadContext(...), so the first Squad payload is not dropped during page bootstrap..github/extensions/copilot-avatar/content/main.js should call updateRootSquadMicBoom(rootAvatar) inside initializeRootAvatar() so an already-latched squadRootMicActive flag still lights up the mic when the mesh appears.Tony Stark and Howard the Duck together while the root card stays idle; verify the named sub-agent cards by display name, model row, and badge text before the overlap collapses.speak() has an explicit engine === '<name>' branch that calls the engine function directly — not an else fallback; (2) the engine function is defined and uses the real synthesis path, not a placeholder that calls speakWebSpeech; (3) the engine voice selection persists via saveSettings and is restored to the module-level var BEFORE the populate-voices call.speakSam uses synthesizeSamAudio (custom Web Audio API formant engine) — NOT a sam-js npm/CDN call. SAM_PHONEME_DATA is the acoustic data table. SAM_VOICES holds 6 presets (sam/elf/cylon/vader/stuffy/gruff). All are self-contained in content/main.js.populateSamVoices() uses option.selected = id === samVoice (not samVoiceSelect.value = samVoice after the fact) so the DOM reflects the restored value on first paint.updateEngineUI has const isSam = ttsEngine === 'sam' and that ttsSamSection.classList.toggle('hidden', !isSam) plus ttsWebspeechSection.classList.toggle('hidden', isAiEngine || isSam) — all three toggles in one function.canPreviewCurrentVoice has an explicit sam branch. Missing it means the Test button stays disabled even when SAM is selected and voices are loaded.DEFAULT_SETTINGS.samVoice exists in main.mjs so fresh installs get a valid default without a saveSettings round-trip.agentId and never checking whether two cards collapse to the same cast identity.loadSquadContext() probe.payload.statusText || '● Squad ready' in the webview; explicit empty strings must survive the handoff when silence is the desired UI state.Howard the Duck-style ghosts and blank idle cards can slip through.content/main.js and letting root-only Squad visuals leak into normal Copilot sessions.webview.show() or the initial websocket as proof that window.setSquadContext already exists.window.setSquadContext() always runs after initializeRootAvatar(); on a fast webview connection the signal can arrive first, and the root chrome stays stale unless initialization reapplies the latched flag.