Feature 立项、讨论、完成的全生命周期管理。 Use when: 开个新功能、new feature、F0xx、立项、feature 完成、验收通过、讨论新功能需求。 Not for: 代码实现、review、merge(那些有专门的 skill)。 Output: Feature 聚合文件 + BACKLOG 索引 + 真相源同步。
71
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
管理 Feature 从诞生到收尾:立项建追溯链、讨论沉淀决策、完成闭环同步。
Feature vs Tech Debt:operator能感知变化 → Feature;只有开发者知道 → Tech Debt。不确定先记 TD。
追溯链架构:ROADMAP.md(热层)→ docs/features/Fxxx.md(温层,唯一入口)→ feature-discussions/research/plans(冷层)
演化关系:Evolved from(功能演进)/ Blocked by(硬依赖)/ Related(松耦合)
触发:operator说"新功能"/"立项"、讨论收敛确认要做。不触发:还在探索 → collaborative-thinking Mode A;小修补 → TD。
加载本 skill 后、动手前,先用记忆系统搜一下相关上下文:
search_evidence("{feature关键词}") # 找相关 feature / ADR
search_evidence("{topic}", scope="all") # 找历史讨论 + thread为什么:防止重复造轮子、重蹈覆辙。记忆系统索引了 400+ docs + 所有 thread 摘要。
分配 F 编号前,先跑关联检测,防止重复立项或把子任务误立为独立 feature:
grep -i "{关键词}" docs/ROADMAP.md docs/features/*.md(或用 search_evidence 替代 grep)| 判定结果 | 处置 |
|---|---|
| 已有 Feature 的子任务/phase | 不立新号,挂到现有 Fxxx 下,issue 加 related: Fxxx |
| 已有 Feature 的相关需求 | 标记 related: Fxxx,由 maintainer 决定合并还是独立 |
| 全新独立需求 | 继续走 Step 1 分配 F 号 |
| 太小 / 纯 enhancement | 不立项,保留 enhancement 标签,不给 F 号 |
community_issue: #{issue号} 字段教训(F114/F115/F116 事故):批量打标签 ≠ 审核通过。每个 issue 必须逐个过关联检测。
5 步流程:
分配 ID:grep -E "^\| F[0-9]+" docs/ROADMAP.md | tail -1,新 ID = 最大 + 1,三位数
创建聚合文件 docs/features/Fxxx-name.md(kebab-case 文件名)
从标准模板创建:复制 cat-cafe-skills/refs/feature-doc-template.md 中「模板正文」部分,替换占位符({NNN}/{Feature Name}/{YYYY-MM-DD} 等)。模板包含 Dashboard parser 所需的全部硬性格式。
轻量 Feature(≤1 Phase)可省略 Timeline/Review Gate/Links/Key Decisions,但 Frontmatter + Status 行 + Why + Current State + What + User Journey(或 user_journey_exempt)+ AC + Dependencies 必须保留(全新能力的 Current State 写 "N/A(无既有基线)",不是删段)。
并在 spec 中补一节:## 需求点 Checklist(模板见 cat-cafe-skills/refs/requirements-checklist-template.md)
F244 Tips Contribution:若 feature 有用户可见能力/工作流变化,在 spec 中保留 ## Tips Contribution(F244):
tips_exempt: {reason}(仅纯内部重构/无用户可感知变化)。更新 ROADMAP.md:末尾加 | F042 | 名称 | spec | Owner | {source} | [F042](features/...) |
internal(内部立项)或 community [#xx](url)(社区 issue 立项,附链接)关联文档:Links 章节列出相关 research/discussion;更新这些文档的 feature_ids: [F042]
Commit:docs(F042): kickoff {名称} [{猫猫签名}],body 含 What/Why
创建毛线球任务(F160 Phase C):立项 commit 后,调用 cat_cafe_create_task 为当前 thread 创建跟踪任务:
完成 F{NNN}: {Feature 名称}Gotcha: 只在有 threadId 的会话中创建。operator在非 thread 环境立项(如 BACKLOG 批量整理)时跳过此步。
为什么:F216 立项 Why 写"降 complexity",AC 却落成"修 bug + 可测性",两者执行中悄悄分叉,直到 close 前愿景守护才发现 gap。根因是立项时愿景表述不够硬 + 交接丢上下文(operator 2026-06-02)。这是 LL-067(后半段被前半段工程量吃)/ LL-069(scope 跟"自我解读"走不跟 spec 走)在立项时刻的前置防线——审计时才抓分叉太晚,立项就钉死。
Step 2 写完 spec,Why / 现状 / AC 逐条过这道自检:
| 维度 | 硬要求 | 反模式(F216 踩过) |
|---|---|---|
| 愿景 Why | 用价值语言一句话说清要解决什么 | 用"技术动作"冒充愿景("重构 X" ❌;"X 每加功能就 7 轮 review" ✅) |
| 真实现状 | 带实测证据(complexity / 行数 / 复现 / hotfix 频次),不美化 | "感觉这块乱"(给数据不给感觉,feedback_no_classifier) |
| 完成判据 AC | 每条能 trace 回 Why + 非作者可复核(命令/数字/截图) | 重构类 AC 落成"提了可测性就算"(F216 AC-B2:complexity 没降也宣布达成) |
两条硬规则:
承载点:现状写进模板 ## Current State / 现状基线 段;AC↔Why 自检见模板 ## Acceptance Criteria 段顶部 comment(均在 feature-doc-template「模板正文」内,随复制进入新 spec)。自检不过 → 回 Step 2 改 spec,不进 Step 3。
检查:聚合文件创建 ✓ frontmatter 完整 ✓ BACKLOG 索引 ✓ 关联文档双向链接 ✓ 愿景硬度自检 ✓ 已 commit ✓ 毛线球任务创建 ✓
LL-071 起源:内容生产任务(视频 / PPT / 系列产出)同样有 lifecycle,但不一定进 feat 体系(shared-rules §21)。
适用:批量产出消耗显著成本(token / API 抽卡)或铺设技术路线,且 operator 决定不开 F 号(挂 story / IP / 项目目录)。
锚点形态:项目目录里的 charter 文档,结构学 feat doc(范例:docs/videos/cucu-pr-flow/episode-brief.md):
cvo_signoff 字段记日期与原话)superseded + 指针,保留为历史不篡改与正式 feat 的区别:无 F 号、无 BACKLOG 索引、无 Design Gate 仪式——但 scope 纪律同强度。
选型:改产品代码 / 对外契约 → 正式 feat;内容产出 / 能力验证 → operator 选轻量 charter 或 feat。拿不准 → 问一句,别替 operator 决定。
两种模式:
采访式(默认):operator口述 → 一次一问澄清("为什么要?现在怎么做?做完后怎么用?")→ 排优先级 → 记开放问题。Anti-anchor:先让operator表达完,再分析。
开放讨论:多猫协作。结构:背景 + 我的分析(仅供参考,先自己想再看)+ 开放问题(按角色分组)+ 我的倾向(透明推理链)。明确标"这是讨论不是任务",保护观点独立性。
讨论结束必须做:
feature-discussions/YYYY-MM-DD-{topic}/README.md(含operator experience、决策过程、优先级排序)## User Journey 段。讨论落盘 ≠ spec 记录——reviewer 冷启动读 spec,不读 discussion 记录。docs: {topic} discussion + backlog update [{猫猫签名}]Discussion → writing-plans 之间的必经关卡。UX 没确认,不准开 worktree。User Journey 没落盘,不准过 Design Gate。
按功能类型分流确认:
| 类型 | 判断标准 | 确认人 | 方式 |
|---|---|---|---|
| 前端 UI/UX | 用户能看到的改动 | operator | wireframe → operator OK 后继续 |
| 纯后端 | API/数据模型/内部逻辑 | 其他猫猫 | collaborative-thinking 讨论达成共识 |
| 架构级 | 跨模块、新基础设施 | 猫猫讨论 → operator拍板 | 先出方案再上报 |
| Trivial | ≤5 行、纯重构、文档 | 跳过 | 跳过 Design Gate,按 SOP 例外路径判断 |
前置检查(F086 M2): 开 Design Gate 前,先做触发器 E "新领域侦查":
docs/features/README.md 找相关 Featurefeature-discussions/ 看有没有前人讨论过类似问题详见 shared-rules.md §13 元思考触发器。先搜现状,再开讨论。
User Journey 前置门禁(F252 教训)🔴:
涉及用户可感知变化的 Feature,Design Gate 前 spec 的 ## User Journey 段必须已落盘,否则 Design Gate 不放行。
| 检查项 | 必须 | 说明 |
|---|---|---|
## User Journey 段存在 | ✅ | 非 exempt feature 不能缺段 |
Primary Journey 有 Scope unit | ✅ | 防 F252 的 session/thread/feature 搞混 |
| Flow 用用户语言 | ✅ | "点击 thread 标题看回放",不是"调用 StoryPlayer.replay()" |
| operator口述期望已回填 | ✅ | Discussion 落盘 ≠ spec 记录(F252 直接原因) |
| 非用户可感知 | — | 写 user_journey_exempt: {reason},不能靠缺段默认跳过 |
架构归属一问(F191)🔴:
每个非 trivial Feature 在 Design Gate 必须能用一句话回答:
Architecture cell: {ownership cell id}
Map delta: none | update required | new cell required
Why: 一句话Architecture cell 来自 docs/architecture/ownership/README.md;普通增量默认引用已有 cell。Map delta: none = 本次只扩展现有边界,不改 ownership map,也不重新画架构图。Map delta: update required = 本次改变 owner / boundary / extension point / canonical anchor,先改对应 cell。Map delta: new cell required = 找不到归属;这不是回去填表,而是 Phase 0 架构发现未完成。答不出来 → Design Gate 不放行。禁止用新 Feature 私造 Store / Queue / Router / Adapter 来绕开已有 cell。
Eval Contract 门禁(F192)🔴:
harness / skill / MCP / shared-rules 类 feature 的 spec 必须含 ## Eval / Tracking Contract 节,否则 Design Gate 不通过。
触发条件(判断标准:改动会改变猫猫行为模式 → 填):
不触发:typo / wording 微调 / 纯重构(行为不变)/ 文档补充
4 项必填(模板见 (internal reference removed)):
Harness 方法论教学(F218 / ADR-031)🔴:
凡是 harness / skill / MCP / shared-rules / SOP / L0 等会改变猫猫行为模式的 feature,Design Gate 必须写出 软+硬+eval 三层计划;不是每层都要很重,但漏掉任何一层都要说明理由。
| 层 | 承重 | 常见载体 |
|---|---|---|
| Soft | 让猫在正确认知路径上想起该动作 | L0 触发句 / skill description / SOP 教学 |
| Hard | 不靠自觉也能挡住或暴露错误 | test / linter / schema / runtime guard / compile gate |
| Eval | 持续检验这条 harness 是否真的让行为变好 | F192 fixture / regression case / friction metric / sunset signal |
一句话判断:只写 Soft = 希望猫下次记得;只有 Soft + Hard = 修了但不知道会不会长期有效;Soft + Hard + Eval 才是 ADR-031 的完整 harness loop。
在地设计检查 (Design in Context) 🔴:
凡是改动或往已有页面/组件添加新 UI 元素,必须逐项过 cat-cafe-skills/refs/design-in-context-checklist.md。禁止在真空中凭想象画已有页面的布局。
现场可感知性自检 (In-context Observability) 🔴:
核心铁律:统计是事后审计,现场可感知性是第一入口。
凡是涉及 agent 状态 / runtime failure / 后台任务 / auth & degradation / diagnostics / health & status / 跨猫协作可见性 的 feature,必须逐项过 cat-cafe-skills/refs/in-context-observability-checklist.md,并在 Design Gate 讨论文档里产出 in_context_observability 决策字段(primary_surface / why_not_dashboard_only / deep_dive_surface / noise_dedup_policy)。缺字段 = Design Gate 不放行。
类比范式:memory entity 自带状态、browser-preview 把页面端上桌——entity carries its own state, surface it where it happens。反面:Datadog/前 agent 时代的 stats dashboard,等用户主动切到 tab 才看到数字 +1。
来源:F174 callback auth lifecycle D2b 实战收敛(2026-04-25,operator experience"新时代的明厨亮灶")。
流程:
collaborative-thinking → 拉相关猫讨论 API 契约/数据模型refs/decision-matrix.md)→ operator拍板feature-discussions/{date}-{fid}-design/Design Gate OQ 升级规则:先判断可逆性维度(见 refs/decision-matrix.md)——回滚成本低+不碰愿景/安全/外部契约/显著成本 → 猫猫自决,不升级 operator。需要升级时,OQ 必须用 Decision Packet 格式,不能只列"模糊问题清单"。
元审美自检(Design Gate 必问,F163 教训 + F167 Round 4 canon 化)🔴
这个方案是坐标变换(改变问题结构,让复杂度消失)还是多项式堆项(在现有结构上叠补丁/层数/脚手架)? 后者 → 先读 Meta-Aesthetics canon(数学美学 / 第一性原理 / 拒绝脚手架),尝试找到更简的分解方式。删掉它不影响安全/可验证性/权限边界,才是多余。 审计未通过 → 回到 Kickoff 或重新设计。
大 scope feature 每个 Phase merge 后,主动和operator碰头(不是问"要不要继续",是确认方向):
小 Feature(1-2 Phase)跳过碰头,直接做到底。
触发:AC 全部打勾 + PR 合入 + remote review 通过。不触发:只是 Phase 完成 / 只是 review 过了。
⚠️ Phase 级进度由 merge-gate Step 7.5 实时同步:每次 PR merge 后,merge-gate 负责更新 Phase ✅、AC 打勾、Timeline 记录。Completion 阶段不需要补这些——它们应该已经是最新的。如果发现 Phase 状态落后于实际 commit,说明之前 merge 时漏了 Step 7.5。
🔴 交付物核实铁律(LL-029):spec checkbox 是记录工具,不是真相源。声称"完成"或"未完成"前,必须核实实际 commit/PR 状态(git log --grep + gh pr list)。只读 .md 就下结论 = 睁眼说瞎话。
Step 0: 愿景对照(必须先做,不可跳过)🔴
AC 全打勾 ≠ 完成(F041 教训:12 项 AC ✅ 但 UI 不可用)。先读原始 Discussion/Interview,自问三个问题:① operator最初要解决的核心问题?② 交付物解决了吗?③ operator用这个功能体验如何?
User Journey 逐步验收(F252 教训)🔴:
涉及用户可感知变化的 Feature,愿景守护时必须按 spec 的 User Journey 逐步走一遍:
project-evidence/)User Journey 验收表(守护猫必须输出):
| Journey | 步骤 | Spec 描述 | 实际行为 | 截图 | 匹配? |
|---------|------|-----------|---------|------|--------|
| Primary | Step 1 | "从 thread 列表点击回放" | [截图] | evidence/... | ✅/❌ |愿景守护证物对照表(F114 Gate — 缺表 = BLOCKED):
守护猫必须输出以下格式的对照表,否则 BLOCKED,不放行:
| operator experience(逐字引用) | 当前实际状态(截图/代码/命令输出) | 匹配? |
|----------------------|-------------------------------|--------|
| "把旧 mode 删掉" | [截图: mode 入口已无旧选项] | ✅ |
| "狼人杀加到 mode 里" | [截图: mode 入口有狼人杀] | ✅ |BLOCKED 条件(任一触发 → 不放行):
跨猫交叉验证(强制,F073 自动化):
自己先完成三问 + 对照表 → 自动 @ 其他猫请求独立愿景守护(不要等operator提醒,直接 @)→ 收到结论 → 对齐 → 填签收表(猫猫 / 读了哪些文档 / 三问结论 / 对照表 / 签收)→ 全部对齐后继续 Step 1。
愿景守护猫选择(不能 hardcode!):
守护猫 ≠ 作者 且 ≠ reviewer
选法:查 cat-config.json roster → 排除作者 catId + reviewer catId → 剩余猫中选一只| 作者 | Reviewer | 守护猫 |
|---|---|---|
| 猫 A | 猫 B | roster 中排除 A 和 B,优先跨 family |
守护猫负责:愿景三问 + 不满足则踢回修改 + 满足则放行 close。
🔴 Step 0.3.5: User Visibility Disclosure(F190 Phase C post-close 教训 2026-05-13)— 守护猫审查前置输入
愿景三问之前,作者必须产出 User Visibility Disclosure 表,把"技术决策"翻译成"用户可见性"语言:
| Surface | 用户能做什么(达成态) | 用户实际能做什么(本 feat close 时) | 缺失/退化 | 处置 |
|---|---|---|---|---|
| 例: 通知页 | 配 VAPID 公私钥 + 一键生成 + 联系信箱 | 看诊断矩阵 + 修复建议(read-only) | 完全丢失写能力 | deferred to Phase D / operator signoff: thread ... |
Inbound intake 类 feature 必须额外含:开源 vs 本地 visual side-by-side screenshots(每个 settings section / 主要 surface 各一对),不能只看"组件 wire 了没"。
Deliberate defer 必须 operator signoff——operator 在 thread 里显式确认"接受这个 deferred surface 不在本 feat 内交付"才能 close;否则按"漏"处置,必须实做或开 follow-up F 号继续。
守护猫先审 Disclosure 才能做愿景三问。看到 deferred 字样直接拷问:"这个 deferred 用户能感知到吗?operator signoff 在哪?"
事故来源:F190 close 时 settings/ 缺 7 个开源 components,operator 完全不知道"通知页变成诊断矩阵"——技术决策语言"deferred"没有映射到用户可见性。详见 (internal reference removed)。
🔴 守护猫提的 P1 = blocker,作者不能 self-resolve(2026-04-26 教训)
历史踩坑:F173 close 时把没完成的 AC-B2 (handler unification) 抽出去开 F177 stub spec 当作"follow-up anchor"应付守护猫的 P1,本质是把"没完成"藏进新文件后宣布闭环(debt = never,TD = never,stub = never,都是话术包装)。
反 anti-pattern 检查(守护猫和作者都要查,operator最终把关):
作者反问自己(close 前必查):
守护猫反问作者(看到 deferred / follow-up / stub anchor 字样直接拷问):
不能给"几个选项让operator选"——这是反问式 ping,把判断推回去。作者必须先有立场再 @ operator。
前端 UI/UX 额外要求:≤3 张截图 + 15s 录屏 + "需求→截图"映射表。
Step 0.5: 反思胶囊(F086 M3)🔴
愿景对照 + 跨猫验证之后、AC 打勾之前,写一个反思胶囊:
project-reflections/README.md 复制模板project-reflections/YYYY-MM-DD-{topic}-capsule.md不能跳过:每个 milestone/feature 完成都要写。没有就写"无",不允许省略章节。
Step 0.6: Harness Eval Checkpoint(F192 Phase A)🔴
反思胶囊之后、Close Gate Report 之前,判断是否需要 harness-level 评估。Checkpoint 必做,但不一定每次都展开——大多数 feature 写 harness_feedback: none 即可。
触发条件(任一满足 → 必须展开写 harness-feedback 文档):
| 触发 | 说明 |
|---|---|
| Harness / skill / MCP feature close | harness 自身变化必须评估 fit |
| operator 不满意 / "不是我要的" | 需要分清 vision gap / translation gap / harness misfit |
| Trace anomaly(重复 tool call、handoff 断链、长时间无 tool call) | trace 只能给 what,猫解释 why |
| 抽样(normal feature close) | 防止只看失败样本 |
未触发时:在 CloseGateReport 中写 harness_feedback: none | reason: {简短理由}。
触发时:
docs/harness-feedback/YYYY-MM-DD-Fxxx-{topic}.md 创建 harness-feedback 文档(schema 见 docs/harness-feedback/README.md)evidence_refs 指向 canonical trace/thread/session,不复制 raw tool-call payloadStep 1: Close Gate Report(F177 Phase A)🔴
输出 CloseGateReport(schema 见 cat-cafe-skills/refs/close-gate.md)——逐条列明每个 AC 的证据和处置:
AC-A1 ✅ met — commit abc123 + test_xxx
AC-A2 ✅ met — screenshot_yyy + PR #1234
AC-A3 ❌ unmet → immediate(现在做完)
AC-A4 ❌ unmet → cvo_signoff(msg:0001777429xxx) — "ok 接受降级"
AC-A5 ❌ unmet → delete(why: 经评估不属于 MVP scope)unmet AC 只有三条路,没有第四选项:
以下不是合法路径:follow-up / deferred / next phase / P2 / stub / TD / 后续 / 留个尾巴 / 先这样 / 下次一定 / 回头 / 以后再 / next PR / will address later
缺 CloseGateReport = 不能 close。自由文本"我都做了"不算。
Step 2: 聚合文件 → Status: done,加 Completed: YYYY-MM-DD,Timeline 加收尾记录
Step 3: 演化关系 — 确认 Evolved from 填写;考虑"往哪去":有明确后续 → 触发 kickoff 立项
Step 4: 从 docs/ROADMAP.md 移除该行;docs/features/README.md 加入"已完成"表格(聚合文件永久保留,不删)
Step 5: 真相源同步 — 所有关联文档 feature_ids 正确;Links 章节无遗漏
Step 5.5: Feature truth close evidence(F253 教训)🔴
在 Status→done、BACKLOG 移除、README completed、reflection、CloseGateReport 全部写完后,必须运行:
pnpm check:featuresPASS check-feature-truth 是 feature close 的硬证据;失败则不能 close,先修真相源再提交。尤其要防:
[backlog-active] BACKLOG contains Fxxx, but all records are done:Step 4 漏移除 BACKLOG[backlog-missing] Active feature Fxxx is missing from BACKLOG:active/done 状态和热层不一致[doc-status-drift]:Status 行和 Timeline merged 记录互相打架不要自动改 BACKLOG:BACKLOG 是手写策展热层,机器只能报错,不能替猫判断 done/active。check-feature-truth 已经每次从 feature docs fresh-generate index 到 tempdir;不需要额外"自动重生成 index"兜底。
暂不做 diff-scope 降级:feature truth 红灯代表共享真相源会误导所有猫,优先全局修正;若未来 unrelated blocker 成本持续过高,再单独评估 per-feature close checker 或 owner 指针,不在 close 流程里静默放过红灯。
Step 6: Commit:docs(Fxxx): mark feature as done [{猫猫签名}],body 含 What/Why/Evolved from + pnpm check:features PASS 摘要
| 阶段 | 关键动作 | 文件 |
|---|---|---|
| Kickoff | 分 ID → 聚合文件 → BACKLOG → 双向链接 | docs/features/Fxxx.md |
| Discussion | 采访/开放 → 落盘 → BACKLOG ref | feature-discussions/ |
| Design Gate | 分流 → 确认(UX→operator/后端→猫猫/架构→两边) | feature-discussions/{date}-{fid}-design/ |
| Completion | 愿景对照 → 跨猫验证 → 更新状态 → 移出 BACKLOG → pnpm check:features PASS | docs/features/Fxxx.md |
| 错误 | 正确 |
|---|---|
| 完成后才补聚合文件 | Kickoff 时就建 |
| AC 打勾就标 done,不读原始需求 | Step 0 愿景对照(F041 教训) |
| 自己验完就收尾 | 跨猫交叉验证是强制的 |
| 删了聚合文件 | 只从 BACKLOG 移除,聚合文件永久保留 |
| 不记录演化关系 | Completion Step 3 必须思考 |
| 讨论完不落盘 | 讨论结束写入 feature-discussions/ |
| 等operator手动协调跨猫守护 | 自己 @ 其他猫发起守护(F073) |
| 每步停下来问operator"可以继续吗?" | 全链路自驱,只在阻塞/close 时通知operator |
| 只看 spec checkbox 就声称完成/未完成 | 核实 git log + PR 状态 + 实际 commit(LL-029) |
| UX 没确认就开 worktree 写代码 | 先过 Design Gate 再动手 |
| 后端 API 自己拍板不跟其他猫讨论 | 纯后端走 collaborative-thinking 拉猫讨论 |
| 等 feat close 才补 Phase 进度 | merge-gate Step 7.5 每次 merge 实时同步(Phase ✅ + AC + Timeline) |
| 社区 issue 批量打 feature 标签不逐个审核 | 每个 issue 必须过 Step 0 关联检测(F114/F115/F116 教训) |
| 社区 feature 只在开源仓打标签,BACKLOG 不同步 | ROADMAP.md 必须同步加 Source=community 条目 |
| Status 标 done 后没跑 feature truth gate | close 前必须跑 pnpm check:features,PASS 才能提交 |
writing-plansquality-gate → [fresh-context-review] → request-reviewmerge-gate(合入)→ 回来用 completion 闭环collaborative-thinking Mode C(沉淀 ADR/规则/教训)80782c5
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.