一键导入
doc-suite-updater
Manual-only repo workflow. Use only when explicitly invoked as doc-suite-updater or by SKILL.md path; do not auto-select from related requests.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Manual-only repo workflow. Use only when explicitly invoked as doc-suite-updater or by SKILL.md path; do not auto-select from related requests.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Manual-only repo workflow. Use only when explicitly invoked as uat-regression or by SKILL.md path; do not auto-select from related requests.
Manual-only repo workflow. Use only when explicitly invoked as doc-regression or by SKILL.md path; do not auto-select from related requests.
Manual-only repo workflow. Use only when explicitly invoked as fastmcp-spike-guide or by SKILL.md path; do not auto-select from related requests.
Manual-only repo workflow. Use only when explicitly invoked as omnifocus-api-ground-truth-audit or by SKILL.md path; do not auto-select from related requests.
Manual-only repo workflow. Use only when explicitly invoked as test-omnifocus-operator or by SKILL.md path; do not auto-select from related requests.
Manual-only repo workflow. Use only when explicitly invoked as uat-gm-cross-coverage-audit or by SKILL.md path; do not auto-select from related requests.
| name | doc-suite-updater |
| description | Manual-only repo workflow. Use only when explicitly invoked as doc-suite-updater or by SKILL.md path; do not auto-select from related requests. |
Two-phase workflow for updating doc-regression scenario suites after shipping a milestone: initialize (deep research → seed file) then collaborative worker (pick up chunks → co-write scenarios with user).
These scenarios are documentation clarity tests — "can an LLM construct the correct payload from the tool docs alone?" They are NOT derived from reading source code. They are NOT testing whether the code works (that's UAT).
The question each scenario answers: "If a model has never seen this codebase, only the tool description and JSON Schema, would it construct the right payload for this request?"
Allowed sources (for both seed generation and workers):
ToolSearch — descriptions + inputSchema as agents see them. This is the primary source..research/updated-spec/MILESTONE-v{X}.md — what was built, what fields were added/changed.planning/phases/{N}-{name}/:
{N}-CONTEXT.md — phase requirements and scope{N}-DISCUSSION-LOG.md — decision resolutions{N}-VERIFICATION.md — did we build what was planned?{N}-{NN}-SUMMARY.md — what each sub-plan delivered.planning/ROADMAP.md, .planning/REQUIREMENTS.md, .planning/STATE.md.planning/milestones/v{X}-ROADMAP.md, v{X}-REQUIREMENTS.md, v{X}-phases/docs/architecture.md, docs/model-taxonomy.md, docs/omnifocus-concepts.md.claude/skills/doc-regression/scenarios/The agent should explore these locations autonomously — the list above is guidance, not exhaustive. The only hard rule is: never read .py files or automated test files.
Never read: .py source files, automated test files, or any implementation code. If you read code to understand field behavior, you already know too much — you're no longer testing what the docs communicate. That's the whole point.
Trap quality: the value of a scenario comes from its trap — the thing that makes it tricky. A scenario without a meaningful trap ("create a task called X") is wasted coverage. Every scenario should test a genuine documentation ambiguity, a field confusion risk, or a subtle semantic distinction that models commonly get wrong.
Regression meaning: once a scenario suite passes across models, running it later should still pass — unless the documentation was deliberately changed. The updater's job is to update scenarios when the tool docs evolve, not when the code changes.
Always run this first. Determines which mode to enter.
DOC-SUITE-ANALYSIS.md at repo root## Progress section:
.research/doc-suite-seeds/ and enter Initialization Mode.Idempotency: this workflow is safe to re-run. Initialization always compares current tool docs against current scenario coverage. If suites are already up to date, the gap analysis will find fewer or no gaps.
Deep research session that produces a seed file coordinating future collaborative worker sessions.
Precondition: verify this session is running in a git worktree (git rev-parse --show-toplevel vs git worktree list). Hard stop if not — the seed file and chunk work should happen on a branch, not main.
.planning/STATE.md (frontmatter: milestone, milestone_name).planning/ROADMAP.md for phase rangesgit tag --list).planning/ROADMAP.md + .planning/phases/.planning/milestones/v{X}-ROADMAP.md + v{X}-phases/v1.3..v1.3.1)Spawn four agents in parallel:
ToolSearch to fetch current descriptions + schemas for ALL OmniFocus Operator tools. For each tool, catalog every field, its description, type, constraints, and semantic meaning. This is the "what agents actually see" baseline..claude/skills/doc-regression/scenarios/. For each scenario, record: which tool, which fields tested, what the trap is, what grading criteria exist. Build a coverage matrix: tool × field → scenario numbers.Cross-reference the tool documentation inventory (Agent A) against scenario coverage (Agent C) to find:
Known gaps: distinguish between "not yet implemented" and "should be testable":
This is the creative analysis step. For each gap identified in Step 3, brainstorm trap concepts:
Trap categories (use as a checklist):
tags in add_tasks vs actions.tags in edit_tasks)Filter out bad traps before recording. A trap is bad if it:
limit: null is already tested in a list_tasks suite, testing the identical pattern on list_projects isn't a new trap — it's busywork. Every trap must test something specific to this tool's fields, field interactions, or unique confusion points. Generic patterns (pagination, completed inclusion) only earn a spot if there's a tool-specific twist.Quality bar — multi-field combinations:
For each surviving trap concept, record:
availability: "remaining", status: "active". This surfaces default-reasoning issues early: "would the default actually return what the user wants?" If you can't sketch the Expected without reading code, the trap may be testing implementation, not docs.# {Tool Name} — Doc Regression Scenarios)scenarios/ directory — no registration step needed (unlike UAT suites)DOC-SUITE-ANALYSIS.md at repo root following the Seed File Template section belowBefore committing, present all ambiguities encountered during research. The user will NOT review the seed itself — this is their only chance to catch misinterpretations before they get baked into chunk instructions.
Resolution hierarchy (when sources conflict):
.research/updated-spec/ supersedes original spec for "what was intended"Present each ambiguity with:
Wait for user confirmation. If corrections needed, update the seed file and re-present. On confirmation: commit docs: add doc-regression gap analysis for v{version}.
If no ambiguities were found, say so explicitly and proceed to commit.
If research shows scenario suites are already up to date, say so with evidence (which tools/fields are covered, which traps exist). Don't produce an empty seed file — this is a successful result.
Pick up the next chunk from the seed file and co-write scenarios with the user.
This is fundamentally collaborative. Unlike UAT suite updates where the worker writes tests and asks for sign-off, doc-regression scenarios require creative input — the trap must be genuine, the prompt must sound natural, the grading must be precise. The worker proposes, the user shapes.
DOC-SUITE-ANALYSIS.md, find first unchecked content chunk.planning/STATE.md — warn if mismatched.claude/skills/doc-regression/SKILL.md) silently to internalize conventionsToolSearch to fetch current tool docs for the specific tools in this chunkFor each gap/trap identified in the seed's chunk instructions, present a concrete draft — not an abstract concept. The user can't evaluate a trap without seeing the actual prompt. Generate the real prompt upfront; it's cheap to draft and essential for review.
Format per trap (use ==================== between traps for visual separation):
====================
### Trap N: {one-line concept}
**Prompt:**
`{Full draft prompt — conversational, natural, as a real user would say it to an agent. This is the actual text that would go in the scenario's Prompt field. Make it concrete, not a placeholder.}`
**The trap:**
> - {Key insight — what the correct mapping is}
> - {Likely mistakes — what models will reach for instead}
> - {Doc evidence — what the docs say that resolves it}
**Expected:** `{tool_name}`
```json
{
"field": "value",
"otherField": "value"
}
- {Why this field/value is correct}
- {What should NOT be present — and why}
Tests:
{tool_name}— {field(s) involved}
====================
**Key rules for this step:**
- Draft a **real prompt**, not "something about overdue tasks." The user needs to see the actual phrasing to judge if it's too specific, too vague, or doesn't feel natural.
- **Explain your reasoning** for the expected behavior. The user may disagree with your interpretation of the docs — surface the decision explicitly so they can course-correct.
- Don't be precious about drafts — the user will reshape them. Get something concrete on the table fast.
- **Space related traps apart.** When two scenarios test the same concept (e.g., rolling vs calendar period), give them different framing and separate them in the suite. If they're adjacent and similar, they read as a pair — the model can guess by pattern, not by understanding.
Present all trap concepts for this chunk, then **wait for user feedback**:
- User may approve, modify, reject, or add new trap ideas
- User may reorder priorities ("do this one first, skip that one")
- User may say the prompt is too specific/vague and suggest rewording
- User may disagree with expected behavior ("no, that should actually be X because...")
**Do NOT write finished scenarios yet** — this step is about aligning on *what* to test and getting the prompt tone right. Step 4 produces the formal scenario with Expected JSON + Grading criteria.
### Step 4 — Co-write scenarios
For each approved trap, draft a complete scenario:
1. Write the full scenario (Prompt, Trap, Expected, Grading) following doc-regression conventions
2. Present it to the user for review
3. User may:
- Approve as-is
- Adjust the prompt wording
- Tighten/loosen grading criteria
- Add edge cases ("what if the model also sets X?")
- Split into multiple scenarios
4. Finalize and move to the next scenario
**Iterate per scenario, not per batch.** The creative discussion is the valuable part — don't rush through a list.
### Step 5 — Review existing scenarios for staleness
If the seed flagged existing scenarios that may need updates (changed field semantics, obsolete traps):
1. Show each flagged scenario with what changed and why it might be stale
2. Propose specific updates (new Expected payload, adjusted Grading, updated Trap description)
3. Wait for user approval per scenario
### Step 6 — Validation (optional)
After all scenarios for this chunk are written/updated:
1. **Offer to run doc-regression**: "Want me to test these new scenarios against the models to see if the traps actually work?"
2. **If user approves**: invoke the doc-regression skill on just the new/modified scenarios. This tests whether:
- The trap actually catches model mistakes (at least one model should struggle)
- The grading criteria correctly distinguish pass/fail
- The prompt is clear enough that the right answer IS right
3. **If results reveal issues**: discuss with user and adjust scenarios
4. **If user declines**: proceed to Step 7
**Note**: validation is genuinely optional here — unlike UAT where live verification catches spec-vs-reality gaps, doc-regression scenarios are internally consistent. Validation is about trap quality, not correctness.
### Step 7 — Completion protocol
1. **Summarize**: files modified, scenarios added, scenarios updated, validation results if applicable
2. **Wait for user sign-off** — user reviews the changes
3. **On approval**:
- Commit scenario changes: `test(doc): {description of what was added/changed}`
- Mark chunk done in separate commit: `chore: mark chunk N complete in doc suite analysis`
4. **If all content chunks now done**: inform user, suggest triggering this skill again for Completion mode
### Edge case — Concurrent workers
The checkbox mechanism isn't atomic. If a chunk was just checked by another session, move to the next unchecked chunk.
## Completion Mode
All content chunks are done. Archive the seed file and wrap up.
1. Create `.research/doc-suite-seeds/` directory if it doesn't exist
2. Archive: `git mv DOC-SUITE-ANALYSIS.md .research/doc-suite-seeds/v{version}.md`
3. Commit: `chore: archive doc suite analysis for v{version}`
4. Remind user to merge the worktree branch to main and clean up the worktree
## Ad-hoc Override
If the user names a specific suite and a specific change ("just add a repetition edge case to edit-tasks.md"), skip mode detection entirely. Read the target suite, follow doc-regression conventions, co-write the scenario with the user. No seed file involved.
## Seed File Template
The seed file must follow this exact structure.
```markdown
# Doc Suite Analysis — v{version} "{milestone_name}"
## How to Use This File
This file is the output of a research session that analyzed what v{version} changed in tool documentation vs what existing doc-regression scenarios cover. It contains everything a fresh agent needs to co-write new scenarios with the user without re-doing the research.
**Workflow:** Run `/doc-suite-updater` in a new session. The skill auto-detects this file and enters Worker mode — it will find the next unchecked chunk, present trap concepts, co-write scenarios with the user, and mark the chunk done.
**Important:** Worker sessions are collaborative — the agent proposes trap concepts and drafts scenarios, but the user shapes the final content. The seed provides starting points, not prescriptive instructions.
---
## Progress
- [ ] Chunk 1 — {title}
- [ ] Chunk 2 — {title}
- [ ] ...
- [ ] **Delete this file** (all chunks done, everything merged)
---
## Chunks — Task List
### Chunk completion protocol
After co-writing the scenarios for a chunk, the agent does NOT commit. Instead:
1. **Summarize changes** — list every file modified, scenarios added, scenarios updated
2. **Offer validation** — "Want me to run these new scenarios through doc-regression to test if the traps work?"
3. **Wait for sign-off** — user reviews the changes (and validation results if applicable)
4. **On approval**: commit the scenario changes, then update the Progress checklist above (check the box)
---
### Chunk 1: {title}
**Suites:** {list of scenario files}
**Trap concepts to explore:**
- {trap idea — one line each, referencing entries in the Trap Idea Bank below}
- {trap idea}
**Stale scenarios to review:**
- {scenario reference — what changed and why it might be stale}
**Est. scope:** ~N new scenarios + ~M updates.
---
{repeat for each chunk}
---
## Reference Material
Everything below is research output — the chunks above reference it.
---
## What v{version} Changed in Tool Documentation
{Organized by tool — what fields were added, what descriptions changed, what new behaviors exist}
---
## Tool Documentation Inventory
Current state of every tool's documentation, with scenario coverage status.
### {tool_name}
**Description summary:** {one-line summary of what the tool does}
| Field | Type | Covered by Scenario(s) | Notes |
|-------|------|----------------------|-------|
| {field} | {type} | {scenario numbers or "none"} | {any notes about tricky semantics} |
| ... | ... | ... | ... |
---
{repeat for each tool}
---
## Gap Analysis by Suite
### {suite name} ({N} scenarios) — {NEEDS UPDATES | UP TO DATE | NEW SUITE NEEDED}
**Uncovered fields/behaviors:**
| Field/Behavior | Why it needs a scenario | Trap potential |
|---------------|----------------------|----------------|
| ... | ... | ... |
**Stale scenarios:**
- Scenario N: {what changed — old assumption vs new reality}
---
{repeat for each suite}
### Suites that DON'T need changes
| Suite | Why it's fine |
|-------|---------------|
| ... | ... |
---
## Trap Idea Bank
Creative trap concepts organized by category. Workers use these as starting points for collaborative scenario writing.
### Field Confusion
| ID | Trap Concept | Tool | Fields | Rough Expected | Difficulty | Why It Matters |
|----|-------------|------|--------|----------------|------------|---------------|
| FC-01 | ... | ... | ... | key fields, not full JSON | medium | ... |
### Implicit Requirements
| ID | Trap Concept | Tool | Fields | Rough Expected | Difficulty | Why It Matters |
|----|-------------|------|--------|----------------|------------|---------------|
| IR-01 | ... | ... | ... | key fields, not full JSON | hard | ... |
### Semantic Subtlety
| ID | Trap Concept | Tool | Fields | Rough Expected | Difficulty | Why It Matters |
|----|-------------|------|--------|----------------|------------|---------------|
| SS-01 | ... | ... | ... | key fields, not full JSON | medium | ... |
### Structural Traps
| ID | Trap Concept | Tool | Fields | Rough Expected | Difficulty | Why It Matters |
|----|-------------|------|--------|----------------|------------|---------------|
| ST-01 | ... | ... | ... | key fields, not full JSON | hard | ... |
### Null Semantics
| ID | Trap Concept | Tool | Fields | Rough Expected | Difficulty | Why It Matters |
|----|-------------|------|--------|----------------|------------|---------------|
| NS-01 | ... | ... | ... | key fields, not full JSON | medium | ... |
### Multi-Tool
| ID | Trap Concept | Tool | Fields | Rough Expected | Difficulty | Why It Matters |
|----|-------------|------|--------|----------------|------------|---------------|
| MT-01 | ... | ... | ... | key fields, not full JSON | hard | ... |
### Other
| ID | Trap Concept | Tool | Fields | Rough Expected | Difficulty | Why It Matters |
|----|-------------|------|--------|----------------|------------|---------------|
| OT-01 | ... | ... | ... | key fields, not full JSON | ... | ... |
{Only include categories that have entries. Omit empty categories.}
---
## Summary of Work
| Suite | Action | New Scenarios | Updates |
|-------|--------|--------------|---------|
| ... | ... | ... | ... |
| **Total** | | **~N** | **~M** |
---
## Final Cleanup
Once ALL chunks are complete and committed, and the user has validated everything:
1. Run `/doc-suite-updater` one more time — it will enter Completion mode and archive this file
2. The worktree branch is now ready for the user to review and merge to main
Workers must follow these conventions when writing or updating scenario files. Read at least one existing suite in .claude/skills/doc-regression/scenarios/ to internalize the patterns.
# {Tool Name} — Doc Regression Scenarios
Scenarios testing whether LLMs can construct correct `{tool_name}` payloads from tool documentation alone.
---
### Scenario N: Short descriptive name
**Prompt:**
> Natural language task request as an agent would receive it.
**Trap:** What makes this tricky (human-only, NEVER sent to model).
**Expected:** `tool_name`
```json
{ ... }
Grading:
items[0].field MUST equal "value"items[0].other MUST NOT be presentitems[0].field SHOULD contain "text"
### Key conventions
- **Prompt** is conversational — written as a real user would speak to an agent. Never robotic or formulaic. **Avoid schema vocabulary** — this means field names, filter names, shortcut names, AND near-synonyms that directly map to a specific field. The litmus test: would saying this word make the model immediately reach for the right field? If yes, it's too easy.
- Don't just swap synonyms ("past due" for "overdue") — that's still handing the model the concept on a plate. Instead, express the **human intent** behind the filter. A real user doesn't think in filters; they think in situations:
- "I've dropped the ball this week — what should I have finished by now?" (not "show me overdue tasks")
- "What can I start working on this week that I couldn't touch before?" (not "what's coming off defer?")
- "Something feels off in my system — what changed in the last few days?" (not "filter by modified date")
- "What should I focus on first?" (not "show me due soon tasks")
- The prompt should describe a **situation or feeling**, not a query. The model's job is to figure out which filters map to that situation.
- **Trap** is human-only context — explains why this is tricky. NEVER included in the exam prompt sent to models.
- **Expected** shows the reference-correct payload.
- **Expected** payloads must reason through defaults. Ask: "What does the default return? Would the user actually want those extra results?" If the default adds unwanted data, the explicit override belongs in Expected. Don't just test the happy path — test that the model knows when to *not* rely on defaults.
- **Grading** uses three severity levels:
- `MUST` — hard fail if not met
- `MUST NOT` — hard fail if present
- `SHOULD` — warning, not a fail
- For date fields, accept any reasonable timezone offset
- For fuzzy dates, check month and year, not exact day
- Multi-tool scenarios: Expected line says `tool_a then tool_b`, show both payloads
- **Shortcut vs verbose forms**: when a shortcut and equivalent verbose form both exist (e.g., `"overdue"` vs `{before: "now"}`), both MUST pass. Use SHOULD to prefer the cleaner form. This is a general convention — apply it everywhere, not just one-off.
- Multiple valid approaches: list Option A / Option B, pass if ANY match
- Scenarios are numbered sequentially within each file
- Each scenario is separated by `---`
### What makes a good trap
The trap is the heart of each scenario. Good traps:
- Test a **genuine ambiguity** in the documentation, not an obscure edge case
- Reflect **real-world phrasing** — how would a user actually say this?
- Have a **clear right answer** derivable from the docs (if the docs are good)
- Catch **common model mistakes** — not contrived gotchas
Bad traps:
- Test knowledge that only comes from reading the code
- Are so obscure that no real user would encounter them
- Have ambiguous correct answers (if the docs genuinely don't specify, that's a doc issue to fix, not a scenario to write)
- **Assume backward compatibility confusion**: the test model receives ONLY the current tool docs in a fresh context — it has never seen a previous schema version. "Might use the old field name" or "might do it the way it worked before v1.2" is not a real trap. The model has no memory of previous versions. Traps must stem from what's ambiguous or confusing in the *current* documentation, not from migration history.
- **Use schema vocabulary in the prompt** — this includes field names, filter names, shortcut names, AND near-synonyms that directly map to a field. Don't just swap synonyms either ("past due" for "overdue" is still too obvious). The prompt should describe a situation or feeling, not a query. The whole point is testing whether the model can figure out which filters map to a human intent, not whether it can match a keyword to a field name.
### Coverage cross-reference
The single most important gap-finding mechanism. Take the tool documentation inventory and check each field against existing scenarios. For every field with no scenario exercising it, consider whether a meaningful trap is possible. Not every field needs a scenario — `name` is straightforward, for instance — but every field with non-obvious semantics should have at least one.
Pay special attention to:
- **Cross-tool confusion**: fields that exist on multiple tools with different semantics (tags on add_tasks vs actions.tags on edit_tasks)
- **Patch semantics**: null vs omit vs value distinctions
- **Dependent fields**: fields that require other fields to be present
- **Mode-specific behavior**: same field behaving differently based on context (new rule vs existing rule)