Skip to content

Releases

v3.1.0

Choose a tag to compare

@MrBinnacle MrBinnacle released this 17 Oct 22:42
Immutable release. Only release title and notes can be modified.
5c68213

Minor Changes

  • #350 b4e5712 Thanks @MrBinnacle! - Rename the domain glossary CONTEXT.md to GLOSSARY.md — the name Pocock v1.3.1 reads. Update live instruction surfaces (CLAUDE.md, AGENTS.md, PRODUCT.md, docs/agents/domain.md) and the voice-provenance shipped-surface list. Dated records and quarantined example text keep the old name as written.

  • #369 f2d5534 Thanks @MrBinnacle! - im-up receiver checks may declare cache_inputs. The validator keys each such check on a sha256 over the command string, the Python version, git --version and the sha256 of each input file's bytes on disk (working files, not git blobs; a directory input covers every file under it, untracked and ignored ones included); a key matching its last passing run is not re-run and is reported cached with that key and the time of the run that produced it. Only passing runs are cached. Every receipt check gains status (passed, cached, failed) and duration_ms. Once a week every check runs uncached and is compared with its cached verdict; a disagreement fails the open and clears that entry. The cache file lives outside the tree. A config with no cache_inputs keeps the prior verdicts and fields, plus the two new ones. Card documentation states what cached promises. Shared validator and suite stay byte-identical across the im-up/im-down pair. Implements the session-boundary design step from the parent research ticket (#450, step 2 / design D3).

Patch Changes

  • #454 efba6d1 Thanks @MrBinnacle! - Define the install route by what a consumer resolves (ADR 0005), so a version bump prices only a change an installed user can observe. Nothing changes for an installed user.

  • #440 9b5ccaa Thanks @MrBinnacle! - im-up and im-down: a receiver check whose cache_inputs is not a list of path strings is now refused with a named error. Before, a bare string was read one character per path and silently cached against the whole tree (#401).

  • #450 f57f020 Thanks @MrBinnacle! - docs(product): add a claims ledger and a consistency sweep for #443. The ledger records, for each
    claim the repository makes, the allowed and forbidden wording, the evidence and a status. The
    sweep quotes each public surface and marks replacement wording as a candidate for the owner. No
    public surface, card, install command or version changes.

  • #457 eecd5a5 Thanks @MrBinnacle! - docs(product): amend the #443 claims ledger. C6 now cites the #452 measurement of the Windows path limit: 108 characters of config root for the HTTPS form, measured with Claude Code 2.1.302 on 2026-10-17. The S2 Pi candidate uses the C2 third-person wording. The sweep adds the two npx skills add sentences that C7 forbids as a current install claim. No public surface, card, install command or version changes.

  • #460 98e5c7c Thanks @MrBinnacle! - docs(product): scope the claims ledger's Windows long-path figures to the measured tree and host. C6 now records that Windows long-path support is an opt-in setting, ties the 108 and 157 figures to the 3.1.0 candidate tree, and forbids reading the install receipt as evidence that the skills work in a session. No public surface, card, install command or version changes.

  • #459 b18605d Thanks @MrBinnacle! - docs(product): record a controlled Windows install receipt for a long Claude configuration directory, and cite it in the claims ledger. With core.longpaths set, the HTTPS marketplace form installed all three plugins at config roots of 109, 140 and 157 characters, and failed at 158; without it, 109 failed. C7 now names v2.0.0 as the last recorded npx skills add run. No public surface, card, install command or version changes.

  • #410 91ed57d Thanks @MrBinnacle! - clirunner-env's description now routes on the filtered-dict, env={} and monkeypatch.delenv branches a CLI test actually hits, its Click CliRunner.invoke env claims carry a 2026-10-06 check date against Click 8.5.x, and a private provenance name is gone from the card body.

  • #436 21e7b70 Thanks @MrBinnacle! - closure-mode: the undefined "Bannister" label is replaced by a plain primary-reference check, the Obsidian example and an unverifiable adoption claim are removed, and the oh-my-claudecode agent ids are dated against 5.7.4 (#381).

  • #397 199ac7b Thanks @MrBinnacle! - No installed card changes. A comment in the scheduled conformance workflow now states the protect-main ruleset and its six required checks, measured 2026-10-05, in place of the stale claim that main had no branch protection.

  • #406 2341482 Thanks @MrBinnacle! - dead-predicate now loads when a hook didn't fire or a reminder never arrived, and it diagnoses three more ways a live router rule matches nothing: a rule shadowed by an earlier one in a first-match router, a rule naming a skill that was renamed or uninstalled, and a rule whose pattern never reaches the case that would refute its claim. Its probe scripts moved to a new probes.md, take the rule file from RULES instead of a hard-coded name, and decode the JSON before scanning for \b.

  • #438 7cac6f2 Thanks @MrBinnacle! - decision-rights: the description now routes on "do not re-litigate", "final", "non-negotiable" and briefs. The card states how a handoff passes on a standing decision from an earlier session, and states the Revisit-if rule once instead of three times (#385).

  • #400 8924eef Thanks @MrBinnacle! - Each card's Dispatches recorded row now counts the card under every name it has been invoked by (its name before the v2.0.0 rename and its plugin-prefixed form) and no longer counts the usage log's repeated lifetime baseline twice, so decision-rights reads 173 where it read 2 and im-up reads 260 where it read 361. The two hook-fired cards keep their note that the counter cannot see hook firings once their count is above zero.

  • #453 bc28253 Thanks @MrBinnacle! - disposition-schema: the description now routes on consolidating seat outputs and on ID collision. The Verification section is a checklist with the finding-count check, the Example is a filled seat prompt and return, and the adversarial-verify template records a measured first-verdict disagreement rate (22 of 34 CI-green pull requests) with its four caveats (#388).

  • #373 c516440 Thanks @MrBinnacle! - The mrbinnacle-engineering plugin description now names the three kinds of card the plugin holds: mistakes that report success, guards and gates that stop your work, and the rituals at phase and session boundaries. The old description named only traps and checks, which did not fit three of its cards. If you already have the plugin installed, you have nothing to do (#363).

  • #367 [3ccc73a](3c...

