Dayward AI
Week 1 · D1About 3 hours

What Skills Are: the SKILL.md Spec, Directory Layout, and Three-Stage Progressive Disclosure

A skill is just a folder containing a SKILL.md; get clear on its directory layout, its two required fields, and why the three stages of discovery, activation, and execution save so much context.

Today's goals 0/3

Sign in to tick these off and save your progress.

Today's Goals

  1. State a skill's minimal makeup, and explain what each of the optional scripts, references, and assets directories holds
  2. Recite SKILL.md frontmatter's two required fields and their hard constraints
  3. Explain three-stage progressive disclosure in your own words, and work out how much context it saves versus loading everything

This course's positioning in one line: MCP handles the wiring, Skills handle the experience, and context engineering handles the trade-offs. Today lays the foundation of the experience half — what a skill actually is, and how it manages to show up on its own exactly when it should. Once you have read the walkthrough and finished the lab, scroll back to the top and tick off the three goals.

Plain-Language Walkthrough

The work instructions in the filing cabinet

Imagine joining a company that has been running for ten years. A colleague walks you to a row of metal filing cabinets at the end of the corridor and says: "From now on, before you do anything, come look in here." Inside are dozens of folders, each with one line on its cover — "when a customer complaint has gone two days without a reply, open me," "before quarterly reports go to finance, open me." You do not have to memorize the contents of every folder, only those dozens of cover lines; when the situation actually arrives, you pull out the matching one and read it.

That is the whole intuition behind Agent Skills. A large model is plenty clever, but it does not know how things are done around here: what format commit messages take, which columns of a report have to line up, which endpoint's return value has a well-known trap in it. None of that is in its training data; it lives in your head and in your team's unspoken agreements.

One thing often conflated needs separating first. A tool solves can it be done — the model cannot read your database, and giving it a query tool means it can. A skill solves how should it be done — the model can already write a commit message, but what it writes does not match your conventions. Capability gaps are filled by tools and experience gaps by skills, and those are two different things. On day six we put function calling, MCP, and Skills into one table and compare them cell by cell; today, just remember the division.

So why not simply write all the experience into the system prompt? Because you pay for it twice. The first payment is cash: the system prompt is resent on every turn, so twenty team conventions filling, say, six thousand tokens means a fifty-turn session is billed three hundred thousand tokens for repetition. The second is dearer — a model's attention is finite, and a system prompt stuffed with twenty unrelated matters will let rule seventeen interfere while it works on the third of them. The value of a filing cabinet is not how much it holds but that it stays closed until it is needed.

A skill is a folder

The spec defines this with extreme plainness: a skill is a directory containing a SKILL.md file. Nothing else is required — no registration, no manifest file, no compilation.

A skill using every available convention looks like this:

TextText
commit-message/
├── SKILL.md          # required: metadata plus the instruction body
├── scripts/          # optional: executable code
│   └── check_scope.py
├── references/       # optional: documents consulted on demand
│   └── REFERENCE.md
└── assets/           # optional: templates and static resources
    └── template.md

Those three optional directories are not arbitrary names; they correspond to three entirely different kinds of thing, and telling them apart is what makes tomorrow's layering work.

scripts/ holds executable code. The criterion is "this logic should give exactly the same result every run" — validating that a JSON payload has all its fields, converting one table format into another. Having the model rewrite that each time is both slow and unstable, so write it as a script and call it once. Day four spends the whole day on this directory.

references/ holds documents consulted on demand. The criterion is "this material is long but unneeded most of the time" — the complete error code table of an endpoint, the field dictionary of a format. The spec advises cutting each reference file small and keeping it focused, because the model loads them one file at a time, and the smaller the file the less is wasted.

assets/ holds static resources. Output templates, configuration boilerplate, lookup data files, diagrams. The difference from references/ is that references are knowledge for the model to read while assets are material for the model to use.

Beyond those three you can put any file or directory you like; the spec does not care. But those three names are a community convention, and people opening your skill will look for things by that instinct, so it is best not to invent your own scheme.

Reading the frontmatter field by field

SKILL.md is structured as YAML frontmatter plus a Markdown body — the same pattern as this course's own chapter files. The smallest possible skill needs only two fields:

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, or asking how to describe a change.
---

name is required and tightly constrained; note each constraint. Length 1 to 64 characters; lowercase letters, digits, and hyphens only; no leading or trailing hyphen; no two consecutive hyphens; and it must match the parent directory name. So PDF-Processing, -pdf, and pdf--processing are all non-conforming.

Why so tight? Because the name is this skill's unique identity across the whole ecosystem: it goes into the directory name, into namespaces, into the slash command a user types, and it decides precedence when two skills collide. Any inconsistency of case anywhere becomes a very hard-to-diagnose "it is clearly installed and I cannot invoke it."

description is the other required field, 1 to 1,024 characters. It has to answer two questions at once: what this skill does, and when it should be used. The spec's good-and-bad comparison is bluntly clear — "Helps with PDFs" is the bad example, and "Extract text and tables from PDFs, fill in forms, merge multiple PDFs. Use when the user is working with PDF documents or mentions PDFs, forms, or document extraction" is the good one. Tomorrow spends a whole day on this one field; today, just remember: it is the skill's only trigger surface, and get it wrong and nobody will ever open the body no matter how well written it is.

Four optional fields each have a use, and knowing they exist is enough. license states the license, and a license name or a pointer to the license file in the package is advised. compatibility states environment requirements, up to 500 characters, and only skills genuinely picky about their environment should have it — "requires git, docker, jq, and network access," say. metadata is a string-to-string map into which a client can stuff attributes outside the spec, and keys are best made distinctive to avoid collisions. allowed-tools is a space-separated string listing pre-approved tools, and this field is still experimental, with support varying between implementations.

The spec places no constraint on the body's format; write what you like. The structure it suggests is step-by-step instructions, input and output examples, and common edge cases. Days two and three expand on those three parts.

Three-stage progressive disclosure

Now to today's most important mechanism. Progressive disclosure has three stages, and each loads something entirely different.

No Yes No Yes Session starts Stage one: discoveryreads only name and descriptionabout 50 to 100 tokens each Does the task matcha description? Stage two: activationreads the full SKILL.mdideally under 5000 tokens Does the body namean attachment? Execute per the instructions Stage three: executionread scripts, references, assets on demand
Mermaid source
mermaidmermaid
flowchart LR
  A[Session starts] --> B[Stage one: discovery<br/>reads only name and description<br/>about 50 to 100 tokens each]
  B --> C{Does the task match<br/>a description?}
  C -- No --> B
  C -- Yes --> D[Stage two: activation<br/>reads the full SKILL.md<br/>ideally under 5000 tokens]
  D --> E{Does the body name<br/>an attachment?}
  E -- No --> F[Execute per the instructions]
  E -- Yes --> G[Stage three: execution<br/>read scripts, references, assets on demand]
  G --> F

Stage one is discovery. As soon as a session starts, the client scans the skill directories, extracts each skill's name and description, assembles a catalog, and puts it into the context. Note that it reads only those two fields and not one word of any body. The official figure is roughly 50 to 100 tokens per skill.

Stage two is activation. The model reads that catalog, judges which entry the current task matches, and reads that one skill's full body into the context. The spec advises keeping a body under 5,000 tokens and 500 lines, and anything beyond that should move into references/.

Stage three is execution. If the body says "when validation fails, read references/api-errors.md," only then does the model read that file; if it says "run scripts/validate.py," only then does it run it. This stage triggers per file, on demand, rather than dumping the whole directory in.

There is one lesson here that is most easily overlooked and most reveals the author's skill: write explicitly in the body when to read which file. Writing "details are in the references directory" is nearly the same as writing nothing, since the model does not know when to look; writing "if the endpoint returned a non-200 status code, read references/api-errors.md" genuinely puts the loading moment in the model's hands.

Working out the context bill

Saying "it saves" is not enough; the numbers make the case. Suppose you have 20 skills installed, each SKILL.md body written up to the spec's 3,000-token limit, with accompanying reference files averaging 5,000 tokens.

Without progressive disclosure, everything in the system prompt: 20 times 3,000 is 60,000 tokens, plus 100,000 for the reference files, or 160,000 tokens in all. That already exceeds many models' windows, and it is resent on every single turn.

With progressive disclosure: stage one at 80 tokens each is 1,600 tokens for 20 skills; a session matches 1 or 2 skills on average, so stage two spends 3,000 to 6,000; stage three reads one or two reference files for another 5,000 to 10,000. The total lands between 10,000 and 18,000 — about a tenth of the load-everything approach.

What is saved is not only money. The window is finite, and going from 160,000 to 16,000 frees room for the code and data of the thing you are actually doing. What belongs in the window and what does not is a craft in itself, and our sister course Context Engineering in 5 Days is devoted to that trade-off.

Part of this bill can be verified by hand: stage one's cost is the only fixed overhead you pay every single time, so it is worth measuring how large your own skills' catalog really is. The code below scans a directory, extracts each skill's name and description, and estimates the catalog's token cost.

catalog-cost.ts
import { readdir, readFile } from 'node:fs/promises'
import { join } from 'node:path'
 
// A rough estimate: about 4 characters per token for English prose. Use a real tokenizer when precision matters.
const estimateTokens = (text: string) => Math.ceil(text.length / 4)
 
async function catalogCost(skillsDir: string) {
  const entries = await readdir(skillsDir, { withFileTypes: true })
  let total = 0
  for (const entry of entries) {
    if (!entry.isDirectory()) continue
    const raw = await readFile(join(skillsDir, entry.name, 'SKILL.md'), 'utf8').catch(() => null)
    if (raw === null) continue // a directory without SKILL.md is not a skill; skip it
    const name = /^name:\s*(.+)$/m.exec(raw)?.[1]?.trim() ?? entry.name
    const description = /^description:\s*(.+)$/m.exec(raw)?.[1]?.trim() ?? ''
    const cost = estimateTokens(name + description)
    total += cost
    console.log(`${name.padEnd(24)} ${String(cost).padStart(4)} tokens`)
  }
  console.log(`catalog costs roughly ${total} tokens, paid once on every turn`)
}
 
await catalogCost(process.argv[2] ?? '.agents/skills')

Run it once and you will find that a catalog of two or three skills is only a couple of hundred tokens, essentially free; but if every description is written to the 1,024-character limit, a catalog of twenty skills costs eight thousand tokens — and at that point the fix is not deleting skills but writing shorter descriptions.

How it differs from the instruction files you already use

The first reaction is often: is this not just cutting AGENTS.md or the convention file in the project root into small pieces? It looks similar in form and is a different mechanism.

A resident instruction file is a sticky note left open on the desk. It enters the context in full on every session, whether or not today's work has anything to do with it. So it suits only things true regardless of what you are doing: code style, language preference, directories nobody may touch. Once past a hundred or two hundred lines it starts diluting attention.

A skill is a closed filing cabinet. Only one cover line shows, and it opens on a match. So it suits things true only in a specific situation: the full procedure for a class of task, the traps of a format, how a particular report is filled in.

A prompt template is the folder you pull out yourself. It also lives in a file, but you are choosing it, not the model. The key difference between a skill and a template is exactly that choosing: with a good description, the model decides which folder to open. That is why tomorrow spends an entire day on that one field.

The criterion boils down to one sentence: is this piece of experience useful every time? If yes, put it in the resident instruction file; if not, make it a skill.

While we are here, let me fill in the basics. A skill does not change how an agent runs; it only puts an extra piece of material into the context of the thinking step — the loop is still the think, act, observe loop. If you have never hand-written that loop and lack a feel for it, read day 2 of the 30-day course: how tool calling works and hand-writing an agent loop, which takes an hour to fill in and gets used on day five when we write a skill runtime ourselves.

The code below is the minimal illustration: a skill catalog is a passage of text composed into the system prompt, and activation is appending one skill's body as a message. Fifty lines shows the whole picture.

inject.ts
type Skill = { name: string; description: string; location: string; body: string }
 
function buildCatalog(skills: Skill[]): string {
  if (skills.length === 0) return '' // omit the section entirely when there are none; never hand the model an empty list
  const items = skills
    .map((s) => `  - name: ${s.name}\n    description: ${s.description}\n    location: ${s.location}`)
    .join('\n')
  return [
    'The following skills provide specialized instructions for particular tasks.',
    'When a task matches a description, read the file at its location before continuing.',
    'available_skills:',
    items,
  ].join('\n')
}
 
function activate(messages: Array<{ role: string; content: string }>, skill: Skill) {
  // Stage two: the whole body enters the context as one message and stays; do not let compaction clear it
  messages.push({ role: 'user', content: `skill_content name=${skill.name}\n${skill.body}` })
}

Understand those two functions and you have understood the same thing every client is doing. Day five completes them into a runtime that genuinely runs: adding the scan, lenient parsing, and precedence for name collisions.

Source Reading

Hands-On Lab

🧪 D1 lab: a worksheet for reading and triggering three existing skills, annotating each one's trigger surface and layering

Code location: labs/agent-skills-7days/day-01-skill-anatomy

Acceptance criteria:

  1. The worksheet has one filled row per skill for all three, each stating its name, the trigger surface of its description, which sections the body divides into, and which optional directories it carries.
  2. For each skill you wrote one sentence that would trigger it and one similar-looking sentence that should not, and explained which word makes the difference.
  3. The description character count and SKILL.md line count are counted for all three, each judged over or under the 1,024-character and 500-line lines.
  4. The end of the table carries a summary of no more than five lines naming the one authoring habit among the three you most want to copy.

There is no code to write today; the deliverable is a worksheet for reading existing skills — learn to read first and you will be able to write tomorrow. Before starting, leave the "reading the frontmatter field by field" section open in a tab, because you will keep coming back to it while filling in the table. Pick the material from the example repository, choosing skills whose purpose you can grasp at a glance rather than the most complex ones.

  1. Open the already-filled row in the solution and read it against the SKILL.md of the skill it cites, working out where in the file each column's content was taken from.
  2. Pick three skills from the example repository and fill one row each in the starter's table: name, trigger surface, body layering, accompanying directories.
  3. For each skill write one sentence that triggers it and one similar-looking sentence that should not, marking which word makes the difference.
  4. Count the description character count and SKILL.md line count for all three, judging each against the spec's two budget lines.
  5. Write the summary paragraph, then self-check against the acceptance criteria one by one; all four passing means done.

Interview Questions

Today's 3 questions are in the question bank below, weighted toward a skill's makeup and the spec's constraints, the three stages of progressive disclosure, and the boundary between a skill and a prompt file. 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

  • State a skill's minimal makeup, and explain what each of the optional scripts, references, and assets directories holds
  • Recite SKILL.md frontmatter's two required fields and their hard constraints
  • Explain three-stage progressive disclosure in your own words, and work out how much context it saves versus loading everything
  • State the division of "tools fill capability gaps, skills fill experience gaps," with an example of each
  • All 4 acceptance criteria of the lab pass
  • Answer at least 2 of the 3 interview questions without looking at the key points

Tomorrow (D2) we write the first real skill. The order is deliberate: today you learned that the description is the only trigger surface, so tomorrow spends the whole session on that one field — how to pick trigger words, how to draw the boundary, how to layer the body, and how to verify after installing into a client that it really did get opened. Understand the mechanism before building, and your first skill will not be an ornament that is installed and never triggered.

Interview questions

  • What problem do Agent Skills solve, and how are they different from putting every convention into one big instruction file?Agent Skills 解决的是什么问题?它和把所有规范写进一个大的提示词文件有什么区别?
    Common in ChinaCommon overseasBasic#agent-skills#context-engineering

    How to reason about it · think before answering

    1. The discriminator is whether you say on demand. Answering skills are reusable prompts says nothing, because that is equally true of a prompt template.
    2. Start with the split: tools fill a capability gap the model cannot cross on its own; skills fill an experience gap where the model can do the task but not the way your team does it.
    3. Then the mechanism: a persistent instruction file enters context in full every session, while a skill exposes only name and description until something matches and its body is loaded.
    4. Quantify the cost: twenty conventions at six thousand tokens of system prompt bill three hundred thousand tokens over a fifty-turn session, and the attention dilution costs more than the money.
    5. Close with the rule of thumb interviewers want: if the guidance applies every single time, it belongs in the persistent instruction file; otherwise make it a skill.
    6. Expected follow-up: what about prompt templates? The difference is who chooses. You pick a template; the model picks a skill by reading descriptions.

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

    1. 这题的区分度在你有没有说出「按需」两个字。只答「skill 是可复用的提示词」的人,等于没答,因为那句话对提示词模板同样成立。
    2. 先给分工:工具补的是能力缺口,模型本来做不到的事;技能补的是经验缺口,模型做得到但不知道你们这儿怎么做。这一刀切下去,后面的论证才站得住。
    3. 再给机制差异:常驻指令文件每次会话全量进上下文,skill 平时只露 name 与 description,命中才展开正文。前者的成本是固定的,后者的成本是按需的。
    4. 接着算代价:二十条规范写满六千 token 的系统提示,五十轮会话要重复计费三十万 token;更贵的是注意力被不相干的规则稀释,做第三件事时被第十七条干扰。
    5. 最后给判据,这是面试官真正想听的一句:这条经验是不是每次都用得上?是就写进常驻指令文件,不是就做成 skill。
    6. 可预期的追问是「那提示词模板呢」。答案是谁来挑:模板是你手动选的,skill 是模型读着 description 自己选的,触发权在模型手里。

    Key points

    • Tools close capability gaps, skills close experience gaps. Do not blur the two.
    • A persistent instruction file costs the same tokens every turn; a skill body only enters context when it matches.
    • Dumping unrelated conventions into the system prompt both costs money and dilutes attention.
    • The test is whether the guidance applies every time: if yes it stays resident, if no it becomes a skill.
    • Unlike a prompt template, a skill is selected by the model itself from its description.

    答题要点

    • 工具补能力缺口,技能补经验缺口,这是两件事,不要混着答。
    • 常驻指令文件成本固定且每轮重发,skill 的正文只在命中时才进上下文。
    • 把不相干的规范全塞进系统提示,除了花钱还会稀释注意力,让模型被无关规则干扰。
    • 判据是「是不是每次都用得上」:是就常驻,不是就做成 skill。
    • 和提示词模板的关键差别是触发权在模型手里,靠的是 description。
  • What does each of the three progressive disclosure stages load, and why not just load every skill up front?渐进式加载的三个阶段分别加载什么?为什么不能一次性把所有 skill 全加载进去?
    Common in ChinaCommon overseasIntermediate#agent-skills#progressive-disclosure

    How to reason about it · think before answering

    1. This tests both recall precision and engineering sense. Naming the three stages is not enough; say which fields and which files each stage pulls in.
    2. Order them by granularity: stage one loads only name and description, roughly fifty to a hundred tokens per skill; stage two loads the full SKILL.md body, recommended under five thousand tokens and five hundred lines; stage three loads individual scripts, references and assets.
    3. Answer the why with a number: twenty skills at three thousand tokens of body plus reference files is well over a hundred thousand tokens, past many context windows, and resent every turn. Progressive loading lands around ten thousand.
    4. Add the deeper reason: what you save is window space, not just money, and that space belongs to the actual task.
    5. Expected follow-up: how does stage three fire? The body must state the loading condition. See the references folder is useless; read the error-code reference when the API returns a non-200 hands the timing to the model.

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

    1. 这题在考你对机制的记忆精度,同时也在考工程感。只背出三个阶段的名字拿不到分,要说出每一阶段加载的**是哪些字段、哪些文件**。
    2. 拆法很简单,按加载的粒度从粗到细数:阶段一只加载 name 与 description,量级是每个 skill 五十到一百个 token;阶段二加载整份 SKILL.md 正文,建议不超过五千 token 与五百行;阶段三按文件粒度加载脚本、引用与资源。
    3. 回答「为什么不全加载」时给一个具体的数:二十个 skill 各三千 token 的正文加上引用文件,全量是十几万 token,超过很多模型的窗口,而且每一轮都要重发。渐进式加载后总量落在一万上下。
    4. 补一条更本质的理由:省下来的不只是钱,是窗口位置。腾出来的空间要留给真正在做的这件事的代码和数据,这就是上下文工程的核心取舍。
    5. 可预期的追问是「阶段三怎么触发」。答案是正文里必须写明读取条件——写「细节见 references 目录」等于没写,写「接口返回非 200 时读 references 里的错误码文件」才真正把时机交给了模型。

    Key points

    • Discovery: only name and description, about fifty to a hundred tokens per skill.
    • Activation: the full SKILL.md body, ideally under five thousand tokens and five hundred lines.
    • Execution: individual files from scripts, references or assets, loaded one at a time on demand.
    • Loading everything up front blows the window and is resent every turn; progressive loading cuts it to roughly a tenth.
    • Stage three only fires if the body spells out which file to read under which condition.

    答题要点

    • 阶段一发现:只加载 name 与 description,每个 skill 约五十到一百 token。
    • 阶段二激活:读入完整 SKILL.md 正文,建议不超过五千 token 与五百行。
    • 阶段三执行:按需读取 scripts、references、assets 里的单个文件,不是整目录倒进来。
    • 全量加载会撑爆窗口且每轮重发,渐进式加载能把量级压到十分之一左右。
    • 阶段三能不能被触发,取决于正文有没有写清「什么条件下读哪个文件」。
  • What hard constraints does the spec put on the name and description fields, and why is name so tightly constrained?SKILL.md 的 name 与 description 有哪些硬性约束?规范为什么要把 name 卡得这么死?
    Common in ChinaCommon overseasIntermediate#agent-skills#spec

    How to reason about it · think before answering

    1. It looks like spec recall, but the real question is the why. Listing the constraints is a pass; explaining which engineering problem they prevent is the differentiator.
    2. Name has five constraints: one to sixty-four characters, lowercase letters digits and hyphens only, no leading or trailing hyphen, no consecutive hyphens, and it must match the parent directory name.
    3. Description has two: one to one thousand twenty-four characters, and it must convey both what the skill does and when to use it.
    4. The reason name is strict: it is the skill's identity across the ecosystem, feeding directory lookup, namespacing, slash-command invocation and collision precedence. One casing mismatch becomes an installed but uncallable skill.
    5. Mention the real-world wrinkle: many clients deliberately relax the name-matches-directory rule and only warn, so a skill can work locally and vanish under a stricter implementation.
    6. Expected follow-up: what if the description runs to a thousand characters? You pay for it every session. Twenty maxed-out descriptions cost eight thousand tokens of catalog, so shorten the text rather than dropping skills.

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

    1. 这题看着像背规范,其实题眼在后半句「为什么」。能把约束背全只算及格,能说出这些约束是为了解决什么工程问题才是加分项。
    2. 先把 name 的五条约束数完:长度一到六十四个字符、只能用小写字母数字和连字符、不能以连字符开头或结尾、不能有连续两个连字符、必须与父目录名一致。
    3. 再给 description 的两条:长度一到一千零二十四个字符;内容上要同时说清做什么和什么时候用,而不是只说做什么。
    4. 解释「为什么卡这么死」:name 是这个 skill 在整个生态里的唯一标识,要拼进目录名、命名空间、斜杠命令,还要在两个 skill 撞名时用来判优先级。任何一处大小写或分隔符不一致,都会变成一个很难查的「装了却调不到」。
    5. 补一个真实的坑:很多客户端在实现时故意放宽了「name 等于目录名」这条,不一致只打警告仍然加载。于是你本地一切正常,换个严格实现就整个消失。
    6. 可预期的追问是「description 写到一千个字符会怎样」。答案是它每次会话都要付一遍,二十个 skill 都写满上限,光目录就要八千 token,这时候该做的是把描述写短而不是删 skill。

    Key points

    • Name: one to sixty-four characters, lowercase alphanumerics and hyphens, no leading or trailing hyphen, no double hyphens, must equal the directory name.
    • Description: one to one thousand twenty-four characters, stating both what it does and when to use it.
    • Name is strict because it is the skill's identity for lookup, namespacing, invocation and collision precedence.
    • Many clients validate name leniently, so working locally does not guarantee working elsewhere.
    • The description is a fixed per-session cost, so keep it as short as it can be while still triggering.

    答题要点

    • name:一到六十四字符、小写字母数字与连字符、首尾不能是连字符、不能有连续连字符、必须等于父目录名。
    • description:一到一千零二十四字符,必须同时说清做什么与什么时候用。
    • name 卡死是因为它是唯一标识,要参与目录查找、命名空间、命令调用与撞名优先级。
    • 很多客户端对 name 做宽松校验,本地能跑不代表换个客户端也能跑。
    • description 是每次会话都要付的固定开销,能短则短。

Comments