conport
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseConPort — Project Management System
ConPort — 项目管理系统
ConPort stores everything about the project: tasks, documents, decisions, infrastructure. Without init, context is unavailable. Without search, you are answering blindly.
This skill carries the always-on discipline — what you must do every session
regardless of topic. Deep, situational reference (recipe semantics, the gap
system, the semantic pass, the full per-tool parameter tables, the block model,
the documentation-graph callout reference, the spec append-only rationale) lives
in the live docs — see the Live docs section below. Fetch the relevant
page before acting on one of those topics; don't act from memory.
**ConPort 存储项目的所有信息:**任务、文档、决策、基础设施。 **未执行init则无法获取上下文。**未进行搜索就盲目作答是不可取的。
本技能遵循全程执行规范——无论会话主题是什么,你在每次会话中都必须执行这些操作。深度场景参考(配方语义、缺口系统、语义扫描、完整工具参数表、块模型、文档图谱标注参考、规范追加-only理由)都存放在实时文档中——请参阅下方的「实时文档」部分。在处理这些主题之前,请先获取相关页面内容;不要凭记忆操作。
MCP Prefix
MCP 前缀
| Environment | Prefix |
|---|---|
| Claude Code CLI | |
| Claude.ai Chat | |
| 环境 | 前缀 |
|---|---|
| Claude Code CLI | |
| Claude.ai Chat | |
FIRST ACTION OF THE SESSION
会话的第一个操作
Step 1: Determine the project name
步骤1:确定项目名称
Claude Code CLI — the env var is already available (from ).
If it's not set, fall back in this priority order:
CONPORT_PROJECT_NAME.claude/settings.local.json- Git remote — extract the repo name (last segment of the URL without )
.git - Directory name — basename of the current working directory
Claude.ai Chat — ask the user (the file system is not available).
Claude Code CLI — 环境变量 已可用(来自 )。
如果未设置,则按以下优先级顺序获取:
CONPORT_PROJECT_NAME.claude/settings.local.json- Git远程仓库 — 提取仓库名称(URL的最后一段,不含 )
.git - 目录名称 — 当前工作目录的基名
Claude.ai Chat — 询问用户(无法访问文件系统)。
Step 2: Call init
步骤2:调用init
mcp__conport__init({
name: "<detected_name>",
skill_id: "conport",
skill_version: "<metadata.version from this SKILL.md frontmatter>", // substitute the real value; never send this placeholder
client_type: "claude-code" // or claude-ai / cursor / codex
})skill_idskill_versionclient_typeclient_typeIf auto-detection of the project name did not work, ask the user.
mcp__conport__init({
name: "<detected_name>",
skill_id: "conport",
skill_version: "<metadata.version from this SKILL.md frontmatter>", // 替换为实际值;请勿发送此占位符
client_type: "claude-code" // 或 claude-ai / cursor / codex
})skill_idskill_versionclient_typeclient_type如果自动检测项目名称失败,请询问用户。
After init — MANDATORY:
执行init后——必须完成:
-
Print summary:
[CONPORT] {summary from response} -
Execute instructions from the response (read files, apply rules)
-
Report backlog:— use
N tasks in TODO, M in progress. Top 5:from the response. Line format:backlog.top, skippingPk · #id title (n subtasks)when zero.(n subtasks)isPk. Skip the whole block ifeffective_priorityandbacklog.total_todo == 0.backlog.total_in_progress == 0 -
Report the roadmap: when the response carriesand/or
roadmap, print them in the format given under OUTPUT FORMAT → Roadmap sections. Both sections are omitted when the project has nothing to show — then print nothing.epic_tails -
If the project is empty (no decisions, no patterns, empty) — offer the bootstrap flow from
product_context.references/bootstrap.md -
Ifis present in the response — surface it to the user and offer to accept (
routine_suggestion, e.g. with theset_routine_config(...)) or dismiss permanently (suggested_config).set_routine_config(enabled=false) -
Ifis present in the response — emit ONE short notice at the very start of your first reply (after the
skill_update_availableline). Format:[CONPORT][SKILL UPDATE] {skill_id} {current} → {latest} ({severity}). Changelog: {changelog_url} · Install: {install_guide}- When — phrase as
current == "unknown".cannot determine version, see {install_guide} - When — emit a stronger line (
severity == "security") and recommend updating before proceeding.[SECURITY UPDATE] - Do NOT re-emit the notice in subsequent turns — once per session.
Never decide "is there an update" by hand-comparing version numbers. The conport plugin (this skill + superpowers-conport + plugin.json + marketplace) versions independently from, which is a separate privately-distributed unit with its own version line. Numbers from different units are NOT comparable. The ONLY correct signal isconport-agentabove: present → update; absent → you're current. If you catch yourself reasoning "my number looks higher than that other unit's, so I'm ahead" — stop, that's the exact mistake this signal prevents.skill_update_available - When
Save-first. Save decisions () and progress ()
as they happen, not in a batch at the end of the session. The moment a choice is
made or a step is finished, persist it — saving at the end loses rationale and
an interrupted session leaves nothing behind. (Live docs → .)
sync_decisionlog_progresscore/save-firstWithout init you cannot: answer questions about the project or work with tasks.
Ignoring instructions is FORBIDDEN.
-
打印摘要:
[CONPORT] {summary from response} -
执行响应中的指令(读取文件、应用规则)
-
报告待办事项:— 使用响应中的
N tasks in TODO, M in progress. Top 5:。格式:backlog.top,当子任务数为0时省略Pk · #id title (n subtasks)。(n subtasks)为Pk。如果effective_priority且backlog.total_todo == 0,则跳过整个块。backlog.total_in_progress == 0 -
报告路线图: 当响应包含和/或
roadmap时,按照「输出格式 → 路线图部分」给定的格式打印。如果项目没有相关内容,则省略这两个部分——此时无需打印任何内容。epic_tails -
如果项目为空(无决策、无模式、为空)——提供
product_context中的引导流程。references/bootstrap.md -
如果响应中存在— 向用户展示该建议,并提供接受(
routine_suggestion,例如使用set_routine_config(...))或永久拒绝(suggested_config)的选项。set_routine_config(enabled=false) -
如果响应中存在— 在你的第一条回复最开始(
skill_update_available行之后)发出一条简短通知。格式:[CONPORT][SKILL UPDATE] {skill_id} {current} → {latest} ({severity}). Changelog: {changelog_url} · Install: {install_guide}- 当 — 表述为
current == "unknown"。无法确定版本,请查看 {install_guide} - 当 — 发出更醒目的提示(
severity == "security"),并建议在继续操作前进行更新。[SECURITY UPDATE] - 请勿在后续对话中重复发出该通知——每个会话仅发送一次。
请勿手动比较版本号来判断「是否有更新」。 conport插件(本技能 + superpowers-conport + plugin.json + marketplace)的版本与独立,后者是单独私有分发的单元,有自己的版本线。不同单元的版本号不可比。判断是否需要更新的唯一正确信号是上述的conport-agent:存在则更新;不存在则当前版本为最新。 如果你发现自己在想「我的版本号看起来比其他单元的高,所以我是最新的」——请停止,这正是该信号要避免的错误。skill_update_available - 当
优先保存。 及时保存决策()和进度(),不要在会话结束时批量保存。一旦做出选择或完成某个步骤,就立即持久化——在结束时保存会丢失理由,中断的会话也会留下空白。(实时文档 → 。)
sync_decisionlog_progresscore/save-first未执行init则无法: 回答关于项目的问题或处理任务。
禁止忽略指令。
WORKFLOW — When to call which tool
工作流程——何时调用哪个工具
The at-a-glance trigger → tool map. Each table is navigational; for the deep
semantics of a surface, fetch the live-docs page named in the table.
以下是一目了然的触发条件→工具映射表。每个表格仅用于导航;如需了解工具的深层语义,请获取表格中指定的实时文档页面。
Planning
规划
| Trigger | Tool |
|---|---|
| "We need to do X" | |
| "X depends on Y" | |
| "Create an epic" / multi-step body of work | |
| "Break it into subtasks" | |
| "Move task X under epic Y" / re-parent | |
| "Roadmap" / "milestones" / "what ships in the release" | |
| "Plan a milestone / a release" | |
| "Rename / move / close a milestone" | |
| "This epic belongs to milestone M" | |
| "Promote this task to an epic" | |
| "Demote this epic to a task" | |
| Need a task in another project I own (no context switch) | |
| 触发条件 | 工具 |
|---|---|
| "我们需要做X" | |
| "X依赖于Y" | |
| "创建一个史诗" / 多步骤工作体 | |
| "将其拆分为子任务" | |
| "将任务X移至史诗Y下" / 重新指定父任务 | |
| "路线图" / "里程碑" / "版本发布内容" | |
| "规划里程碑/版本发布" | |
| "重命名/移动/关闭里程碑" | |
| "此史诗属于里程碑M" | |
| "将此任务升级为史诗" | |
| "将此史诗降级为任务" | |
| 需要在我拥有的另一个项目中创建任务(无需切换上下文) | |
Execution
执行
| Trigger | Tool |
|---|---|
| Starting work | |
| Done / Finished | |
| Cancelled | |
| Blocked | |
| Milestone finished | |
| Milestone dropped | |
IN_PROGRESS gate. Before your first ConPort write against a task, move it to
IN_PROGRESS. This keeps accurate and the backlog honest.
current_focusAn epic closes only with its children closed — the server refuses
on an epic that still has open children with
, listing them. A snoozed child counts as open.
update_task(status='DONE')epic_not_readyEpic progress is counted ONLY from /
— never from a plan file's task list. A plan
document is a snapshot of the intent; the epic's children are the state. Every
write that touches a child ( under an epic, status or
re-parent, ) echoes — read that rollup, print it
per OUTPUT FORMAT, and when it says , close the epic with a
right then instead of leaving the tail to rot.
epic_progresslist_tasks(parent_task_id=…)add_taskupdate_taskdelete_taskepic_progressclosableresolutionClosing tasks — always pass :
On or , pass a argument with the verdict
(what was done / why cancelled). The server:
resolutionstatus=DONECANCELLEDresolution- Appends a section to the task's description (preserves the original spec verbatim).
## Resolution - Auto-creates a linked so the close shows up in
progress_entry,recent_activity, and search.list_progress
Do NOT call separately for task closes — that would
duplicate the entry. is for progress events that don't belong
to a single closing task (e.g. mid-implementation notes, infra changes).
log_progresslog_progressRoadmap discipline. A milestone is an ordered group of epics; the current
milestone is the open one with the smallest , and /
return it in the section.
sequenceinitget_agendaroadmap- Work the current milestone. In an interactive session, picking up work
that belongs to a later milestone needs an explicit decision by the
owner — say which milestone the work sits in and ask before starting; never
silently pull work forward because it looked convenient. Work attached to no
milestone () is not off-limits, but say so when you take it, so the owner can attach its epic to the roadmap or leave it aside deliberately. (An autonomous routine run has no owner to ask: the conport-routine skill overrides this rule with its own — unattached rows are fair game, later-milestone rows are not.)
milestone_id: null - Closing a milestone always carries — what was delivered (DONE) or why it was dropped (CANCELLED). The server logs a progress entry from it.
resolution - A release milestone () closes only after the release actually happened. "Every epic is DONE" is not a release; the resolution names the shipped version/artifact. If the release hasn't shipped, leave the milestone open and say so.
is_release=true - is a prescription, not an error to route around.
milestone_not_readyis refused while any epic of the milestone is open;update_milestone(status='DONE')lists exactly what to close first (an empty milestone is refused too — attach the epic that carries the work). Do the prescribed closes, then retry. Never CANCEL a milestone just to get past the refusal.context.open_epics
→ Deep detail: live docs .
projects/roadmap| 触发条件 | 工具 |
|---|---|
| 开始工作 | |
| 完成/结束 | |
| 取消 | |
| 阻塞 | |
| 里程碑完成 | |
| 里程碑取消 | |
IN_PROGRESS 门限。 在针对任务进行第一次ConPort写入之前,需将其状态改为IN_PROGRESS。这能保证 的准确性和待办事项的真实性。
current_focus仅当所有子任务关闭后,史诗才能关闭——如果史诗仍有未关闭的子任务,服务器会拒绝执行 ,并返回 ,列出未关闭的子任务。已暂停的子任务视为未关闭。
update_task(status='DONE')epic_not_ready史诗进度仅通过 /
统计——绝不能从计划文件的任务列表中统计。计划文档是意图的快照;史诗的子任务才是实际状态。每次修改子任务(在史诗下 、 状态或重新指定父任务、)都会同步 ——读取该汇总信息,按照「输出格式」打印,当显示 为true时,立即使用 关闭史诗,不要拖延。
epic_progresslist_tasks(parent_task_id=…)add_taskupdate_taskdelete_taskepic_progressclosableresolution关闭任务——必须传入 :
当设置 或 时,需传入 参数说明结果(完成了什么/为何取消)。服务器会:
resolutionstatus=DONECANCELLEDresolution- 在任务描述中追加 部分(保留原始规范内容)。
## Resolution - 自动创建关联的 ,以便关闭操作显示在
progress_entry、recent_activity和搜索结果中。list_progress
关闭任务时请勿单独调用 ——这会导致条目重复。 用于不属于单个关闭任务的进度事件(例如,实施过程中的笔记、基础设施变更)。
log_progresslog_progress路线图规范。 里程碑是一组有序的史诗;当前里程碑是 值最小的未关闭里程碑, / 会在 部分返回该里程碑。
sequenceinitget_agendaroadmap- 优先处理当前里程碑的工作。 在交互式会话中,若要处理后续里程碑的工作,需要所有者明确同意——说明工作所属的里程碑,并在开始前询问;绝不能因为看起来方便就擅自提前处理工作。未关联到任何里程碑的工作()并非不可处理,但在处理时需告知所有者,以便所有者将其史诗关联到路线图或故意留待以后处理。(自动例行运行时无所有者可询问:conport-routine 技能会用自己的规则覆盖此规则——未关联的任务可处理,后续里程碑的任务不可处理。)
milestone_id: null - 关闭里程碑时必须传入 ——说明交付内容(DONE)或取消原因(CANCELLED)。服务器会据此记录进度条目。
resolution - 发布里程碑()仅在实际发布后才能关闭。「所有史诗已完成」并不等同于发布;
is_release=true需指定发布的版本/制品。如果尚未发布,请保持里程碑为打开状态并告知用户。resolution - 是要求,而非需要绕过的错误。 如果里程碑下仍有未关闭的史诗,
milestone_not_ready会被拒绝;update_milestone(status='DONE')会列出需要先关闭的史诗(空里程碑也会被拒绝——需关联承载工作的史诗)。先完成要求的关闭操作,然后重试。绝不能为了绕过拒绝而取消里程碑。context.open_epics
→ 详细内容:实时文档 。
projects/roadmapPatterns
模式
| Trigger | Tool |
|---|---|
| "Show me the patterns" | |
| "Record a pattern" | |
| "Update / rename / re-tag a pattern" | |
| "What approaches do we use?" | |
| 触发条件 | 工具 |
|---|---|
| "展示模式" | |
| "记录模式" | |
| "更新/重命名/重新标记模式" | |
| "我们使用哪些方法?" | |
Search
搜索
| Trigger | Tool |
|---|---|
| Question about the project | |
| "What was decided about Y?" | |
| "Which projects do I own?" / bootstrapping without a known project_id | |
| 触发条件 | 工具 |
|---|---|
| 关于项目的问题 | 先执行 |
| "关于Y的决策是什么?" | 按主题 |
| "我拥有哪些项目?" / 未指定project_id时引导初始化 | |
Sync
同步
| Trigger | Tool |
|---|---|
| Technology choice | |
| Trade-off with rationale | |
| Read one decision's full body (id → tags + currency) before amending | |
| Amend / re-tag an existing decision | |
| Decision no longer holds, NO replacement | |
| Un-retire a decision | |
Decision candidates auto-extracted from | never committed directly — they wait in the proposals queue: |
| 触发条件 | 工具 |
|---|---|
| 技术选择 | |
| 带有理由的权衡 | |
| 修改决策前读取完整内容(id → tags + 有效性) | |
| 修改/重新标记现有决策 | |
| 决策不再适用,且无替代方案 | |
| 恢复已弃用的决策 | |
从 | 请勿直接提交——它们会在提案队列中等待: |
Progress
进度
| Trigger | Tool |
|---|---|
| Standalone progress note (not a task close) | |
| Closing a task | |
| Context has changed | |
| 触发条件 | 工具 |
|---|---|
| 独立进度记录(非任务关闭) | |
| 关闭任务 | |
| 上下文已变更 | |
Documentation
文档
| Trigger | Tool |
|---|---|
| Spec / API docs | |
| Wholesale body / metadata update | |
| List a doc's blocks (pick ulids before a surgical edit) | |
| Read / edit / insert / delete one block | |
| Read a doc (with rendered Wave 5 stubs) | |
| "Who references this doc/block?" | |
| "What's similar to this block but not yet linked?" | |
| Overlapping content / linking two docs | author one callout — |
Block-level editing is the default for any narrow change — including specs.
Use / / for surgical edits; only one
block re-embeds and the spec append-only invariant doesn't engage.
is the wholesale-rewrite channel.
update_blockinsert_blockdelete_blockupdate_document(content=...)Spec append-only invariant. on a body
requires : (clarification/typo — allowed, logged with a
mandatory ) or (a meaningful claim change — rejected;
author a new spec and link the old one with ).
Don't chain block edits to rewrite a spec's claims either.
update_documentdoc_type='spec'change_kindamendreasonsubstantivelink_items(relationship='supersedes')Don't create a doc when an edit will do. Never whose purpose
is to describe / amend / react to an existing doc — that accumulates synthesis
drift. Edit the original, or author an addendum with an explicit callout
( / ); default to
when unsure.
add_document> [!extends] [[doc-N]]> [!supersedes] [[doc-N]]> [!relates-to]→ Deep detail: live docs , ,
; full agent reference in
.
projects/block-modelprojects/spec-append-onlycore/documentation-calloutsreferences/documentation_graph.md| 触发条件 | 工具 |
|---|---|
| 规范/API文档 | |
| 批量更新内容/元数据 | |
| 列出文档的块(在精准编辑前获取ulids) | |
| 读取/编辑/插入/删除单个块 | |
| 读取文档(包含渲染后的Wave 5占位符) | |
| "哪些内容引用了此文档/块?" | |
| "哪些块与此块相似但尚未关联?" | |
| 内容重叠/关联两个文档 | 添加标注—— |
块级编辑是窄范围修改的默认方式——包括规范修改。使用 / / 进行精准编辑;仅修改一个块时不会触发规范追加-only规则。 是批量重写渠道。
update_blockinsert_blockdelete_blockupdate_document(content=...)规范追加-only规则。 对 的内容执行 时,需指定 :(澄清/拼写错误——允许,需提供必填的 )或 (有意义的声明变更——拒绝;需创建新规范并使用 关联旧规范)。也请勿通过多次块编辑来重写规范的声明。
doc_type='spec'update_documentchange_kindamendreasonsubstantivelink_items(relationship='supersedes')无需创建新文档时请勿创建。 若目的是描述/修改/回应现有文档,请勿使用 ——这会导致内容偏差。请编辑原始文档,或创建带有明确标注的补充内容( / );不确定时默认使用 。
add_document> [!extends] [[doc-N]]> [!supersedes] [[doc-N]]> [!relates-to]→ 详细内容:实时文档 , , ;完整代理参考见 。
projects/block-modelprojects/spec-append-onlycore/documentation-calloutsreferences/documentation_graph.mdRoutines (periodic backlog cycles)
例行程序(定期待办事项周期)
| Trigger | Tool |
|---|---|
| Starting a periodic cycle run | |
| "Set up / tune the cycle policy" | |
| Mark a task as agent-executable | |
| Finishing a run | |
| "Show recent runs" | |
| Calibrating before estimating tasks | |
| Picking unblocked work deep in the backlog | |
| Deferring a task to a date | |
→ Full runbook: the conport-routine skill; live docs .
projects/routines| 触发条件 | 工具 |
|---|---|
| 开始定期周期运行 | |
| "设置/调整周期策略" | |
| 标记任务为可代理执行 | |
| 完成运行 | |
| "展示最近的运行记录" | |
| 估算任务前校准 | |
| 从待办事项深处选择未阻塞的工作 | |
| 将任务推迟到指定日期 | |
→ 完整运行手册:conport-routine 技能;实时文档 。
projects/routinesContext assembly, gaps, semantic pass
上下文组装、缺口、语义扫描
| Trigger | Tool |
|---|---|
| "Open task #N and brief me" | |
| "Implementation status of spec doc-N?" | |
| "What recipes are available?" | |
| "Current architecture of subsystem X?" | |
| "Is this architecture doc safe to archive?" | |
| Init response shows gaps / "show all gaps" | review |
| "Clean up the graph" | |
| Manual semantic flow | |
start_id'<type>-<id>''task-271''doc-76'taskdocdecisionpatternprogress'[[task-271]]'→ Deep detail: live docs , ,
.
projects/context-recipesprojects/gapsprojects/semantic-pass| 触发条件 | 工具 |
|---|---|
| "打开任务#N并进行简报" | |
| "规范doc-N的实施状态?" | |
| "有哪些可用的配方?" | |
| "子系统X的当前架构?" | |
| "此架构文档是否可以安全归档?" | |
| Init响应显示缺口 / "展示所有缺口" | 查看 |
| "清理图谱" | |
| 手动语义流程 | |
start_id'<type>-<id>''task-271''doc-76'taskdocdecisionpatternprogress'[[task-271]]'→ 详细内容:实时文档 , , 。
projects/context-recipesprojects/gapsprojects/semantic-passTASK HIERARCHY (2 levels, schema-enforced)
任务层级(2级,架构强制)
The task tree is two levels and the database enforces it:
- — leaf node. May have
kind='task'pointing to an epic. Cannot have children.parent_task_id - — root container. Always
kind='epic'. Other tasks attach under it.parent_task_id=NULL
No third level. Trying to attach a task under another task (kind=task with kind=task parent) is rejected at the DB level. The MCP/REST layer maps the rejection to a structured payload with two recovery options.
parent_not_epic任务树为两级,由数据库强制实施:
- — 叶子节点。可设置
kind='task'指向史诗。不能有子任务。parent_task_id - — 根容器。
kind='epic'始终为NULL。其他任务可关联到其下。parent_task_id
不存在第三级。尝试将任务关联到另一个任务(kind=task的父任务为kind=task)会在数据库层面被拒绝。MCP/REST层会将拒绝转换为结构化的 负载,并提供两种恢复选项。
parent_not_epicRecovery: parent_not_epic
error
parent_not_epic恢复:parent_not_epic
错误
parent_not_epicWhen or returns:
add_task(parent_task_id=X)update_task(parent_task_id=X)json
{
"error": "parent_not_epic",
"message": "Cannot attach a task under task-X — a task can only have an epic as parent.",
"context": {
"intended_parent": {"id": X, "kind": "task", "title": "..."},
"resolved_epic": {"id": Y, "kind": "epic", "title": "..."}
},
"suggestions": [
{"action": "promote_parent", "call": "update_task(task_id=X, kind='epic')"},
{"action": "attach_to_epic", "call": "add_task(..., parent_task_id=Y)"}
]
}Decide by local context:
- promote_parent when X is itself a substantial body of work and the new task is a subtask of it → make X an epic, attach the new task under it.
- attach_to_epic when X is just another leaf inside an epic Y → attach the new task to Y as a sibling of X.
If is , only is offered — there's no ancestor epic in the chain.
resolved_epicnullpromote_parent当 或 返回:
add_task(parent_task_id=X)update_task(parent_task_id=X)json
{
"error": "parent_not_epic",
"message": "Cannot attach a task under task-X — a task can only have an epic as parent.",
"context": {
"intended_parent": {"id": X, "kind": "task", "title": "..."},
"resolved_epic": {"id": Y, "kind": "epic", "title": "..."}
},
"suggestions": [
{"action": "promote_parent", "call": "update_task(task_id=X, kind='epic')"},
{"action": "attach_to_epic", "call": "add_task(..., parent_task_id=Y)"}
]
}根据本地上下文决定:
- promote_parent — 当X本身是大量工作,且新任务是其子任务时→将X升级为史诗,将新任务关联到其下。
- attach_to_epic — 当X只是史诗Y下的一个叶子任务时→将新任务关联到Y,作为X的同级任务。
如果 为 ,则仅提供 选项——链中没有祖先史诗。
resolved_epicnullpromote_parentPromote / demote rules
升级/降级规则
- Promote →
task: task must be root (no parent). Combineepicwithkind='epic'in oneparent_task_id=0call to atomically detach + promote.update_task - Demote →
epic: epic must have no children. Close or reparent subtasks first.task
Cross-references stay for both kinds — epic is a subtype, not a separate namespace.
task-N- 升级 →
task:任务必须为根任务(无父任务)。在一次epic调用中同时设置update_task和kind='epic',实现原子化脱离+升级。parent_task_id=0 - 降级 →
epic:史诗必须无子任务。需先关闭或重新指定子任务的父任务。task
交叉引用对两种类型都使用 — 史诗是子类型,而非单独的命名空间。
task-NCROSS-REFERENCE FORMAT (canonical grammar)
交叉引用格式(标准语法)
Every reference to another ConPort item — in , ,
, document body, commit messages — uses the canonical form
.
summaryrationaledescription<type>-<number>Type vocabulary (lowercase): , , , ,
. No aliases (no , no , no ).
decisiontaskdocpatternprogressdocumenttasksdecForms accepted by the parser:
- Plain prose: ,
decision-321,task-271.doc-76 - Wikilink: ,
[[decision-321]],[[task-271]]— preferred inside document bodies; the autolinker reifies them as item-graph edges.[[doc-76]] - Block anchor (documents only): — link to a specific block (Wave 6).
[[doc-89#<block_ulid>]]
Anti-patterns (silently break tag/graph navigation):
| ❌ Don't write | ✅ Write |
|---|---|
| |
| |
| |
| drop — autolinker can't resolve; cite the new per-project id |
Microcheck (extends POST-WRITE VERIFICATION):
Before the write call, scan your / /
payload for . If you find one:
summaryrationaledescription#\d+- Replace with if you know the type.
<type>-<number> - Untyped or pre-migration id → either drop, or flag explicitly ("legacy id #N, not resolvable") so a reader knows it's intentional, not an oversight.
The parser currently accepts both legacy and canonical so
older corpus stays linked; emit canonical-only in new writes.
#N<type>-N所有对ConPort其他项的引用——包括 , , , 文档内容, 提交信息——都使用标准格式 。
summaryrationaledescription<type>-<number>类型词汇(小写): , , , , 。无别名(不能用 , , )。
decisiontaskdocpatternprogressdocumenttasksdec解析器接受的格式:
- 普通文本:,
decision-321,task-271。doc-76 - 维基链接:,
[[decision-321]],[[task-271]]— 文档内容中首选;自动链接器会将其转换为项目图谱的边。[[doc-76]] - 块锚点(仅文档):— 链接到特定块(Wave 6)。
[[doc-89#<block_ulid>]]
反模式(会静默破坏标签/图谱导航):
| ❌ 请勿这样写 | ✅ 正确写法 |
|---|---|
| |
| |
| |
| 删除——自动链接器无法解析;请引用新的项目内ID |
微检查(扩展自写入后验证):
在调用写入操作前,扫描你的 / / 负载中的 。如果找到:
summaryrationaledescription#\d+- 若知道类型,替换为 。
<type>-<number> - 无类型或迁移前ID → 要么删除,要么明确标记("遗留ID #N,无法解析"),以便读者知道是故意为之,而非疏忽。
目前解析器同时接受遗留的 和标准的 ,以保持旧内容的链接;新写入内容请仅使用标准格式。
#N<type>-NOUTPUT FORMAT
输出格式
MCP tools return JSON with a field. Use it to inform the user.
summary| After | Format |
|---|---|
| |
| |
| |
| Task DONE/CANCELLED | |
| |
Any write response carrying | |
Roadmap sections. and return and
only when the project has them — a missing section means "nothing to show",
print nothing. When present:
initget_agendaroadmapepic_tails[ROADMAP] milestone-{current.milestone_id} «{current.title}»{ [release]}{ · ready to close} · {open_milestones_total} milestones open
· task-{task_id} {title} — {open_children}/{total_children} subtasks open
Next: milestone-{next.milestone_id} «{next.title}»One line per entry of (only the open epics of the
current milestone are listed — a closed one is already delivered); add
only when is true and
only when is true; drop the line entirely when
is .
·current.epics [release]current.is_release · ready to closecurrent.ready_to_closeNext:nextnull[TAILS] task-{epic_id} {title} — {suggested_action}One line per entry of , in the order returned (closest to closing
first; means nothing is left but the close itself).
is prescribed by the server — print it and follow it, don't
substitute your own plan.
epic_tailsclosable=truesuggested_actionMCP create / update tools return a slim payload (not the full entity body) to
save agent context — , (echoed even as ), , and
context-specific fields (, , , …). Need the full body? Use
the matching read tool (, , , …). The
slim / echo is your POST-WRITE verification channel.
(Live docs → .)
idtags[]summaryversionstatuskindget_taskget_documentlist_decisionstagskindcore/post-write-verificationDecision currency. Read surfaces (, ,
) annotate each decision with ( / /
) and . Before citing a decision as authoritative, check
: if , follow to the current decision; if
, treat it as retired (see ) and do not present
it as current. A high on a decision is a prompt to verify
it still holds, not proof that it's stale.
get_decisionlist_decisionssearchcurrencycurrentsupersededdeprecatedage_dayscurrencysupersededsuperseded_bydeprecateddeprecation_reasonage_dayscurrentMCP工具返回带有 字段的JSON。请使用该字段告知用户。
summary| 操作后 | 格式 |
|---|---|
| |
| |
| |
| 任务DONE/CANCELLED | |
| |
任何返回包含 | |
路线图部分。 和 仅在项目有相关内容时返回 和 — 缺失的部分表示"无内容可展示",无需打印。如果存在:
initget_agendaroadmapepic_tails[ROADMAP] milestone-{current.milestone_id} «{current.title}»{ [release]}{ · ready to close} · {open_milestones_total} milestones open
· task-{task_id} {title} — {open_children}/{total_children} subtasks open
Next: milestone-{next.milestone_id} «{next.title}»current.epics·current.is_release [release]current.ready_to_close · ready to closenextnullNext:[TAILS] task-{epic_id} {title} — {suggested_action}epic_tailsclosable=truesuggested_actionMCP创建/更新工具返回精简负载(而非完整实体内容)以节省代理上下文——包含 , (即使为空数组也会返回), ,以及特定上下文字段(, , , …)。如需完整内容,请使用对应的读取工具(, , , …)。返回的精简 / 是你的写入后验证渠道。(实时文档 → 。)
idtagssummaryversionstatuskindget_taskget_documentlist_decisionstagskindcore/post-write-verification决策有效性。 读取界面(, , )会为每个决策标注 ( / / )和 。在引用决策作为权威依据前,请检查 :如果是 ,请跟随 查看当前决策;如果是 ,则视为已弃用(查看 ),不要将其作为当前决策展示。 决策的 较高提示你需验证其是否仍然适用,而非证明其已过时。
get_decisionlist_decisionssearchcurrencycurrentsupersededdeprecatedage_dayscurrencysupersededsuperseded_bydeprecateddeprecation_reasoncurrentage_daysPOST-WRITE VERIFICATION
写入后验证
Some MCP clients silently drop an optional parameter when the surrounding
tool-call XML is malformed — the dropped value folds into the previous string
field and the call returns 200 OK with a truncated payload. A real incident lost
a 's array (they ended up inside ); the decision
landed untagged and broke graph navigation.
sync_decisiontagsrationaleThe server now rejects any write whose string field contains literal
tool-call fragments (, , ,
, ) with a structured
error — the bad write does not land; re-issue with the field cleaned. That guard
catches the worst class; the echo check below still catches the subtler cases.
<parameter …><invoke …></invoke><function_calls>antml:*mcp_payload_contaminatedAfter every create/update call that took optional fields, verify the response
echo against intent:
| You passed | Check on the response |
|---|---|
| Response |
| |
| |
| Field is present and equal to intent |
| Response |
| Response |
| Response |
On mismatch. Re-issue the call with the field re-stated (often one retry
fixes the XML glitch). If a second attempt still loses it, flag the mismatch to
the user verbatim ("graph integrity: tags lost on decision N, please re-run")
rather than silently moving on — the damage is mute graph drift, easy to miss.
Applies to: , , , ,
, ,
, , , ,
, block ops (, ,
).
sync_decisionadd_taskupdate_taskadd_milestoneupdate_milestonelog_progresslog_patternadd_documentupdate_documentupdate_active_contextupdate_product_contextupdate_blockinsert_blockdelete_block当周围的工具调用XML格式错误时,部分MCP客户端会静默丢弃可选参数——丢弃的值会合并到前一个字符串字段中,调用会返回200 OK但负载被截断。曾发生过一起事件: 的 数组丢失(它们被合并到 中);决策未被标记,破坏了图谱导航。
sync_decisiontagsrationale现在,服务器会拒绝任何字符串字段包含字面工具调用片段(, , , , )的写入操作,并返回结构化的 错误——错误的写入不会生效;请清理字段后重新调用。该防护措施能捕获最严重的情况;下面的回显检查仍能捕获更细微的情况。
<parameter …><invoke …></invoke><function_calls>antml:*mcp_payload_contaminated在每次包含可选字段的创建/更新调用后,请验证响应回显是否符合预期:
| 你传入的参数 | 检查响应中的内容 |
|---|---|
| 响应中的 |
| |
| |
| 字段存在且与预期一致 |
| 响应中的 |
任务的 | 响应中的 |
里程碑的 | 响应中的 |
不匹配时。 重新调用并重新指定该字段(通常重试一次即可修复XML故障)。如果第二次尝试仍丢失该字段,请直接向用户标记不匹配情况("图谱完整性:决策N的标签丢失,请重新运行"),不要静默继续——这种损害是静默的图谱漂移,容易被忽略。
适用于:, , , , , , , , , , , 块操作(, , )。
sync_decisionadd_taskupdate_taskadd_milestoneupdate_milestonelog_progresslog_patternadd_documentupdate_documentupdate_active_contextupdate_product_contextupdate_blockinsert_blockdelete_blockMCP ERROR HANDLING
MCP 错误处理
On an error:
Invalid arguments for tool- READ — the name of the broken parameter
path - READ — the required type
expected - FIX ONLY THAT PARAMETER
- DO NOT TOUCH OTHER PARAMETERS
| Fix |
|---|---|
| |
| |
| |
当出现 错误时:
Invalid arguments for tool- 读取 — 错误参数的名称
path - 读取 — 要求的类型
expected - 仅修复该参数
- 请勿修改其他参数
| 修复方式 |
|---|---|
| |
| |
| |
CHECKLIST
检查清单
- Has been run?
init - Question about the project → has been done?
search - Starting work on a task → moved to IN_PROGRESS before the first write?
- New work → task created/updated?
- Work finished → task = DONE with ?
resolution - Closing a task → did NOT call separately (it's auto-logged)?
log_progress - Interactive session, work from a later milestone → owner explicitly agreed to it?
- Milestone finished → with
update_milestone(and, ifresolution, only after the release actually shipped)?is_release - Decision made → ?
sync_decision - Important information → document created?
- After every write → response echo verified (tags / description / priority match intent)?
- Cross-references in write payload → all in canonical form (no
<type>-<number>, no#N)?decision #321 - Deep topic (recipes / gaps / semantic pass / block model / tool params) → fetched the live-docs page before acting?
- 是否已运行 ?
init - 关于项目的问题 → 是否已执行 ?
search - 开始处理任务 → 是否已在第一次写入前将其改为IN_PROGRESS状态?
- 新工作 → 是否已创建/更新任务?
- 工作完成 → 任务是否设为DONE 并指定 ?
resolution - 关闭任务 → 是否未单独调用 (已自动记录)?
log_progress - 交互式会话,处理后续里程碑的工作 → 是否已获得所有者明确同意?
- 里程碑完成 → 是否已使用 并指定
update_milestone(如果是发布里程碑,是否仅在实际发布后执行)?resolution - 做出决策 → 是否已执行 ?
sync_decision - 重要信息 → 是否已创建文档?
- 每次写入后 → 是否已验证响应回显(标签/描述/优先级与预期一致)?
- 写入负载中的交叉引用 → 是否都为标准 格式(无
<type>-<number>,无#N)?decision #321 - 深度主题(配方/缺口/语义扫描/块模型/工具参数) → 是否已在操作前获取实时文档页面?
Live docs
实时文档
The deep, situational reference lives at https://conport.app and is the
single source of truth. Before acting on a deep topic, fetch the relevant
page. Public index: https://conport.app/llms.txt. (No web fetch? Use the
CLI.)
conport docs <topic>| Topic | Page |
|---|---|
| Save-first discipline | |
| Knowledge-graph model (item links + GraphRAG) | |
| Cross-reference grammar | |
| Documentation-graph callouts (full reference) | |
| Post-write verification / slim responses | |
| |
| Knowledge-base gaps | |
| Semantic pass | |
| Spec append-only invariant | |
| Block-level document model | |
| Task hierarchy | |
| Roadmap milestones | |
| Full per-tool parameter reference | |
Local references (shipped with the skill):
(full MCP tool API), (long-form callout
reference), (fresh-project onboarding).
references/command_list.mdreferences/documentation_graph.mdreferences/bootstrap.md深度场景参考存放在 https://conport.app**,是唯一的事实来源。**在处理深度主题之前,请获取相关页面内容。 公开索引:**https://conport.app/llms.txt**。(无法网页获取?使用 CLI。)
conport docs <topic>| 主题 | 页面 |
|---|---|
| 优先保存规范 | |
| 知识图谱模型(项目链接 + GraphRAG) | |
| 交叉引用语法 | |
| 文档图谱标注(完整参考) | |
| 写入后验证 / 精简响应 | |
| |
| 知识库缺口 | |
| 语义扫描 | |
| 规范追加-only规则 | |
| 块级文档模型 | |
| 任务层级 | |
| 路线图里程碑 | |
| 完整工具参数参考 | |
本地参考(随技能提供):(完整MCP工具API)、(长篇标注参考)、(新项目引导)。
references/command_list.mdreferences/documentation_graph.mdreferences/bootstrap.md