Dayward AI
Week 1 · D2About 4 hours

Writing Your First Skill: How to Write description's Trigger Words, How to Layer the Structure, How to Install It Into a Client

Start from something you already do well, and write your first skill that actually gets triggered: write description as an imperative sentence describing user intent, layer the body by steps and pitfalls, then install it into a client and confirm it really opens up.

Today's goals 0/3

Sign in to tick these off and save your progress.

Today's Goals

  1. Narrow a repeated task down to a skill's boundary, and state what it should not handle
  2. Write a usable description following three rules — imperative mood, user intent, and a clear boundary
  3. Install a skill into a client's project-level or user-level directory, and confirm it is actually triggered

Yesterday you took three existing skills apart and saw what good looks like. Today you write one of your own. Today's success has a single criterion: you say something natural and it opens up by itself. Once you have read the walkthrough and finished the lab, scroll back to the top and tick off the three goals.

Plain-Language Walkthrough

Choosing a subject: start with the thing you explained three times this week

The work instructions in that filing cabinet were not written out of thin air; a long-tenured employee wrote them after being asked one time too many. Your first skill should come the same way.

The best signal for a subject is "you have already corrected it." You have the AI write a commit message and it writes update code; you say no, our format is a type, a colon, and a description; it fixes it; a different repository, a different session, and it is back to update code. That round trip happened three times this week — those three corrections are the entire content of this skill, and you do not have to invent anything.

The official best practices page puts this bluntly: a skill generated out of the model's own general knowledge comes out full of correct-and-useless lines like "handle errors appropriately" and "follow authentication best practices." A genuinely valuable skill comes from specific experience — your project's conventions, the edges you hit, every sentence you corrected in conversation. So look in these three places when choosing a subject:

First, what you have corrected repeatedly. That is the most direct source, and the content of the correction goes in verbatim.

Second, what is already written in a document nobody reads. The team's commit convention, endpoint agreements, how a report is filled in. They usually sit in a document nobody opens, and as a skill the model comes to consult them rather than a person having to go find them.

Third, what you can read off the commit history. Which changes recur in the same form, which review comments come up again and again. Material like that is dense, because it records what was actually changed rather than what was meant to be done.

Once chosen, immediately do one thing: write down what it does not handle. A write-a-commit-message skill does not care whether the code is correct, whether this should be committed at all, or what the branch should be called. Write that boundary down now, because it goes verbatim into the end of the description shortly. It is the step beginners most often skip and most often pay for — on day three, when we get to anti-patterns, you will see that trying to cover everything is the most common of the four.

The description is the only trigger surface

Now write today's most important line. Recall yesterday's three stages: at session start, the model can see only the name and the description. However beautiful the body, if this one line fails to make the model recognize "time to open me," the whole skill might as well not exist.

The spec gives four authoring principles; here is each one applied:

First, use the imperative mood and write instructions to the model. Write "use when the user is committing code," not "this skill can help generate commit messages." What the model is doing is making a decision — use it or not — so tell it directly when to use it. A self-introducing "This skill does…" sentence contributes nothing to that decision.

Second, write user intent, not internal implementation. What the model matches against is the sentence the user just said, not your implementation details. "Parses and generates per the Conventional Commits spec" is implementation; "use when the user is committing code, writing a commit message, or asking how to describe a change" is intent.

Third, err toward being pushy. The official wording is exactly "err on the side of being pushy": list the applicable situations explicitly, including phrasings where the user never names the domain directly. A user rarely says "write me a commit message per the convention"; they are likelier to say "I'm ready to commit these changes." Put colloquial phrasings like that in too.

Fourth, keep it short. A few sentences to a short paragraph is enough. The limit is 1,024 characters, but this one line is paid on every session — as computed yesterday, twenty skills all written to the limit cost eight thousand tokens for the catalog alone.

On top of those four, add one you derived yourself in yesterday's lab: append a boundary sentence. The first half governs when it appears, and that closing half governs when it stays quiet.

Put all five together and a commit-message skill's description looks like this:

YAMLYAML
---
name: commit-message
description: Write Git commit messages to the team's convention. Use when the user is committing code, writing a commit message, tidying up staged changes, or asking how this change should be described, even when they never mention conventions or formatting. Only produces the commit message text; does not decide whether to commit and does not run git commands.
---

