argen/hornero
v0.4.0MIT
Role-and-skill methodology for product managers: PM reviewer subagent and 59 skills (38 product-management, 16 cross-role process, 5 command skills), including the chronicle layer for durable decisions.
Changelog
All notable changes to Hornero are documented here. The format follows Keep a Changelog. Plugin version is anchored in .claude-plugin/plugin.json and the root plugin.json.
[Unreleased]
[0.4.0] - 2026-10-27
Added
claude plugin evalsuite underevals/cases/: 25 routing cases (one per natural-language row oftests/dispatcher/routes.tsv, graded on the skill that fired) and 7 PM-lens artifact cases with anllmquality grader.validate-dispatcher.shCheck 4 keeps routes.tsv and the routing cases in sync.EVAL_HORNERO_NO_AUTO_EXTRACT=1opt-out inhooks/auto-extract-lesson.sh, set by every eval case so the Stop hook's extra lesson turn does not alter graded output..github/workflows/evals.yml: opt-in (workflow_dispatchplus weekly) eval run; needs theANTHROPIC_API_KEYsecret.ci.ymldoes not run evals..claude-plugin/marketplace.json:/plugin marketplace add argen/hornerothen/plugin install hornero@hornero.- Portable root
plugin.json(Agent Plugins standard) with Codex settings underextensions["com.openai"](display name, default prompts,kickoffas the onboarding skill), and.agents/plugins/marketplace.jsonfor the Codex repo marketplace. - skills.sh install path (
npx skills add argen/hornero); a localnpx skills addrun discovered all 59 skills. .claude/rules/skills.md, a path-scoped rule (skills/**,roles/**,resources/**) with the validate-skill, catalog, and validate-resource reminders.allowed-tools: Read, Grep, Glob, Bash(scripts/chronicle.sh *)onchronicle-recall,prep, andreview.- Stop hook
timeout(30s) andstatusMessage;_commentnotes Claude Code's cap of 8 consecutive Stop-hook continuations. skills/{orchestrate,role,kickoff,catalog,audit}/SKILL.mdastype: commandskills (kickoff,catalog,audit,rolesetdisable-model-invocation: true;orchestratestays model-invocable because the dispatcher routes to it)..claude/skills -> ../skillsso a session opened at the repo root discovers every skill without the plugin orinstall.sh;.gitignoreun-ignores it.validate-skill.shfails on unquotedname/descriptionvalues containing:or starting with a YAML indicator, fails on descriptions over 1024 characters, and warns over 500 lines; covered byscripts/test-validate-skill.sh.scripts/check-md-links.sh(withtest-check-md-links.sh) fails on broken relative Markdown links.smoke-check.shrunsclaude plugin validateon a dereferenced copy of the repo (skipped when the CLI is absent) and the link check; CI installs the CLI and runs the new tests.- This changelog.
- Hardening of the new checks:
validate-skill.shalso rejects unquoted values with:<TAB>, a trailing:, a leading-/?/,/]/}, a#comment start, or an unclosed quote;check-md-links.shignores inline code spans and~~~fences, skips any URI scheme and accepts<angle>targets;smoke-check.shvalidates a tracked-files-only dereferenced copy and no longer aborts on missing validator output; CI pins the Claude Code CLI to 2.1.311 with the auto-updater disabled.
Changed
prd,positioning-statement,success-metrics,strategy-kernel,bet-portfolioandcross-functional-orchestrationcarry an Output discipline block: each finding names its framework and author, at least one trade-off is stated, and the response ends with one to three concrete next actions. Artifact eval cases went from 0.40-0.60 to 0.86-1.00.- Artifact eval cases split the single
quality.mdgrader intoq-sources,q-distinct,q-tradeoffandq-actionable(plusq-decisionfor the launch plan), so a case passes at 0.8 with one criterion missing and shows which one. - Per-role skills moved from
roles/<role>/skills/<name>/toskills/<name>/; every skill is now a real directory and role membership is therole:frontmatter key (38 skills carryrole: product-manager).roles/<role>/keepsROLE.mdandsources.md. All path references and relative links across the docs are rewritten. catalog.shgroups skills byrole:and liststype: commandskills under a new "Slash commands" section;smoke-check.shstep 7 now fails on any symlink underskills/or arole:with noroles/<role>/ROLE.md.- Slash commands are skills (
type: command); the invocation syntax, argument handling, and route-declaration lines of the six commands that shadowed same-named skills (review,prep,ingest,hypothesis-track,stakeholder-update,customer-update) plusextract-lessonnow live in each skill's Application section, withargument-hint:where they take arguments. validate-skill.shexemptstype: commandskills from the six-section anatomy (they still needname,description,type).install.shinstalls every file of each skill directory and uses flat skill names (no<role>-prefix);--dry-runcounts and the DISPATCHER loading table follow the new layout.skills/competitive-teardown/SKILL.mdsplit: the worked example moved toexamples.md, bringing it under the 500-line warning.evals/judge.pyandevals/README.mddefault judge models are nowclaude-sonnet-5-5,gpt-5(unverified) andgemini-2.5-pro; the README no longer claims 7 roles.orchestrateandcross-functional-orchestrationstate that onlyproduct-manager-reviewerexists today and that the orchestrator covers unshipped lenses itself.catalog.shandbuild-codex-agents.shstrip surrounding double quotes from frontmatter values.- ROADMAP "Releases" section replaced by a pointer to this file.
install.sh --codexinstalls skills to the shared~/.agents/skills/path (agents and hooks stay under~/.codex/) and points tonpx skills add argen/horneroas the lighter path.smoke-check.shstep 8 compares rootplugin.jsonagainst.claude-plugin/plugin.json(name, version,extensions["com.openai"]present) and checksmcp.jsonserver names against the Claude manifest (none declared today, so nomcp.jsonships).- README install sections lead with the marketplace flows; counts now read 59 skills (38 PM, 16 cross-role, 5 command skills; 12 slash-invocable) in the README and plugin descriptions.
- Descriptions of 15 skills in the finance, problem-framing, memory, discovery, and strategy clusters state what they produce, when to use them, and which sibling to use instead.
- ROADMAP Distribution: marketplace files ship; public Codex directory submission is blocked because plugins that ship hooks are ineligible.
Fixed
- Eval fixtures: the chronicle routing cases now seed a
chronicle/project andscripts/chronicle.shviaseed-chronicle.sh(run with--scaffold, which CI and the README commands now pass); the positioning-statement, saas-revenue-growth-metrics and saas-economics-efficiency-metrics routing cases carry their artifact or metrics inline;success-metricsdescription now covers critiquing an existing metric definition. - Four skills (
prep,hypothesis-track,stakeholder-update,customer-update), the/hypothesis-trackcommand and thegithubresource card had unquoteddescription:values containing:, which is invalid YAML; Claude Code loaded them with empty metadata. Descriptions are now double-quoted. repositoryin both plugin manifests is a string, asclaude plugin validaterequires.- Dead links to
skills/multi-role-reviewand to roles that were never shipped (software-engineer,data-scientist,tester,designer,security-expert,marketing-expert) removed or reworded as plain "future role" prose; stale../../links incommands/and three renamed-file links corrected. templates/settings.jsonhooks use the real Claude Code shape (matcherplushooks[],tool_input.file_pathread from stdin viajq); inventedCLAUDE_TOOL_FILE_PATH,effortLevelandskipAutoPermissionPromptkeys removed.- Generated Codex agent TOMLs no longer carry
sandbox_mode(Codex ignores it in custom agents); they setmodel_reasoning_effort = "medium"instead.AGENTS.mdusesagents.max_concurrent_threads_per_session. - ROADMAP skill counts corrected to 38 product-manager and 16 cross-role skills.
Removed
evals/judge.py,evals/score.sh,evals/tasks/andevals/runs/(bespoke human and LLM dual-scoring flow that was never run);evals/rubric.mdnow feeds the llm graders andevals/EVAL-REPORT.mdis kept as history..codex-plugin/plugin.json, superseded by the rootplugin.json.commands/and the.claude/commandssymlink (superseded by skills), andscripts/build-plugin-skills.sh(no symlinks left to generate).install.shno longer copies to~/.claude/commandsor~/.codex/prompts; skills replace both. Claude Code users type/<name>. Codex has nodisable-model-invocationand no prompts directory here, so a Codex user invokes a skill explicitly by typing$or using/skillsto mention it (for example$orchestrate), or implicitly by describing the task in natural language.
Upgrading
install.shnow prunes files the previous install recorded in.hornero-manifestthat the new install does not write (old~/.claude/commands/*.md,~/.codex/prompts/*.md,~/.claude/skills/<role>-<skill>/), honouring--dry-run; run./install.shagain to clean up. Files that are not hidden (dotfiles underskills/) are no longer installed.
[0.3.0] - 2026-05
PM skill expansion, conversational kickoff, automatic lesson extraction, a voice for the companion, present-focused docs.
- A voice for the companion —
VOICE.mdcodifies the personality (calm, terse, plain-spoken, no preening) grounded in the rufous hornero's traits (patient layers, duet, ground-level walk, comfortable around humans). Six touchpoints rewritten to land the voice: SessionStart banner,/kickoffopener, dispatcher's declared one-liner, Stop-hook "nothing to capture" line,/catalogfooter, README microcopy.CLAUDE.md+AGENTS.mdreferenceVOICE.mdon first dispatch. Artefact outputs (PRDs, OKRs, etc.) stay voice-neutral so they travel cleanly to stakeholders. - Automatic lesson extraction —
hooks/auto-extract-lesson.shwires the Stop hook to fire the extract-lesson skill at every session end without the user having to type/extract-lesson. The agent self-filters via Chris MDP's signal-vs-noise discipline (most sessions stop in one line; only ones with real signal produce proposals). Re-stop loop prevented viastop_hook_active. Opt-out:HORNERO_NO_AUTO_EXTRACT=1. Plugin hook, install.sh recommendation, andtemplates/settings.jsonall updated. - Docs reorientation — canonical docs (README, ROADMAP, methodology, ATTRIBUTION, DISPATCHER, CLAUDE, AGENTS, CONTRIBUTING, roles/README, onboarding, role-cheatsheet, adoption, commands/role) now lead with present capabilities rather than the journey. README opens with a "What you get" section; ROADMAP adopts Now / Next / Later + Releases.
- Conversational kickoff —
/kickoffno longer asks one question and offers a 7-item bulleted menu; it opens with a 3-sentence intro and a single open invitation, then routes via the dispatcher.DISPATCHER.mdgains Step 6b (ambiguous-but-rich → one clarifying question, never a menu). SessionStart banner names natural language first; slash commands as alternatives. - PM skill expansion — 22 new PM skills in four commits, re-synthesised from Dean Peters' Product-Manager-Skills (CC BY-NC-SA 4.0 source; Hornero's re-synthesis is MIT). New themes: career/leadership (4), AI-PM (2), discovery extensions (3), outside-in (3), workshops + delivery (3), finance (7). Total PM skills 15 → 37; total skills 21 → 45.
[0.2.0]
- Antagonistic role-reviewer E2E (PM) —
scripts/play-against.sh --checkruns the PM positive case + PM negative control viaexpectagainst the real interactiveclaudeCLI; transcripts persisted totests/seeded/last-run/on every run for spot-checking. Coarse regression net for catastrophic persona drift. - CI self-breakage guard —
.github/workflows/ci.ymlrunsvalidate-skill,validate-resource,test-validate-resource, andsmoke-checkon every PR. Opt-in local mirror viascripts/install-git-hooks.sh. Catches staleCATALOG.md, frontmatter contract violations, and skill↔resource cross-ref breaks before merge. - Resources layer (PR 1 — foundation) — new top-level
resources/<system>/RESOURCE.mdcards describing external data sources (object model, MCP server, gotchas, fallback). Skills opt in viaresources: [<slug>]frontmatter. Shipsresources/linear/and thelinear-triageconsuming skill;scripts/validate-resource.shenforces anatomy;smoke-check.shgains bidirectional skill↔resource cross-ref. Hornero stays usable when no MCP server is configured (graceful degradation via documented fallback paths). PR #24. - Vendor-agnostic plugin parity — Hornero loads at full fidelity on both Claude Code and Codex from a single source-of-truth.
.claude-plugin/plugin.jsonand.codex-plugin/plugin.jsonsibling manifests; reviewer subagents available asagents/<name>.md(Claude) and auto-generated.codex/agents/<name>.toml(Codex) viascripts/build-codex-agents.sh;install.sh --codexinstalls skills + agents + hooks + commands. PR #23. - Plugin packaging (Claude Code) —
.claude-plugin/plugin.jsonmanifest, top-levelskills/<name>/SKILL.mdsymlinks (auto-built byscripts/build-plugin-skills.sh), plugin-loadable session hooks. PRs #20, #21. - Blog-alignment series (PRs #18–#19) — guardrail hooks in
templates/settings.json,templates/sub-CLAUDE.md.template+playbooks/claude-md-layering.md, explore/edit separation made explicit inDISPATCHER.md,templates/MAP.md.template,/auditslash command +playbooks/skill-rot-review.md(quarterly cadence),playbooks/adoption.md(DRI + cross-functional working group + approval process). - Memory layer v0 — project-local memory layer at
memory/decisions/shipped as the third Hornero primitive. Two new cross-role skills:memory-queryanddecision-record.playbooks/memory-loop.mdwalks the read-decide-write cycle end-to-end. Distinct fromadr(architecture-shaped) andprd(feature-shaped) —decision-recordcaptures cross-role posture-shaping calls. Opt-in per project; absentmemory/decisions/directory → no-op behaviour. - Chronicle layer — machine-queryable record of decisions any future session or role can load as situational awareness. Influenced by Quorum's Chronicle module — same lifecycle, simpler substrate (Markdown-with-strict-frontmatter, deterministic harness, no embedder dependency). Two cross-role skills:
chronicle-record(write side, callsscripts/chronicle.sh propose— LLM-free; human commits) andchronicle-recall(read side, byte-identical output for a given corpus). Deterministic harness attests/chronicle/backs the layer.