Verdaccio Pull Request Workflow
verdaccio/verdaccio
Takes a change through a verdaccio pull request: branch, local checks, changeset, title and body, labels, CI and review rounds, and ports to other release lines.
“自动发现项目中的代码问题并提交 GitHub Issue”
$ npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install shenjingnan/xiaozhi-client issue-hunter --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/shenjingnan/xiaozhi-client.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/issue-hunter .claude/skills/issue-hunter && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "issue-hunter" agent skill from https://github.com/shenjingnan/xiaozhi-client/tree/main/.agents/skills/issue-hunter into .claude/skills/issue-hunter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "issue-hunter", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/shenjingnan/xiaozhi-client/tree/main/.agents/skills/issue-hunterType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install shenjingnan/xiaozhi-client issue-hunter --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shenjingnan/xiaozhi-client.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/issue-hunter .agents/skills/issue-hunter && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "issue-hunter" agent skill from https://github.com/shenjingnan/xiaozhi-client/tree/main/.agents/skills/issue-hunter into .agents/skills/issue-hunter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "issue-hunter", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install shenjingnan/xiaozhi-client issue-hunter --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shenjingnan/xiaozhi-client.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/issue-hunter .cursor/skills/issue-hunter && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "issue-hunter" agent skill from https://github.com/shenjingnan/xiaozhi-client/tree/main/.agents/skills/issue-hunter into .cursor/skills/issue-hunter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "issue-hunter", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/shenjingnan/xiaozhi-client.git --path .agents/skills/issue-hunter--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install shenjingnan/xiaozhi-client issue-hunter --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shenjingnan/xiaozhi-client.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/issue-hunter .gemini/skills/issue-hunter && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "issue-hunter" agent skill from https://github.com/shenjingnan/xiaozhi-client/tree/main/.agents/skills/issue-hunter into .gemini/skills/issue-hunter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "issue-hunter", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install shenjingnan/xiaozhi-client issue-hunterInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/shenjingnan/xiaozhi-client.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/issue-hunter .github/skills/issue-hunter && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "issue-hunter" agent skill from https://github.com/shenjingnan/xiaozhi-client/tree/main/.agents/skills/issue-hunter into .github/skills/issue-hunter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "issue-hunter", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install shenjingnan/xiaozhi-client issue-hunter --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/shenjingnan/xiaozhi-client.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/issue-hunter .opencode/skills/issue-hunter && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "issue-hunter" agent skill from https://github.com/shenjingnan/xiaozhi-client/tree/main/.agents/skills/issue-hunter into .opencode/skills/issue-hunter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "issue-hunter", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
issue-hunterIssue Hunter is a skill in shenjingnan/xiaozhi-client (341 stars). Its SKILL.md is about 2.4k tokens. Licence: MIT.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit fe3c382. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmghFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm and gh, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Issue Hunter loads about 2.4k tokens when it runs. Until then it costs about 10 tokens; SKILL.md has 437 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from shenjingnan/xiaozhi-client at commit fe3c382, republished under its MIT licence (© shenjingnan). 437 words, ~2,422 tokens.
.claude/skills/issue-hunter/SKILL.md (or your agent's skills folder).我是代码问题猎手,专门负责在 xiaozhi-client 项目中发现潜在的代码问题、不规范实践和潜在 bug,同时遵循务实开发理念。
xiaozhi-client/
├── src/ # 统一源码目录
│ ├── server/ # 后端核心
│ │ ├── lib/mcp/ # MCP 核心库
│ │ ├── handlers/ # 处理器
│ │ ├── services/ # 业务服务
│ │ └── utils/ # 工具函数
│ ├── web/ # React 前端
│ ├── cli/ # CLI 工具
│ ├── config/ # 配置管理
│ ├── mcp-core/ # MCP 协议核心
│ ├── endpoint/ # 端点处理
│ ├── esp32/ # ESP32 硬件相关
│ ├── types/ # 共享类型定义
│ └── utils/ # 通用工具
├── todos/ # 待解决问题(用于去重)
├── docs/ # Nextra 文档
└── .github/workflows/
├── claude.yml # @claude 触发
└── issue-hunter.yml # 定时执行(每10分钟)src/server/lib/mcp/manager.ts - MCP 管理器src/server/services/ - 业务服务src/server/handlers/ - 处理器src/cli/ - CLI 入口检查范围: docs/, README.md, CLAUDE.md
检测内容:
检测命令:
# 检查文档文件
find docs/ -name "*.mdx" -type f检查命令: pnpm typecheck
检测内容:
关注重点:
检测内容:
代码模式:
// ❌ 危险模式
async function riskyOperation() {
const result = await fetchSomething(); // 无错误处理
}
// ❌ 无意义捕获
try {
// ...
} catch (e) {
// 吞掉错误
}
// ✅ 正确模式
async function riskyOperation() {
try {
return await fetchSomething();
} catch (error) {
logger.error('操作失败', error);
throw error; // 重新抛出
}
}检测内容:
代码模式:
// ❌ 未清理定时器
const timer = setInterval(() => {
// ...
}, 1000);
// 缺少 clearInterval
// ✅ 正确清理
const timer = setInterval(() => {
// ...
}, 1000);
// 在 cleanup 中清理
cleanup() {
clearInterval(timer);
}检测内容:
检测命令:
# 查找大文件
find src/ -name "*.ts" -type f -exec wc -l {} + | sort -rn | head -20检查命令: pnpm check:cpd (jscpd)
阈值: 报告重复率超过 5% 的文件 重点关注: 跨包重复代码
分析输出:
# 运行重复代码检测
pnpm check:cpd检测内容:
检查方法:
检查范围: src/web/
检测内容:
检查命令:
pnpm typecheck - TypeScript 类型错误pnpm build - 构建错误关注点:
检测内容:
pnpm audit)检测命令:
# 安全审计
pnpm audit
# 检查过时依赖
pnpm outdated检测内容:
正确模式:
// ✅ 推荐(使用路径别名)
import { MCPManager } from "@/mcp-core";
import { ConfigService } from "@/config";
// ❌ 避免(相对路径)
import { MCPManager } from "../mcp-core";
import { ConfigService } from "../config";检查命令: pnpm lint
检测内容:
步骤 1.1: 获取现有 open issues
gh issue list --state open --limit 100 --json number,title步骤 1.2: 读取 todos 目录
ls -la todos/步骤 1.3: 解析现有问题和 todos
去重策略:
步骤 2.1: 随机选择问题类型
// 使用当前时间戳作为随机种子
const problemTypes = [
'文档问题', '类型安全问题', '错误处理问题', '资源泄漏问题',
'性能问题', '代码重复', '架构问题', '组件设计问题',
'编译时问题', '依赖问题', '路径别名问题', '代码规范问题'
];
const selectedIndex = Math.floor(Date.now() / 1000) % problemTypes.length;
const selectedType = problemTypes[selectedIndex];步骤 2.2: 针对选定类型执行检测
# 检查公共接口的 JSDoc 覆盖
find src/server src/cli -name "*.ts" ! -path "*/__tests__/*" ! -name "*.test.ts" -exec grep -l "export" {} \;pnpm typecheck 2>&1 | grep -A 5 "error TS"# 查找未处理异常的异步函数
grep -r "await.*fetch\|await.*request" src/ --include="*.ts" | grep -v "try\|catch" | head -20# 查找 setInterval 但没有 clearInterval
grep -r "setInterval" src/ --include="*.ts" -A 10 | grep -v "clearInterval"# 查找大文件
find src/ -name "*.ts" -type f -exec wc -l {} + | sort -rn | head -20pnpm check:cpd --threshold 5# 分析模块依赖
grep -r "import.*from.*\.\./\.\./\.\." src/ --include="*.ts" | head -20# 查找大组件文件
find src/web -name "*.tsx" -type f -exec wc -l {} + | sort -rn | head -20pnpm typecheck
pnpm buildpnpm audit --json
pnpm outdated# 查找相对路径导入
grep -r "from.*\.\./\.\." src/ --include="*.ts" | grep -v "__tests__" | head -20pnpm lint 2>&1 | grep -E "error|warning"步骤 2.3: 评估问题严重程度
严重程度标准:
步骤 3.1: 选择最高优先级问题
步骤 3.2: 生成 Issue 报告
报告结构:
## 问题描述
[详细说明发现的问题]
## 问题位置
`path/to/file.ts:行号`
## 严重程度
[Critical / High / Medium / Low]
## 影响范围
[说明问题可能造成的影响]
## 修复方案
[详细的修复步骤或代码示例]
## 相关代码
\`\`\`typescript
[有问题的代码片段]
\`\`\`Issue 标题格式:
Claude: [BUG] 简短描述Claude: [CODE] 简短描述Claude: [SECURITY] 简短描述Claude: [PERF] 简短描述Claude: [ARCH] 简短描述标签使用:
bug - 功能错误code-quality - 代码质量问题security - 安全问题performance - 性能问题architecture - 架构问题documentation - 文档问题good first issue - 适合新手修复的简单问题步骤 3.3: 创建 Issue
gh issue create \
--title "Claude: [类型] 简短描述" \
--body "Issue 内容" \
--label "bug,code-quality"创建 Issue 后,
.github/workflows/auto-claude-comment.ymlworkflow 会自动添加 "@claude" 评论来触发处理流程。
使用以下命令调用此技能:
/issue-hunter或使用 Skill 工具:
{
"skill": "issue-hunter"
}技能执行后会返回:
## 问题发现报告
**选定问题类型**: [类型]
**发现的问题数量**: [数量]
**最高优先级问题**: [问题]
### 问题详情
**问题类型**: [类型]
**严重程度**: [严重程度]
**文件位置**: `path/to/file.ts:行号`
### 问题描述
[详细描述]
### 修复方案
[修复步骤或代码]
### Issue 已创建
🔗 [Issue #XXX: 标题](https://github.com/shenjingnan/xiaozhi-client/issues/XXX)issue-hunter 发现问题后创建 Issueci-validator 检查代码是否通过 CIpath-alias-validator 检查路径别名使用issue-hunter 记录严重违规行为type-validator 检查类型问题issue-hunter 记录未解决的类型安全问题🔍 正在分析项目代码...
⚠️ 随机选择问题类型: 资源泄漏问题
🔍 检测范围: src/server/lib/mcp/, src/server/utils/
⚠️ 发现问题:WebSocket 连接未正确关闭
📍 位置:src/server/utils/某个传输相关文件:45
📊 严重程度:High
📝 问题描述:
当连接失败时,WebSocket 连接没有被正确关闭,可能导致资源泄漏。
✨ 修复方案:
```typescript
// 在 catch 块中添加连接关闭逻辑
catch (error) {
if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {
this.ws.close();
}
throw error;
}📮 Issue 已创建: 🔗 Issue #123: Claude: [BUG] WebSocket 连接未正确关闭导致资源泄漏
### 示例 2:发现类型安全问题🔍 正在分析项目代码...
⚠️ 随机选择问题类型: 类型安全问题
🔍 检测命令: pnpm typecheck
⚠️ 发现问题:非测试文件中使用 any 类型
📍 位置:src/server/services/某个服务文件.ts:78
📊 严重程度:Medium
📝 问题描述: 非测试文件中使用 any 类型绕过类型检查,降低了代码的类型安全性。
✨ 修复方案:
// 将 any 替换为具体的类型定义
interface ProcessOptions {
endpoint: string;
timeout: number;
}
function processData(options: ProcessOptions): Result {
// ...
}📮 Issue 已创建: 🔗 Issue #124: Claude: [CODE] 非测试文件中 any 类型使用不当
### 示例 3:发现架构问题🔍 正在分析项目代码...
⚠️ 随机选择问题类型: 架构问题
🔍 检测范围: src/server/services/, src/server/handlers/
⚠️ 发现问题:模块职责不清晰
📍 位置:src/server/services/某个服务文件.ts
📊 严重程度:Medium
📝 问题描述: StatusService 同时负责状态管理和通知发送,违反了单一职责原则。建议将通知发送逻辑拆分到 NotificationService。
✨ 修复方案:
// 重构 StatusService,只保留状态管理逻辑
// 将通知发送逻辑移至 NotificationService
class StatusService {
getStatus(): ServiceStatus {
return this.currentStatus;
}
updateStatus(status: ServiceStatus): void {
this.currentStatus = status;
// 移除通知发送逻辑
}
}📮 Issue 已创建: 🔗 Issue #125: Claude: [ARCH] StatusService 职责不清晰
## 务实开发指导
### 何时报告问题
- **实际遇到问题**:当代码确实存在 bug 或风险时
- **影响可维护性**:当问题严重影响代码维护时
- **违反项目规范**:当代码明显违反 CLAUDE.md 规定时
- **安全或性能风险**:当存在安全漏洞或性能瓶颈时
### 何时不报告问题
- **预防性设计**:为了"可能的需要"而建议的改进
- **理论完美**:为了代码的"优雅"而过度抽象
- **过度优化**:在没有性能问题时优化性能
- **设计模式**:为了使用设计模式而使用
### 判断标准
在报告问题前,问自己:
1. 这个问题是否真的影响功能或维护性?
2. 这个问题是否在其他地方已经被覆盖(todos 或 open issues)?
3. 修复这个问题的收益是否大于成本?
4. 是否符合"如无必要勿增实体"的原则?© shenjingnan, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/issue-hunter of shenjingnan/xiaozhi-client.
Open the folder on GitHubat commit fe3c382
Issue Hunter next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Issue Hunter this skillshenjingnan/xiaozhi-client | 341 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Verdaccio Pull Request Workflowverdaccio/verdaccio | 18k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Verdaccio PR Reviewverdaccio/verdaccio | 18k | — | ~1.7k | Automated safety check: Pass | MIT | |
| Difit Reviewyoshiko-pg/difit | 3.2k | — | ~764 | Automated safety check: Pass | MIT | |
| ZCF Release AutomationUfoMiao/zcf | 6.1k | — | ~3.4k | Automated safety check: Pass | MIT | |
| Linea Dependency MaintenanceConsensys-Incorporated/linea-attestation-registry | 177 | 1 repos | ~3.7k | Automated safety check: Warn | MIT |
verdaccio/verdaccio
Takes a change through a verdaccio pull request: branch, local checks, changeset, title and body, labels, CI and review rounds, and ports to other release lines.
verdaccio/verdaccio
Reviews an existing verdaccio/verdaccio pull request end to end, verifies each finding and reports whether it is mergeable, optionally fixing it on the PR branch.
yoshiko-pg/difit
A skill for reviewing a specific diff and showing the findings as comments inside difit (the diff viewer).
UfoMiao/zcf
Automates a version release with changesets: analyzes code changes, writes a bilingual CHANGELOG, bumps the version and commits through a release branch and pull request.
Consensys-Incorporated/linea-attestation-registry
Safely plan and execute dependency maintenance for JavaScript/TypeScript (npm, pnpm) and GitHub Actions, including npm lockfiles, pnpm workspaces, catalogs, overrides, SHA-pinned action versions…
seasonedcc/remix-forms
Release a new version of the remix-forms npm package. An agent skill from seasonedcc/remix-forms.
shenjingnan/xiaozhi-client
分析当前分支 git 改动,检查 e2e 测试用例覆盖情况,并可补充缺失的测试用例. An agent skill from shenjingnan/xiaozhi-client.
shenjingnan/xiaozhi-client
GitHub 评论修复技能,用于获取 PR 的 Copilot 评论并分析修复问题. An agent skill from shenjingnan/xiaozhi-client.
shenjingnan/xiaozhi-client
文档自动生成
shenjingnan/xiaozhi-client
CI检查验证和质量保障
shenjingnan/xiaozhi-client
生成代码评审友好的 commit 信息
shenjingnan/xiaozhi-client
开发流程检查技能,确保代码修改后执行必要的质量检查
Categories
Run `npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a claude-code`. Or copy the skill folder (.agents/skills/issue-hunter in shenjingnan/xiaozhi-client) into .claude/skills/issue-hunter in your project. Claude Code loads it when a task matches its description.
Run `npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a codex`. Or copy the skill folder (.agents/skills/issue-hunter in shenjingnan/xiaozhi-client) into .agents/skills/issue-hunter in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add shenjingnan/xiaozhi-client --skill issue-hunter -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/issue-hunter, .gemini/skills/issue-hunter, .github/skills/issue-hunter and .opencode/skills/issue-hunter in your project.
Going by SKILL.md and its folder, Issue Hunter needs the command-line tools its instructions call (pnpm and gh).
SKILL.md contains no URLs. Its commands use gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Issue Hunter is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Issue Hunter: Verdaccio Pull Request Workflow (verdaccio/verdaccio, 18k stars), Verdaccio PR Review (verdaccio/verdaccio, 18k stars), Difit Review (yoshiko-pg/difit, 3.2k stars) and ZCF Release Automation (UfoMiao/zcf, 6.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
shenjingnan (a GitHub user) maintains it in shenjingnan/xiaozhi-client, which has 341 GitHub stars. The repository holds 16 skills in this directory. The repository was last updated on September 3, 2026.
Source: shenjingnan/xiaozhi-client on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.