Skip to content

feat(resources): Resources layer PR 2 — promote 4 to stable, ship 3 consuming skills, wire mcpServers + install#31

Merged
argen merged 5 commits into
mainfrom
feat/resources-layer-pr2
May 20, 2026
Merged

feat(resources): Resources layer PR 2 — promote 4 to stable, ship 3 consuming skills, wire mcpServers + install#31
argen merged 5 commits into
mainfrom
feat/resources-layer-pr2

Conversation

@argen

@argen argen commented May 20, 2026

Copy link
Copy Markdown
Owner

Summary

Closes the Resources layer — PR 2 item in `ROADMAP.md` (Next). Three logical pieces in three commits.

1. Four resources promoted to `stable` (`7e0bc26`)

`jira`, `bigquery`, `snowflake`, `hubspot` were already fully-scaffolded RESOURCE.md cards from PR 1 (install command, auth env, capabilities table, object model, common gotchas, fallback recipes). Re-read each, confirmed the content is load-bearing, flipped `status`. Also updated `used_by:` back-refs on linear/jira/bigquery/snowflake/hubspot/github to point at the new consuming skills so the bidirectional cross-ref check resolves cleanly.

2. Three resource-consuming skills + frontmatter opt-ins (`4638923`)

  • `skills/query-issue-tracker/` (`resources: [linear, jira]`) — cross-system read primitive. Three call shapes (list / drill / active scope). Tracker-neutral result shape (normalised priority + status category). Writes deliberately out of scope.
  • `skills/query-warehouse/` (`resources: [bigquery, snowflake]`) — cross-system warehouse primitive. Three call shapes (discover / estimate / run). Kill-cost guardrail is the whole point — every `run` is preceded by an internal `estimate`; queries above the per-call byte cap (default 100 GB) are refused. SQL dialect NOT translated between engines.
  • `roles/product-manager/skills/hubspot-pipeline-readout/` (`resources: [hubspot]`) — 10-20min PM pass producing a one-page pipeline readout (stage health vs 90-day baseline → segment velocity → ICP fit pattern).
  • Frontmatter opt-ins: `prd → [linear, jira]`, `decision-record → [github]`.

3. Plugin manifest + install plumbing (`72cd9f7`)

  • `.claude-plugin/plugin.json` gains an `mcpServers` block (linear/jira/github/bigquery/snowflake/hubspot, all `optional: true`).
  • `install.sh --list-resources` short-circuits the install and prints the resource catalog (slug, status, consumer count).
  • `install.sh` install path copies `resources//RESOURCE.md` into `/hornero-resources//` on both targets.
  • `smoke-check.sh` count check includes resources in the expected dry-run total.

Anti-genericisation discipline

Per the ROADMAP risk: don't over-genericise the cross-system skills. The two new cross-system skills each branch on engine/tracker in at most 2 places in their `## Application` section — engine routing only; no SQL dialect translation, no priority/status synthesis beyond shape normalisation.

Test plan

  • `scripts/validate-resource.sh` on all 4 promoted cards
  • `scripts/validate-skill.sh` on all 3 new skills
  • `scripts/smoke-check.sh` — 12 passed, 0 failed (bidirectional cross-ref resolves; install dry-run count matches)
  • `bash install.sh --list-resources` — prints the catalog
  • `bash install.sh --dry-run` — shows the new `hornero-resources/` copy step
  • Eyeball one end-to-end run of each new skill against a live MCP after merge

What's NOT in this PR

  • Stretch resources (`datadog`, `notion`, `slack`) — sequenced as Resources layer PR 3 in Later.
  • Dispatcher amendment to pass the resources line to fan-out subagents — also PR 3.
  • SessionStart probe script (`scripts/probe-mcp.sh`) — also PR 3.

🤖 Generated with Claude Code

argen added 5 commits May 20, 2026 23:06
…-refs

