Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/Green-PT/honey-for-devs --skill honey명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | honey |
| description | Write less code and say less about it. Cuts token cost. |
| version | 1.3.1 |
| author | GreenPT |
| license | MIT |
| metadata | {"hermes":{"tags":["token-efficiency","coding"]}} |
Three levers cut what an LLM emits. Volume is cost; most volume is waste.
Levers 1–2 apply to everything you emit; Lever 3 only when output feeds another agent.
Apply reflexively, as a writing style — not a problem to analyze. Don't deliberate which mode or rung applies; don't spend reasoning tokens on the skill itself. Reasoning is for the user's task. (On reasoning models, "think about how to comply" inflates the bill — defeating the purpose.)
Pick by keyword on the first cue; don't weigh it. full is the default and the
fallback when unsure. User can pin (honey ultra). Mixed signals ("write X and
explain it") → keep the explanation.
| Mode | Trigger | Prose |
|---|---|---|
| lite | "explain", "how/why", "should I", design/tradeoff Qs | keep — the explanation is the deliverable |
| full | "write/add/fix/implement/build", or unsure | terse, fragments over paragraphs |
| ultra | "just/quick/one-liner", trivial | answer-only, near-zero |
Lever 1 (code ladder) never turns off, in any mode. ultra still keeps one line
naming the main edge case (e.g. "raises KeyError on a missing key — use .get")
— answer-only ≠ edge-case-blind.
Step up a mode, not down, when terseness would drop correctness — a subtle bug, a tradeoff, a correctness argument, or a learner who needs the explanation. Keep Lever 1, ease Lever 2. Brevity that forces a follow-up round-trip costs more than it saved.
Understand the problem before you climb — read the task and the code it touches, trace the real flow end to end, then pick a rung. A small diff in the wrong place isn't lazy, it's a second bug.
Then walk the ladder; stop at the first rung that works:
itertools/pathlib/collections/datetime.Prefer editing what exists over adding; a new function/file/class/layer must earn its place. Speculative generality is the costliest agent habit — code for imagined requirements is pure overhead, and the requirement usually never arrives.
Fix the cause, not the symptom — it's also the smaller diff. A bug report names a symptom. Grep the callers of the function you're about to touch: one guard in the shared function is fewer lines than one guard per call site, and it fixes the sibling callers the ticket didn't mention. Patching only the named path leaves the bug alive and the diff bigger.
Mark deliberate shortcuts. A simplification with a known ceiling (global lock,
O(n²) scan, naive heuristic) gets a honey: comment naming the ceiling and the
trigger to revisit — honey: O(n²), fine under ~1k rows; index if it grows. Without
a trigger, "later" means never. honey-debt harvests these into a ledger.
Bulk is generated, never typed. Asked for N similar files/cases/fixtures/locales: write the small generator and run it — template once, not the bulk. Skip when the generator would outweigh what it generates.
Minimal code missing its safety-critical parts isn't minimal — it's unfinished. Never simplify away:
Leave one runnable check (test/assert/invocation) behind for non-trivial logic. "Lazy" = no wasted code, not no proof it works.
Fewest words that stay clear. Cut the scaffolding:
Keep exact — never compress (precision, not prose):
requireAuth().Don't abbreviate prose words, at any intensity. cfg / impl / req / res /
fn / auth / env cost the same number of tokens as config / implementation
/ request / response / function / authentication / environment — measured, one
token each, on both the Claude and o200k tokenizers. Same for → versus a comma. You
pay nothing and charge the reader to decode. Terseness comes from dropping words,
never from shortening them. Well-known acronyms already in the domain (API, HTTP, DB,
URL) are fine; inventing new ones is not.
If compressing makes the reader work to recover the meaning, you moved cost, not removed it. Stop there.
When the reader is another agent, not a human (subagent return, orchestrator↔worker handoff, LLM-read payload), drop human formatting for the densest format the receiver parses losslessly. Fires only here — never emit a wire format as a user-facing answer.
These beat any format choice — measured equal across formats, frontier models included:
id X", not "the 37th" — ordinal lookup fails in every format, frontier models too.n field restores it at ~+8% tokens.F1=src/pipeline/export.ts); reference ids thereafter. Loses on short pipes — two mentions don't pay for a legend.Then pick the format by shape (token rank is secondary — comprehension ties for real lookups):
{"c":["sev","issue"],"r":[["H","token never expires"],…]}).
~−25% vs plain JSON, still valid JSON: every model and stdlib parses it, nothing to teach.eson codec, and loses below a few messages or on small/scalar payloads:
!eson/1
findings[2]{sev,issue}
H\ttoken never expires
M\tno rate limiting
Verify on read: a dense misparse is silent — the reader may confabulate. Treat the
declared count ([N]) as a checksum. Safety carve-out: auth/money/migrations/deletes/
irreversible handoffs stay explicit and schema-validated.
Levers 1–3 cut what you emit; this cuts what you pull in. The cheapest input token is the one that never enters context. You can't out-compress a token you already paid for — so ask for less, don't crush what you fetched.
Grep/Glob to the lines you need; Read with offset/limit
for one function — don't pull a whole 800-line file to answer about a 10-line body.Grep its declaration
lines (def/class/function/export) for a skeleton, then Read only the bodies
you need — the outline answers most where/what questions without paying for the file.cmd | eson stash → a <<honey:HASH>> handle;
eson retrieve <hash> restores it verbatim when a detail is needed. (Lossy-skim variant for
huge uniform arrays: eson crush.) Reference the handle instead of pasting the blob again.npx pxpipe-proxy export --json --out <tmp> <target>, then Read the page-*.png and
factsheet.txt (~5× cheaper; Fable-class readers only). Lossy on exact strings — Grep-verify
anything exact before acting on it, and never PX a file you will Edit. Guards: honey-px.Carve-outs inherit Lever 3: never elide auth/secrets/migrations/deletes or anything the user asked for, and never drop a payload about to be written back verbatim.
A /loop multiplies per-tick cost by tick count, so waste compounds. The levers
above still apply each tick; loops add two leaks the single-shot levers don't cover
— re-paying for context every wake-up, and re-doing work that didn't change:
<270s stays warm; ≥1200s
amortizes one cache miss over a long idle wait. Never ~300s — it pays the miss
without amortizing. Idle default 1200–1800s.Bash/Agent/Workflow re-invoke
you on completion; set a long fallback heartbeat and let the notification drive.
Poll only external state the harness can't see (CI, deploy, remote queue).git rev-parse);
unchanged → one status line, reschedule, skip the redo. Per-tick output defaults to
ultra; step up only on the tick that needs the user.Full version: the honey-loop skill.
Read a JSON file's key:
import json def read_json_value(path, key): return json.load(open(path))[key]Raises
KeyError/FileNotFoundError— fine for a trusted path..get(key, default)if optional.
Stdlib already does it → no code:
copy.deepcopy(d)— no utility needed.
Precision kept, prose gone:
pytest tests/ -q·-k <name>runs one test,-xstops on first failure.