Read more

v3.0.1

Choose a tag to compare

@MrBinnacle MrBinnacle released this 30 Sep 19:10
Immutable release. Only release title and notes can be modified.
3dca050

Patch Changes

  • #322 5db554a Thanks @MrBinnacle! - Add plugin eval cases for decision-rights and subagent-handback under skills/orchestration/evals/: three moved from the research repo unchanged except for their plugin path, and one new should-not-fire case for decision-rights. The card validator no longer reads that evals/ directory as a card. The cases have not been run.

  • #319 4e80582 Thanks @MrBinnacle! - Remove the stale _quarantine/subagent-research-reliability/ directory. Its provenance describes
    the dead-letter patch shipped in 756403a; the live subagent-handback card still contains the
    three references the provenance names, so no unique copy was lost. Conformance O8 now rejects a
    quarantine directory whose name matches a published card, preventing promotion residue from
    returning. The standing obligations move to conformance v4 because O8 is a new obligation.

  • #325 4f268c3 Thanks @MrBinnacle! - Correct every model-invocable card's stated standing cost from the pinned skill-harness audit.
    Add a CI check and poison control that reject stale or mismatched cost records.

  • #331 1557bac Thanks @MrBinnacle! - The README, the marketplace description and the Pages site now make only claims the cards' own records support. The README no longer says every skill passed the admission policy (the 2026-08-15 triage found most do not yet meet all four questions) or that every skill came from an incident (im-down and im-up were designed), and it states the completed pull-rebase screen result instead of "under way". The marketplace description names what every card carries: an evidence record, test cases and a retirement condition. The mrbinnacle-meta description drops "whether a skill should exist", a subject whose card retired in August. On the site, four links that pointed at README headings moved by #324 now point at CATALOG.md, where the three "What this isn't" sections are restored, and the install block adds the /plugin install step and names all three plugins. A new check, scripts/validate_site_links.py, fails CI when a site link or its anchor does not resolve.

  • e5116d6 Thanks @MrBinnacle! - pull-rebase's paired verdict now reads CANT_TELL_YET (stale receipt: card_hash_mismatch). The receipt was issued against the card's SKILL.md before the v2.0.0 rename changed its bytes, so under the rotation pass's currency gate it no longer disposes anything; the link stays as history. The verdict word is unchanged. The conformance check O5, run with the harness root, failed on this row until now.

  • #324 5460176 Thanks @MrBinnacle! - The README now leads with what each skill is for and what ships with it; the checked evidence tables, admission detail, install detail and repository layout moved to CATALOG.md unchanged, and the checks moved with them.

  • 96e5eaa Thanks @MrBinnacle! - Record four observations on the uniform-eol candidate's open re-test (the S432 disposition, step 2) and two new occurrences in its evidence record, which now counts six. Every git-visible conversion with a recorded instrument since the repaired line-ending guard was built was caught, including one this collection's own refresh_dispatch_counts.py caused on 2026-09-30. That leans toward the record's first branch, under which the card stays in _quarantine/ until two git-invisible occurrences are counted; one is counted today. The candidate is not admitted.

v3.0.0

Choose a tag to compare

@MrBinnacle MrBinnacle released this 21 Sep 14:32
Immutable release. Only release title and notes can be modified.
4c00b0e

Each plugin is now its own root. skills/<bucket>/.claude-plugin/plugin.json states the plugin's name, version and exact card list, and each marketplace entry points its source at that bucket. Before this release, claude plugin eval loaded each plugin with no name, no version and no skills, so an eval of this collection could measure nothing and still report a score. The install path changes from the whole repository to one bucket, which is a major change under ADR 0002. ADR 0004 records the decision. The standing obligations move to conformance v3. Seven changesets were consumed, and the full list is the v3.0.0 section of CHANGELOG.md.

v2.0.0

Choose a tag to compare

@MrBinnacle MrBinnacle released this 13 Sep 17:52
Immutable release. Only release title and notes can be modified.
e29938f

The major that #286's card renames already delivered. Eleven published cards were renamed on 2026-09-08 and ADR 0003 rules a card's name part of the declared surface; both install routes track main, so every installer received the rename under 1.6.0. This release makes the version number describe what installers already have. Twelve changesets consumed; the full list is the v2.0.0 section of CHANGELOG.md.

v1.6.0 — the landing page ships, and the front page states what an install writes (14 skills)

Choose a tag to compare

@MrBinnacle MrBinnacle released this 08 Sep 02:08
Immutable release. Only release title and notes can be modified.
b1d8712

14 cards, unchanged from v1.5.0. This release adds no card and retires none.

The landing page ships

site/ carries the page source: one HTML file, one stylesheet, every value drawn from assets/tokens.json, seven Phosphor icons vendored inline under MIT. A GitHub Actions Pages workflow publishes that directory plus the favicon and the social preview, and nothing else. The page is live at https://mrbinnacle.github.io/skills/.

site/style.css joins the declared-hex check in the same release. Before this, a colour reaching a reader through the page was unchecked while the same colour in an asset was refused. A stranger meets the palette on the page first, so the page was the surface with no gate on it.

The front page states what an install writes

Three claims on README.md were false. Each was found by running every documented command in a scrubbed clean environment, and each is corrected against that measurement.

The install is not inert Markdown. A clean-environment run installs 88 files under .claude/skills/. 23 are not Markdown and 7 are Python: the scripts im-down and im-up instruct a reader to run. The page said both install routes copy Markdown files and that there is nothing to import and no framework to run. Nothing executes at install time, and that part was true; the description of the payload was not.

The installer writes three things, not one. .claude/skills/, a second complete copy of every card in .agents/skills/, and a skills-lock.json. Two of the three were undocumented.

A card directory holds four required files, not three. Every card carries evals/evals.json alongside SKILL.md, gotchas.md and EVIDENCE.md. Across the collection, 46 tracked files sit outside the three the page listed.

This is the first release of this collection whose front page has been checked against a cold install rather than against CI.

Gates that now check the surface they were missing

  • One word list binds every line of prose the repository publishes, over every tracked .md except frozen candidates and the changelog. Twenty-five lines were rewritten to name the thing the sentence pointed at.
  • validate_brand_kit.py selects the tracked set from the index instead of walking the working tree, so the scanned set no longer depends on what a clone happens to hold.
  • A residue term in a file or directory name is refused in its underscore, hyphen and dot forms; the vale-prose hook lints the same three paths CI lints; a new _quarantine/ candidate is refused unless it declares its landing.
  • tokens.json no longer documents two permissions that no checker implements. A contributor who read a note and wrote the sentence it described was refused by a build the documentation said would accept it.

The banner line

Retired and replaced at eleven places across six files. It now reads "14 skill cards. Each states the condition that would retire it."

Session boundary cards

im-down refuses to write a packet after measuring a receiver check red, and states the computed safe-to-clear verdict. A REJECTED receipt now says whether every packet assertion held and names the failing receiver checks, so a rejection caused by a defective gate is distinguishable from one caused by a bad packet.