The four resources scaffolded as `stretch` in PR 1 (jira, bigquery,
snowflake, hubspot) have been complete RESOURCE.md cards since they
landed — install command, auth env, capabilities table, object model,
common gotchas, fallback recipes. Flipping `status: stretch →
status: stable` after re-reading each one to confirm the content is
load-bearing.

Also updating `used_by:` back-refs on linear, jira, bigquery, snowflake,
hubspot, github to point at the consuming skills shipping in this PR
(query-issue-tracker, query-warehouse, hubspot-pipeline-readout,
decision-record, prd). The smoke-check bidirectional cross-ref now
resolves cleanly.

What stays `stretch` for now: datadog, notion, slack. Those land in
ROADMAP → Later → Resources PR 3 along with the stretch-resource
dispatcher wiring.
Three new skills:

- `skills/query-issue-tracker/` (cross-role, resources: [linear, jira]) —
  read primitive over the team's tracker. Three call shapes: list by
  filter, drill one, active scope. Tracker detection is structural (which
  MCP server is connected); result shape is tracker-neutral (id, title,
  normalised status category, normalised priority enum). Writes stay out
  of scope — they belong to tracker-specific skills like linear-triage.

- `skills/query-warehouse/` (cross-role, resources: [bigquery, snowflake]) —
  read primitive over the team's analytics warehouse. Three call shapes:
  discover schema, estimate cost, run SQL. The kill-cost guardrail is the
  whole point — every `run` is preceded by an internal `estimate`; queries
  above the per-call byte cap (default 100 GB) are refused. SQL dialect
  is NOT translated between engines — that's a leaky abstraction; engine
  detection is enough.

- `roles/product-manager/skills/hubspot-pipeline-readout/` (resources:
  [hubspot]) — PM-specific 10-20min pass producing a one-page pipeline
  readout. Three sections in order: stage health (with rolling 90-day
  baseline comparison), segment velocity (last 30 days closed), ICP fit
  pattern (won deals vs the stated ICP claim, sourced from the chronicle
  positioning entry when present).

Frontmatter opt-ins on existing skills:

- `roles/product-manager/skills/prd/SKILL.md` — resources: [linear, jira]
  for pulling current open-issue context into the PRD when relevant.
- `skills/decision-record/SKILL.md` — resources: [github] for cross-linking
  the decision to the PR/commit that implements it.

All three new skills pass validate-skill (anatomy: Purpose, Key Concepts,
Application, Examples, Common Pitfalls, References). Smoke-check passes
with the new bidirectional cross-references resolving cleanly.
… copy

Three changes that wire the resources layer into the install path and
plugin manifest so the new cards are discoverable and reachable from
installed Hornero rather than only from the repo checkout.

1. `.claude-plugin/plugin.json` gains an `mcpServers` block listing
   linear, jira, github, bigquery, snowflake, hubspot — every entry
   marked `optional: true` so Hornero stays usable when no MCP server
   is configured (graceful degradation via the Fallback section in each
   RESOURCE.md). Each entry carries install command, auth env vars, and
   used_by skills so plugin loaders can surface "this skill wants
   resource X" without parsing repo files.

2. `install.sh --list-resources` short-circuits the install flow and
   prints the resource catalog (slug, status, consumer-count) — used
   to scan availability before deciding what to wire up.

3. `install.sh` install path now copies `resources/<slug>/RESOURCE.md`
   into `<host>/hornero-resources/<slug>/` on both Claude and Codex
   targets. Read-only mirror so skills' relative cross-references
   resolve when the repo isn't on disk.

4. `scripts/smoke-check.sh` count check now includes resources in
   the expected dry-run total (skills + agents + commands + resources).

ROADMAP updated: this PR's work moves from Next → Now (under the
Resources layer summary line, which also gets a current count of stable
vs stretch and a one-line note about the cross-system primitives).
CATALOG regenerated.

This closes Resources layer PR 2 from the roadmap. Resources PR 3
(stretch resources + dispatcher wiring + SessionStart probe) stays
in Later as originally sequenced.
…framing

Two reviewer-flagged fixes:

1. **Remove `mcpServers` block from `.claude-plugin/plugin.json`.** The
   Claude Code plugin manifest spec doesn't consume a top-level
   `mcpServers` key in this shape — MCP servers travel via `.mcp.json`
   with the standard `{command, args, env}` schema, not the
   `{optional, install, auth_env, used_by}` block I'd written. The
   block was aspirational documentation that the loader silently
   ignored; worse, the plugin description claimed it as a feature.
   Removed the block; rewrote the description to point to the
   `resources/<slug>/RESOURCE.md` cards as the source of truth for
   per-resource MCP install / auth / fallback details.

2. **Honest framing of the kill-cost guardrail in `query-warehouse`.**
   The skill prose said enforcement was "structural, not advisory" but
   a SKILL.md is instructions to an agent, not executable code. Updated
   the Common Pitfall to say so explicitly and point to where hard
   structural enforcement should actually live (warehouse-layer IAM /
   billing alerts / CI gates).

3. **Engine-routing-vs-divergent-logic note in `query-issue-tracker`.**
   The skill branches on tracker in three places in `## Application`
   (one MCP tool name per call shape). A reviewer flagged this against
   the ROADMAP "if Linear, X; if JIRA, Y more than twice, split" rule,
   but the branches are engine-routing only — same shape, different
   tool name. Added a Key Concepts note distinguishing engine routing
   (allowed, the whole point of a cross-system primitive) from
   divergent logic (the anti-pattern the rule was guarding against).
   No structural change; clarifies intent for future readers.

smoke-check still passes (12/12).
… into base

When this PR was rebased onto current main (which carried the squash-
merged #30), the plugin description counts needed updating from
\"10 commands, 50 skills (37 PM + 13 cross-role)\" to
\"12 commands, 54 skills (38 PM + 16 cross-role)\". Also synced the
Codex manifest, which was lagging.

Counts are sourced from \`find skills -maxdepth 2 -name SKILL.md -type f\`
(16 cross-role) and \`find roles -path '*/skills/*/SKILL.md'\` (38 PM,
including the new hubspot-pipeline-readout).
@argen argen force-pushed the feat/resources-layer-pr2 branch from 85c54a4 to ef47a1d Compare May 20, 2026 22:09
@argen argen merged commit 09bc3d7 into main May 20, 2026
1 check failed
@argen argen deleted the feat/resources-layer-pr2 branch May 20, 2026 22:10
argen added a commit that referenced this pull request May 20, 2026
…#37)

Three PRs landed this session (#30 chronicle append-semantics, #31
resources layer PR 2, #32 mktemp fix) and the front-door docs hadn't
caught up. Updated counts and added coverage for what shipped:

- README:
  - Skill count: 37 → 38 PM (added hubspot-pipeline-readout in #31).
  - Cross-role count: 8 → 16 (added ingest, prep, review,
    hypothesis-track, stakeholder-update, customer-update,
    query-issue-tracker, query-warehouse).
  - Slash commands: 6 → 12 (matched the new skills).
  - Themes table: hubspot-pipeline-readout added under Operations.
  - Cross-role list restructured into four sub-groups (harness
    primitives / chronicle write+read / chronicle append-shaped /
    chronicle workflow / cross-system primitives).
  - Resources table: jira/bigquery/snowflake/hubspot promoted to
    stable with their consumer skills named; github added explicitly;
    claude.ai-native cards (canva, gmail, google-calendar,
    google-drive, intercom) folded into the stable group.
  - Chronicle section rewritten to cover all four entry types
    (decision / hypothesis / stakeholder / customer), the sourcing
    hierarchy, and the append exception with the three append-shaped
    skills.
  - New /catalog table rows for /ingest, /prep, /review, and the
    three append commands.

- DISPATCHER: "eight cross-role" → "sixteen cross-role".

- playbooks/onboarding.md, role-cheatsheet.md: skill counts updated
  to match.

No content changes outside doc strings; smoke-check still 12/12.
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