feat(#347): promote product + design roles to sub-agents (Wave 3 PR 2)#356
Conversation
…xis 1 + 2 - Omar (head-of-product), Mariam (product-manager), Hanan (product-analyst) - Maha (head-of-design), Nour (ui-designer), Iman (ux-designer) - All sonnet per AgDR-0050 § Axis 2 default-model matrix - All ship full toolset (Bash, Read, Edit, Write, Grep, Glob) - WRAP shape: each agent file delegates identity to roles/<dept>/<slug>.md - ## Activation mode sections were added to all 19 role files in PR 1; this PR ships wrappers only (no role-file churn) Refs #347
- Rename test_engineering_agents_wrap_shape.sh → test_agent_wrap_shape.sh so the file name no longer pins to one dept (Waves 3-4 will add security + data + utility-agent invariants under the same shape). - Grow ENG_AGENTS → ROLE_AGENTS matrix from 7 → 13 entries, with the 4th field encoding the dept so the @roles/<dept>/<slug>.md reference check is dept-aware instead of hardcoded to engineering. - Header comment now documents the wave history (PR 1 shipped, PR 2 here, PR 3 + PR 4 upcoming) so future contributors see the growth arc rather than treating the test as final. - ## Activation mode coverage on all 19 role files is unchanged from PR 1 — verified as a regression check, all 19 still PASS. Refs #347
… + design Was 12 (5 utility + 7 engineering); now 18 (5 utility + 7 engineering + 6 product-design) after #347 PR 2 lands the product + design dept wrappers. Stays under the 25-word Wave 1 invariant (test_token_ efficiency_wave1.sh) and surfaces the wave-progression context so the target of 24 doesn't read as a still-pending one-shot. Refs #347
atlas-apex
left a comment
There was a problem hiding this comment.
Code Review: PR #356
Commit: 996e92ec128189d129547e259b379c10f233afac
Summary
Wave 3 PR 2 of #347's 5-PR plan: six new product + design sub-agent wrappers (Omar, Mariam, Hanan, Maha, Nour, Iman), smoke-test rename + matrix expansion (7→13), and CLAUDE.md agent-count refresh (12→18). All 6 new agents follow the WRAP shape established in PR 1 — frontmatter owns model + tools + persona metadata, body delegates identity to @roles/<dept>/<slug>.md. Zero role files modified, zero utility agents touched, zero routing/sync/drift work.
Checklist Results
- Architecture & Design: Pass — pure WRAP wrappers, no logic duplication, identity stays in roles/
- Code Quality: Pass — uniform shape across all 6 agents, identical activation-context boilerplate
- Testing: Pass — smoke test grown from 7→13 entries with 4-field dept-aware parsing; PR body reports 13/13 + 19/19 PASS
- Security: N/A — frontmatter + boilerplate markdown only, no secrets / auth / I/O surface
- Performance: N/A
- PR Description & Glossary: Pass — narrative bullets per pr-quality.md; Glossary present and correctly tightened (4 terms, does NOT redefine WRAP/Activation-mode primitives that PR 1 already glossed)
- Technical Decisions (AgDR):Pass — all decisions trace to AgDR-0050 § Axis 2 (default model matrix) and § Axis 6 (HYBRID role-trigger integration); no new decisions introduced
- Adopter Handbooks: N/A — no handbooks loaded (no architecture/general always-load files in scope; diff is pure markdown + bash test, no language handbooks triggered)
Verification against the brief
1. WRAP shape uniform across 6 new agents — VERIFIED. All 6 carry identical frontmatter field set (name / description / model / allowed-tools / persona_name) and identical ## Activation context boilerplate. Bodies reference @roles/design/head-of-design.md, @roles/product/head-of-product.md, @roles/product/product-analyst.md, @roles/product/product-manager.md, @roles/design/ui-designer.md, @roles/design/ux-designer.md respectively — dept matches the role file's canonical home in every case.
2. Model matrix matches AgDR-0050 § Axis 2 EXACTLY — VERIFIED. All 6 = sonnet. No drift.
3. Allowed-tools uniform — VERIFIED. All 6 carry Bash, Read, Edit, Write, Grep, Glob (full superset). No stripping.
4. Smoke test rename clean — VERIFIED. GitHub reports changeType: RENAMED at 70% similarity (history preserved). Matrix grown from 7 → 13 entries with new dept field (4-field colon-delimited parsing via IFS=':' read). Header documents the wave history (PR 1 → PR 4). Invariant 4 updated to use per-dept path @roles/${dept}/${slug}.md. Pass message updated to "role-derived agent wrap-shape" (no longer engineering-pinned).
5. CLAUDE.md word count — VERIFIED. New cell = 18 words (18 sub-agents (5 utility + 7 engineering + 6 product-design). Growing to 24 across Wave 1-3 per AgDR-0050.). Comfortably under the 25-word Wave 1 cap. Minor nit: PR body claims 19 words; actual is 18. Non-blocking.
6. No role files modified — VERIFIED. gh pr view --jq '.files[] | select(.path | startswith(\"roles/\"))' returned empty.
7. No utility agents touched — VERIFIED. None of rex.md / hatim.md / code-reviewer.md / security-reviewer.md / etc. appear in the file list.
8. No routing config / sync hook / drift guards — VERIFIED. No matches for detect-role-trigger, sync-agent, or agent-routing in the file list. PR stays in its lane (PR 2 territory only).
9. No role-trigger integration — VERIFIED (subset of #8).
10. PR body — VERIFIED. Narrative bullets (each answers what + why); Glossary present and correctly tightened — defines only Wrap shape (WRAP), Isolated-work-class, In-flow-class, Wave 3 PR 2 (no redefinition of PR 1's already-glossed primitives); uses Refs #347 not Closes; references Per AgDR-0050-agent-runtime-overhaul. correctly.
11. Wave 1 invariants — VERIFIED. CLAUDE.md row stays at 18 words ≤ 25-word cap; PR body reports 4/4 Wave 1 invariants green.
Issues Found
None blocking.
Suggestions
- (nit, non-blocking) PR body's testing section claims "19 words" for the CLAUDE.md row; actual count is 18. Minor undercount in the author's prose; the row itself is well within the 25-word cap so this changes nothing about the invariant.
Verdict
APPROVED (submitted as --comment because Rex cannot self-approve own-authored PRs; verdict is approval-equivalent — operator should write the marker.)
Reviewed by Rex (Code Reviewer Agent)
Reviewed commit: 996e92ec128189d129547e259b379c10f233afac
#356) * feat(#347): add 6 product + design sub-agent wrappers per AgDR-0050 Axis 1 + 2 - Omar (head-of-product), Mariam (product-manager), Hanan (product-analyst) - Maha (head-of-design), Nour (ui-designer), Iman (ux-designer) - All sonnet per AgDR-0050 § Axis 2 default-model matrix - All ship full toolset (Bash, Read, Edit, Write, Grep, Glob) - WRAP shape: each agent file delegates identity to roles/<dept>/<slug>.md - ## Activation mode sections were added to all 19 role files in PR 1; this PR ships wrappers only (no role-file churn) Refs #347 * test(#347): extend agent wrap-shape smoke test to cover product + design - Rename test_engineering_agents_wrap_shape.sh → test_agent_wrap_shape.sh so the file name no longer pins to one dept (Waves 3-4 will add security + data + utility-agent invariants under the same shape). - Grow ENG_AGENTS → ROLE_AGENTS matrix from 7 → 13 entries, with the 4th field encoding the dept so the @roles/<dept>/<slug>.md reference check is dept-aware instead of hardcoded to engineering. - Header comment now documents the wave history (PR 1 shipped, PR 2 here, PR 3 + PR 4 upcoming) so future contributors see the growth arc rather than treating the test as final. - ## Activation mode coverage on all 19 role files is unchanged from PR 1 — verified as a regression check, all 19 still PASS. Refs #347 * docs(#347): CLAUDE.md agent-count row reflects 18 agents post product + design Was 12 (5 utility + 7 engineering); now 18 (5 utility + 7 engineering + 6 product-design) after #347 PR 2 lands the product + design dept wrappers. Stays under the 25-word Wave 1 invariant (test_token_ efficiency_wave1.sh) and surfaces the wave-progression context so the target of 24 doesn't read as a still-pending one-shot. Refs #347 --------- Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Summary
roles/<dept>/<slug>.md(Axis 1 WRAP shape from AgDR-0050). Operators can nowAgent(subagent_type: "product-manager")etc. instead of relying solely on in-thread persona adoption.sonnet; allowed-tools is the standardBash, Read, Edit, Write, Grep, Globsuperset (matches the engineering-dept defaults, not the QA-engineer read-only carve-out). Adopters re-route per agent viaagent-routing.yamlonce [Feature] Centralised agent-routing config — agent-routing.yaml in private repo, propagates to .claude/agents/*.md at SessionStart #351 PR 2 ships the SessionStart sync hook.## Activation modealready on each role file — PR 1 added the section to all 19 roles (engineering, product, design, security, data) as part of its churn. This PR adds wrappers only and does NOT touch role files. The class assignments (Omar/Hanan/Maha = isolated-work-class; Mariam/Nour/Iman = in-flow-class) match Axis 6 exactly and are re-verified by invariant 6 of the smoke test on every run.test_engineering_agents_wrap_shape.shrenamed totest_agent_wrap_shape.sh(no longer dept-pinned) and its agent matrix grows from 7 → 13 entries with a newdeptfield per row so the@roles/<dept>/<slug>.mdreference check is per-dept aware. Test header documents the wave progression (PR 1 → PR 2 → PR 3 → PR 4) so future contributors see the growth arc.Testing
bash .claude/agents/tests/test_agent_wrap_shape.sh— PASS (13 agent wrappers verified across 4 invariants: existence + frontmatter completeness + model-matrix match + role-file body reference; plus 19 role files verified for## Activation modeClass coverage)bash .claude/hooks/tests/test_token_efficiency_wave1.sh— PASS (Wave 1 invariants 1-4 all green; CLAUDE.md agent-count row stays at 19 words, well under the 25-word cap).claude/agents/head-of-product.mdfrontmatter shape — matches the PR 1.claude/agents/tech-lead.mdtemplate exactly (name / description / model: sonnet / allowed-tools / persona_name: Omar)Refs #347
Glossary
roles/<dept>/<slug>.mdstays canonical for persona definition;.claude/agents/<slug>.mdis a thin runtime wrapper owning model + tool-restriction + agent metadata only.