Skip to content

v0.3: portable skill for Codex, Cursor, Hermes, and Claude Desktop - #8

Merged
ccf merged 22 commits into
mainfrom
feat/v0.3
Sep 14, 2026
Merged

ccf merged 22 commits into
mainfrom
feat/v0.3

Conversation

@ccf

@ccf ccf commented Sep 14, 2026

Copy link
Copy Markdown
Owner

Summary

v0.3 makes the same humanize skill installable on Claude Code, Codex CLI, Cursor, Hermes Agent, and the Claude Desktop app through each harness's own installer, and repositions the public copy: humanize is grounded in the thirteen studies in references/SOURCES.md and covers every layer of a text, with StoryScope named where it is the source of a number.

Spec: docs/design/2026-09-14-humanize-v0.3-design.md (revision 2 after a three-lens adversarial review) · Plan: docs/design/2026-09-14-humanize-v0.3-plan.md (revision 2 after a worktree dry run).

Layout and manifests

  • Plugin moved from plugins/humanize/ to the repository root: skills/humanize/, .claude-plugin/ (marketplace source is ./), new root plugin.json (Agent Plugins 1.0) and .codex-plugin/plugin.json with the Codex interface block.
  • Version 0.3.0 in lockstep across the four manifests, pyproject.toml, and the CHANGELOG heading — tests/test_portability.py fails on drift.

Skill

  • SKILL.md is harness-agnostic (still ≤ 150 lines): argument-hint removed (a hard error outside Claude Code), relative python3 scripts/surface_scan.py path, Codex $humanize and plain-words options noted, document extraction described generically. No harness variables anywhere under skills/ (tested).

Tests, tooling, docs

  • tests/test_portability.py: spec-only frontmatter; no harness-specific content; runtime references named; guard-clean scripts (Hermes skills_guard patterns); manifests agree; zip packager contract; study count matches SOURCES.md.
  • tools/package_skill_zip.py builds the claude.ai skill upload (dist/humanize-skill-0.3.0.zip, attached to the release).
  • tools/smoke_harnesses.sh: local acceptance matrix whose PASS rule needs evidence the scanner ran; transcripts under docs/acceptance/v0.3/.
  • README install table (Claude Code, Codex, Cursor, Hermes, Cowork, claude.ai) with the verified gotchas; CLAUDE.md and BUGBOT.md invariants for portability and version lockstep.

Migration

Existing Claude Code installs: claude plugin marketplace update humanize && claude plugin update humanize@humanize.

Test plan

  • uv run pytest -q -W error → 108 passed on 3.9 and 3.13; ruff clean; claude plugin validate --strict . passes
  • Smoke matrix PASS on Claude Code, Codex, Cursor, Hermes (Task 7, in progress)
  • codex plugin marketplace add ccf/humanize@feat/v0.3 installs from GitHub (pre-merge)
  • CI green, Bugbot threads resolved
  • Post-merge: Hermes skills install, Claude plugin upgrade 0.2.0 → 0.3.0, Cowork marketplace add; tag v0.3.0 + release with the zip; claude.ai upload

🤖 Generated with Claude Code

https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh


Note

Low Risk
Packaging, docs, and compliance tests only; surface_scan.py behavior is unchanged. Main operational risk is install-path migration (source: "./") for existing Claude Code marketplace users.

Overview
v0.3.0 reframes humanize as a harness-portable agent skill: the package moves from plugins/humanize/ to the repo root (skills/humanize/, marketplace source: "./"), bumps version everywhere in lockstep, and adds Agent Plugins 1.0 (plugin.json), Claude (.claude-plugin/plugin.json), and Codex (.codex-plugin/plugin.json) manifests so the same skill installs on Claude Code, Codex, Cursor, Hermes, and Claude Desktop.

