Commit 43f6a17
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
- compound
- pre-commit-review
- tests
- agents
- tests
- docs
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
55 | | - | |
| 55 | + | |
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
69 | 89 | | |
70 | 90 | | |
71 | 91 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
43 | | - | |
| 43 | + | |
44 | 44 | | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
50 | 51 | | |
51 | 52 | | |
52 | 53 | | |
| 54 | + | |
| 55 | + | |
53 | 56 | | |
54 | 57 | | |
55 | | - | |
| 58 | + | |
56 | 59 | | |
57 | | - | |
58 | | - | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
59 | 63 | | |
60 | 64 | | |
61 | 65 | | |
| |||
66 | 70 | | |
67 | 71 | | |
68 | 72 | | |
69 | | - | |
| 73 | + | |
70 | 74 | | |
71 | 75 | | |
72 | 76 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
70 | | - | |
| 70 | + | |
71 | 71 | | |
72 | 72 | | |
73 | 73 | | |
74 | | - | |
| 74 | + | |
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
| |||
0 commit comments