Section by section: the first sentence is what it does (imperative, short); the long middle is when to use it, with four phrasings spread from formal to colloquial, and that closing "even when they never mention conventions or formatting" is the official "be pushy"; and the end is the boundary, where two "does not" clauses keep the most collision-prone neighboring capabilities out.

Layering the body: steps, examples, pitfalls

The description decides whether it gets opened, and the body decides whether opening it helped. The spec recommends three sections: step-by-step instructions, input and output examples, and common edge cases. In practice, expand them in this order:

Write the workflow as numbered steps. For a task where steps depend on each other and order matters, the numbering is itself a constraint. Every step must be an action that can be completed; do not write sentences with no landing point, like "handle the various situations appropriately."

Give a template for the output format rather than describing it in prose. The spec stresses this one: a model pattern-matching against a concrete structure is far more reliable than reading a paragraph saying "the output should contain a title, key points, and recommendations." A short template goes in the body; a long one, or one used only in specific cases, goes in assets/.

Pitfalls get their own section, and it must stay in the body. The spec calls this section gotchas and notes that it is often the highest-value part of the whole skill — because it holds the facts a reasonable guess would get wrong. "This table uses soft deletes, so every query must include the not-deleted condition" is a pitfall; "watch out for exceptions" is not a pitfall, it is filler. The criterion for a pitfall is one sentence: without this line, would the model get it wrong? If not, delete it.

Why can pitfalls not move into references/? Because the model has to know a pitfall exists before it will go look one up. Putting them in a reference file requires the model to predict it is about to hit something before it hits it, which does not work.

One principle runs throughout: write only what the model does not know. Do not explain what Git is or what a commit is; jump straight to "we have exactly six types here and not one more." The criterion is one question to yourself: without this line, would the model get it wrong? If not it is filler, so delete it and make room for something else.

Installing it into a client

A finished skill counts as installed only once it sits somewhere the client scans. Placement has two dimensions: scope (this project or all projects) and directory convention (the cross-client one or a particular vendor's own).

TextText
project root/
├── .agents/skills/commit-message/SKILL.md   # project level, cross-client convention
└── .claude/skills/commit-message/SKILL.md   # project level, Claude Code's own
 
~/
├── .agents/skills/commit-message/SKILL.md   # user level, cross-client convention
└── .claude/skills/commit-message/SKILL.md   # user level, Claude Code's own

.agents/skills/ is the cross-client convention the community settled on, and a skill placed there can be seen by several clients at once; a vendor's own directory (Claude Code's being .claude/skills/) is its native location. The spec itself does not dictate where skill directories go; it defines only what a folder looks like inside — which is why both sets of paths exist. Put a skill in .agents/skills/ to share it across tools, and in a vendor's own directory to give it to one.

Choosing the scope is easy to judge: what holds only for this repository goes project level and travels with the repository, so everyone on the team has it as soon as they pull; cross-project personal habits go user level.

On precedence when two skills collide, there is a divergence you must verify yourself. The prevailing cross-client convention is project level beats user level — closer to the code at hand is more specific and ought to win. But a particular client may have its own hierarchy; Claude Code's documentation, for example, orders enterprise, personal, and project from high to low, so personal beats project, and that reasoning also holds: you would not want a skill arriving from a repository to override the same-named skill you configured yourself. Both designs are reasonable, so check which one your client uses before installing rather than going on instinct. On a collision a client usually logs a warning that a skill was shadowed, and that log line is the first place to look when diagnosing this.

What to do when it does not trigger the first time

You wrote and installed it, said "help me commit these changes," and nothing happened. Check these three things, which cover the overwhelming majority of cases:

First, it was never scanned at all. Confirm whether the client recognizes this directory, whether the SKILL.md filename has the wrong case, and whether name equals the parent directory name. Most clients have a command listing available skills, and absence from that list means it was not scanned, which has nothing whatsoever to do with the description. Always do this step first — get the order wrong and you will spend an afternoon editing a completely innocent description.

Second, frontmatter parsing failed. The most common variant is a bare colon in the YAML: description: use when the user says: help me commit, where that middle colon makes the YAML parser treat the line as invalid. Some clients repair it as a fallback and some skip the skill outright. To use a colon in the description, wrap the whole value in quotes.