SKILL.md is made harness-agnostic: argument-hint and ${CLAUDE_PLUGIN_ROOT} go away, the scanner uses a relative <skill folder>/scripts/surface_scan.py path, audit rules require a row for every fired scanner block, and public copy grounds the tool in thirteen studies (SOURCES.md) rather than StoryScope-first positioning.

New enforcement and release tooling: tests/test_portability.py (frontmatter, no harness tokens under skills/, manifest/version/study-count sync, guard-clean scripts, zip contract), tools/package_skill_zip.py for claude.ai uploads, and tools/smoke_harnesses.sh with transcripts under docs/acceptance/v0.3/. README gains a per-harness install table; CLAUDE.md and BUGBOT.md document portability invariants. Migration: existing Claude Code users run marketplace + plugin update after merge.

Reviewed by Cursor Bugbot for commit a517f74. Bugbot is set up for automated code reviews on this repo. Configure here.

ccf and others added 13 commits September 14, 2026 08:10
…rmes, Claude Desktop

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
Drop argument-hint (hard error outside Claude Code); Cowork custom marketplaces
verified; six-field frontmatter allow-list in the portability test.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
21 findings folded in: conftest path, Cursor CLI reality, scanner evidence in the
smoke matrix, no harness variables in the skill, phased acceptance, zip packager
test, guard-pattern list, Hermes flags, claude.ai slash menu, study-count guard.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread skills/humanize/SKILL.md Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread tools/smoke_harnesses.sh
Comment thread tools/smoke_harnesses.sh Outdated
ccf and others added 2 commits September 14, 2026 11:37

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread tools/smoke_harnesses.sh Outdated
Comment thread tools/smoke_harnesses.sh
ccf and others added 4 commits September 14, 2026 11:49
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
…de evidence

- judge() now matches the four row concepts against the third |-separated
  field (the Tell cell) of distinct table rows under ## Output, and requires
  four distinct matching rows; drops the exploitable whole-row grep and the
  CONTAINER_ALT pipeline (I1).
- Guard against a vacuous PASS if the scanner's summary wording ever drifts
  and NUM_TAILS/NUM_REP come back empty (I3).
- Every harness's temp install/stream directory is now protected by an
  EXIT/INT/TERM trap pair, so a ^C or kill mid-run can't leave the Claude
  plugin disabled, a Hermes copy stuck in $HOME, or a Codex/Cursor temp
  project behind (I2, I4).
- The Claude Code raw stream now writes to a mktemp -d directory instead of
  docs/acceptance/, and is removed after parsing (I5).
- The Claude parser now mirrors the Codex one: a tool_use only becomes
  evidence when its serialized input names surface_scan.py, and a
  tool_result only counts when it answers such a call by tool_use_id. A read
  of a reference file no longer satisfies the tool-evidence rule or leaks
  into ## Scanner output (C2).