Dependencies

Vulnerable transitive js-yaml packages refreshed, and a scheduled high-severity dependency audit added. Thanks to @mikemikimike.

What a version promises

The install path and the card format, not the card set. Admitting or retiring a card is a minor change. Moving the install path or changing a card's format would be major. ADR 0002 records why that surface is narrow.

Full entries: CHANGELOG.md.

v1.5.0 — three authoring rules gated, and evidence corrected (14 skills)

Choose a tag to compare

@MrBinnacle MrBinnacle released this 07 Sep 21:45
Immutable release. Only release title and notes can be modified.
eaabf9f

Delivered 2026-09-06 at eaabf9f. 14 published cards, unchanged. Twenty-two changesets, one of them minor.

This release record was created on 2026-09-07. The delivery happened when the version-bump pull request merged to main, which is what ADR 0002 makes the release event; the tag and this page record it. No Release object accompanied the tag at the time, so this repository's Releases page showed v1.1 as the latest release while four deliveries shipped past it. That gap is what this page closes.

What it delivered

Three authoring rules that were machine-checkable but ungated are now gated. scripts/validate_card_files.py grows checks for SKILL.md size bounds (400–7,168 bytes), local link resolution with case matching, and reader-facing auxiliary reachability from SKILL.md through local links.

Three details in that check are worth stating, because each closes a way the check could have been fooled. Exemption patterns for test and build files are tree-wide, and a stale pattern is reported only when the tree already uses exemptions. Link extraction follows markdown only, so Python subscript syntax cannot be mistaken for a markdown link. Case matching walks directory entries, so a case-insensitive filesystem cannot hide a mismatch.

The live tree was brought green in the same change rather than after it: missing EVIDENCE.md and gotchas.md links were added on twelve cards.

Corrections to the collection's own evidence. Several patch entries revise what earlier measurements can support. A July screen ran on a prompt that named the skill's own rule, so its bare arm was coached and its 1.00 pass rate measured a warned model rather than an unaided one. A paired run from 2026-09-01 was re-ingested under a corrected detector — same two logs, same pin, a different reading of them. A currency gate added on 2026-08-30 was found wrong and repaired.

One card that named a gate sequence on two surfaces and implemented it on neither now ships audit_frontend.py with six parser-backed gates.

What the version number promises

The declared surface is the install path and the card format. The card set is not part of it: adding or retiring a card is a minor change, changing the install path or a card's on-disk shape is a major change, and a correction inside a card is a patch. Both documented install routes track main, so a consumer receives changed cards when a version bump merges, not when a tag is pushed.

Full changelog

Read the complete section at CHANGELOG.md.

v1.4.0 — the collection retires its own gate card (14 skills)

Choose a tag to compare

@MrBinnacle MrBinnacle released this 07 Sep 21:45
Immutable release. Only release title and notes can be modified.
9cf70c5

Delivered 2026-08-31 at 9cf70c5. 14 published cards, down from 15. Nineteen changesets, one of them minor.

This release record was created on 2026-09-07. The delivery happened when the version-bump pull request merged to main, which is what ADR 0002 makes the release event; the tag and this page record it. No Release object accompanied the tag at the time, so this repository's Releases page showed v1.1 as the latest release while four deliveries shipped past it. That gap is what this page closes.

What it delivered

The collection retired its own gate card, because the gate card could not pass its own gate. skill-necessity-gate is removed.

ADMISSION.md criterion 1 requires an unaided failure that was observed, not predicted. The card's own EVIDENCE.md answered Occasions counted | 0 — no triggering occurrence, and no occurrence appeared across the card's whole life. That defect is not repairable by rewriting: an occurrence can only be found. The S295 admission triage recorded the card RECURRENCE-THIN on 2026-08-15 and deferred the call; this release makes it.

A third retirement route was added to AGENTS.md before it was used. Withdrawn on the policy covers a published card removed because it cannot satisfy the admission policy it is measured against, with the card's own evidence record as the proof and no screen required — because the failing criterion counts occurrences rather than measuring lift. The route is written narrowly: it fires on a criterion the card's own record demonstrably fails, and the changeset must quote the failing row.

Two rules outlived the card and moved into AGENTS.md in the same commit that removed the directory, so nothing that cited the card now cites a deleted file. The topology rule — decide model-invocable against procedure by asking who does the strategic thinking — is one of them.

What the version number promises

The declared surface is the install path and the card format. The card set is not part of it: adding or retiring a card is a minor change, changing the install path or a card's on-disk shape is a major change, and a correction inside a card is a patch. This release is the case that rule was written for. A scheme under which retirement forced a major bump would either inflate the major number until it carried no information, or create a standing incentive not to retire — and this collection retires cards on recorded evidence and says so on its front page.

Both documented install routes track main, so a consumer receives changed cards when a version bump merges, not when a tag is pushed.

Full changelog

Read the complete section at CHANGELOG.md.

v1.2.0 — the session-boundary pair (9 skills)

Choose a tag to compare

@MrBinnacle MrBinnacle released this 07 Sep 21:45
Immutable release. Only release title and notes can be modified.
07fe466

Delivered 2026-08-10 at 07fe466. 9 published cards, up from 7.

This release record was created on 2026-09-07. The delivery itself happened when the version-bump pull request merged to main, which is what ADR 0002 makes the release event; the tag and this page record it. The tag was pushed on 2026-09-06 and no Release object accompanied it, so this repository's Releases page showed v1.1 as the latest release while four deliveries shipped past it. That gap is what this page closes.

What it delivered

The session-boundary pair. Two cards were added under skills/engineering/, then renamed to im-down and im-up, four verification holes found while adopting them were closed, and their validator suites were wired into CI so the pair is checked on every run rather than on the day it was written.

What the version number promises

The declared surface is the install path and the card format. The card set is not part of it: adding or retiring a card is a minor change, changing the install path or a card's on-disk shape is a major change, and a correction inside a card is a patch. Both documented install routes track main, so a consumer receives changed cards when a version bump merges, not when a tag is pushed.


The session-boundary pair, and the first CI job that runs this collection's own code.

im-down and im-up carry one session's state into the next as an audited packet rather
than as conversational memory. They arrived, were hardened against four verification holes
found while adopting them in a real repository, and were renamed. Nine skills now.

Minor Changes

  • #9 20bae6c — Add the session-boundary pair under skills/engineering/: im-down (producer — one
    atomic packet with a hidden JSON manifest, deterministic snapshot script, and validator) and
    im-up (receiver — treats the packet as untrusted data, verifies branch
    and HEAD, probes typed claims, runs only repository-configured checks, and emits an explicit
    acceptance receipt). Both are human-invoked (disable-model-invocation: true), configured via
    .claude/session-boundary.json, and ship with four fixture classes (clean accepted; stale
    HEAD, missing required field, and failed probe all rejected). No Stop hook ships in this
    release.

  • #11 fc5009c — Rename the session-boundary pair to im-down (producer, session close) and im-up (receiver,
    session start). The old names described the machinery; these describe what the operator is
    actually doing — signing off, and coming back. They also resolve a real collision: the previous
    receiver name was identical to a widely-installed local skill of the same name, so the two
    could not coexist in one library.

    No behavior changes. Directory names, frontmatter name: fields, bucket README, top-level
    README, and the pair's own cross-references all move together, and the validator drift
    assertion tracks the new directory names.

Patch Changes

  • #10 fa81634 — Close four verification holes found while adopting the session-boundary pair in a real
    repository. Each was reproduced against the shipped code before it was changed.

    • A command probe was never executed, yet its claim kept verified and the packet was
      ACCEPTED on an advisory note. Refusing to run packet-supplied commands was the right call;
      leaving the status untouched let any unverifiable claim be laundered by choosing that probe
      kind. A command probe now runs only when the repository config authorises the exact command
      (receiver_checks or the new trusted_probe_commands), and an unlisted probe rejects the
      packet.
    • Receive mode without --config skipped every configured check and still returned ACCEPTED.
      It now rejects: a verification an omitted argument switches off is not a verification.
    • The example receiver_checks entry was git status --porcelain, which exits zero on a
      clean tree, a dirty tree, and a deleted tracked file alike, so the only shipped example
      could not fail. The example is now git diff --quiet && git diff --cached --quiet, and the
      validator reports a known always-zero check as a note.
    • A narrative sentence quoting a ticket title containing the word TODO rejected an otherwise
      valid packet. __REQUIRED__ remains a hard rejection; TODO and TBD now reject only as a
      whole-line placeholder or a manifest value that is nothing but the token.

    Also documents the produce-after-final-commit ordering (committing the packet moves HEAD and
    makes the packet reject itself) and adds a drift assertion so the validator copy shipped in
    both skill directories cannot diverge silently. The fixture suite grows from four cases to
    nine.

  • #12 9b5d3bb — Run the session-boundary validator suites in CI. Two skills in this collection ship
    executable code and the collection had no job that executed it — only the link check and
    the de-personalization gate.

    The job invokes each suite through its real entrypoint rather than through pytest, and
    that is the point of it. The cases run from if __name__ == "__main__" and the functions
    carry no test_ prefix, so pytest collects nothing from either file and reports
    "no tests ran" — a green line that means the opposite of what it looks like. The job
    asserts each suite's PASS: line so a suite that does not execute cannot report success,
    and a poison control asserts the shipped validator still rejects a stale packet, because a
    gate that cannot fail guards nothing. Both skills record the pytest false-green in their
    gotchas. Runs on Linux and Windows, the platform the pair is actually used on.

v1.3.0 — first promotions out of quarantine, and a native install route (15 skills)

Choose a tag to compare

@MrBinnacle MrBinnacle released this 07 Sep 21:45
Immutable release. Only release title and notes can be modified.
02154ef

Delivered 2026-08-25 at 02154ef. 15 published cards, up from 9. Sixty-seven changesets, ten of them minor — the largest release this collection has made.

This release record was created on 2026-09-07. The delivery happened when the version-bump pull request merged to main, which is what ADR 0002 makes the release event; the tag and this page record it. No Release object accompanied the tag at the time, so this repository's Releases page showed v1.1 as the latest release while four deliveries shipped past it. That gap is what this page closes.

What it delivered

The first promotions the collection has made. Twenty-two candidates had accumulated in quarantine without a route out. Six cards were promoted: click-clirunner-env-none-deletes, halt-as-deliverable, mock-masked-stub-trap, pretooluse-bash-guard-prose-false-positive, success-test-accepts-any-output, and router-skill-predicate-gap.

A native install route. Until this release there was no .claude-plugin/marketplace.json. The only documented way in was a third-party installer named once in the changelog's own preamble.

ADR 0002, and the machinery it obliged. The decision that a release is a delivery event landed here, together with the generated version field on each plugin entry it requires and a release gate that distinguishes a release ref from an ordinary one by whether package.json changed against its merge-base.

The admission policy separated from the card that stated it. Outside contributors had been told to "pass the gate" and sent to a skill card that was both the rule and the statement of the rule, with no edition anyone could cite later.

A published description length limit that was actually enforced. AGENTS.md step 2a had required 200 characters or fewer since the collection began, and that step was the only thing enforcing it.

What the version number promises

The declared surface is the install path and the card format. The card set is not part of it: adding or retiring a card is a minor change, changing the install path or a card's on-disk shape is a major change, and a correction inside a card is a patch. Both documented install routes track main, so a consumer receives changed cards when a version bump merges, not when a tag is pushed.

Full changelog

The complete section for this version runs to 1,171 lines and exceeds the size a release page can hold. Read it at CHANGELOG.md.

v1.1 — first retirement + repo hardening (7 skills)

Choose a tag to compare

@MrBinnacle MrBinnacle released this 16 Jul 01:21
465674b

The collection's first retirement of a shipped skill — and the point of the whole design.

Retired

  • claude-code-stop-hook-envelope — Claude Code now delivers the assistant's final turn inline via last_assistant_message on Stop/SubagentStop, and the docs recommend it over reading the transcript. That is the exact platform change the skill's evidence record pre-registered as its retirement trigger, so it retired against its own stated criterion — no screen required. Removed from the collection; recorded in RETIRED.md with the evidence intact at the v1.0 tag.

A list that shrinks when the models improve is the one telling you the truth about which skills still earn their keep. 7 skills remain.

Corrected

  • git-pull-rebase-trap — the --ff-only claim was wrong. Under pull.rebase=true, --ff-only refuses a diverged pull outright (a loud abort) rather than silently rebasing; --no-ff and no-flag pulls still rebase silently. Verified empirically (git 2.55.0).

Repository hardening

  • Added .gitignore, .editorconfig, CODE_OF_CONDUCT.md, a pull-request template, and a link-check CI workflow (lychee — every PR + weekly).
  • Aux-file credibility pass over the 7 shipped skills; removed the empty in-progress/ placeholder.

Full detail: CHANGELOG.md. Merged in #4.