@firatcand/roster 0.4.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +79 -219
  2. package/agents/lesson-drafter.md +3 -8
  3. package/agents/pattern-detector.md +0 -1
  4. package/bin/roster.js +1407 -217
  5. package/package.json +2 -3
  6. package/skills/chief-of-staff/SKILL.md +62 -78
  7. package/skills/dreamer/SKILL.md +8 -7
  8. package/skills/roster-orchestrator/SKILL.md +53 -25
  9. package/templates/CLAUDE.project.template.md +1 -1
  10. package/templates/CONTEXT.template.md +2 -2
  11. package/templates/gitignore-defaults.txt +2 -0
  12. package/templates/scaffold/chief-of-staff/README.md +16 -24
  13. package/templates/scaffold/chief-of-staff/agent.md +22 -32
  14. package/templates/scaffold/chief-of-staff/plans/audit-agent.yaml +4 -4
  15. package/templates/scaffold/chief-of-staff/plans/audit-repo.yaml +5 -4
  16. package/templates/scaffold/chief-of-staff/plans/create-agent.yaml +5 -34
  17. package/templates/scaffold/config/project.yaml.template +10 -0
  18. package/templates/scaffold/conventions.md +159 -171
  19. package/templates/scaffold/dreamer/README.md +2 -2
  20. package/templates/scaffold/dreamer/agent.md +0 -1
  21. package/templates/scaffold/dreamer/plans/nightly-reflection.yaml +23 -37
  22. package/templates/scaffold/dreamer/subagents/lesson-drafter.md +2 -7
  23. package/templates/scaffold/{projects/_demo/guidelines → guidelines}/asset-links.md +4 -0
  24. package/templates/scaffold/{projects/_demo/guidelines → guidelines}/brand-book.md +4 -0
  25. package/templates/scaffold/{projects/_demo/guidelines → guidelines}/messaging.md +4 -0
  26. package/templates/scaffold/{projects/_demo/guidelines → guidelines}/voice.md +4 -0
  27. package/templates/scaffold/scripts/audit-agent.sh +74 -47
  28. package/templates/scaffold/scripts/audit-repo.sh +27 -49
  29. package/templates/scaffold/scripts/create-function.sh +1 -1
  30. package/templates/scaffold/scripts/lib/README.md +1 -1
  31. package/templates/scaffold/scripts/lib/bindings-prompt.sh +43 -124
  32. package/templates/scaffold/scripts/new-agent.sh +99 -91
  33. package/templates/scaffold/scripts/rename-agent.sh +91 -0
  34. package/templates/scaffold/scripts/save-state.sh +32 -0
  35. package/agents/critic.md +0 -74
  36. package/agents/enricher.md +0 -56
  37. package/agents/promotion-arbiter.md +0 -71
  38. package/agents/prospector.md +0 -51
  39. package/agents/writer.md +0 -58
  40. package/skills/sdr/SKILL.md +0 -147
  41. package/templates/scaffold/chief-of-staff/plans/add-agent-to-project.yaml +0 -45
  42. package/templates/scaffold/chief-of-staff/plans/archive-project.yaml +0 -51
  43. package/templates/scaffold/chief-of-staff/plans/audit-project.yaml +0 -34
  44. package/templates/scaffold/chief-of-staff/plans/create-project.yaml +0 -65
  45. package/templates/scaffold/chief-of-staff/plans/remove-agent-from-project.yaml +0 -50
  46. package/templates/scaffold/chief-of-staff/plans/rename-project.yaml +0 -62
  47. package/templates/scaffold/chief-of-staff/plans/unarchive-project.yaml +0 -41
  48. package/templates/scaffold/dreamer/subagents/promotion-arbiter.md +0 -64
  49. package/templates/scaffold/gtm/sdr/.claude/settings.json +0 -3
  50. package/templates/scaffold/gtm/sdr/.mcp.json +0 -21
  51. package/templates/scaffold/gtm/sdr/README.md +0 -41
  52. package/templates/scaffold/gtm/sdr/agent.md +0 -136
  53. package/templates/scaffold/gtm/sdr/plans/cold-outreach.yaml +0 -92
  54. package/templates/scaffold/gtm/sdr/projects/_demo/asset-references.md +0 -7
  55. package/templates/scaffold/gtm/sdr/projects/_demo/config/default.yaml +0 -69
  56. package/templates/scaffold/gtm/sdr/projects/_demo/log/feedback/.gitkeep +0 -0
  57. package/templates/scaffold/gtm/sdr/projects/_demo/log/runs/.gitkeep +0 -0
  58. package/templates/scaffold/gtm/sdr/projects/_demo/playbook/.gitkeep +0 -0
  59. package/templates/scaffold/gtm/sdr/subagents/critic.md +0 -67
  60. package/templates/scaffold/gtm/sdr/subagents/enricher.md +0 -49
  61. package/templates/scaffold/gtm/sdr/subagents/prospector.md +0 -44
  62. package/templates/scaffold/gtm/sdr/subagents/writer.md +0 -51
  63. package/templates/scaffold/projects/_demo/CLAUDE.md +0 -35
  64. package/templates/scaffold/projects/_demo/README.md +0 -16
  65. package/templates/scaffold/projects/_demo/assets/.gitkeep +0 -0
  66. package/templates/scaffold/projects/_demo/config/default.yaml +0 -28
  67. package/templates/scaffold/projects/_demo/state.md +0 -11
  68. package/templates/scaffold/scripts/archive-project.sh +0 -98
  69. package/templates/scaffold/scripts/audit-project.sh +0 -361
  70. package/templates/scaffold/scripts/new-agent-instance.sh +0 -114
  71. package/templates/scaffold/scripts/new-project.sh +0 -125
  72. package/templates/scaffold/scripts/remove-agent-from-project.sh +0 -67
  73. package/templates/scaffold/scripts/rename-project.sh +0 -118
  74. package/templates/scaffold/scripts/unarchive-project.sh +0 -115
  75. /package/templates/scaffold/gtm/{sdr/playbook/.gitkeep → .gitkeep} +0 -0
  76. /package/templates/scaffold/{projects/_demo/guidelines → guidelines}/icps/_persona-template.md +0 -0
@@ -1,50 +0,0 @@
1
- plan: remove-agent-from-project
2
- description: |
3
- Remove an agent instance from a project. Always archives (no hard delete).
4
- For permanent deletion, the user can manually rm -rf the archived copy.
5
- Run history and project-scoped lessons live inside the instance — deletion
6
- destroys evidence the dreamer needs.
7
-
8
- inputs:
9
- project:
10
- required: true
11
- description: Project slug.
12
- function:
13
- required: true
14
- description: Function slug.
15
- agent:
16
- required: true
17
- description: Agent slug.
18
-
19
- outputs:
20
- archive_path: string
21
-
22
- steps:
23
- - id: validate
24
- description: |
25
- Confirm instance exists at
26
- ${inputs.function}/${inputs.agent}/projects/${inputs.project}/.
27
-
28
- - id: confirmation
29
- description: |
30
- Show the planned move and CLAUDE.md update:
31
-
32
- Will move:
33
- ${inputs.function}/${inputs.agent}/projects/${inputs.project}/ → _archive/${inputs.function}/${inputs.agent}/projects/${inputs.project}-<date>/
34
- And update:
35
- projects/${inputs.project}/CLAUDE.md (remove instance from ## Active agent instances)
36
- Proceed?
37
-
38
- Wait for "proceed", "yes", "y". Abort cleanly if denied.
39
- approval: session
40
-
41
- - id: execute
42
- tool: bash
43
- args:
44
- command: bash scripts/remove-agent-from-project.sh ${inputs.project} ${inputs.function} ${inputs.agent}
45
- description: Run the backing script.
46
-
47
- - id: report
48
- description: Print the archive path and the operation log entry.
49
-
50
- approval_channel: session
@@ -1,62 +0,0 @@
1
- plan: rename-project
2
- description: |
3
- Rename a project everywhere it appears: project root, every agent instance
4
- folder, and content references in CLAUDE.md / GUIDANCE.md / config files /
5
- asset-references. Does NOT auto-update lesson, run, or feedback bodies —
6
- those are historical evidence reviewed manually.
7
-
8
- inputs:
9
- old:
10
- required: true
11
- description: Current project slug (must exist at projects/<old>/).
12
- new:
13
- required: true
14
- description: New slug (lowercase, kebab-case, must not exist live or in _archive).
15
-
16
- outputs:
17
- paths_renamed: list
18
- unauto_updated_files: list
19
-
20
- steps:
21
- - id: validate
22
- description: |
23
- Confirm projects/${inputs.old}/ exists. Validate ${inputs.new} slug.
24
- Confirm no collision live or archived. Find all instances at
25
- <function>/<agent>/projects/${inputs.old}/ across the repo.
26
-
27
- - id: confirmation
28
- description: |
29
- Show full list of folder moves AND in-file content updates:
30
-
31
- Will rename folders:
32
- projects/${inputs.old}/ → projects/${inputs.new}/
33
- <function>/<agent>/projects/${inputs.old}/ → <function>/<agent>/projects/${inputs.new}/
34
-
35
- Will replace project name in:
36
- projects/${inputs.new}/CLAUDE.md
37
- projects/${inputs.new}/GUIDANCE.md
38
- <function>/*/projects/${inputs.new}/config/default.yaml (project: ${inputs.new})
39
- <function>/*/projects/${inputs.new}/asset-references.md
40
-
41
- WILL NOT auto-update:
42
- - lesson frontmatter project: fields (review manually)
43
- - run/feedback frontmatter project: fields
44
- - text references inside lesson, run, or feedback bodies
45
-
46
- Proceed?
47
-
48
- Wait for "proceed", "yes", "y". Abort cleanly if denied.
49
- approval: session
50
-
51
- - id: execute
52
- tool: bash
53
- args:
54
- command: bash scripts/rename-project.sh ${inputs.old} ${inputs.new}
55
- description: Run the backing script.
56
-
57
- - id: report
58
- description: |
59
- Print renamed paths. Surface the list of files that mention ${inputs.old}
60
- in their content but were NOT auto-updated, for manual review.
61
-
62
- approval_channel: session
@@ -1,41 +0,0 @@
1
- plan: unarchive-project
2
- description: |
3
- Restore an archived project from _archive/ back to the live tree.
4
-
5
- inputs:
6
- project:
7
- required: true
8
- description: Project slug to restore.
9
- archive_suffix:
10
- required: false
11
- description: Date/disambiguator suffix when multiple archives exist (e.g., 2026-04-26-2).
12
-
13
- outputs:
14
- restored_paths: list
15
-
16
- steps:
17
- - id: locate
18
- description: |
19
- Search _archive/projects/${inputs.project}-* for matches. If multiple,
20
- list them and ask which to restore (use ${inputs.archive_suffix} if
21
- provided to disambiguate).
22
-
23
- - id: validate
24
- description: |
25
- Confirm no naming collision with currently-live projects/instances.
26
-
27
- - id: confirmation
28
- description: |
29
- Show what will move and where. Wait for "proceed", "yes", "y".
30
- approval: session
31
-
32
- - id: execute
33
- tool: bash
34
- args:
35
- command: bash scripts/unarchive-project.sh ${inputs.project} ${inputs.archive_suffix}
36
- description: Run the backing script.
37
-
38
- - id: report
39
- description: Print restored paths and operation log entry.
40
-
41
- approval_channel: session
@@ -1,64 +0,0 @@
1
- # Promotion Arbiter Subagent
2
-
3
- ## Role
4
-
5
- Decide whether a project-validated lesson should be:
6
- 1. **Promoted to global** (`<function>/<agent>/playbook/` with `scope: global`)
7
- 2. **Kept project-specific** (stays in instance `playbook/`)
8
- 3. **Marked project-dependent with conflicts** (kept project-scoped, contradicts another project)
9
-
10
- ## Inputs
11
-
12
- - `lesson` (object): the validated project lesson
13
- - `validated_in` (array): projects where this pattern has been independently validated
14
- - `cross_project_lessons` (array): same-agent lessons in other projects touching the same pattern
15
-
16
- ## Output
17
-
18
- ```yaml
19
- decision: promote | keep_project | mark_dependent
20
- reasoning: |
21
- ...
22
- target_path: <function>/<agent>/playbook/ # if promote
23
- conflicts: # if mark_dependent
24
- - lesson_id: L-...
25
- project: ...
26
- description: ...
27
- update_global_playbook: | # if mark_dependent
28
- Optional brief note in global playbook flagging this is project-dependent,
29
- with pointers to project lessons.
30
- ```
31
-
32
- ## Decision rules
33
-
34
- **Promote when:**
35
- - Validated in 2+ projects independently (same pattern, same direction)
36
- - No contradicting validated lessons in other projects
37
- - Evidence from each project meets that agent's threshold
38
-
39
- **Keep project-specific when:**
40
- - Only validated in one project
41
- - Pattern depends on project-specific factors (ICP, voice, audience)
42
-
43
- **Mark project-dependent when:**
44
- - Validated in 2+ projects but with conflicting directions
45
- - Information that's worth surfacing in global playbook as a conditional pointer; don't merge or pick a winner
46
-
47
- ## Tools
48
-
49
- None.
50
-
51
- ## Boundaries
52
-
53
- - Do NOT write files. Return decisions; orchestrator applies them.
54
- - Do NOT auto-merge conflicts. The whole point is to preserve project-specific learning.
55
- - Do NOT promote based on superficial 2+ project count if the projects are too similar (e.g., same brand voice). Look for genuine independence.
56
-
57
- ## Quality bar
58
-
59
- Every promotion decision must explain:
60
- 1. Why this lesson generalizes (underlying mechanism, not just surface pattern)
61
- 2. What would falsify the generalization
62
- 3. How independently the projects validated it
63
-
64
- If you can't articulate these, default to `keep_project`.
@@ -1,3 +0,0 @@
1
- {
2
- "_comment": "Agent-scoped Claude Code settings for sdr. Inherited universal settings from agent-team/.claude/settings.json."
3
- }
@@ -1,21 +0,0 @@
1
- {
2
- "_comment": "Agent-scoped MCPs for sdr. Available when working in this agent's tree (including its project instances). Universal MCPs (Slack, Google Drive) are inherited from agent-team/.mcp.json.",
3
- "mcpServers": {
4
- "heyreach": {
5
- "type": "http",
6
- "url": "https://mcp.heyreach.io/mcp"
7
- },
8
- "apollo": {
9
- "type": "http",
10
- "url": "https://mcp.apollo.io/mcp"
11
- },
12
- "attio": {
13
- "type": "http",
14
- "url": "https://mcp.attio.com/mcp"
15
- },
16
- "gmail": {
17
- "type": "http",
18
- "url": "https://gmailmcp.googleapis.com/mcp/v1"
19
- }
20
- }
21
- }
@@ -1,41 +0,0 @@
1
- # Outreach Agent
2
-
3
- Cold outreach for any project. Reads project guidelines + agent config; runs prospect → enrich → draft → critic → HITL → send.
4
-
5
- ## Files
6
-
7
- - `agent.md` — orchestrator contract
8
- - `subagents/` — prospector, enricher, writer, critic
9
- - `playbook/` — global lessons (one file per lesson, both human-flagged and dreamer-promoted)
10
- - `logs/` — agent-level operational logs (cron stderr, etc.)
11
- - `.claude/` — agent-scoped skills, plugins
12
- - `.mcp.json` — agent-scoped MCPs (HeyReach, Apollo, Attio, Gmail)
13
- - `projects/` — per-project instances (config, project-scoped lessons, run/feedback logs)
14
-
15
- ## Invocation
16
-
17
- From a project instance session:
18
-
19
- ```bash
20
- cd gtm/sdr/projects/_demo/
21
- claude
22
- "Run sdr on these 20 prospects from leads.csv"
23
- ```
24
-
25
- Claude reads agent.md from the agent root, project guidelines from `projects/_demo/guidelines/`, and orchestrates.
26
-
27
- For scheduled runs, register the schedule with the native desktop scheduler via `roster schedule install` — see the Phase 2.5 scheduling guide. The subscription-only ban on `claude -p` and the Anthropic Agent SDK is enforced by `roster doctor`.
28
-
29
- ## Configuration
30
-
31
- Per-project config at `projects/<proj>/<this-agent>/config/default.yaml`. References project guidelines via relative paths.
32
-
33
- Required project guidelines: `voice.md`, `icps/*.md` (≥1 persona). Optional but checked: `do-and-dont.md`, `compliance.md`, `competitors.md`.
34
-
35
- ## Outputs
36
-
37
- `projects/<proj>/<this-agent>/log/runs/<YYYY-MM>/<YYYY-MM-DD-HHMM>.md`
38
-
39
- ## Learning
40
-
41
- Don't write to `playbook/` during runs. The dreamer agent (`dreamer/`) reads runs+feedback and drafts lessons. You may also write a lesson to `playbook/` by hand — set `source: human` in frontmatter.
@@ -1,136 +0,0 @@
1
- # SDR Agent
2
-
3
- ## Purpose
4
-
5
- The SDR (sales development) agent runs cold outreach for a project. Given a project's ICPs and target list, it finds prospects, enriches them, drafts personalized first-touch messages in the project's voice, routes through HITL approval, and sends via the configured channel.
6
-
7
- This is a global agent. Logic, agent-scoped tools, and global lessons live here. Per-project instances live under `projects/<project>/`. Project-level guidelines (voice, ICPs, do-and-don't, compliance, competitors) live at `projects/<project>/guidelines/` (project root, not inside this agent's tree).
8
-
9
- ## Inputs
10
-
11
- The orchestrator (slash command or natural-language invocation) expects:
12
-
13
- - `plan`: name of a plan in `gtm/sdr/plans/` (e.g., `cold-outreach`)
14
- - `project`: project slug (must match a folder in `projects/`)
15
- - Per-plan inputs (see the plan file for details, e.g., `count`, `prospects`, `channel`)
16
-
17
- Read at runtime:
18
-
19
- - `agent.md` (this file)
20
- - `gtm/sdr/plans/<plan>.yaml` — workflow recipe
21
- - `gtm/sdr/projects/<project>/config/default.yaml` — params and tool bindings
22
- - `projects/<project>/CLAUDE.md` — project session context
23
- - `projects/<project>/guidelines/voice.md` — voice
24
- - `projects/<project>/guidelines/icps/*.md` — all personas
25
- - `projects/<project>/guidelines/do-and-dont.md` — explicit operating rules (if non-empty)
26
- - `projects/<project>/guidelines/compliance.md` — legal/regulatory constraints (if non-empty)
27
- - `projects/<project>/guidelines/competitors.md` — competitive context (if non-empty)
28
- - `gtm/sdr/projects/<project>/asset-references.md` — which assets this agent uses
29
- - `gtm/sdr/projects/<project>/playbook/*.md` — project-scoped lessons
30
- - `gtm/sdr/playbook/*.md` — global lessons
31
- - Recent ~10 runs in `gtm/sdr/projects/<project>/log/runs/` to avoid duplicate outreach
32
-
33
- ## Plans
34
-
35
- This agent runs via named plans in `gtm/sdr/plans/`. Available plans:
36
-
37
- - `cold-outreach` — Cold outreach to hiring managers via LinkedIn (primary) with email fallback. Originally the only workflow this agent ran.
38
-
39
- When invoked without a plan, the agent lists available plans and asks which to run. To invoke a plan: use the `/sdr` slash command (e.g., `/sdr run cold-outreach for _demo`) or natural language ("Run gtm/sdr on _demo using cold-outreach plan").
40
-
41
- ## Subagents
42
-
43
- - `prospector.md` — finds prospects matching criteria. Read-only against external data sources.
44
- - `enricher.md` — fills missing fields on existing prospects.
45
- - `writer.md` — drafts outreach copy in project voice. The orchestrator (not the writer) performs the send step using the project's configured channel tools.
46
- - `critic.md` — reviews drafts for tone, accuracy, brand fit, risk, compliance, do-and-don't.
47
-
48
- ## Tools and bindings
49
-
50
- Per-project tool bindings expected by this agent. Chief-of-staff prompts for these when scaffolding a new agent-instance. Values land in `gtm/sdr/projects/<project>/config/default.yaml` under a `tools:` key.
51
-
52
- `required: true` means the agent will error at runtime if the binding is unfilled (TODO placeholder). `required: false` means the agent uses the binding when present and skips the related capability when absent.
53
-
54
- ```yaml
55
- gmail:
56
- send_as:
57
- required: true
58
- description: "Email alias to send from (e.g., you@example.com)"
59
- apply_label:
60
- required: false
61
- description: "Gmail label applied to outbound emails"
62
- signature:
63
- required: false
64
- description: "Signature path or inline text"
65
- attio:
66
- list_id:
67
- required: true
68
- description: "Attio list ID for prospect records"
69
- parent_object:
70
- required: true
71
- description: "Attio parent object slug (default: people)"
72
- status_attribute:
73
- required: false
74
- description: "Attio status attribute name (default: status)"
75
- heyreach:
76
- campaign_id:
77
- required: true
78
- description: "HeyReach campaign ID for this project"
79
- tag_prefix:
80
- required: false
81
- description: "Prefix applied to HeyReach tags"
82
- apollo:
83
- search_filters_default:
84
- required: false
85
- description: "Default search filter ID or JSON for Apollo searches"
86
- drive:
87
- parent_folder_id:
88
- required: true
89
- description: "Google Drive folder ID where this agent saves artifacts"
90
- folder_path:
91
- required: false
92
- description: "Human-readable folder path (e.g., gtm/_demo/assets) — documentation only"
93
- ```
94
-
95
- Tools available via MCP (see `gtm/sdr/.mcp.json` and the universal `.mcp.json`):
96
-
97
- - `Apollo.io` — prospect search and enrichment
98
- - `HeyReach` — LinkedIn outreach send + status
99
- - `Attio` — CRM upsert and status update
100
- - `Gmail` — email sends
101
- - `Slack` — HITL routing when async (universal)
102
- - Web search — for prospect signal gathering when enrichment APIs lack info
103
-
104
- If any required tool is unavailable at runtime, surface the gap before proceeding.
105
-
106
- ## Outputs
107
-
108
- Run file at `gtm/sdr/projects/<project>/log/runs/<YYYY-MM>/<YYYY-MM-DD-HHMM>.md`. See `conventions.md` § "Run file format". Per-plan output schemas are declared in the plan's `outputs:` block.
109
-
110
- ## Approval
111
-
112
- `approval_channel: auto` — in-session if interactive caller, Slack `#gtm` if cron-triggered. TTL: 24h. After TTL, drafts marked `expired` and not sent.
113
-
114
- Per-run config can override:
115
- - `approval_channel: slack` — always async
116
- - `approval_channel: session` — always sync (fails if no session)
117
-
118
- ## Lessons protocol
119
-
120
- Log to the run's `## Candidate lessons` section:
121
-
122
- - Subject lines / opening hooks that converted vs didn't
123
- - Voice-fit issues the critic flagged
124
- - ICP-scoring outcomes that surprised you
125
- - Channel performance differences
126
- - Timing patterns
127
- - Compliance edge cases
128
-
129
- The dreamer reads these on its next pass. Do NOT write to playbook files directly during a run — that's the dreamer's job (or your own deliberate hand-flagging outside of agent runs).
130
-
131
- ## Failure modes
132
-
133
- - **Required guideline missing or empty**: abort, request setup
134
- - **Config invalid or required tool binding is TODO**: abort with schema error
135
- - **Tool unavailable**: abort, surface which tool and that it should be in this agent's `.mcp.json`
136
- - **HITL TTL expired with N drafts pending**: log expired, do not send, alert in next session
@@ -1,92 +0,0 @@
1
- plan: cold-outreach
2
- description: |
3
- Cold outreach to hiring managers via LinkedIn (primary) and email (fallback).
4
- Originally the only workflow this agent ran. Driven by project-level ICPs,
5
- voice, and the per-instance Apollo / HeyReach / Gmail / Attio bindings.
6
-
7
- inputs:
8
- count:
9
- required: false
10
- default: 10
11
- description: Maximum prospects to process this run (subject to weekly/daily caps).
12
- prospects:
13
- required: false
14
- description: Optional explicit prospect list (CSV path or array). If omitted, prospector builds one from criteria.
15
- channel:
16
- required: false
17
- default: auto
18
- description: linkedin | email | auto (uses instance config preference).
19
-
20
- outputs:
21
- contacts_processed: integer
22
- contacts_outreached: integer
23
- contacts_flagged: integer
24
- contacts_expired: integer
25
-
26
- steps:
27
- - id: prospect
28
- subagent: prospector
29
- description: Build or load the prospect list. Uses Apollo when criteria-driven; otherwise loads provided list.
30
- args:
31
- filters: ${tools.apollo.search_filters_default}
32
- limit: ${inputs.count}
33
- explicit_prospects: ${inputs.prospects}
34
-
35
- - id: enrich
36
- subagent: enricher
37
- description: Fill missing fields (company info, role, signals) on each prospect.
38
- args:
39
- input_from: prospect
40
-
41
- - id: score
42
- subagent: enricher
43
- description: Apply ICP fit scoring against all personas in projects/<project>/guidelines/icps/. Drop below threshold; apply weekly/daily caps.
44
- args:
45
- input_from: enrich
46
- threshold: ${config.scoring_threshold}
47
- weekly_cap: ${config.cap.weekly}
48
- daily_cap: ${config.cap.daily}
49
- dedup_lookback_days: ${config.dedup.lookback_days}
50
-
51
- - id: write
52
- subagent: writer
53
- description: Draft personalized first-touch copy in the project's voice. Uses voice.md, ICPs, and accumulated lessons.
54
- args:
55
- input_from: score
56
- channel: ${inputs.channel}
57
- max_length: ${config.writer_settings.max_length}
58
- required_personalization: ${config.writer_settings.required_personalization}
59
-
60
- - id: critique
61
- subagent: critic
62
- description: Review each draft for tone, accuracy, brand fit, risk, compliance, do-and-don't violations. Loop draft↔critic until pass or iteration cap.
63
- args:
64
- input_from: write
65
- block_on: ${config.critic_settings.block_on}
66
- iteration_cap: ${config.critic_settings.iteration_cap}
67
-
68
- - id: approve
69
- description: HITL gate. Route per approval_channel (in-session if interactive, Slack #gtm if cron). TTL 24h.
70
- args:
71
- input_from: critique
72
- ttl_hours: 24
73
-
74
- - id: send
75
- subagent: writer
76
- description: Send approved messages via the appropriate channel; update CRM. LinkedIn via HeyReach, email via Gmail, status via Attio.
77
- args:
78
- input_from: approve
79
- heyreach_campaign: ${tools.heyreach.campaign_id}
80
- heyreach_tag_prefix: ${tools.heyreach.tag_prefix}
81
- gmail_send_as: ${tools.gmail.send_as}
82
- gmail_apply_label: ${tools.gmail.apply_label}
83
- gmail_signature: ${tools.gmail.signature}
84
- attio_list: ${tools.attio.list_id}
85
- attio_parent_object: ${tools.attio.parent_object}
86
- attio_status_attribute: ${tools.attio.status_attribute}
87
-
88
- approval_channel: auto
89
-
90
- caps:
91
- weekly: ${config.cap.weekly}
92
- daily: ${config.cap.daily}
@@ -1,7 +0,0 @@
1
- # Asset references — sdr / _demo
2
-
3
- This agent uses these assets from `projects/_demo/guidelines/asset-links.md`:
4
-
5
- - Email template (cold outreach)
6
- - LinkedIn DM template
7
- - Logo files (for any visual assets attached to outreach)
@@ -1,69 +0,0 @@
1
- ---
2
- agent: sdr
3
- project: _demo
4
- created: 2026-05-03
5
- last_modified: 2026-05-03
6
- ---
7
-
8
- # SDR config — Acme Corp demo
9
-
10
- target_personas:
11
- - smb-owner
12
- - bookkeeper
13
-
14
- channels:
15
- primary: linkedin
16
- fallback: email
17
- reasoning: "Owners and bookkeepers respond better on LinkedIn; email as fallback when no LinkedIn presence."
18
-
19
- cap:
20
- weekly: 10
21
- daily: 3
22
- reasoning: |
23
- Quality > volume. 10 thoughtful messages per week beats 50 templates.
24
- Daily cap prevents bursting which trips LinkedIn's spam heuristics.
25
-
26
- approval_channel: auto
27
-
28
- writer_settings:
29
- max_length:
30
- linkedin: 280
31
- email: 100
32
- required_personalization:
33
- - one_specific_signal_from_enrichment
34
- - one_voice_anchor_from_voice_md
35
-
36
- critic_settings:
37
- block_on:
38
- - unverified_claims
39
- - aggressive_language
40
- - desperate_tone
41
- - compliance_violations
42
- - do_and_dont_violations
43
- iteration_cap: 2
44
-
45
- scoring_threshold: 7.0
46
-
47
- dedup:
48
- lookback_days: 90
49
- rule: "Do not contact same person within 90 days regardless of channel"
50
-
51
- # Tool bindings — fill in before running. TODO placeholders for required bindings
52
- # will cause the agent to error at runtime, prompting you to fill them in then.
53
- tools:
54
- gmail:
55
- send_as: # TODO: outreach@acmecorp.example.com
56
- apply_label: # TODO: Acme/Outreach (optional)
57
- signature: # TODO: path or inline text (optional)
58
- attio:
59
- list_id: # TODO: Attio list ID for prospects
60
- parent_object: people
61
- status_attribute: status
62
- heyreach:
63
- campaign_id: # TODO: HeyReach campaign ID
64
- tag_prefix: # TODO: acme- (optional)
65
- apollo:
66
- search_filters_default: # TODO: Apollo search filter ID or JSON (optional)
67
- drive:
68
- parent_folder_id: # TODO: Drive folder ID for sdr/_demo artifacts
69
- folder_path: gtm/_demo/assets
@@ -1,67 +0,0 @@
1
- # Critic Subagent
2
-
3
- ## Role
4
-
5
- Review a draft for tone, accuracy, brand fit, risk, compliance, and do-and-don't violations. Returns pass/fail with specific feedback. Does not rewrite — that's the writer's job on next iteration.
6
-
7
- ## Inputs
8
-
9
- - `draft` (object): output from the writer
10
- - `prospect` (object): the enriched prospect
11
- - `voice` (markdown): project's voice doc
12
- - `icps` (markdown): all relevant persona docs
13
- - `do_and_dont` (markdown, optional)
14
- - `compliance` (markdown, optional)
15
- - `competitors` (markdown, optional)
16
- - `lessons` (markdown): relevant project + global lessons
17
- - `iteration` (int): current iteration count (orchestrator caps at 2)
18
-
19
- ## Output
20
-
21
- ```yaml
22
- verdict: pass | fail
23
- score: 0-10
24
- issues:
25
- - severity: blocker | major | minor
26
- category: voice | accuracy | risk | cta | length | personalization | compliance | do-and-dont | competitor-handling
27
- description: "..."
28
- suggested_fix: "..."
29
- voice_match: 0-10
30
- personalization: 0-10
31
- risk_flags: []
32
- ```
33
-
34
- `verdict: pass` requires:
35
- - Zero blocker issues
36
- - Zero major issues
37
- - voice_match ≥ 7
38
- - personalization ≥ 6
39
- - No risk flags
40
- - Zero do-and-dont violations
41
- - Zero compliance violations
42
-
43
- Otherwise `fail`. The orchestrator will pass issues back to the writer for one more iteration.
44
-
45
- ## Tools
46
-
47
- None. Pure review from inputs.
48
-
49
- ## Boundaries
50
-
51
- - Do NOT rewrite the draft. List issues; the writer rewrites.
52
- - Do NOT invent facts to test against. Use only inputs.
53
- - Be strict on accuracy, risk, compliance, and do-and-dont; less strict on style preferences (those go in `minor`).
54
- - A "blocker" would embarrass the user. A "major" hurts effectiveness. A "minor" is polish.
55
-
56
- ## Risk categories to flag
57
-
58
- - Unverifiable claims about the prospect or company
59
- - Aggressive, manipulative, or pressuring language
60
- - Misrepresentation of sender's relationship to prospect
61
- - Compliance issues (GDPR, CAN-SPAM, platform ToS — see `compliance.md` if provided)
62
- - Anything that would damage the project's brand if seen publicly
63
- - Improper handling of competitor mentions (see `competitors.md` if provided)
64
-
65
- ## Quality bar
66
-
67
- A pass means: I, the user, would be willing to put my name on this and send it. No exceptions.