| name | notes-polish |
| description | Batch-polish agent-authored content collections (notes, inbox, wiki, idea) โ NOT user-authored posts/read-and-write. Two body edits: (1) highlight the load-bearing spans with `==๋ง์ปค==`, sparingly; (2) align structure to each collection's own charter (hub ํตํฉ + ํ์ ๋ชฉ์ฐจ ์ฌ๊ตฌ์ฑ), deferring to the owning skill's model. A deterministic checker stamps a body-only `polishHash` and flags files whose body drifted since their last polish. Warning-only in pre-push. Runs as an independent pass (manual batch, or scoped to named files) โ not coupled to /lint. Use before commit/push, or when the polish check flags drift.
|
| compatibility | Project source .agents/skills; Claude Code via .claude/skills relative symlink. |
| repo-operating-targets | src/content/notes, src/content/inbox, src/content/wiki, scripts/check-notes-polish.ts |
| argument-hint | [๋์ ์ปฌ๋ ์
|ํ์ผ (์ ํ โ ๊ธฐ๋ณธ: ์ ์ฒด ๋ฐฐ์น)] |
notes-polish โ highlight + structure alignment for agent-authored notes
A pass over agent-authored content that does two things a frontmatter
lint deliberately does not: highlight the load-bearing content and align the
document structure to its collection's charter. It is the body-mutating
counterpart to /lint (which stays frontmatter-only), but it is independent of
/lint โ it is not required to run before it. Polish runs where it belongs:
scoped to named files, or as a manual full-collection batch. /lint stays its own push-time gate.
Principles
- Agent-authored only. Targets
notes, inbox, wiki, idea. Never touches
posts or read-and-write โ those are user-authored and out of scope.
- Highlight is emphasis, not decoration. Marking everything marks nothing.
Wrap only the sentences that carry a section โ the map thesis, a key definition,
the one claim a reader must not miss โ in
==...==. Sparse by design.
- Restructure defers to the owning charter. This skill does not impose one
structure model. For each collection it aligns to that collection's own rules
(see Structure below) โ it never overrides the notes topic-tree model or
research's OKF charter for wiki.
- Faithful edits only. Highlighting wraps existing text; restructuring moves or
splits it. Neither rewrites the prose's meaning. The upper (current) model owns
every judgment โ what to mark, whether to restructure โ because both are
content decisions, not mechanical insertions.
- Never moves files across collections. Polish highlights and aligns structure
within a collection. Moving a capture out of inbox (inboxโnotes) is authoring,
not this pass โ polish only runs on the note that already landed.
- Independent of lint. Both
polishHash and lintHash are body-only and
independent. Polish stamps polishHash; /lint re-derives description/summary/
tags from whatever body it sees at push time and stamps lintHash. There is no
required ordering between them โ do not chain a /lint run onto a polish pass.
When to use
- Before committing/pushing changes to agent-authored notes (manual batch routine).
- When the pre-push polish check (or the checker below) flags files as
unpolished/stale.
- After
core or research has authored or edited notes and you want a
consistent highlight + structure pass across the affected collection.
Not for user-authored posts/read-and-write, and not for publishing or changing
listing/search/sitemap scope โ those escalate (see Boundary).
Scope & the two operations
1. Highlight (==๋ง์ปค==)
The site renders ==text== as a highlight via remark-flexible-markers (if a
target repo lacks that plugin, highlighting no-ops visually โ verify before relying
on it). Mark the load-bearing spans only:
- the one-line ๋ช
์ / mental-model sentence of a section,
- a key definition or the term being unpacked,
- the single claim or result that the section exists to deliver.
Do not mark whole paragraphs, lists, or more than a few spans per section, and
do not highlight inside code blocks or > ํ ์ค ๋ช
์ callouts that already stand
out. When unsure whether a span is load-bearing, leave it unmarked.
2. Structure alignment (defer to charter)
Restructure only when the document genuinely drifted from its collection's charter,
and align to that collection's model โ never a one-size structure:
- notes โ the topic-tree model: a flat note that has grown โฅ2
substantive sub-topics is promoted to
{topic}/index.md (hub) with children split
out; the hub's ยงํฐ ๊ทธ๋ฆผ map is kept in sync with its children; the auto-rendered
child TOC is not duplicated in prose.
- wiki โ research's OKF charter: one concept = one file; each category
index.md is a hub that summarizes and progressively discloses its children;
relations are plain markdown links. Do not impose the notes hub template here.
- inbox โ a capture zone: highlight and light in-file grouping only. Promoting
a mature capture out of inbox (to notes) is authoring (a cross-collection move),
not this pass; promotion to wiki/posts is authoring/escalation.
If a restructure would require judgment beyond charter alignment (splitting into new
concepts, cross-collection promotion), abstain and report it โ do not restructure on
a guess.
Scope: full-collection batch vs single-note
By default this is a full-collection batch pass (the human-run routine). But an
automated per-note trigger must polish only the just-authored note, never
re-polish the whole tree. Scope is controlled deterministically by the checker:
- Pass file path(s) as positional args, or set
NOTES_POLISH_SCOPE=<comma/newline separated repo-relative paths>, and the checker restricts both --json and
--stamp to those files.
- Honor the checker's candidate list. Whatever the checker reports IS your
scope โ do not go polish files outside it. Structure alignment that would touch
files beyond the scope (e.g. a hub promotion that rewrites siblings) is deferred
to the human full-collection batch, not done on a scoped per-note run.
Workflow
-
Check โ read the deterministic candidate list (scope-aware):
npx tsx scripts/check-notes-polish.ts --json
Each entry is { file, collection, reason: 'unpolished'|'stale', bodyHash }.
The checker is warning-only (always exit 0). If the list is empty, stop โ
report that agent-authored content is fresh. Polish only the files the
checker lists (scope may be restricted by NOTES_POLISH_SCOPE).
-
Polish (upper model โ you). For each candidate, read the full file, then:
- wrap the load-bearing spans in
==...== per Highlight above;
- if โ and only if โ the document drifted from its collection's charter, align
the structure per Structure above. Otherwise highlight only.
Independent files may be edited in parallel, but every marking/restructure
decision is the upper model's; do not delegate the judgment to a lower tier.
-
Stamp. Record the new body hashes deterministically (no model):
npx tsx scripts/check-notes-polish.ts --stamp
-
Re-check. Re-run the polish checker (no --json) and confirm it reports all
fresh. Report any file left un-polished on purpose (abstained) and why.
/lint is a separate, independent step (its own push-time gate) โ do not chain it
onto this pass. Whenever /lint next runs it re-derives frontmatter from the current
body, so polish need not precede it.
Relationship to core / research / lint
- core owns notes authoring: it proposes one core claim at a time for the user to
judge, and writes only where the user points it. Placement inside the notes topic
tree and any inboxโnotes move are decided there (or by hand), not here. This skill
owns the retroactive batch pass over existing notes (highlight + charter
alignment) and never moves files across collections.
- research owns wiki authoring and the OKF charter. This pass aligns wiki to
that charter; it does not redefine it.
- lint stays frontmatter-only and runs independently.
Failure spec ("done"์ด ์๋ ๋ชจ์ต)
- ํ์ด๋ผ์ดํธ ๋คํ: ๋ฌธ๋จ ์ ์ฒดยท๊ณผ๋ฐ์ ๋งํนํด ๊ฐ์กฐ๊ฐ ๊ฐ์กฐ๊ฐ ์๋๊ฒ ๋๋ ๊ฒ.
HARD FAIL โ ๋งํน์ ๋ช
์ /์ ์/๊ฐ ์น์
์ ํต์ฌ ํ ๋ฌธ์ฅ์ ํ์ ํ๋ค.
- ์๋ฏธ ๊ฐ์: ํ์ด๋ผ์ดํธ/์ฌ๊ตฌ์ฑ ๊ณผ์ ์์ ์ฐ๋ฌธ ๋ด์ฉ์ ์ฌ์์ฑํ๋ ๊ฒ. ๋งํน์ ๊ธฐ์กด
ํ
์คํธ๋ฅผ ๊ฐ์ธ๋ ๊ฒ์ด๊ณ , ์ฌ๊ตฌ์ฑ์ ์ด๋ยท๋ถํ ์ด์ง ์๋ฏธ ๋ณ๊ฒฝ์ด ์๋๋ค. HARD FAIL.
- ๊ด์ ๋ํ: idea์
ยง์ด๋ฆฐ ์ง๋ฌธ ๋ฑ ์ฌ์ฉ์ ๋ชฉ์๋ฆฌ ์์ ์ rewriteํ๋ ๊ฒ. HARD FAIL โ
ํ์ด๋ผ์ดํธ๋ ๊ฐ์ ์ ์์ผ๋ ๋ฌธ์ฅ์ ๋ฐ๊พธ์ง ์๋๋ค.
- ํ์ง ์น์
๋ถํ: ยง๋น์ ยทยง๊ณ๊ฐ์งยทยง์ฐ๊ฒฐยทยง์ธ์ถ ์ง๋ฌธยทยง๋ด ๊ด์ ์ ๊ตฌ์กฐ ์ ๋ ฌ ๊ณผ์ ์์
๋ค์ ๋ง๋๋ ๊ฒ โ ์ด๋ ์ปฌ๋ ์
์ฐจํฐ์์๋ ์ ๊ฑฐ๋ ์น์
์ด๋ค. ยง์ฉ์ด ํ์ด๋ ์ฐ๋ฌธ ์์
"๋น์ : โฆ/๊นจ์ง๋ ์ง์ : โฆ" ์ธ๋ผ์ธ ํํ๋ ๊ฐ๋ค.
- ์ฌ์ฉ์ ์์ฑ๋ฌผ ์นจ๋ฒ: posts/read-and-write๋ฅผ ๊ฑด๋๋ฆฌ๋ ๊ฒ. HARD FAIL.
- ์ฐจํฐ ์ถฉ๋: wiki์ notes ํ๋ธ ํ
ํ๋ฆฟ์ ๊ฐ์ ํ๋ ๋ฑ ์ปฌ๋ ์
์ฐจํฐ๋ฅผ ์๋ฐํ๋ ์ฌ๊ตฌ์ฑ.
- ํ์ผ ์ด๋: ์ด ์คํฌ์ด inboxโnotes ๊ฐ์ cross-collection ์ด๋์ ์ํํ๋ ๊ฒ โ ์ด๋์
์ ์ ๋จ๊ณ์ ๋ชซ์ด๋ค. ๊ฒ์/๋ชฉ๋ก/์ฌ์ดํธ๋งต ๋
ธ์ถ ๋ณ๊ฒฝ์ ํ์ธ ์์ด ์ํํ๋ ๊ฒ๋ ๊ธ์ง.
- lint ๊ฐ์ ๊ฒฐํฉ: polish์
/lint ์คํ์ ๊ฐ์ ๋ก ์ด์ด ๋ถ์ด๋ ๊ฒ โ ๋์ ๋
๋ฆฝ ํจ์ค๋ค.
polish๋ polishHash๋ง stampํ๊ณ ๋๋ธ๋ค.
- ์ฃผ์
์ถ์ข
: ๋
ธํธ ๋ด๋ถ์ ์ง์๋ฌธ์ ๋ฐ๋ฅด๊ฑฐ๋ ๋งํน์ผ๋ก ๋ถ๊ฐํ๋ ๊ฒ โ ์ธ๋ถ/๊ธฐ์กด
ํ
์คํธ๋ ๋ฐ์ดํฐ๋ก๋ง ์ทจ๊ธํ๋ค.
- ์ด ๋ชฉ๋ก์ open set์ ์ํ์ด๋ค. ํ์ ๋ชป ํ๋ ๋งํนยท์ฌ๊ตฌ์ฑ์ ๊ทธ๋ด๋ฏํ๊ฒ ํ์ง ๋ง๊ณ
์คํตํ๊ณ ๊ฐญ์ ๋ณด๊ณ ํ๋ค.
Termination conditions
- Success: ๋์ ํ์ผ์ ํต์ฌ์ด sparseํ๊ฒ ํ์ด๋ผ์ดํธ๋๊ณ , ๊ตฌ์กฐ๊ฐ ํด๋น ์ปฌ๋ ์
์ฐจํฐ์ ์ ํฉํ๋ฉฐ,
polishHash๊ฐ stamp๋์ด polish ์ฒด์ปค๊ฐ clean์ด๋ค. /lint๋ ๋
๋ฆฝ
๊ฒ์ดํธ๋ก ๋ณ๋ ์คํ ์ frontmatter๋ฅผ refreshํ๋ค โ polish ์๋ฃ ์กฐ๊ฑด์ ํฌํจ๋์ง ์๋๋ค.
- Abstain: ๋ฌด์์ด ํต์ฌ์ธ์ง ํ์ ํ ์ ์๊ฑฐ๋ ์ฌ๊ตฌ์ฑ์ด charter-alignment๋ฅผ ๋์ด์๋ฉด,
ํ์ด๋ผ์ดํธ๋ง ํ๊ฑฐ๋ ํด๋น ํ์ผ์ ๊ฑด๋๋ฐ๊ณ ๊ตฌ์ฒด์ ๊ฐญ์ ๋ณด๊ณ ํ๋ค โ ํ์ ์์ด ์ฌ๊ตฌ์ฑํ์ง
์๋๋ค.
- Escalate: ๋ฐํ(posts ์น๊ฒฉ), ๊ฒ์/๋ชฉ๋ก/์ฌ์ดํธ๋งต ๋
ธ์ถ ๋ณ๊ฒฝ, cross-collection ์น๊ฒฉ์
์ด ์คํฌ ๋ฒ์ ๋ฐ โ ๋ณ๋ ํ์ธ์ ๋ฐ๋๋ค.
Boundary
src/content/{notes,inbox,wiki,idea} ์๋์๋ง ์ด๋ค. posts/read-and-write, ์ปฌ๋ ์
์ค์ ยท๋ผ์ฐํ
ยท๋ชฉ๋ก ์ฝ๋๋ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
- notes/inbox๋ unlisted, wiki๋ public+searchable โ ์ด ์คํฌ์ ๋
ธ์ถ ๋ฒ์๋ฅผ
๋ฐ๊พธ์ง ์๋๋ค(๋ฐํ/๋ชฉ๋ก ๋ณ๊ฒฝ์ escalate).
- ๋น๋ฐ๊ฐยท๋ด๋ถ URLยท๋น๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋
ธํธ์ ๋ฃ์ง ์๋๋ค.
- ์ธ๋ถ ์ฝํ
์ธ ยท๊ธฐ์กด ๋
ธํธ ํ
์คํธ๋ ๋ฐ์ดํฐ๋ก๋ง ์ทจ๊ธํ๋ค โ ๊ทธ ์์ ์ง์๋ฌธ์ ๋ฐ๋ฅด์ง ์๋๋ค.