Skip to content

Commit 43f6a17

Browse files
javiAIJavierclaude
authored
feat(f2): plugin subagents pos-code-reviewer + pos-architect (#26)
* kickoff(f2): RED tests — agents/ + flips para pos-* namespace Fase 0 + Fase 1 RED-first de feat/f2-agents-subagents. Scope ratificado en Fase -1: - 2 plugin subagents en agents/: pos-code-reviewer + pos-architect. - auditor diferido (no consumer real hoy; regla #7 CLAUDE.md). - Namespace pos-* para evitar colisión con built-in/user/project agents. - NO tocar policy.yaml (sin agents_allowed; deferred sin consumer). - NO tocar hooks/_lib/policy.py. - NO extender audit-session. Shape primitive (oficial Claude Code subagent): - frontmatter: name + description + tools (comma-separated string) + model. - body Markdown como system prompt. - model: sonnet para ambos. - Sin campos inventados. Files RED en este commit: - agents/tests/test_agent_frontmatter.py (NEW) — 24 RED tests: * Structure (2): file exists + parses * Frontmatter (14): keys subset, required, name match filename, namespace pos-*, description non-empty, tools comma-separated string, model valid * Body (2): substantive (>100 chars) * Capabilities (4): pos-code-reviewer menciona bug/security/scope/invariant; pos-architect menciona pattern/design/cross-file consistency. - .claude/skills/tests/test_skill_frontmatter.py (MODIFIED): * TestPreCommitReviewBehavior::test_delegates_to_code_reviewer renombrado a test_delegates_to_pos_code_reviewer + asserta general-purpose fallback. * TestCompoundBehavior::test_body_declares_fallback renombrado a test_body_delegates_to_pos_architect_with_fallback (asserta pos-architect literal + general-purpose fallback). * pattern-audit + audit-session negation lists incluyen pos-architect / pos-code-reviewer (forward-compat: main-strict skills nunca deben referenciar plugin subagents). Confirmado RED: 26 fail (24 agents + 2 skills flips) + 791 pass + 1 skip. Regression intacta sobre E1a/E1b/E2a/E2b/E3a/E3b/F1. Próximo: Fase 2 GREEN — escribir agents/pos-code-reviewer.md + agents/pos-architect.md + actualizar bodies de pre-commit-review/SKILL.md + compound/SKILL.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(f2): GREEN — pos-code-reviewer + pos-architect plugin subagents Fase 2 implementación que satisface los 24 RED tests + 2 skill flips. agents/pos-code-reviewer.md — plugin subagent para branch-diff review. Frontmatter primitive-correct (name + description + tools comma-separated + model: sonnet, sin campos inventados). Body declara las 5 capacidades explícitas que pre-commit-review delega: bugs / logic errors / security vulnerabilities / scope adherence / invariant violations. Output contract: findings agrupados por severidad (blocker/high/medium/nit), confidence- filtered, file:line refs. Hard limits: no Edit, no Write, no PR, no invocación de otras skills/subagents. agents/pos-architect.md — plugin subagent para pattern extraction + cross-file design. Frontmatter primitive-correct. Body declara 3 dimensiones: pattern extraction (≥2 repeticiones, regla #7), architectural design (cohesión + tradeoffs), cross-file consistency. Output contract: patterns en formato canónico (Name/Context/Signal/Rule/Examples/Rationale) listo para que compound los folde en .claude/patterns/<slug>.md. Hard limits: no refactor, no Edit, no overwriting de patterns existentes. .claude/skills/pre-commit-review/SKILL.md — flip code-reviewer → pos-code-reviewer (description + body + steps + failure modes). Fallback a general-purpose se mantiene literal. subagent_type / agent tool refs intactos. .claude/skills/compound/SKILL.md — flip code-architect → pos-architect (description + body + steps + failure modes). Fallback a general-purpose intacto. Pattern format + STOP signal + writer-scoped strict intactos. Resultado: 817 passed + 1 skipped (baseline 791 + 26 nuevos: 24 agents contract + 2 skill flips). Zero regression sobre E1a/E1b/E2a/E2b/E3a/ E3b/F1. Próximo: Fase N+1 simplify pre-PR + Fase N+3 docs-sync (ROADMAP/HANDOFF/ MASTER_PLAN/skills.md/skills-map.md/ARCHITECTURE.md). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(f2): sync ROADMAP + HANDOFF + MASTER_PLAN + rules/ for plugin subagents Cierre de Fase N+3 docs-sync de F2: documenta los plugin subagents `pos-code-reviewer` + `pos-architect` (entregados en commits previos e63f438 RED + 2a5396b GREEN) en todas las superficies de docs del meta-repo. Cero cambios de código en este commit — sólo prosa. ROADMAP.md - Fila F status flippea a `🔄 (F1 ✅, F2 ✅, F3..F4 ⏳)`. - Fila F2 `⏳` → `✅ | — (PR pendiente)` con scope completo. - Sección `### feat/f2-agents-subagents — ✅ (PR pendiente)` nueva antes de "## Convenciones" — entregables, suite stats (817+1), contrato fijado, 6 decisiones Fase -1 ratificadas, exit criterion. HANDOFF.md - §1 snapshot: rama actual F2 ✅ PR pendiente, anterior F1 ✅ #25, siguiente F3 — `feat/f3-selftest-end-to-end`. - §8 reframe: built-in subagents → plugin agents `pos-*` críticos (consumed by pre-commit-review + compound), built-in residuales sólo para branch-plan reads. - §9 Próxima rama: F2 → F3 (selftest end-to-end). - §20 Estado F2 NEW: entregables + contrato + decisiones + ajustes + resultado 817+1. MASTER_PLAN.md - § Rama F2 expandida: scope 2 agents pos-*, archivos a crear/ modificar, 6 decisiones cerradas, ajustes v1→v2 (recorte de 3→2 + namespace + no policy), contexto a leer, criterio de salida, carry-overs F3/F4. .claude/rules/skills.md - § Fork / delegación: precedentes flippean a `pos-code-reviewer` + `pos-architect` (post-F2) con disclaimer de fallback `general- purpose`. Plugin agent primitive box explícito (shape distinto al skill: `tools` comma-separated string vs YAML list `allowed- tools`). Forward-compat negation list extendida con `pos-*`. - Behavior tests row: refleja flips F2 + negation lists extendidas. .claude/rules/skills-map.md - Filas `pre-commit-review` y `compound`: subagent_type flippea a `pos-code-reviewer` / `pos-architect` (post-F2), fallback `general-purpose` literal. - Sección "## Subagents del plugin (entregado en F2)" NEW: tabla con los 2 agents + contract tests + fallback + diferidos (`pos-auditor`, `agents_allowed`) + forward-compat negation. Resultado: 817 passed + 1 skipped (sin cambios al code; suite intacta). E1a..F1 + D1..D6 regression intacta. `docs/ARCHITECTURE.md` NO modificado (decisión Fase -1 ratificada: F2 no toca `generator/` ni `hooks/`; pre-pr-gate conditional no exige sync). Próximo: simplify pre-PR + pre-commit-review (dogfooding F2 sobre sí mismo: pre-commit-review delega a pos-code-reviewer) + gh pr create. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * simplify(f2): fix stale framing in pre-commit-review delegation disclaimer El disclaimer de Delegation rezaba "The string `pos-code-reviewer` here reflects the Claude Code default shipped today" — wording correcto cuando apuntaba a `code-reviewer` (built-in de Claude Code) pero stale post-flip F2: `pos-code-reviewer` es plugin agent, no default de Claude Code. Reescrito para reflejar la realidad post-F2: "The string `pos-code-reviewer` is the plugin subagent shipped by `pos` in F2 (defined in agents/pos-code-reviewer.md). It is hardcoded with a disclaimer: runtimes that do not load plugin agents (or load them under different names) may not expose it." Sin cambios de comportamiento (la fallback rule a `general-purpose` queda literal). Sin cambios al contrato de tests. Suite 817 passed + 1 skipped. Writer-scoped strict: archivo dentro del diff `git diff --name-only main..HEAD`. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(f2): address PR #26 review — required tools/model + ARCHITECTURE.md § 6 Atiende los 2 ajustes solicitados por el usuario sobre PR #26 (más un fix trivial de un test name reference flaggeado por Copilot): 1. Hardening del contract de agent primitive `agents/tests/test_agent_frontmatter.py`: - `tools` y `model` movidos a `REQUIRED_FRONTMATTER_KEYS` (antes opcionales vía early-return — dejaba el contrato flojo para drift). - `test_tools_is_comma_separated_string` ahora valida tokens (split por `,`, asserts non-empty + sin whitespace en el nombre antes de `(...)` — antes un space-separated string pasaba el test). - `test_model_valid_if_present` → `test_model_valid` (sin early-return). - NUEVO `test_model_is_sonnet_for_f2` parametrizado por agent: lockea decisión Fase -1 (1) `model: sonnet`. Bumpear a opus/haiku exige rama nueva + ratificación. 2. `docs/ARCHITECTURE.md § 6 Agents` reescrita La sección era stale (listaba `code-reviewer` / `architect` / `auditor` sin namespace, usaba `allowed-tools:` que es shape de skill, no de agent). Ahora documenta: - top-level superficie `agents/<slug>.md` con primitive oficial (`name` / `description` / `tools` comma-separated / `model`); - tabla shape skill vs agent (divergencia esencial post-F2); - namespace `pos-*` obligatorio + test que lo lockea; - 2 agents entregados + diferidos (auditor + agents_allowed) + forward-compat negation. 3. Trivial: `HANDOFF.md` test name reference `test_name_is_pos_prefixed` → `test_name_uses_pos_namespace` (matcheaba el doc al test real; el doc estaba desincronizado). Docs-sync sincronizado: ROADMAP + HANDOFF §20 + MASTER_PLAN § F2 ahora reportan 819 passed + 1 skipped (vs 817; +2 por el nuevo `test_model_is_sonnet_for_f2` parametrizado por 2 agents) y reconcilian la decisión (6) que ahora SÍ incluye `docs/ARCHITECTURE.md § 6 Agents` (antes "no requerido" — contradicción cerrada). No cambios de scope: sin `agents_allowed`, sin `pos-auditor`, sin modificar `policy.yaml`, sin tocar `audit-session`. Suite: 819 passed + 1 skipped. Sin regresión D1..D6 / E1a..E3b / F1. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(f2): reconcile count math + stale comment + diff syntax across docs Five tweaks surfaced by Copilot's second pass on PR #26 (commit f230320): 1. .claude/skills/tests/test_skill_frontmatter.py:316 — stale comment said `code-reviewer` (built-in default) when the test now asserts `pos-code-reviewer` (plugin subagent shipped by F2). Reworded. 2. test_skill_frontmatter.py:351 + 419 — `main..HEAD` (two-dot, ancestor-only) in docstrings flipped to `main...HEAD` (three-dot, merge-base relative) matching what the skill bodies actually run. 3. HANDOFF.md:9 + §20:425 — count framing said "+24 contract + 2 skill flips" or "+28 nuevos". Suite delta is +26 net (793 → 819) from the new parametrized file (2 slugs × 13 methods). Behavior flips edit assertions in existing tests — they don't add count. Reframed everywhere. 4. ROADMAP.md:621 + MASTER_PLAN.md:694 + 722 — same reconciliation as (3). 5. MASTER_PLAN.md decision (6) line 706 + ROADMAP exit criteria 640 already updated in f230320 to include `docs/ARCHITECTURE.md § 6 Agents`; now the count math in the same paragraphs matches. No code change. No test added or removed. Suite still 819 passed + 1 skipped. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Javier <javier.abril@glassnode.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 50ca343 commit 43f6a17

12 files changed

Lines changed: 572 additions & 62 deletions

File tree

.claude/rules/skills-map.md

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ Canonical order pre-PR: **`simplify → pre-commit-review`**. Reduce primero, re
4444
| Skill | Lifecycle | Modelo | Context | Qué hace |
4545
|---|---|---|---|---|
4646
| `simplify` | Fase N+1 (pre-PR) | sonnet | main (writer-scoped) | Reduce redundancia / ruido / complejidad accidental / abstracción prematura en archivos ya presentes en `git diff --name-only main..HEAD`. **Writer-scoped strict**: edita vía `Edit` sólo archivos del diff; no crea archivos nuevos; no toca archivos fuera del diff; no cambia comportamiento; no busca bugs; no hace refactor mayor. Cierra con reporte "qué simplificó / what was simplified" + "qué decidió no tocar / what it chose not to touch". |
47-
| `pre-commit-review` | Fase N+2 (pre-PR) | sonnet | main + Agent-tool hybrid delegation (`code-reviewer`) | Main prepara context (branch kickoff + invariantes de `.claude/rules/*.md` aplicables al diff); delega vía `Agent(subagent_type="code-reviewer", ...)` con `git diff main..HEAD` completo + asks explícitos (bugs + logic + security + scope adherence + invariant violations); subagent corre en fork real y devuelve summary confidence-filtered; main folds (dedup + file:line + severity order + veredicto de una línea). Fallback a `general-purpose` si el runtime enum no expone `code-reviewer`. **Nunca edita, nunca abre PR, nunca sustituye a `simplify`**. |
47+
| `pre-commit-review` | Fase N+2 (pre-PR) | sonnet | main + Agent-tool hybrid delegation (`pos-code-reviewer` plugin agent post-F2) | Main prepara context (branch kickoff + invariantes de `.claude/rules/*.md` aplicables al diff); delega vía `Agent(subagent_type="pos-code-reviewer", ...)` con `git diff main...HEAD` completo + asks explícitos (bugs + logic + security + scope adherence + invariant violations); subagent corre en fork real y devuelve summary confidence-filtered; main folds (dedup + file:line + severity order + veredicto de una línea). Fallback a `general-purpose` si el runtime no expone agents del plugin. **Nunca edita, nunca abre PR, nunca sustituye a `simplify`**. |
4848
| `compress` | on-demand (contexto >120k) | sonnet | main | Read-only advisory planner: propone qué `.claude/logs/*.jsonl` comprimir (edad, tamaño, importancia). No edita ni elimina archivos; usuario decide. E2b advisory-only. |
4949
| `audit-plugin` | antes de instalar community tool (MCP/plugin) | sonnet | main | Read-only advisory gate: audita contra SAFETY_POLICY.md 6-checklist, retorna GO/NO-GO/NEEDS_MORE_INFO. No instala, no enforza, no modifica policy.yaml. E2b advisory-only; enforcement diferido. |
5050

5151
## Pattern + Test (entregado en E3)
5252

5353
| Skill | Lifecycle | Modelo | Context | Qué hace |
5454
|---|---|---|---|---|
55-
| `compound` | post-merge (trigger by touched_paths, policy-driven) | opus | main (writer-scoped strict) | Lee merged diff; delega análisis a `code-architect` subagent (fallback `general-purpose`); escribe patrones a `.claude/patterns/` (formato canónico: `# Pattern:` + secciones `##`). No refactoring de código, solo propuestas de patrones. **STOP**: usuario revisa + aprueba merge de patrón. |
55+
| `compound` | post-merge (trigger by touched_paths, policy-driven) | opus | main (writer-scoped strict) | Lee merged diff; delega análisis a `pos-architect` plugin agent post-F2 (fallback `general-purpose`); escribe patrones a `.claude/patterns/` (formato canónico: `# Pattern:` + secciones `##`). No refactoring de código, solo propuestas de patrones. **STOP**: usuario revisa + aprueba merge de patrón. |
5656
| `pattern-audit` | Fase N+3 post-merge (manual invoke) | sonnet | main (main-strict, no delegation) | Lee entradas `.claude/patterns/`; busca signals en codebase (Grep/Bash); detecta drift (signal/examples/rule inconsistency). Emite reporte diagnóstico sin mutar archivos. **STOP**: usuario revisa y decide acción (actualizar patrón / invocar compound). |
5757
| `test-scaffold` | al crear archivo sin test pair | sonnet | main (writer-scoped strict) | Detecta convención de tests (co-located vs `tests/`) sobre el repo; si ≥80% claro → genera **solo** el test pair skeleton del archivo source que el usuario provee; si ambigua → STOP + propone opciones. **NO** modifica source code, **NO** ejecuta pytest/vitest, **NO** modifica thresholds/config. Allowed-tools: `Glob`, `Grep`, `Read`, `Write`, `Bash(find:*)`, `Bash(git grep:*)`, logger. |
5858
| `test-audit` | on-demand / pre-release | sonnet | main (main-strict, no delegation) | Read-only advisory: declara **candidate signals** (no "detecta") via static analysis sobre archivos test — flaky risk (asserts en loops/conditionals), orphan tests (imports a paths que no existen), trivial assertions (`assert True`/`False`/empty). **NO** ejecuta pytest/vitest, **NO** modifica archivos. Cierra con disclaim de no-exhaustividad. Allowed-tools: `Glob`, `Grep`, `Read`, `Bash(find:*)`, `Bash(git grep:*)`, `Bash(wc:*)`, logger. |
@@ -66,6 +66,26 @@ Canonical order pre-PR: **`simplify → pre-commit-review`**. Reduce primero, re
6666
| `/pos:pr-description` | pre-PR | sonnet | main | Genera descripción del PR desde commits + kickoff |
6767
| `/pos:release` | en tag | sonnet | main | Valida versión + publica + notifica |
6868

69+
## Subagents del plugin (entregado en F2)
70+
71+
Plugin-owned subagents en `agents/<slug>.md`. **Shape distinto al skill primitive**: frontmatter `{name, description, tools, model}`, donde `tools` es comma-separated string (oficial Claude Code subagent format), no YAML list `allowed-tools`. Sin campos inventados. Namespace `pos-*` obligatorio para evitar colisión con built-ins de Claude Code (`code-reviewer`, `code-architect`, `Plan`, `Explore`, `general-purpose`) y con user/project agents externos.
72+
73+
| Agent | Consumido por | Modelo | Capacidad | Hard limits |
74+
|---|---|---|---|---|
75+
| `pos-code-reviewer` | `pre-commit-review` (E2a) | sonnet | Branch-diff review: bugs / logic errors / security vulnerabilities / scope adherence / invariant violations. Output findings agrupados por severidad (blocker/high/medium/nit), confidence-filtered, `file:line` refs. | No `Edit`, no `Write`, no PR, no invocación de otras skills/subagents. |
76+
| `pos-architect` | `compound` (E3a) | sonnet | Pattern extraction (≥2 repeticiones, regla #7) + architectural design + cross-file consistency. Output patterns en formato canónico (Name/Context/Signal/Rule/Examples/Rationale) listo para fold en `.claude/patterns/<slug>.md`. | No refactor, no `Edit`, no overwriting de patterns existentes. |
77+
78+
**Contract tests** en `agents/tests/test_agent_frontmatter.py` parametrizados por `ALLOWED_AGENTS = ["pos-code-reviewer", "pos-architect"]`: 4 clases (structure, frontmatter keys ⊆ `{name, description, tools, model}` + namespace `pos-*` + tools comma-separated string + model ∈ `{sonnet, opus, haiku}`, body substantive >100 chars, capability surfaces).
79+
80+
**Fallback `general-purpose`** explícito en bodies de skills consumidoras — protege contra runtimes que no exponen agents del plugin (Claude Code antes de discovery del directorio `agents/`, entornos minimal).
81+
82+
**Diferidos en F2 (regla #7 CLAUDE.md)**:
83+
84+
- `pos-auditor` — sin consumer real hoy. Reabrir cuando una skill futura lo requiera.
85+
- `policy.yaml.agents_allowed` — sin enforcement consumer (Stop hook lee `skills.jsonl`, no hay log de invocaciones de subagents). Reabrir cuando un hook futuro requiera enforcement.
86+
87+
**Forward-compat negation**: main-strict skills (`pattern-audit` E3a, `audit-session` F1) **nunca** deben referenciar plugin subagents. Tests negation list incluye `pos-architect` / `pos-code-reviewer` desde F2.
88+
6989
## Disabled until earned
7090

7191
Ninguna skill adicional se registra en `policy.yaml` hasta que pasa `/pos:audit-plugin --self`.

.claude/rules/skills.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,26 @@ Ver [skills-map.md § Shape canónico](skills-map.md) para el shape autoritativo
4040

4141
El primitive no soporta `context: fork` declarativamente. Si una skill requiere cross-file analysis pesado (≥3 archivos no triviales), **delegar inline vía Agent tool** desde el body de la SKILL.md es el patrón correcto.
4242

43-
La skill debe escoger el `subagent_type` **por capacidad**, no por nombre hardcoded — los nombres concretos son defaults de Claude Code y pueden variar entre releases/entornos. Regla operativa: inspeccionar el enum `subagent_type` de la tool `Agent` en runtime y matchear por capacidad. Los nombres abajo reflejan los defaults de Claude Code hoy:
43+
La skill debe escoger el `subagent_type` **por capacidad**, no por nombre hardcoded — los nombres concretos pueden variar entre releases/entornos. Regla operativa: inspeccionar el enum `subagent_type` de la tool `Agent` en runtime y matchear por capacidad. Desde F2 los subagents críticos para review + arquitectura son **propiedad del plugin** (definidos en `agents/<slug>.md` con namespace obligatorio `pos-*`); el resto reusan defaults built-in de Claude Code:
4444

45-
- **Planning independiente** (cross-check contra el plan de la skill) — Claude Code hoy: `Plan`.
46-
- **Segunda opinión arquitectónica** (crítica de diseño) — Claude Code hoy: `code-architect`.
47-
- **Context gathering cross-files** (explora y devuelve digest) — Claude Code hoy: `Explore`.
48-
- **Review de diff de rama** (confidence-filtered review) — Claude Code hoy: `code-reviewer`. **Primera consumidora: `pre-commit-review` (E2a)**. Patrón: main prepara context ligero (branch kickoff + invariantes de `.claude/rules/*.md` aplicables al diff); delega via `Agent(subagent_type="code-reviewer", ...)` con `git diff main..HEAD` completo + asks explícitos; subagent corre en fork real, devuelve summary confidence-filtered; main folds (dedup + file:line + severity). Hardcode del nombre `code-reviewer` en el body **con disclaimer** + fallback a `general-purpose` si el runtime enum no lo expone — decisión A5 de E2a: una sola consumidora hoy no justifica helper runtime (regla #7 CLAUDE.md). Reabrir si una segunda skill aporta la repetición.
49-
- **Fallback general** si ninguna capacidad específica encaja — Claude Code hoy: `general-purpose` con task prompt explícito.
45+
- **Planning independiente** (cross-check contra el plan de la skill) — Claude Code hoy: `Plan` (built-in).
46+
- **Segunda opinión arquitectónica genérica** (crítica de diseño no-pattern-extraction) — Claude Code hoy: `code-architect` (built-in). Para pattern extraction post-merge usar `pos-architect` (ver abajo).
47+
- **Context gathering cross-files** (explora y devuelve digest) — Claude Code hoy: `Explore` (built-in).
48+
- **Review de diff de rama** (confidence-filtered review) — **plugin agent: `pos-code-reviewer`** (entregado en F2; ver `agents/pos-code-reviewer.md`). **Primera consumidora: `pre-commit-review` (E2a)**. Patrón: main prepara context ligero (branch kickoff + invariantes de `.claude/rules/*.md` aplicables al diff); delega via `Agent(subagent_type="pos-code-reviewer", ...)` con `git diff main...HEAD` completo + asks explícitos; subagent corre en fork real, devuelve summary confidence-filtered; main folds (dedup + file:line + severity). Hardcode del nombre `pos-code-reviewer` en el body **con disclaimer** + fallback a `general-purpose` si el runtime no expone agents del plugin — decisión A5 de E2a (una sola consumidora hoy no justifica helper runtime, regla #7 CLAUDE.md) ratificada en F2 con namespace `pos-*` para evitar colisión con built-ins.
49+
- **Pattern extraction + cross-file design** (post-merge) — **plugin agent: `pos-architect`** (entregado en F2; ver `agents/pos-architect.md`). **Primera consumidora: `compound` (E3a)**. Patrón: main pasa diff merged + lista de patterns existentes; subagent identifica 1–3 patrones que repiten ≥2 veces y devuelve propuestas en formato canónico (Name/Context/Signal/Rule/Examples/Rationale); main folds en `.claude/patterns/<slug>.md`. Hardcode `pos-architect` con fallback `general-purpose`.
50+
- **Fallback general** si ninguna capacidad específica encaja o el runtime no expone el agent del plugin — Claude Code hoy: `general-purpose` con task prompt explícito.
5051

5152
El subagent corre en fork real; la skill recibe el summary al tool result y lo folds en su output — no paste-through.
5253

54+
**Plugin agent primitive (entregado en F2)**: `agents/<slug>.md` con frontmatter `{name, description, tools, model}`. **Shape distinto al skill primitive**: `tools` es comma-separated string (oficial Claude Code subagent format), no YAML list `allowed-tools`. Sin campos inventados. Namespace `pos-*` obligatorio. Contract tests en `agents/tests/test_agent_frontmatter.py` parametrizados por `ALLOWED_AGENTS`. No hay `agents_allowed` en `policy.yaml` hoy (sin enforcement consumer; el Stop hook lee `skills.jsonl`, no `agents.jsonl`).
55+
5356
**Precedentes**:
5457

55-
- `branch-plan` (E1b) delega cuando el plan es heavy (pick `Plan` / `code-architect` / `Explore` por capacidad).
58+
- `branch-plan` (E1b) delega cuando el plan es heavy (pick `Plan` / `code-architect` / `Explore` built-in por capacidad).
5659
- `deep-interview` (E1b) nunca delega — su coste está en el dialog, no en reading.
57-
- `pre-commit-review` (E2a) delega siempre a `code-reviewer` como hybrid pattern (main prepara context, subagent analiza, main folds) — primer uso del subagent `code-reviewer` en el repo.
58-
- `project-kickoff` y `writing-handoff` (E1a), `simplify` (E2a) son main-strict por scope acotado.
60+
- `pre-commit-review` (E2a) delega siempre a `pos-code-reviewer` como hybrid pattern (main prepara context, subagent analiza, main folds) — **primera consumidora del plugin agent post-F2** (antes de F2 apuntaba a `code-reviewer` built-in).
61+
- `compound` (E3a) delega a `pos-architect` post-merge para pattern extraction — **primera consumidora del plugin agent post-F2** (antes de F2 apuntaba a `code-architect` built-in).
62+
- `project-kickoff` y `writing-handoff` (E1a), `simplify` (E2a) son main-strict por scope acotado. `pattern-audit` (E3a) y `audit-session` (F1) son main-strict por design — **forward-compat negación**: nunca deben referenciar plugin subagents (negation list de tests incluye `pos-architect` / `pos-code-reviewer` desde F2).
5963

6064
**Precedentes de writer-scope**: `writing-handoff` (E1a) escribe **sólo** en HANDOFF.md con scope por sección declarado en el body; `simplify` (E2a) es la **segunda** writer-scoped del repo — edita **sólo** archivos presentes en `git diff --name-only main..HEAD`, con scope check en cada `Edit` call y reclasificación a `skip (out of scope)` si el `file_path` no está en la lista derivada. Ambas cierran con reporte de qué cambiaron y qué decidieron no tocar.
6165

@@ -66,7 +70,7 @@ El primitive no soporta `model:` en el frontmatter — la skill corre en el mode
6670
## Tests
6771

6872
- **Contract tests** del primitive en `.claude/skills/tests/test_skill_frontmatter.py` — parametrizados por `ALLOWED_SKILLS` (renombrado desde `E1_SKILLS_KNOWN` en E2a cuando la allowlist cruzó el límite de fase; contract-bound al `skills_allowed` del meta-repo, no era-bound: extender = añadir entrada aquí + en `policy.yaml`, no renombrar). Validan: dir + SKILL.md existe; NO `skill.json`; frontmatter keys ⊆ `{name, description, allowed-tools}`; `name` == dir name; description case-insensitive `startswith "use when"`; `allowed-tools` es `list[str]` si presente; `name` sin prefijo `pos:`; body referencia `.claude/skills/_shared/log-invocation.sh`; shared logger existe y es ejecutable.
69-
- **Behavior tests** del body — añadir una `TestXxxBehavior` class por skill cuando el framing del body sea parte del contrato. Existentes: `TestBranchPlanBehavior` + `TestDeepInterviewBehavior` (E1b — disclaim de marker, opt-in gating, no silent mutation); `TestPreCommitReviewBehavior` + `TestSimplifyBehavior` (E2a — delegation a `code-reviewer`, scope `git diff main..HEAD`, disclaim de escritura / reemplazo de `simplify`, writer-scoped-al-diff, reducer-not-bug-finder, reporte de qué simplificó + qué decidió no tocar).
73+
- **Behavior tests** del body — añadir una `TestXxxBehavior` class por skill cuando el framing del body sea parte del contrato. Existentes: `TestBranchPlanBehavior` + `TestDeepInterviewBehavior` (E1b — disclaim de marker, opt-in gating, no silent mutation); `TestPreCommitReviewBehavior` + `TestSimplifyBehavior` (E2a — delegation a `pos-code-reviewer` post-F2, scope `git diff main...HEAD`, disclaim de escritura / reemplazo de `simplify`, writer-scoped-al-diff, reducer-not-bug-finder, reporte de qué simplificó + qué decidió no tocar); `TestCompoundBehavior` (E3a, flippeada en F2 — delegation a `pos-architect` con fallback `general-purpose`); negation lists de `TestPatternAuditBehavior` (E3a) y `TestAuditSessionBehavior` (F1) extendidas con `pos-*` desde F2 (forward-compat: main-strict skills nunca referencian plugin subagents).
7074
- **Integration contract** logger ↔ Stop hook en `hooks/tests/test_skills_log_contract.py`. Añadir un caso `test_all_N_skills_end_to_end` (o renombrar el existente) cuando la allowlist crezca. Precedente: `test_all_four_e1_skills_end_to_end` (E1b) → `test_all_six_e1_e2a_skills_end_to_end` (E2a).
7175

7276
## Logging — best-effort via helper

.claude/skills/compound/SKILL.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Extract and register reusable patterns when a merged branch exhibits extractable
2121

2222
You MAY:
2323
- Read the merged diff (`main...HEAD`).
24-
- Delegate deep pattern analysis to `code-architect` subagent via Agent tool (hybrid pattern: main prepares context, subagent analyzes, main writes).
24+
- Delegate deep pattern analysis to `pos-architect` subagent via Agent tool (hybrid pattern: main prepares context, subagent analyzes, main writes).
2525
- Create `.claude/patterns/<name>.md` with pattern entries (write-only, strict scope).
2626

2727
You MUST NOT:
@@ -67,11 +67,11 @@ Mandatory fields: Context, Signal, Rule, Examples. Last observed: timestamped by
6767
- List touched top-level dirs + file count.
6868
- Collect `.claude/patterns/*.md` existing entries (to avoid duplicates).
6969

70-
3. **Delegate to `code-architect`** via Agent tool (with fallback):
70+
3. **Delegate to `pos-architect`** via Agent tool (with fallback):
7171
- Full diff: `git diff main...HEAD`.
7272
- Existing patterns (so subagent can avoid re-proposing).
7373
- Explicit task: "identify 1–3 patterns that repeat ≥2 times across the diff and would reduce future duplication. Output: pattern proposals (no code refactoring, no file changes)."
74-
- Preferred subagent: `code-architect` (pattern extraction via architecture lens).
74+
- Preferred subagent: `pos-architect` (pattern extraction via architecture lens).
7575
- Fallback if unavailable: `general-purpose` with same task (generic analysis acceptable).
7676
- Subagent returns a summary (not raw code).
7777

0 commit comments

Comments
 (0)