@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.
- package/README.md +79 -219
- package/agents/lesson-drafter.md +3 -8
- package/agents/pattern-detector.md +0 -1
- package/bin/roster.js +1407 -217
- package/package.json +2 -3
- package/skills/chief-of-staff/SKILL.md +62 -78
- package/skills/dreamer/SKILL.md +8 -7
- package/skills/roster-orchestrator/SKILL.md +53 -25
- package/templates/CLAUDE.project.template.md +1 -1
- package/templates/CONTEXT.template.md +2 -2
- package/templates/gitignore-defaults.txt +2 -0
- package/templates/scaffold/chief-of-staff/README.md +16 -24
- package/templates/scaffold/chief-of-staff/agent.md +22 -32
- package/templates/scaffold/chief-of-staff/plans/audit-agent.yaml +4 -4
- package/templates/scaffold/chief-of-staff/plans/audit-repo.yaml +5 -4
- package/templates/scaffold/chief-of-staff/plans/create-agent.yaml +5 -34
- package/templates/scaffold/config/project.yaml.template +10 -0
- package/templates/scaffold/conventions.md +159 -171
- package/templates/scaffold/dreamer/README.md +2 -2
- package/templates/scaffold/dreamer/agent.md +0 -1
- package/templates/scaffold/dreamer/plans/nightly-reflection.yaml +23 -37
- package/templates/scaffold/dreamer/subagents/lesson-drafter.md +2 -7
- package/templates/scaffold/{projects/_demo/guidelines → guidelines}/asset-links.md +4 -0
- package/templates/scaffold/{projects/_demo/guidelines → guidelines}/brand-book.md +4 -0
- package/templates/scaffold/{projects/_demo/guidelines → guidelines}/messaging.md +4 -0
- package/templates/scaffold/{projects/_demo/guidelines → guidelines}/voice.md +4 -0
- package/templates/scaffold/scripts/audit-agent.sh +74 -47
- package/templates/scaffold/scripts/audit-repo.sh +27 -49
- package/templates/scaffold/scripts/create-function.sh +1 -1
- package/templates/scaffold/scripts/lib/README.md +1 -1
- package/templates/scaffold/scripts/lib/bindings-prompt.sh +43 -124
- package/templates/scaffold/scripts/new-agent.sh +99 -91
- package/templates/scaffold/scripts/rename-agent.sh +91 -0
- package/templates/scaffold/scripts/save-state.sh +32 -0
- package/agents/critic.md +0 -74
- package/agents/enricher.md +0 -56
- package/agents/promotion-arbiter.md +0 -71
- package/agents/prospector.md +0 -51
- package/agents/writer.md +0 -58
- package/skills/sdr/SKILL.md +0 -147
- package/templates/scaffold/chief-of-staff/plans/add-agent-to-project.yaml +0 -45
- package/templates/scaffold/chief-of-staff/plans/archive-project.yaml +0 -51
- package/templates/scaffold/chief-of-staff/plans/audit-project.yaml +0 -34
- package/templates/scaffold/chief-of-staff/plans/create-project.yaml +0 -65
- package/templates/scaffold/chief-of-staff/plans/remove-agent-from-project.yaml +0 -50
- package/templates/scaffold/chief-of-staff/plans/rename-project.yaml +0 -62
- package/templates/scaffold/chief-of-staff/plans/unarchive-project.yaml +0 -41
- package/templates/scaffold/dreamer/subagents/promotion-arbiter.md +0 -64
- package/templates/scaffold/gtm/sdr/.claude/settings.json +0 -3
- package/templates/scaffold/gtm/sdr/.mcp.json +0 -21
- package/templates/scaffold/gtm/sdr/README.md +0 -41
- package/templates/scaffold/gtm/sdr/agent.md +0 -136
- package/templates/scaffold/gtm/sdr/plans/cold-outreach.yaml +0 -92
- package/templates/scaffold/gtm/sdr/projects/_demo/asset-references.md +0 -7
- package/templates/scaffold/gtm/sdr/projects/_demo/config/default.yaml +0 -69
- package/templates/scaffold/gtm/sdr/projects/_demo/log/feedback/.gitkeep +0 -0
- package/templates/scaffold/gtm/sdr/projects/_demo/log/runs/.gitkeep +0 -0
- package/templates/scaffold/gtm/sdr/projects/_demo/playbook/.gitkeep +0 -0
- package/templates/scaffold/gtm/sdr/subagents/critic.md +0 -67
- package/templates/scaffold/gtm/sdr/subagents/enricher.md +0 -49
- package/templates/scaffold/gtm/sdr/subagents/prospector.md +0 -44
- package/templates/scaffold/gtm/sdr/subagents/writer.md +0 -51
- package/templates/scaffold/projects/_demo/CLAUDE.md +0 -35
- package/templates/scaffold/projects/_demo/README.md +0 -16
- package/templates/scaffold/projects/_demo/assets/.gitkeep +0 -0
- package/templates/scaffold/projects/_demo/config/default.yaml +0 -28
- package/templates/scaffold/projects/_demo/state.md +0 -11
- package/templates/scaffold/scripts/archive-project.sh +0 -98
- package/templates/scaffold/scripts/audit-project.sh +0 -361
- package/templates/scaffold/scripts/new-agent-instance.sh +0 -114
- package/templates/scaffold/scripts/new-project.sh +0 -125
- package/templates/scaffold/scripts/remove-agent-from-project.sh +0 -67
- package/templates/scaffold/scripts/rename-project.sh +0 -118
- package/templates/scaffold/scripts/unarchive-project.sh +0 -115
- /package/templates/scaffold/gtm/{sdr/playbook/.gitkeep → .gitkeep} +0 -0
- /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,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,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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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.
|