Third, the description does not cover the phrasing you used. That is the case that genuinely calls for editing the description. The criterion: can the keywords of the sentence you actually said be matched against something in the description? If not, add them — but add the class of phrasing rather than that one sentence. Copying your exact words in verbatim walks straight into overfitting, and day three is devoted to avoiding that.

There is one more situation that is not a failure and is worth knowing: the task was too easy and the model reckoned it could handle it. The spec states plainly that clients usually consult skills only when a task exceeds the model's own capability. "Read this file for me" will trigger no skill at all, however well the description matches.

The code below turns the first two checks into a script: validating name against its five rules, the length of description, and whether the frontmatter parses. Run it before installing and it saves most of the diagnosis time.

validate-skill.ts
import { readFile } from 'node:fs/promises'
import { basename, dirname } from 'node:path'
 
const NAME_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/ // covers both no leading/trailing hyphen and no consecutive hyphens
 
export async function validateSkill(skillMdPath: string): Promise<string[]> {
  const raw = await readFile(skillMdPath, 'utf8')
  const errors: string[] = []
 
  const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(raw)
  if (!m) return ['no frontmatter found; the first lines must be --- and the fields']
  const front = m[1]
 
  const name = /^name:\s*(.+)$/m.exec(front)?.[1]?.trim()
  const description = /^description:\s*(.+)$/m.exec(front)?.[1]?.trim()
 
  if (!name) errors.push('missing the required field name')
  else {
    if (name.length > 64) errors.push(`name exceeds 64 characters (currently ${name.length})`)
    if (!NAME_RE.test(name))
      errors.push('name allows only lowercase letters, digits, and single hyphens, and cannot start or end with one')
    const dir = basename(dirname(skillMdPath))
    if (name !== dir) errors.push(`name disagrees with the parent directory: ${name} versus ${dir}`)
  }
 
  if (!description) errors.push('missing the required field description; without it the skill can never be triggered')
  else if (description.length > 1024)
    errors.push(`description exceeds 1024 characters (currently ${description.length})`)
  // A bare colon is the most common YAML trap: a colon in an unquoted value, which many parsers reject outright
  else if (/:/.test(description) && !/^["']/.test(description))
    errors.push('description contains a colon but is not quoted; some clients will fail to parse it')
 
  return errors
}

Budget awareness: two lines

Finally, pin down two numeric lines that run through the remaining five days of this course.

Line one: 500 lines and 5,000 tokens for the body. That is the spec's recommended ceiling, and anything beyond should move into references/. When moving, remember yesterday's rule: state under what condition each file is read, or the content you moved out is effectively lost.

Line two: 1,024 characters for the description. That is a hard limit, but the number to actually watch is not this one — it is all your skills' descriptions added together. Twenty of them written to the limit make eight thousand tokens for the catalog alone, and those eight thousand are paid every turn.

The two lines differ in nature, so do not conflate them: 500 lines is money paid only on a match, and 1,024 characters is money paid continuously. So a body can be written at leisure while a description must be counted to the word.

A practical habit is to watch the total description cost as a metric. The code below totals the description lengths of every skill in a directory and warns when over budget — put it in your own check script alongside yesterday's catalog cost estimator.

budget.ts
import { readdir, readFile } from 'node:fs/promises'
import { join } from 'node:path'
 
const BUDGET_CHARS = 4000 // budget for all descriptions combined; at 4 characters per token, about 1000 tokens
 
export async function checkBudget(skillsDir: string): Promise<boolean> {
  const dirs = (await readdir(skillsDir, { withFileTypes: true })).filter((e) => e.isDirectory())
  let total = 0
  for (const d of dirs) {
    const raw = await readFile(join(skillsDir, d.name, 'SKILL.md'), 'utf8').catch(() => '')
    const desc = /^description:\s*(.+)$/m.exec(raw)?.[1]?.trim() ?? ''
    total += desc.length
    if (desc.length > 300)
      console.warn(`${d.name} has a ${desc.length}-character description; consider trimming under 300`)
  }
  console.log(`${dirs.length} skills' descriptions total ${total} characters, budget ${BUDGET_CHARS}`)
  return total <= BUDGET_CHARS
}

Source Reading

Hands-On Lab

🧪 D2 lab: a write-commit-messages-to-the-team-convention skill, with a SKILL.md and a trigger verification record

Code location: labs/agent-skills-7days/day-02-commit-message-skill

Acceptance criteria:

  1. The SKILL.md frontmatter passes validation: name satisfies all five naming rules and equals the parent directory name, and description is within 1,024 characters and contains no unquoted bare colon.
  2. You can point at which part of the description is the imperative sentence, the user intent, the colloquial phrasings, and the boundary.
  3. The body has all three sections — workflow, output template, pitfalls — and every line of the pitfalls section can answer "would the model get it wrong without this," with the ones you could not answer for already deleted.
  4. After installing into a client, three differently worded sentences each trigger it, all three succeeding; and one similar-looking sentence verifies it was not triggered spuriously.
  5. The trigger verification record states the exact words used each time, whether it triggered, and which part of the description you changed when it did not.

There is code today, but the code is not the deliverable — the deliverable is a skill triggered by one natural sentence. Before starting, find your team's commit convention and keep it beside you; with no written convention, pull the last twenty commits and see what they actually look like. When stuck, go back to the section on what to do when it does not trigger and check in order without skipping steps.

  1. Open the solution's SKILL.md, look only at the frontmatter and guess when it would be triggered, then read the body to check whether you guessed right.
  2. Complete the description in the starter so it covers three different phrasings while not covering two near-miss phrasings.
  3. Complete the body's workflow and pitfalls sections, writing the two most-violated rules of the team convention as pitfalls.
  4. Copy the whole directory into your client's project-level skill directory, trigger it once with each of three phrasings, and watch it open up and output per your template.
  5. Check the name, the description length, and the body line count against the spec, and record the three numbers in the worksheet.

Interview Questions

Today's 3 questions are in the question bank below, weighted toward how a description is written and how triggering works, how a skill's body is layered, and installation locations and scope. Expand each one and read the analysis before the key points — practicing the derivation beats memorizing bullets. The high-frequency labels for the domestic and overseas markets are there so you can pick by target market.

Checklist and Tomorrow

  • Narrow a repeated task down to a skill's boundary, and state what it should not handle
  • Write a usable description following three rules — imperative mood, user intent, and a clear boundary
  • Install a skill into a client's project-level or user-level directory, and confirm it is actually triggered
  • Recite the three diagnostic steps for a skill that did not trigger, and explain why the first is whether it was scanned
  • All 5 acceptance criteria of the lab pass
  • Answer at least 2 of the 3 interview questions without looking at the key points

Tomorrow (D3) we upgrade writing by feel into writing by method: three criteria for choosing a subject, two mature forms, four anti-patterns, and the most important thing — actually measuring a description's trigger rate with a set of positive and negative cases. Today you judged quality by trying three sentences yourself, which works with one skill and stops working by the tenth. Tomorrow gives you a ruler you can reuse.

Interview questions

  • What goes wrong when a skill description is too broad, and what goes wrong when it is too narrow? How do you find the middle?skill 的 description 写得太泛会怎样?太窄又会怎样?你怎么找到中间那个点?
    Common in ChinaCommon overseasIntermediate#agent-skills#skill-description

    How to reason about it · think before answering

    1. The hinge word is cost. Saying too broad misfires and too narrow never fires just restates the question; the interviewer wants to know what a misfire actually costs.
    2. Give three layers of cost for over-broad descriptions: the body wastes context, its instructions interfere with the current task, and once the model has committed to one skill it is less likely to reach for the right one. One over-broad skill degrades the whole library.
    3. For too narrow: it only fires when the user phrases things exactly as you imagined, and real users never do. Such a skill is usually not bad, it is simply never exercised, so you never learn that it is bad.
    4. Give the middle as a procedure, not a feeling: cover phrasings rather than keywords, add a boundary clause that excludes adjacent capabilities, then measure trigger rate against positives and near-miss negatives and revise from the data.
    5. Add the often-missed fact that agents typically only consult skills for tasks beyond what they handle alone, so a trivially easy task will not trigger no matter how well the description matches.
    6. Expected follow-up: how do you avoid overfitting when revising? Never paste the failing query verbatim; generalize to the category it represents, and hold out a validation split.

    分析过程 · 先想清楚再作答

    1. 这题的题眼在「代价」两个字。只说「太泛会误触发、太窄会不触发」是把题目复述了一遍,面试官等的是后面那句:误触发到底损失了什么。
    2. 先说太泛的代价,而且要说满三层:这个 skill 的正文白占了上下文位置;它的指令会干扰当前任务;更麻烦的是模型一旦选定了一个 skill,就更不容易再去选真正对的那个。**一个太泛的 skill 会拖累整个技能库**,这一句是拿分点。
    3. 再说太窄的代价:它只在用户按你预想的说法提问时才触发,而真实用户几乎不会那样说话。太窄的 skill 通常不是不好用,是根本没被用过,所以你连它不好用都不知道。
    4. 找中间点的方法要给成一套动作而不是感觉:写覆盖多种说法而不是多个关键词,末尾补一句边界排除相邻能力,然后用一组正例加近似负例把触发率量出来,按结果改描述。
    5. 补一个容易被忽略的事实:有些任务简单到模型觉得自己就能干,这时候描述写得再匹配也不会触发。判断描述好不好之前,先确认这个任务值不值得一个 skill。
    6. 可预期的追问是「改描述时怎么避免过拟合」。答案是不要把失败查询的原话抄进描述,要归纳出它代表的那一类说法,并留一部分查询不参与优化、只用来验证。

    Key points

    • Three costs of over-broad: wasted context, interference with the current task, and crowding out the correct skill.
    • Over-narrow means it never fires, which hides the problem rather than surfacing it.
    • Cover phrasings rather than keywords, and add a closing boundary clause that excludes adjacent capabilities.
    • Measure trigger rate with positives and near-miss negatives, then revise from the data.
    • A task simple enough for the model alone will not trigger any skill; that is not a description problem.

    答题要点

    • 太泛的三层代价:占上下文、干扰当前任务、挤掉真正该用的那个 skill。
    • 太窄的代价是根本没被触发过,问题被掩盖,你连它好不好用都测不出来。
    • 写法上覆盖「多种说法」而不是「多个关键词」,末尾补一句边界排除相邻能力。
    • 用正例加近似负例量出触发率,按数据改描述,不靠手感。
    • 任务本身太简单时不会触发任何 skill,这不是描述的问题。
  • What belongs in a skill body and what does not, and why must the gotchas stay in SKILL.md rather than move to a reference file?skill 的正文应该写什么、不应该写什么?为什么「坑」那一段必须留在 SKILL.md 里而不是挪到引用文件?
    Common in ChinaCommon overseasIntermediate#agent-skills#skill-authoring

    How to reason about it · think before answering

    1. This separates people who have written skills from people who have read about them. The untested answer is write clear steps; the tested answer starts with a test.
    2. The test is one sentence: would the model get this wrong without this line? If not, cut it. Explaining what a PDF is only dilutes attention.
    3. Three things belong: project-specific conventions, non-obvious edge cases, and which tool or API to use. All three are absent from the model's general knowledge.
    4. Call out output format specifically: a concrete template beats prose, because models pattern-match against structures far better than they parse a described format.
    5. Gotchas cannot move because of ordering: the model must know a trap exists before it will look it up. Putting them in a reference file assumes it can predict a collision it has not hit yet.
    6. Expected follow-up: what does belong in references? Long material whose need has a clear trigger condition, and the body must state that condition, such as read the error-code file when the API returns a non-200.

    分析过程 · 先想清楚再作答

    1. 这题考的是你有没有真写过 skill。没写过的人会答「写清楚步骤」,写过的人会先给一条判据。
    2. 判据只有一句:**不写这一条,模型会不会做错?** 不会就是废话,删掉。解释什么是 PDF、什么是数据库迁移,模型本来就知道,写进去纯粹在稀释注意力。
    3. 该写的三类是:项目特有的约定、非显然的边界情况、以及指定用哪个工具或接口。这三类的共同点是模型的通用知识里没有。
    4. 输出格式那一段要单独强调:给模板比用文字描述可靠,因为模型对具体结构做模式匹配的能力远强于读一段散文式的格式说明。
    5. 「坑」为什么不能挪走,答案是一个先后顺序问题:**模型得先知道有坑,才会去查坑**。放进引用文件就要求它在还没撞上的时候预判自己会撞上,这个前提不成立。引用文件适合放「我知道会用到,只是现在还不需要」的材料。
    6. 可预期的追问是「那什么该挪进 references」。答案是长、且用不用得上有明确判断条件的材料,并且正文里必须写出那个条件,比如「接口返回非 200 时读错误码文件」。

    Key points

    • The test: would the model get this wrong without the line? If not, delete it.
    • Include project conventions, non-obvious edge cases, and the specific tool or API to use.
    • Give a template for output format instead of describing it in prose.
    • Gotchas stay in the body because the model must know a trap exists before looking it up.
    • References hold long material, and the body must state the condition for loading each one.

    答题要点

    • 判据是「不写这一条模型会不会做错」,不会就删。
    • 该写:项目特有约定、非显然的边界、指定的工具与接口。
    • 输出格式给模板,不要用文字描述格式。
    • 坑必须留在正文,因为模型要先知道有坑才会去查坑。
    • 引用文件放长材料,且正文必须写出「什么条件下读它」。
  • How should a client resolve a name collision between a project-level and a user-level skill, and why do clients differ here?项目级和用户级的 skill 同名时该怎么处理?为什么各家客户端在这一点上会有不同的选择?
    Common in ChinaCommon overseasDeep dive#agent-skills#client-integration

    How to reason about it · think before answering

    1. It looks like trivia but it tests whether you have actually installed skills. There is a real disagreement here, and naming it marks you as someone who has hit it.
    2. Start with the common convention: project-level overrides user-level, because configuration closer to the code at hand is more specific. Within one scope, first-found or last-found are both acceptable as long as you pick one and stay consistent.
    3. Then the divergence: Claude Code documents enterprise, then personal, then project, so personal wins over project, so that a cloned repository cannot silently shadow the skill you configured yourself.
    4. Explain the trade-off, which is where the marks are: project-first buys automatic team conventions, user-first buys protection from hijacking by an unfamiliar repository.
    5. Bring in trust: project-level skills can arrive with a freshly cloned repository and inject instructions into your session, which is why most clients gate them behind a folder-trust check.
    6. Expected follow-up: how do you notice a collision? Clients normally log a shadowed-skill warning, and implementers should record diagnostics rather than dropping the skill silently.

    分析过程 · 先想清楚再作答

    1. 这题看起来是细节题,实际在考你有没有真的装过、有没有踩过。标准答案背后有一个分歧,能说出分歧的人一眼就是实操过的。
    2. 先给通行约定:跨客户端的普遍做法是**项目级压过用户级**,理由是离手头这份代码越近的配置越具体,理应赢。同一作用域内两个目录撞名,先找到还是后找到都行,但必须固定一种并保持一致。
    3. 再给分歧:具体客户端可以有自己的层级。Claude Code 的文档给出的顺序是企业级、个人级、项目级由高到低——**个人级压过项目级**,理由是不希望一个仓库带进来的 skill 悄悄覆盖掉你自己配的同名 skill。
    4. 把两种设计的取舍讲清楚,这是本题真正的区分度:项目优先换来的是「团队约定自动生效」,用户优先换来的是「不被陌生仓库劫持」。它们各自解决的是不同的风险。
    5. 顺势带出信任问题:项目级 skill 可能来自一个你刚 clone 的陌生仓库,等于让它往你的会话里注入指令。所以多数客户端把项目级加载挂在「信任这个目录」的开关后面。
    6. 可预期的追问是「撞名了怎么发现」。答案是客户端一般会打一条被遮蔽的警告,那条日志是排查的第一现场;实现方也应该在这种时候记录诊断信息而不是静默丢弃。

    Key points

    • The common convention is project over user, with a fixed, consistent rule inside a single scope.
    • Clients may differ: Claude Code documents enterprise, then personal, then project.
    • Project-first gives automatic team conventions; user-first prevents hijacking by an unfamiliar repository.
    • Project-level skills can come from untrusted repositories, so gate them behind a folder trust check.
    • Log a warning and record diagnostics on a collision instead of silently shadowing.

    答题要点

    • 通行约定是项目级压过用户级,同作用域内固定一种顺序并保持一致。
    • 具体客户端可以不同,比如 Claude Code 的顺序是企业级、个人级、项目级。
    • 项目优先换来团队约定自动生效,用户优先换来不被陌生仓库劫持。
    • 项目级 skill 可能来自不可信仓库,加载应挂在目录信任检查后面。
    • 撞名要打警告并记录诊断,不能静默遮蔽。

Comments