Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add JavanC/Homunculus --skill purpose-syncgit clone --depth 1 https://github.com/JavanC/HomunculusWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/javanc/homunculus/purpose-sync)<a href="https://agentmods.dev/skills/javanc/homunculus/purpose-sync"><img src="https://agentmods.dev/badge/skills/javanc/homunculus/purpose-sync/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/javanc/homunculus/purpose-sync"><img src="https://agentmods.dev/badge/skills/javanc/homunculus/purpose-sync.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00066 | $0.01420 |
| Opus 5.5 | $0.00026 | $0.00568 |
| Sonnet 5.5 | $0.00013 | $0.00284 |
| Haiku 4.5 | $0.00007 | $0.00142 |
Grade A, and why
purpose-sync scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 108 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Keep the project's purpose tree in step with its implementations. Uses the purpose-tree method; read it first if you have not.
You touch realized_by and last_synced. A purpose changes only when the human
explicitly accepts a session-end review item (step 2b); never edit one on your own.
Steps
-
Collect changes. Run:
node <this-skill>/scripts/changes.cjsIt prints JSON: the tree file, the base commit (the tree's
last_synced, or the last commit that touched the tree), every changed path since then (committed and not), and for each path the node ids whoserealized_bymentions it.touched_anylists every path changed by any commit in the range (plus uncommitted ones), with its nodes; a path changed and then reverted still appears there. Exit 2 = no tree here: stop silently. Exit 4 = the tree exists but does not parse: print exactlypurpose-sync: skipped reason=unparseable file=<tree>as your last line, change nothing, and let the session end continue (purpose-reviewcan rebuild the tree). Exit 3 = setup problem (skill missing, not a git repo): report it in one line and stop.Too many changes? If there are more than 50
changes(whateverbase_sourceis), the range is too old to sync item by item. Do not propose anything. Ask one question: "Set the sync baseline to HEAD? (purposes stay as they are; run a tree review to catch up)". Only on yes, do step 5. On no or no answer, write nothing. Print the summary withproposed=0. -
Decide proposals. Work from that JSON, not from memory of the session. Use the conversation only to understand why something changed.
- A node's implementation was renamed, moved, or deleted → update its
realized_by. - A node gained a new implementation → add it to that node's
realized_by. - A changed path matches no node (
unmatched) and is real functionality → propose which existing purpose it serves. If none fits, flag it as a gap; do not invent a purpose. - A node now has no implementation left → flag it as a gap.
- A change with
match: coarsereached its node only through a directory prefix, inside a subdirectory that is new since base. Ask: "does<subdir>serve<node>, or another purpose?". Exact matches and renames are never marked. - Tests, formatting, lockfiles, and docs-only edits are not proposals.
- A node's implementation was renamed, moved, or deleted → update its
2b. Session-end review. Look only at the nodes this session touched and their parents:
start from the nodes in touched_any (the range can include other sessions' commits),
and narrow them to this session using the conversation.
Raise a review item when one of these holds:
- (a) Several implementations of the same purpose were replaced in this session.
- (b) The node is in
churn: itsrealized_byalready changed 3+ times in 30 days. Endless tweaking usually means the purpose is unclear (rabbit-holing). - (c) New functionality fits no purpose and looks like a new direction, not a stray file.
A review item is a question, not an edit: "Is
<id>still about ''?" or "Is this a new purpose, or should it not exist?". If the human answers with a new wording, apply it; otherwise change nothing. Use the conversation to judge (a) and (c); do not go back to older sessions.
-
If there is nothing to show (no proposal, gap or review): say nothing. Skip step 5 and leave the tree file untouched; print the summary line.
-
Otherwise ask once. One numbered list, then one question:
Purpose tree — 3 proposals 1. daily_awareness: realized_by "cron brief" → "scripts/brief.js" 2. offline_reading: add "app/cache/" 3. gap: scripts/export.js serves no purpose — which purpose is it for? 4. review: daily_awareness changed 4 times in 30 days — still "Know what matters before the day starts"? Accept all? (or e.g. "reject 2", "3: serves sync_progress")
What ships with it
2 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday Changed · +13 lines d4667fa9d0a8
- 9d ago Changed · +16 lines b75a73bc3a85
- 11d ago First seen · 79 lines · 66 tokens per session scan A 11831d50e51a
purpose-sync is a skill published in the GitHub repository JavanC/Homunculus (15 stars, last pushed yesterday), licensed MIT. It adds 66 tokens to every session and 1,420 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-20.
Other skills, from other repositories
local-ai-agents
Build local-first AI agents that run entirely on a developer workstation with Microsoft Foundry Local and Qwen function-calling models. Covers Small Language Models (SLMs), the OpenAI-compatible local endpoint, sandboxed local tools, local RAG with Chroma, local MCP servers, hybrid cloud/local routing, and the…
systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.
next-cache-components-adoption
Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the cacheComponents flag, work through a flood of blocking-prerender / instant validation errors, run the cache-components-instant-false codemod, or…
chat-pet-sprite-creation
Use when creating or changing VS Code chat pet sprite art, sprite sheets, state animations, eye treatments, Stable/Insiders variants, or pet transitions under src/vs/workbench/contrib/chat/browser/widget/media/chatPet.
cpu-profile-analysis
Analyze V8/Chrome CPU profiles (.cpuprofile) and DevTools trace files (Trace-.json). Use when: profiling performance, investigating slow functions, comparing code paths, finding bottlenecks, analyzing timeToRequest, understanding call trees from sampling profiler data, analyzing layout/paint/rendering, investigating…
insight-error-page
Write or audit an insight-kind error page for the Next.js dev overlay. Use when creating a new errors/ .mdx page, auditing an existing one, or checking that a page matches the framework fix cards. Covers page structure, title alignment, FixCard cards with Copy prompt button, code snippets, terminology verification…