{"id":"c636d731-e1c6-4ecb-b036-98e4a3f7ef18","slug":"coding-kit","kind":"skill","name":"coding-kit","summary":"Portable agent-brain kit: superpowers methodology, YAGNI minimalism, cross-chat SQLite FTS5 memory, adversarial trap-suite evals. Hermes-compatible skills for OMP/Claude Code/Gemini CLI/Hermes/Antigra","owner":"oleg494","repoUrl":"https://github.com/oleg494/coding-kit","license":"MIT","licenseTier":"permissive","trust":"community","stars":3,"match":null,"fewStars":true,"format":"skill","createdAt":"2026-08-19T00:29:04.000Z","addedAt":"2026-10-21T11:26:59.661Z","logoUrl":"https://avatars.githubusercontent.com/u/69392657?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["databases","developer-tools","communication"],"tags":["ai-agents","claude-code","evals","gemini-cli","hermes","prompt-engineering","sqlite-fts5"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-26T02:29:21.084Z","sample":false,"url":"https://conduits.dev/tools/coding-kit","language":"Python","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# coding-kit\n\n**One operating contract, on-demand skills and cross-session memory for coding agents.**\n\nThe kit gives an agent a short contract ([OPS.md](OPS.md): authority,\ncompletion, evidence, memory), 27 skills that load only when their domain\nquestion is open, and a Python standard-library memory engine with\nevaluation tools. It is not an agent runtime, a sandbox, or a guarantee of\nbetter answers.\n\n[![Kit gates](https://github.com/oleg494/coding-kit/actions/workflows/test.yml/badge.svg)](https://github.com/oleg494/coding-kit/actions/workflows/test.yml)\n[![Release](https://img.shields.io/github/v/release/oleg494/coding-kit)](https://github.com/oleg494/coding-kit/releases/latest)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n[Get started](#get-started) · [Daily use](#daily-use) · [Skills](#skills-at-a-glance) · [Evidence and limitations](#evidence-and-limitations) · [Upgrading](#upgrading) · [Contributing](CONTRIBUTING.md)\n\n## What you can use it for\n\n- **Carry decisions across sessions.** Save findings in your private memory\n  store and search them from a fresh agent session instead of reconstructing\n  project history from chat.\n- **Give coding work a consistent method.** The contract defines acceptance,\n  verification and reporting; skills add domain detail for planning,\n  debugging, testing, review, security, money paths and UI.\n- **Evaluate behavior rather than trust promises.** Run policy scenarios,\n  skill-routing checks, and small coding tasks with deterministic verifiers.\n  These answer different questions; none alone proves overall coding quality.\n\nDeveloped and tested with **Claude Code and Oh My Pi (OMP)**. Other agents\nthat read instruction files and `SKILL.md` skills can be configured manually;\nthis project does not claim to have tested their behavior. Instructions are\nin English; the kit asks the agent to answer in your language.\n\n## Get started\n\nInstallation has two separate steps: **create the memory store**, then\n**connect your agent**. The first step does not install agent instructions.\n\n### 1. Create your memory store\n\nRequirements: Git and **Python 3.12**. CI runs on Windows and Ubuntu with\nPython 3.12; other Python versions are untested. Runtime scripts use the\nstandard library. Only contributors running the test suite need `pytest`.\n\nRun these commands in PowerShell or Bash:\n\n```text\ngit clone https://github.com/oleg494/coding-kit.git coding-kit\ncd coding-kit\npython scripts/install.py\n```\n\nThe installer creates your user-level `~/.memory/` directory, including\nfixtures and indexes, and links its engine to this clone. Keep the clone in\nplace. Re-running the installer is supported. Look for `search smoke: OK`.\nIt does not configure your agent's rules or skills.\n\n<details>\n<summary>Use a different memory location</summary>\n\nSet `MEMORY_ROOT` before installation and in sessions that use the kit.\n\nPowerShell:\n\n```powershell\n$env:MEMORY_ROOT = \"$HOME/coding-memory\"\npython scripts/install.py\n```\n\nBash:\n\n```bash\nexport MEMORY_ROOT=\"$HOME/coding-memory\"\npython scripts/install.py\n```\n\nExamples below call the engine from the clone, so they do not depend on\nshell expansion of `~` in script arguments.\n\n</details>\n\n### 2. Connect your agent\n\nMerge a pointer to this clone's [OPS.md](OPS.md) into your agent's rules file.\nUse an absolute path so the contract remains reachable from other projects.\nLoad it once; [AGENTS.md](AGENTS.md) is only a repository router. Preserve\nexisting instructions rather than replacing them wholesale.\n\nCopy or link only the 27 skills declared in [profile.yml](profile.yml) into\nthe agent's skill directory, preserving unrelated skills. Skill bodies load\non demand; no full method chain or memory warmup is required at startup.\nThese user-level changes can affect every project opened with that agent.\n\n| Agent | Rules file | Skills |\n|---|---|---|\n| Claude Code | `~/.claude/CLAUDE.md` | `~/.claude/skills/` |\n| Oh My Pi (OMP) | `~/.omp/agent/AGENTS.md` | `~/.agents/skills/` with user-agent skill discovery enabled |\n| Antigravity | `~/AGENTS.md` | `~/.agents/skills/` |\n| ZCode | `~/.zcode/AGENTS.md` | `~/.zcode/skills/` |\n| Hermes | Delimited block in `SOUL.md` | Generated owned-skill projection via [Hermes adapter](adapters/hermes.md) |\n\nThe OMP paths above match the kit's [deployment targets](scripts/tools/deploy.py).\nSee the [Antigravity](adapters/antigravity.md) and [ZCode](adapters/zcode.md)\nguides for their environment-specific setup.\n\n### 3. Verify the connection\n\nFrom the clone, enter the tools directory, save a note, and retrieve it:\n\n```text\ncd memory/db-tools\npython findings.py add \"first-note\" --text \"hello\" --project coding-kit\npython findings.py search \"first-note\" --project coding-kit\ncd ../..\n```\n\nThen start a **fresh agent session** and ask:\n\n> Search my coding-kit memory for \"first-note\" using the memory tools.\n> Show the command you ran and the stored finding.\n\nThe agent should invoke `findings.py search` or `search_all.py` against your\nmemory store and retrieve the note, not merely repeat this example. If it\ndoes not, check that the rules and skill paths are loaded by your agent.\n\n`python scripts/doctor.py` checks repository and memory consistency.\nA green result is **not** proof that an agent loaded or followed the kit.\n\n## Daily use\n\nRun the memory tools from the clone, or use their absolute paths elsewhere:\n\n```text\npython memory/db-tools/search_all.py \"deployment decision\"\npython memory/db-tools/search_all.py \"deployment decision\" --project coding-kit\npython memory/db-tools/search_all.py \"deployment decision\" --importance high\npython memory/db-tools/findings.py projects\n```\n\n`--mode lexical` remains the default. Optional semantic retrieval uses a\nlocal multilingual MiniLM ONNX model, never a hosted inference API. It needs\n`numpy`, `onnxruntime`, and `tokenizers` only for semantic commands; ordinary\nFTS5 search and installation do not require those packages. Prepare the model\nand build the disposable index explicitly:\n\n```text\npython memory/db-tools/vector_search.py prepare-model --model-dir ~/.local/share/coding-kit/models/paraphrase-multilingual-MiniLM-L12-v2\npython memory/db-tools/vector_search.py build --model-dir ~/.local/share/coding-kit/models/paraphrase-multilingual-MiniLM-L12-v2\npython memory/db-tools/search_all.py \"resume interrupted work\" --mode vector --model-dir ~/.local/share/coding-kit/models/paraphrase-multilingual-MiniLM-L12-v2\npython memory/db-tools/search_all.py \"resume interrupted work\" --mode hybrid --model-dir ~/.local/share/coding-kit/models/paraphrase-multilingual-MiniLM-L12-v2\n```\n\nThe pinned public model is\n`Xenova/paraphrase-multilingual-MiniLM-L12-v2` at revision\n`2c4055b12046f11709e9df2c122e59ffbdc2f900`; preparation downloads only its\nquantized ONNX graph and tokenizer, verifies their fingerprints, and never\nexecutes remote code. `MEMORY_EMBEDDING_MODEL_DIR` may replace repeated\n`--model-dir` flags. Semantic reads do not repair stale indexes: rebuild after\nmemory changes. Index writes are temporary and atomic; source databases are\nauthoritative. Semantic index files are disposable, not personal data\nbackups. `findings.py search` also accepts `--mode`, `--model-dir`, and\n`--index`; both CLIs expose `--state all|current|superseded` and\n`--verification all|verified|unverified` before result limits.\n\nHow the agent retrieves and saves memory, and how it resumes \"continue work\non X\", is defined once in [OPS.md](OPS.md) §§2 and 5: relevant memory is\nsearched without a reminder, durable verified results are saved without a\nconfirmation prompt, and read-only scope, \"do not save\" or stop switch saving\noff. These are instruction contracts, not runtime enforcement.\n\n## Skills at a glance\n\nOrdinary implementation needs no skill; the contract is the method. Each\nskill owns one kind of open question, and its description names the neighbor\nto use instead. Cross-references are pointers, not a load order.\n\n| Open question | Skill |\n|---|---|\n| What to build: unclear idea, requirements, spec, design choice | `brainstorming` |\n| How to execute coupled or multi-slice work | `writing-plans` |\n| Independent slices to run in parallel | `dispatching-parallel-agents` |\n| Workspace isolation for concurrent work | `using-git-worktrees` |\n| Commits, branches, conflicts, releases, integrating a branch | `git-workflow-and-versioning` |\n| Test-first work, test design, reproducing a bug as a test | `testing-discipline` |\n| About to claim done, fixed or passing | `verification-before-completion` |\n| Unknown failure cause, hung or broken runtime | `systematic-debugging` |\n| Performing or requesting a code review | `code-review-and-quality` |\n| Handling review feedback received | `receiving-code-review` |\n| Blast radius of an N-file change or rename | `code-graph-review` |\n| Independent audit of someone's completion claim | `fable-judge` |\n| Speculative abstraction, new dependency, over-engineering | `ponytail` |\n| Module boundaries, god files, schema evolution | `architecture-simplicity` |\n| Consequential library, tool or platform choice | `production-first-decisions` |\n| Payments, balances, quotas, refunds | `money-path-safety` |\n| Untrusted input, auth, secrets, personal data | `security-and-hardening` |\n| Logging, metrics, tracing, alerts | `observability-and-instrumentation` |\n| Release, rollout, rollback | `shipping-and-launch` |\n| UI components, tokens, themes | `design-system` |\n| Dashboards and data visualization | `dashboard-design` |\n| Web research with primary sources | `web-research` |\n| Saving or retrieving cross-session knowledge | `dev-wiki` |\n| Windows encoding, CRLF/BOM, cmd/PowerShell quirks | `windows-encoding-fixes` |\n| Creating or editing a skill | `skill-authoring` |\n| `/fable-method`, or a non-code plan/audit/report | `fable-method` |\n| Explicitly granted open-ended mission | `autonomous-work` |\n\n`profile.yml` declares these kit-owned skills. Third-party skills beside them\n(for example Firecrawl) are not kit release assets; kit validation and\nsynchronization leave them untouched.\n\n### Ownership and lightweight navigation\n\nThe kit owns its contract, declared skills, memory scripts and generated\nrouters. Approval mode, sandboxing, model/provider routing, compaction and\nthird-party tools belong to the host/user setup; kit releases do not change\nthose settings.\n\nUse targeted source search and LSP for ordinary code navigation. For an\nexisting indexed project, `python memory/db-tools/repomap.py project --db\n<project.db> --tokens 1500` gives a bounded map without installing a graph\nstack. Confirm indexed relationships against current source; an index may be\nstale.\n\nMemory availability is an explicit check: `python\nmemory/scripts/memory-warmup.py`; add `--full` only for diagnostic feeds and\nintegrity inspection. Nothing runs automatically at session start.\n\nYour knowledge lives in `~/.memory/` (or `MEMORY_ROOT`), **outside the kit\nrepository**. The clone contains methodology and tooling, not your personal\nproject history. Do not commit your memory store or assume it is a sandbox\nfor untrusted data. See the [security policy](SECURITY.md).\n\n<details>\n<summary>Back up and verify recovery</summary>\n\nThe store is the one asset this repository cannot rebuild (`db/*.db` are\ngitignored by design). Back it up, then prove the snapshot is usable:\n\n```text\npython scripts/tools/backup_memory.py\npython scripts/tools/backup_memory.py --list\npython scripts/tools/backup_memory.py --restore-drill <backup directory>\n```\n\nBackups land in `<memory root>/backups/<timestamp>/`. A snapshot whose\ndatabase was skipped is tagged `DEGRADED` and refused as a restore point.\n`--restore-drill` restores into a temporary root, runs `PRAGMA\nintegrity_check` on every restored database, verifies the findings store and\nsearches a token taken from the restored rows; it prints JSON and exits 0\nonly when that verification passes. `--restore <dir>` performs a live restore\n(pre-restore snapshot first; asks unless `--yes`).\n\n</details>\n\n<details>\n<summary>Organize findings by project and importance</summary>\n\nProjects are discovered from the memory root's `db/*.db` files and optional\n`projects.json`. Project slugs use `[a-z0-9][a-z0-9_-]{0,63}`.\nUse `portable` for reusable cross-project knowledge and `unknown` for\nunclassified notes.\n\nImportance levels:\n\n- `high`: critical boundaries, invariants, and durable release contracts.\n- `normal`: actionable findings, runbooks, and feature setups.\n- `low`: temporary checkpoints and scratch notes.\n- `unreviewed`: findings not yet qualitatively reviewed.\n\nUse `findings.py edit --help` to update a finding using its returned ID;\nIDs are not guaranteed to start at 1. For batch classification,\n`findings.py classify mapping.json --dry-run` validates a mapping before\nmutation. Classification is transactional and preserves user-curated records\nunless `--force` is supplied. See [findings.py](memory/db-tools/findings.py).\n\n</details>\n\n## Evidence and limitations\n\n**The kit is not a demonstrated universal coding-quality improvement.**\nIt adds instructions and can add work. Whether that helps depends on the\nmodel, task, and integration.\n\nA historical external [DeepSWE](https://deepswe.datacurve.ai/) A/B run\ncompared the same agent with and without the kit using `deepseek-v4-pro`,\npier + mini-swe-agent in Docker, and a 10-task seed-0 subset:\n\n| Observation | Reported result |\n|---|---|\n| Solved tasks in the reported nine-task comparison | **6/9 in both arms** |\n| Steps across five mutually solved tasks | **+21% with the kit** |\n| Prompt tokens across those five tasks | **+41%**: 99.5M vs 70.4M |\n| Task-level differences | One kit win and one kit loss |\n\nThis was a small historical sample using a 36-skill manifest, not a benchmark\nof the current release. Version 6.0 cuts the inventory and the always-loaded\ncontract partly because of this result; that cut has not been re-measured. Raw artifacts are retained outside this repository;\nthe repo does not ship a reproduction script for these numbers. The results\nare descriptive, not a causal explanation or a general reliability claim.\nPrompt-token counts are not a measured monetary bill.\n\nThe [4.5.1 release notes](https://github.com/oleg494/coding-kit/releases/tag/v4.5.1)\nseparately document policy-calibration observations and their limits. They\nare stated-next-action evidence, not an end-to-end coding-quality win rate.\n\nEvery public claim the kit makes — including its unverified ones — is\ntracked in the [claims ledger](docs/CLAIMS.md), which lists the runnable\nverification command, the evidence artifact, or an explicit `unverified`\nstatus for each claim, plus the release acceptance gates and rollback\nprocedures that must hold before a version tag.\n\n### Run the kit's checks\n\n```text\npython -m pip install pytest\npython scripts/doctor.py\npython -m pytest tests -q\npython scripts/tools/check_file_sizes.py --ci\n```\n\nCI runs the [kit gates](.github/workflows/test.yml) on Windows and Ubuntu.\nStructural validation can run without a model or paid API calls:\n\n```text\npython eval/runner.py --inline-skills\npython eval/task_runner.py --dry-run\npython eval/trigger_eval.py --queries eval/trigger_queries.json\n```\n\nThese commands validate evaluation inputs; they do **not** measure a live\nmodel's behavior. Trap dry-runs record `DRY_RUN` rows with `passed: 0`;\nexit zero means the inputs are valid, not that the model passed.\n\nReport input validation, stated-next-action text probes, executed tool tasks\nand controlled comparisons separately. Record the resolved model and reasoning\nlevel when observed; otherwise label them unknown. A self-assessed text probe\nis not a tool-loop success rate, a speedup, or a model comparison.\n\nTrap and trigger results carry `comparison_id`: a digest of executed prompts,\nexpectations, selected cases, scorer code and execution settings. `trend.py`\ncompares only matching IDs within a model. Unknown IDs stay visible without\ndeltas and cannot seed baselines; existing run files are never rewritten.\nOn `--update-baselines`, new trap/trigger baselines use\n`{model: {comparison_id: rate}}`; old numeric baselines are not reused.\nMatching IDs do not control mutable images, ambient skills or provider aliases,\nand do not prove that an instruction change caused an improvement.\n\n<details>\n<summary>Evaluation tools and what they measure</summary>\n\n| Tool | Purpose and boundary |\n|---|---|\n| [Trap-suite](eval/runner.py) | Adversarial policy scenarios. The judge defaults to the executor; use a distinct judge to reduce self-judging bias. Answers over 8000 characters fail evaluation without a model verdict, rather than judging an incomplete prefix. Policy adherence is not task superiority. |\n| [Task smoke](eval/task_runner.py) | Six coding tasks, including two impossible canaries, with deterministic `verify.py` oracles. A smoke check, not a statistical benchmark. |\n| [Trigger evals](eval/trigger_eval.py) | Skill activation routing: use `--queries auto` for current co-located cases; an 80-query central corpus provides fallback coverage. |\n| [Results store](eval/results_io.py) and [trend](eval/trend.py) | Structured results, explicit live/dry-run modes, failure categories, and comparisons of recorded runs. |\n| [Telemetry](eval/telemetry.py) | Measures duration. Optional usage totals are user-reported, not independently measured token cost. |\n| [Ablation](eval/ablate.py) | Compares prompts with and without an inlined skill. Ambient skills remain uncontrolled; results are descriptive, not causal. |\n| [Rigor A/B](eval/rigor/) | Policy experiments with isolation probes and an acceptance gate that can reject a candidate. |\n\nLive evaluations require an executor and may incur provider charges.\nPrompt evaluations require `docker:<image> <argv...>`; bare host commands\nare refused. The image must contain the executor. Only explicitly declared\nread-only mounts are visible alongside a disposable writable task directory;\nhost credentials are not inherited. Network is off by default. `@net` enables\nunrestricted bridge networking, not endpoint allowlisting; live-model\nacceptance of this isolation stays open until credential and network\nrestrictions are verified.\n\n</details>\n\n## Autonomous work (opt-in)\n\nRequests such as “do useful work” or “keep going without asking” activate\n[autonomous-work](skills/autonomous-work/SKILL.md): evidence-backed work\nselection, verified progress, and immediate stop/revocation. Ordinary\nbounded requests do not become autonomous missions. Outward, destructive and\nspending actions still need authorization (OPS §1); memory follows OPS §5.\n\nAn optional foreground Python [supervisor](scripts/tools/autonomous.py)\nsupports continuation across process boundaries:\n\n```text\npython scripts/tools/autonomous.py --help\n```\n\nIt accepts an executor and independent verifier, records resumable state,\nand reports completion only after verification succeeds. A `STOP` file\nprevents further spawning and interrupts a live child. Read the\n[supervisor contract](docs/research/2026-09-08-autonomous-mode.md) before\nconfiguring commands; a workspace is not a security sandbox.\n\n### Carry unfinished work into a fresh session\n\nCapture a task brief with `scripts/tools/handoff.py`. The brief is JSON with\n`goal`, `acceptance`, `constraints`, `pending`, and `observations`. Each\nobservation has a `claim` and a nonempty `paths` list of workspace-relative\nregular files that support it. List only files you intend to fingerprint.\n\n```text\npython scripts/tools/handoff.py capture --workspace /path/to/repo --brief brief.json --output handoff.json\npython scripts/tools/handoff.py resume --workspace /path/to/repo --handoff handoff.json\n```\n\nCapture stores hashes, not file contents, and refuses to overwrite an existing\nhandoff. Resume is read-only: it returns the complete task context and marks\nobservations stale when their supporting files changed, disappeared, or became\nunsafe to read. Exit codes: `0` unchanged, `1` drift, `2` invalid input. Use\n`--json` on resume for structured output. Unchanged bytes are not proof that a\nclaim is true, that tests passed, or that an action is authorized.\n\nGive the fresh agent the resume output and the workspace, not the previous chat.\nIt must inspect stale evidence and preserve current user edits before continuing.\nFor automatic worker launches, add `--handoff /path/to/handoff.json` to the\nsupervisor invocation. The supervisor refreshes this context before each worker;\nthe configured independent verifier remains the completion gate. Neither tool\nexecutes commands embedded in a handoff, snapshots the whole repository, or\nreplaces the host's permission and sandbox controls.\n\n## Upgrading\n\n### 6.0: one contract, fewer overlapping skills\n\n6.0 is a text release; the memory format and tools are unchanged. Skills\nwhose triggers collided were merged, and three skills that restated the\ncontract were folded into it:\n\n| Retired skill | Now lives in |\n|---|---|\n| `superpowers`, `reasoning-engine`, `engineering-persona` | `OPS.md` |\n| `yagni` | `ponytail` |\n| `spec-driven-development` | `brainstorming` |\n| `incremental-implementation` | `writing-plans` |\n| `test-driven-development` | `testing-discipline` |\n| `debug-incident-protocol` | `systematic-debugging` |\n| `requesting-code-review` | `code-review-and-quality` |\n| `finishing-a-development-branch` | `git-workflow-and-versioning` |\n\nEach rule now lives in one place, descriptions name their neighbor skill,\nemphatic wording was replaced by stated reasons, and universal checklists got\napplicability conditions. Motivation: context files raised agent cost about\n20% without raising solve rates ([arXiv:2602.11988](https://arxiv.org/abs/2602.11988));\nskill routing errors concentrate inside clusters of similar skills and\noverly general skills capture routing ([arXiv:2605.16508](https://arxiv.org/abs/2605.16508));\nfocused skills beat exhaustive bundles ([arXiv:2602.12670](https://arxiv.org/abs/2602.12670)).\nRedeploying removes the retired skills from kit-managed skill directories;\n`scripts/tools/deploy.py` only deletes skills its manifest owns. Details:\n[CHANGELOG](docs/CHANGELOG.md).\n\n### 5.x\n\n- 5.1 added optional `--mode vector|hybrid` memory search on top of the\n  unchanged lexical default; semantic modes need a local model and index.\n  Searches are strictly read-only: an absent or desynced findings store is\n  reported, not repaired; run `findings.py list` or the doctor to heal it.\n- 5.0 replaced `contract_drift.needs_contract_update(paths)` with\n  `needs_contract_review(paths)`, which flags high-materiality paths for\n  review and exits zero for valid input; callers that used the old boolean or\n  exit code as an approval gate must change. The CLI accepts one JSON array\n  of path strings (or nothing for an empty diff); invalid input exits 2.\n\n## Inside the repository\n\n| Component | Entry point |\n|---|---|\n| Operating contract | [OPS.md](OPS.md) |\n| Repository router | [AGENTS.md](AGENTS.md) |\n| Host integration notes | [SKILL_RUNTIME.md](SKILL_RUNTIME.md) |\n| Paths and skill manifest | [profile.yml](profile.yml) |\n| Skills | [skills/](skills/) |\n| Memory engine | [memory/db-tools/](memory/db-tools/) |\n| Evaluation tools | [eval/](eval/) |\n| Changes and contribution guide | [Changelog](docs/CHANGELOG.md) · [Contributing](CONTRIBUTING.md) |\n\nWindows-first development; CI also runs on Ubuntu. The memory engine link\nis a junction on Windows and a symlink elsewhere.\n\n## Credits and license\n\n[MIT](LICENSE). Planning, debugging, verification and review skills are\nderived from [obra/superpowers](https://github.com/obra/superpowers) by Jesse\nVincent, reworked for coding-kit; see the\n[superpowers license](docs/licenses/superpowers-LICENSE).\nThe `ponytail` skill is adapted from\n[DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail);\nsee its [license](skills/ponytail/LICENSE).\n"}