Skip to content

v0.5.0 — 자기 적용

Choose a tag to compare

@tjdwls101010 tjdwls101010 released this 24 Aug 12:08
· 19 commits to main since this release
a5a6faf

[0.5.0] — 2026-08-24

Self-application. Four releases built one doctrine each — principle over rail, interface over document, write for the user rather than the developer, density. None of them ever asked whether the skill obeys all four itself. This one asks, across the whole surface at once, and the answer was no in five places. The doctrine was stated four times and the copies had already drifted apart from the code. Prose restated things a tool schema and a check message deliver on every use. Two headings announced sections that had moved. A document contradicted itself about whether its own central claim was verified. And the one thing a harness author most needs to decide — which of the four ways to run work in parallel — was not in the skill at all.

Added

  • The four-way orchestration choice, in references/agents.md, which now opens on it: subagents, agent view, agent teams, dynamic workflows. The discriminant is the one the docs already use — who decides what runs next — and the column this skill adds is what each choice makes the harness contain, because three of the four contain nothing. Agent teams had appeared exactly once before this, as an antipattern with no honest opposite; the section gives them one, along with the four costs an interview never volunteers, the largest being that teams do not isolate teammates in worktrees, so partitioned file ownership is a design act the harness owes the user.
  • Four prose-only rules became checks. Project-scope permissions.defaultMode: "auto" (ignored outright, so the harness reads as configured and behaves as if it weren't). Path rules on tools that never consult one — Write(docs/**) parses, looks like it protects docs/, and protects nothing; an Error rather than a Warning because no valid alternative reading exists. The missing word boundary in Bash(ls*), which turned out to be a message repair rather than a new check. And skill-frontmatter hooks: blocks, which had reached no validator at all.
  • A heading-with-no-body check over every reference file. The defect it catches is invisible by construction: moving a paragraph out is a diff a reviewer sees, and the heading left behind is a diff nobody sees. Container headings are allowed to hand straight to a deeper one — they promise subsections and deliver them; what has no reading is a heading whose next heading is a sibling.

Changed

  • interview.md and re-entry.md merged into one file, and re-entry.md deleted. v2's D22 was two steps, and only one of them earned the headline: gating the load produced always-loaded 4,833 → 2,411 words, while splitting the file bought "a re-entry pass doesn't read interview prose" and cost a second copy of the status semantics plus a round trip back into the stages. Rewritten rather than concatenated — 74 claims extracted from the two originals, then a new document written against that list, so a fresh build and a re-entry read as two phases of one lifecycle instead of two documents.
  • The doctrine has one canonical statement again. skills.md restated the rail-vs-principle litmus at greater length than the original and restated progressive disclosure in full; claude-md-and-rules.md restated the enforced-vs-advisory question hooks.md also asks; workflows.md quoted "the one sentence that governs every layer" without citing it. Each keeps its component-specific application and anchors to the canonical phrase.
  • A new filter, sharper than "is this mechanism prose?": does a runtime surface already deliver this on every use? The surfaces are a tool's own schema, a bundled script's --help, and a check's failure message — none of which can drift from what they describe. AskUserQuestion's mechanical limits and the workflow determinism ban went on that basis. Documentation of silent behaviour stays, because no surface delivers it.
  • Reference prose is net smaller everywhere it was touched: skills.md 2,840 → 2,491, e2e-testing.md 3,523 → 3,467, workflows.md 2,203 → 2,180, claude-md-and-rules.md 2,795 → 2,764, SKILL.md 2,644 → 2,620.

Fixed

  • e2e-testing.md contradicted itself about whether headless permission handling was verified — a heading saying "unverified in this build", a paragraph reporting three confirmed runs, and a third paragraph saying "reasoned, not verified. Do not present it to the user as already confirmed." Three positions on one question, left behind when 0.4.0 added the confirmation without updating the prose around it. The boundary is now drawn once: the flag combination is settled, the reader's machine never is, and the date and run count live only in run_e2e.py's docstring.
  • skills.md said a skill body over 400 lines earns a second file while MAX_SKILL_BODY_LINES says 500 and SKILL.md says 500. Rather than correct the number, the sentence now defers to the check, whose message prints it — writing 500 into prose would have reproduced the exact defect being fixed.
  • Two headings in agents.md promised sections whose content had migrated into the frontmatter table below.
  • A check that fired on a documented pattern. The first implementation of the skill-hooks check warned whenever a skill hook used ${CLAUDE_PROJECT_DIR}, which the docs describe as the intended way for a skill to reach a project-level script. Caught by the adversarial review and removed, along with the reference sentence that read as a ban on it.

Known limitations

  • Sync mode costs about 3.6× more to enter than it did. Before the merge it read re-entry.md alone, 1,094 words; it now reads the merged interview.md, 3,924. Nothing offsets this and it is not presented as an improvement — it is an accepted trade, taken because the alternative was two copies of the status table that can disagree, which is sync's own correctness problem. Frequency is not part of the argument: there is no invocation telemetry, so "sync is the rarest mode" is not measurable here. The merged file is still conditional, so the always-loaded budget is unaffected.
  • The claim-loss audit behind the merge is a floor, not a proof. It anchors one string per claim, which cannot see a claim losing part of itself — the adversarial pass found two doing exactly that, and both were restored before release. A future merge should expect the same class of miss.
  • Prose and check messages still co-own the reason and the fix in several places this release did not touch (hooks.md's permission gotchas, the duplicate-agent-name warning, the paths:-less rule warning). The boundary that says prose keeps the decision and the finding carries the consequence was applied to what changed here, not swept across the package.
  • Carried forward: the L5 full-interview dogfooding remains unrun, for the fourth release — AskUserQuestion does not exist in headless or subagent contexts, so no automated test can exercise the interview. Installing the plugin from a local directory path still copies gitignored files into the plugin cache (harmless; GitHub-source installs are unaffected).