- Minor cleanup: dedupe Codex's out.md text against the last agent_message
  (mirroring Claude's existing dedupe), anchor check_auth's alternatives,
  strip __pycache__ from each harness's copied skill, and guard against an
  unknown harness argument.

Re-ran `tools/smoke_harnesses.sh claude codex`: PASS claude-code, PASS codex
on the first attempt; transcripts regenerated.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
- Step 2 now tells the model to search for scripts/surface_scan.py when a
  harness doesn't show the skill's path, and to skip the scan (saying so) if
  it still can't find it — insurance for Cursor, Hermes, Cowork, and
  claude.ai, none of which have exercised this step yet (I6). The
  compensating -1 line drops the now-redundant document-skills plugin
  pointer from the Non-text sources paragraph; it already lives in the
  README's "Word, PDF, PowerPoint inputs" note. Net 0 lines: SKILL.md stays
  at 150; curly-character count unchanged at 11.
- "## Invocation (`/humanize` only)" -> "## Invocation (explicit only)": the
  old heading contradicted the very next sentence, which also names Codex's
  $humanize form (minor).

uv run pytest -q -W error: 108 passed (3.13 and --python 3.9).
claude plugin validate --strict .: Validation passed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
- README.md: stop claiming every install command was verified. `npx skills
  --help` / `npx skills add --help` (skills.sh CLI 1.5.26) confirm `add
  <package>` accepts the owner/repo shorthand the skills.sh row uses, so
  that row stays; the sentence now names what was actually checked and
  points installs that fetch from GitHub (Codex, Hermes) at the acceptance
  record instead (C1). `claude plugin validate .` -> `--strict` to match
  CLAUDE.md and CI (minor).
- docs/acceptance/v0.3/README.md: the "## Tool calls" sentence is now true
  for both harnesses (after the smoke-script fix). Renamed the misnumbered
  "Acceptance step 4" reference to "Acceptance 3 (spec §8)" and added a
  section recording its verbatim outcome from task-7-report.md (marketplace
  add from ccf/humanize@feat/v0.3, plugin add resolving to 0.3.0, skill
  listed, plugin and marketplace removed, list back to the pre-run
  baseline). Added an "Acceptance 7 (spec §8)" checklist recording this
  run's results: the storyscope grep over the manifests/pyproject/SKILL.md
  is empty, the README's seven StoryScope mentions are all sourced
  positions, every README command was checked (per C1), and the scanner run
  on the README grounding paragraph shows no wordlist hits. Added a
  "Pre-merge status" paragraph: Claude Code and Codex PASS, Cursor and
  Hermes SKIP (unauthenticated on this machine), both moving to phase 2 and
  re-run after login (C2/C3, I7).
- docs/design/2026-09-14-humanize-v0.3-design.md: status line now names the
  pre-merge acceptance items actually recorded (1, 2 for Claude Code/Codex,
  3, 7) and states plainly that Cursor and Hermes move to phase 2
  unauthenticated, matching what the acceptance README records. Appended
  four Post-review amendments: the phase-2 move for Cursor/Hermes, the
  narrowed acceptance-7 grep scope with the "sourced positions" README
  check, the Claude parser/row-matching/trap/temp-dir hardening from this
  wave, and the SKILL.md scan-path fallback (C3, I8).

Gate: uv run pytest -q -W error (108, both 3.13 and --python 3.9); bash -n
tools/smoke_harnesses.sh; wc -l skills/humanize/SKILL.md (150); claude
plugin validate --strict . (passed); claude plugin list shows
humanize@humanize enabled; no .jsonl under docs/acceptance/.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2a39835. Configure here.

Comment thread tools/smoke_harnesses.sh
Comment thread tools/smoke_harnesses.sh
…quires a python call

- run_hermes now sets its EXIT/INT/TERM trap before mkdir/cp -R instead of
  after, so a ^C or kill during the copy itself can't leave a partial
  install stuck in $HOME (rm -rf on a $dest that doesn't exist yet, or
  exists only partially, is safe). The pre-existence SKIP check stays
  where it was, before the trap is armed (Bugbot).
- The Claude parser's tool-evidence filter now requires name == "Bash" and
  a command containing both "python" and "surface_scan.py", matching the
  Codex parser's rule exactly. Matching on the serialized input alone let a
  Read/Glob/Grep search that merely names surface_scan.py — invited by
  SKILL.md's new scan-path fallback — satisfy the tool-evidence rule
  without the scanner ever running (Bugbot).

Re-ran `tools/smoke_harnesses.sh claude`: PASS claude-code on the first
attempt; transcript regenerated (## Tool calls now holds only the Bash
scanner calls). `claude plugin list` shows humanize@humanize enabled
before and after.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
@ccf
ccf merged commit e4230af into main Sep 14, 2026
5 checks passed
ccf added a commit that referenced this pull request Sep 14, 2026
…Bugbot PR #8)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTKYvLEVY4mStJ3iPaB1Mh
@ccf
ccf deleted the feat/v0.3 branch September 14, 2026 16:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant