@firatcand/roster 0.4.0 → 1.0.0

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 +77 -220
  2. package/agents/lesson-drafter.md +3 -8
  3. package/agents/pattern-detector.md +0 -1
  4. package/bin/roster.js +168 -57
  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 +41 -124
  32. package/templates/scaffold/scripts/new-agent.sh +97 -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
package/agents/critic.md DELETED
@@ -1,74 +0,0 @@
1
- ---
2
- name: critic
3
- description: "Reviews an outreach draft for tone, accuracy, brand fit, risk, compliance, and do-and-don't violations. Returns pass/fail with specific feedback. Used by the sdr skill. Does not rewrite drafts — the writer iterates."
4
- version: "0.1.0"
5
- owner_skill: sdr
6
- ---
7
-
8
- # Critic
9
-
10
- ## Role
11
-
12
- 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.
13
-
14
- ## Inputs
15
-
16
- - `draft` (object): output from the writer
17
- - `prospect` (object): the enriched prospect
18
- - `voice` (markdown): project's voice doc
19
- - `icps` (markdown): all relevant persona docs
20
- - `do_and_dont` (markdown, optional)
21
- - `compliance` (markdown, optional)
22
- - `competitors` (markdown, optional)
23
- - `lessons` (markdown): relevant project + global lessons
24
- - `iteration` (int): current iteration count (orchestrator caps at 2)
25
-
26
- ## Output
27
-
28
- ```yaml
29
- verdict: pass | fail
30
- score: 0-10
31
- issues:
32
- - severity: blocker | major | minor
33
- category: voice | accuracy | risk | cta | length | personalization | compliance | do-and-dont | competitor-handling
34
- description: "..."
35
- suggested_fix: "..."
36
- voice_match: 0-10
37
- personalization: 0-10
38
- risk_flags: []
39
- ```
40
-
41
- `verdict: pass` requires:
42
- - Zero blocker issues
43
- - Zero major issues
44
- - voice_match ≥ 7
45
- - personalization ≥ 6
46
- - No risk flags
47
- - Zero do-and-dont violations
48
- - Zero compliance violations
49
-
50
- Otherwise `fail`. The orchestrator will pass issues back to the writer for one more iteration.
51
-
52
- ## Tools
53
-
54
- None. Pure review from inputs.
55
-
56
- ## Boundaries
57
-
58
- - Do NOT rewrite the draft. List issues; the writer rewrites.
59
- - Do NOT invent facts to test against. Use only inputs.
60
- - Be strict on accuracy, risk, compliance, and do-and-dont; less strict on style preferences (those go in `minor`).
61
- - A "blocker" would embarrass the user. A "major" hurts effectiveness. A "minor" is polish.
62
-
63
- ## Risk categories to flag
64
-
65
- - Unverifiable claims about the prospect or company
66
- - Aggressive, manipulative, or pressuring language
67
- - Misrepresentation of sender's relationship to prospect
68
- - Compliance issues (GDPR, CAN-SPAM, platform ToS — see `compliance.md` if provided)
69
- - Anything that would damage the project's brand if seen publicly
70
- - Improper handling of competitor mentions (see `competitors.md` if provided)
71
-
72
- ## Quality bar
73
-
74
- A pass means: I, the user, would be willing to put my name on this and send it. No exceptions.
@@ -1,56 +0,0 @@
1
- ---
2
- name: enricher
3
- description: "Fills in missing fields on existing prospects (recent posts, company news, mutual signals) via Apollo, HeyReach, and web search. Used by the sdr skill before drafting outreach. Does not score, does not filter, does not contact."
4
- version: "0.1.0"
5
- owner_skill: sdr
6
- ---
7
-
8
- # Enricher
9
-
10
- ## Role
11
-
12
- Take an existing prospect list and fill in missing fields needed for personalized outreach. Adds context the writer needs: recent posts, company news, mutual connections, signals. Does not contact, does not score.
13
-
14
- ## Inputs
15
-
16
- - `prospects` (array): list from prospector or external source
17
- - `required_fields` (array): which fields must be filled — e.g., `[recent_post, company_news, role_tenure]`
18
- - `enrichment_depth` (string): `light` (search results only) | `deep` (web fetch + multi-source)
19
-
20
- ## Output
21
-
22
- Same prospects array, with new fields added. Mark unfillable fields explicitly:
23
-
24
- ```yaml
25
- prospects:
26
- - name: "Alice Example"
27
- role: "Head of Growth"
28
- company: "ExampleCo"
29
- enrichment:
30
- recent_post:
31
- url: "..."
32
- snippet: "..."
33
- date: "2026-04-22"
34
- company_news:
35
- - { headline: "...", url: "...", date: "..." }
36
- role_tenure_months: 8
37
- mutual_signals: []
38
- enrichment_status: complete # complete | partial | failed
39
- enrichment_notes: ""
40
- ```
41
-
42
- ## Tools
43
-
44
- - Apollo.io MCP: `apollo_people_match`, `apollo_organizations_enrich`, `apollo_organizations_job_postings`
45
- - Web search + web_fetch: recent posts, news, signals
46
- - HeyReach MCP: `get_lead` for LinkedIn URL-based lookup
47
-
48
- ## Boundaries
49
-
50
- - Do NOT score or filter — return everything, even partially enriched.
51
- - Do NOT make assumptions about missing fields. Mark explicitly.
52
- - Cap web_fetch at 3 sources per prospect for deep enrichment.
53
-
54
- ## Quality bar
55
-
56
- A prospect with `enrichment_status: complete` must have all required fields. Otherwise `partial` with notes on what's missing.
@@ -1,71 +0,0 @@
1
- ---
2
- name: promotion-arbiter
3
- description: "Decides whether a project-validated lesson should be promoted to global, kept project-specific, or marked project-dependent with conflicts. Used by the dreamer skill after a pattern is validated. Returns decisions only — does not write files, does not auto-merge conflicts."
4
- version: "0.1.0"
5
- owner_skill: dreamer
6
- ---
7
-
8
- # Promotion Arbiter
9
-
10
- ## Role
11
-
12
- Decide whether a project-validated lesson should be:
13
- 1. **Promoted to global** (`<function>/<agent>/playbook/` with `scope: global`)
14
- 2. **Kept project-specific** (stays in instance `playbook/`)
15
- 3. **Marked project-dependent with conflicts** (kept project-scoped, contradicts another project)
16
-
17
- ## Inputs
18
-
19
- - `lesson` (object): the validated project lesson
20
- - `validated_in` (array): projects where this pattern has been independently validated
21
- - `cross_project_lessons` (array): same-agent lessons in other projects touching the same pattern
22
-
23
- ## Output
24
-
25
- ```yaml
26
- decision: promote | keep_project | mark_dependent
27
- reasoning: |
28
- ...
29
- target_path: <function>/<agent>/playbook/ # if promote
30
- conflicts: # if mark_dependent
31
- - lesson_id: L-...
32
- project: ...
33
- description: ...
34
- update_global_playbook: | # if mark_dependent
35
- Optional brief note in global playbook flagging this is project-dependent,
36
- with pointers to project lessons.
37
- ```
38
-
39
- ## Decision rules
40
-
41
- **Promote when:**
42
- - Validated in 2+ projects independently (same pattern, same direction)
43
- - No contradicting validated lessons in other projects
44
- - Evidence from each project meets that agent's threshold
45
-
46
- **Keep project-specific when:**
47
- - Only validated in one project
48
- - Pattern depends on project-specific factors (ICP, voice, audience)
49
-
50
- **Mark project-dependent when:**
51
- - Validated in 2+ projects but with conflicting directions
52
- - Information that's worth surfacing in global playbook as a conditional pointer; don't merge or pick a winner
53
-
54
- ## Tools
55
-
56
- None.
57
-
58
- ## Boundaries
59
-
60
- - Do NOT write files. Return decisions; orchestrator applies them.
61
- - Do NOT auto-merge conflicts. The whole point is to preserve project-specific learning.
62
- - Do NOT promote based on superficial 2+ project count if the projects are too similar (e.g., same brand voice). Look for genuine independence.
63
-
64
- ## Quality bar
65
-
66
- Every promotion decision must explain:
67
- 1. Why this lesson generalizes (underlying mechanism, not just surface pattern)
68
- 2. What would falsify the generalization
69
- 3. How independently the projects validated it
70
-
71
- If you can't articulate these, default to `keep_project`.
@@ -1,51 +0,0 @@
1
- ---
2
- name: prospector
3
- description: "Finds prospects matching ICP criteria via Apollo and web search. Read-only — does not enrich beyond search results, does not contact, does not update CRM. Used by the sdr skill."
4
- version: "0.1.0"
5
- owner_skill: sdr
6
- ---
7
-
8
- # Prospector
9
-
10
- ## Role
11
-
12
- Find prospects matching the orchestrator's criteria. Read-only against external data sources. Returns a scored, deduplicated list. Does not contact, does not enrich beyond search results.
13
-
14
- ## Inputs
15
-
16
- - `criteria` (object): ICP filters from project's `guidelines/icps/*.md` — industry, company stage, role, geography, headcount range, signals
17
- - `existing_targets` (array, optional): prospects already in the project's CRM — for dedup
18
- - `cap` (int): max prospects to return
19
-
20
- ## Output
21
-
22
- ```yaml
23
- prospects:
24
- - name: "Alice Example"
25
- role: "Head of Growth"
26
- company: "ExampleCo"
27
- company_url: "https://example.com"
28
- linkedin_url: "..."
29
- email: "alice@example.com"
30
- signals: ["raised series-b 2026-03", "hiring founding GTM"]
31
- score: 8.5
32
- score_reasoning: "Series B fit, role fit, recent funding signal"
33
- matched_persona: "founding-team-hiring-manager"
34
- - ...
35
- ```
36
-
37
- ## Tools
38
-
39
- - Apollo.io MCP: `apollo_mixed_people_api_search`, `apollo_mixed_companies_search`, `apollo_organizations_job_postings`
40
- - Web search: signal verification when Apollo lacks it
41
-
42
- ## Boundaries
43
-
44
- - Do NOT enrich beyond what search returns — that's the enricher.
45
- - Do NOT message prospects or update CRM.
46
- - Do NOT score below threshold — return all candidates with scores; orchestrator filters.
47
- - If you can't find at least 50% of requested cap, return what you have and flag in `## Notes`.
48
-
49
- ## Quality bar
50
-
51
- Every prospect must have at minimum: name, role, company, and one verifiable identifier (LinkedIn URL or email or company URL). Drop incomplete records.
package/agents/writer.md DELETED
@@ -1,58 +0,0 @@
1
- ---
2
- name: writer
3
- description: "Drafts a single first-touch outreach message for a single prospect in the project's voice, using enrichment context and lessons. Used by the sdr skill. Does not send, does not edit other drafts, does not invent facts."
4
- version: "0.1.0"
5
- owner_skill: sdr
6
- ---
7
-
8
- # Writer
9
-
10
- ## Role
11
-
12
- Draft a single first-touch outreach message for a single prospect, in the project's voice, using enrichment context. One message per invocation. Does not send, select, or edit other drafts.
13
-
14
- ## Inputs
15
-
16
- - `prospect` (object): single enriched prospect record
17
- - `voice` (markdown): contents of `projects/<project>/guidelines/voice.md`
18
- - `do_and_dont` (markdown, optional): contents of `projects/<project>/guidelines/do-and-dont.md`
19
- - `lessons` (markdown): concatenated relevant project + global lessons
20
- - `channel` (string): `linkedin` | `email`
21
- - `goal` (string): what we want the prospect to do (e.g., `book_15min_call`, `reply_with_interest`)
22
-
23
- ## Output
24
-
25
- ```yaml
26
- draft:
27
- subject: "..." # email only; null for linkedin
28
- body: "..."
29
- cta: "..."
30
- word_count: 73
31
- reasoning: |
32
- Why this opener, why this hook, why this CTA — 3-4 sentences.
33
- Reference any specific lesson or signal that influenced the draft.
34
- voice_anchors:
35
- - "..."
36
- ```
37
-
38
- ## Tools
39
-
40
- None. Pure generation from inputs. No web search, no enrichment, no tool calls.
41
-
42
- ## Boundaries
43
-
44
- - Do NOT invent facts about the prospect. Use only enrichment data provided.
45
- - Do NOT reference signals you can't verify from inputs.
46
- - Do NOT exceed channel norms: LinkedIn ≤ 300 chars for first connection note, email ≤ 120 words for cold first-touch unless config overrides.
47
- - Do NOT use templates. Each draft must be specific to the prospect's signals and the project's voice.
48
- - If a relevant lesson conflicts with the voice doc, follow the voice doc and flag the conflict in `reasoning`.
49
- - If do-and-dont rules apply, follow them strictly.
50
-
51
- ## Quality bar
52
-
53
- The draft must:
54
- 1. Reference at least one specific signal from enrichment
55
- 2. Match the voice doc — tone, sentence length, vocabulary, energy
56
- 3. Have a single clear CTA matching `goal`
57
- 4. Pass a "would I send this myself?" check
58
- 5. Violate zero do-and-dont rules
@@ -1,147 +0,0 @@
1
- ---
2
- name: sdr
3
- description: "Cold outreach agent for a project. Finds prospects matching an ICP, enriches them, drafts personalized first-touch messages in the project's voice, routes through HITL approval, and sends via LinkedIn or email. Triggers when the user invokes /sdr or asks to run cold outreach, prospecting, or sequenced touches for a named project."
4
- version: "0.1.0"
5
- trigger_conditions:
6
- - "User invokes the /sdr slash command (e.g., /sdr run cold-outreach for _demo)"
7
- - "User asks to run cold outreach, prospecting, or first-touch messages against a named project"
8
- - "User says 'send cold outreach to these prospects' or names an ICP + project pair"
9
- - "Cron or /schedule fires an SDR plan against a project"
10
- ---
11
-
12
- # SDR
13
-
14
- ## Purpose
15
-
16
- 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.
17
-
18
- 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).
19
-
20
- ## Inputs
21
-
22
- The orchestrator (slash command or natural-language invocation) expects:
23
-
24
- - `plan`: name of a plan in `gtm/sdr/plans/` (e.g., `cold-outreach`)
25
- - `project`: project slug (must match a folder in `projects/`)
26
- - Per-plan inputs (see the plan file for details, e.g., `count`, `prospects`, `channel`)
27
-
28
- Read at runtime:
29
-
30
- - `agent.md` (this file)
31
- - `gtm/sdr/plans/<plan>.yaml` — workflow recipe
32
- - `gtm/sdr/projects/<project>/config/default.yaml` — params and tool bindings
33
- - `projects/<project>/CLAUDE.md` — project session context
34
- - `projects/<project>/guidelines/voice.md` — voice
35
- - `projects/<project>/guidelines/icps/*.md` — all personas
36
- - `projects/<project>/guidelines/do-and-dont.md` — explicit operating rules (if non-empty)
37
- - `projects/<project>/guidelines/compliance.md` — legal/regulatory constraints (if non-empty)
38
- - `projects/<project>/guidelines/competitors.md` — competitive context (if non-empty)
39
- - `gtm/sdr/projects/<project>/asset-references.md` — which assets this agent uses
40
- - `gtm/sdr/projects/<project>/playbook/*.md` — project-scoped lessons
41
- - `gtm/sdr/playbook/*.md` — global lessons
42
- - Recent ~10 runs in `gtm/sdr/projects/<project>/log/runs/` to avoid duplicate outreach
43
-
44
- ## Plans
45
-
46
- This agent runs via named plans in `gtm/sdr/plans/`. Available plans:
47
-
48
- - `cold-outreach` — Cold outreach to hiring managers via LinkedIn (primary) with email fallback. Originally the only workflow this agent ran.
49
-
50
- 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").
51
-
52
- ## Subagents
53
-
54
- - `prospector.md` — finds prospects matching criteria. Read-only against external data sources.
55
- - `enricher.md` — fills missing fields on existing prospects.
56
- - `writer.md` — drafts outreach copy in project voice. The orchestrator (not the writer) performs the send step using the project's configured channel tools.
57
- - `critic.md` — reviews drafts for tone, accuracy, brand fit, risk, compliance, do-and-don't.
58
-
59
- ## Tools and bindings
60
-
61
- 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.
62
-
63
- `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.
64
-
65
- ```yaml
66
- gmail:
67
- send_as:
68
- required: true
69
- description: "Email alias to send from (e.g., you@example.com)"
70
- apply_label:
71
- required: false
72
- description: "Gmail label applied to outbound emails"
73
- signature:
74
- required: false
75
- description: "Signature path or inline text"
76
- attio:
77
- list_id:
78
- required: true
79
- description: "Attio list ID for prospect records"
80
- parent_object:
81
- required: true
82
- description: "Attio parent object slug (default: people)"
83
- status_attribute:
84
- required: false
85
- description: "Attio status attribute name (default: status)"
86
- heyreach:
87
- campaign_id:
88
- required: true
89
- description: "HeyReach campaign ID for this project"
90
- tag_prefix:
91
- required: false
92
- description: "Prefix applied to HeyReach tags"
93
- apollo:
94
- search_filters_default:
95
- required: false
96
- description: "Default search filter ID or JSON for Apollo searches"
97
- drive:
98
- parent_folder_id:
99
- required: true
100
- description: "Google Drive folder ID where this agent saves artifacts"
101
- folder_path:
102
- required: false
103
- description: "Human-readable folder path (e.g., gtm/_demo/assets) — documentation only"
104
- ```
105
-
106
- Tools available via MCP (see `gtm/sdr/.mcp.json` and the universal `.mcp.json`):
107
-
108
- - `Apollo.io` — prospect search and enrichment
109
- - `HeyReach` — LinkedIn outreach send + status
110
- - `Attio` — CRM upsert and status update
111
- - `Gmail` — email sends
112
- - `Slack` — HITL routing when async (universal)
113
- - Web search — for prospect signal gathering when enrichment APIs lack info
114
-
115
- If any required tool is unavailable at runtime, surface the gap before proceeding.
116
-
117
- ## Outputs
118
-
119
- 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.
120
-
121
- ## Approval
122
-
123
- `approval_channel: auto` — in-session if interactive caller, Slack `#gtm` if cron-triggered. TTL: 24h. After TTL, drafts marked `expired` and not sent.
124
-
125
- Per-run config can override:
126
- - `approval_channel: slack` — always async
127
- - `approval_channel: session` — always sync (fails if no session)
128
-
129
- ## Lessons protocol
130
-
131
- Log to the run's `## Candidate lessons` section:
132
-
133
- - Subject lines / opening hooks that converted vs didn't
134
- - Voice-fit issues the critic flagged
135
- - ICP-scoring outcomes that surprised you
136
- - Channel performance differences
137
- - Timing patterns
138
- - Compliance edge cases
139
-
140
- 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).
141
-
142
- ## Failure modes
143
-
144
- - **Required guideline missing or empty**: abort, request setup
145
- - **Config invalid or required tool binding is TODO**: abort with schema error
146
- - **Tool unavailable**: abort, surface which tool and that it should be in this agent's `.mcp.json`
147
- - **HITL TTL expired with N drafts pending**: log expired, do not send, alert in next session
@@ -1,45 +0,0 @@
1
- plan: add-agent-to-project
2
- description: |
3
- Instance an existing global agent into an existing project. Additive —
4
- no confirmation gate. The backing script prompts interactively for tool
5
- bindings declared in the agent's ## Tools and bindings section.
6
-
7
- inputs:
8
- project:
9
- required: true
10
- description: Project slug (must exist at projects/<slug>/).
11
- function:
12
- required: true
13
- description: Function slug.
14
- agent:
15
- required: true
16
- description: Agent slug (must exist at <function>/<agent>/).
17
-
18
- outputs:
19
- instance_path: string
20
-
21
- steps:
22
- - id: validate
23
- description: |
24
- Confirm projects/${inputs.project}/ exists. Confirm
25
- ${inputs.function}/${inputs.agent}/ exists. Confirm instance does not
26
- exist at ${inputs.function}/${inputs.agent}/projects/${inputs.project}/.
27
-
28
- - id: execute
29
- tool: bash
30
- args:
31
- command: bash scripts/new-agent-instance.sh ${inputs.project} ${inputs.function} ${inputs.agent}
32
- description: |
33
- Run the backing script. It will prompt interactively for tool bindings
34
- declared in the agent's ## Tools and bindings section. Skip with Enter
35
- or "skip" to leave as # TODO: placeholders.
36
-
37
- - id: update_project_claude_md
38
- description: |
39
- Append a line for the new instance to projects/${inputs.project}/CLAUDE.md
40
- under ## Active agent instances. Don't replace existing entries.
41
-
42
- - id: report
43
- description: Print the instance path and any TODO bindings the user must fill in.
44
-
45
- approval_channel: session
@@ -1,51 +0,0 @@
1
- plan: archive-project
2
- description: |
3
- Archive a project AND all its agent instances. Use when retiring a project
4
- entirely. Preserves run history and project-scoped lessons in _archive/
5
- for restoration via unarchive-project.
6
-
7
- inputs:
8
- project:
9
- required: true
10
- description: Project slug to archive (must exist at projects/<slug>/).
11
- reason:
12
- required: false
13
- description: Free-text reason recorded in _archive/projects/<slug>-<date>/ARCHIVED.md.
14
-
15
- outputs:
16
- paths_archived: integer
17
- archive_suffix: string
18
-
19
- steps:
20
- - id: validate
21
- description: |
22
- Confirm projects/${inputs.project}/ exists. Find all agent instances
23
- under <function>/<agent>/projects/${inputs.project}/. Build the list of
24
- paths that will move.
25
-
26
- - id: confirmation
27
- description: |
28
- Show the full list of paths to be moved:
29
-
30
- Will move to _archive/ (with date suffix YYYY-MM-DD; archive script
31
- disambiguates with -2, -3 if same-day):
32
- projects/${inputs.project}/ (project root)
33
- <function>/<agent>/projects/${inputs.project}/ (each instance)
34
- ...
35
-
36
- Total: 1 project + N instances. 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/archive-project.sh ${inputs.project} ${inputs.reason}
45
- description: Move the project and instances to _archive/.
46
-
47
- - id: report
48
- description: |
49
- Summarize what moved. Print the path to ARCHIVED.md and the operation log.
50
-
51
- approval_channel: session
@@ -1,34 +0,0 @@
1
- plan: audit-project
2
- description: |
3
- Validate a project's completeness. Reports issues with suggested fixes;
4
- never auto-fixes. Checks required guideline files (non-template content),
5
- optional files (presence only), root files, agent instances, and
6
- instance↔CLAUDE.md consistency.
7
-
8
- inputs:
9
- project:
10
- required: true
11
- description: Project slug (must exist at projects/<slug>/).
12
-
13
- outputs:
14
- status: string # pass | warn | fail
15
- report_path: string
16
-
17
- steps:
18
- - id: execute
19
- tool: bash
20
- args:
21
- command: bash scripts/audit-project.sh ${inputs.project}
22
- description: Run the backing audit script.
23
-
24
- - id: report
25
- description: |
26
- Print the condensed summary to stdout. Reference the full report at
27
- chief-of-staff/logs/<YYYY-MM>/audit-${inputs.project}-<YYYY-MM-DD-HHMM>.md.
28
- Severity rules:
29
- - Failure: required file missing/template, instance config invalid YAML,
30
- instance project field mismatches folder name.
31
- - Warning: optional file missing, instance not listed in CLAUDE.md,
32
- last run > 30 days old.
33
-
34
- approval_channel: session
@@ -1,65 +0,0 @@
1
- plan: create-project
2
- description: |
3
- Scaffold a new project at projects/<slug>/ and optionally instance a list of
4
- agents into it. If no agent list is provided, prompt the user with a
5
- multi-select of all globally-discovered agents.
6
-
7
- inputs:
8
- project:
9
- required: true
10
- description: Project slug (lowercase, kebab-case, starts with letter, must not collide live or in _archive).
11
- agents:
12
- required: false
13
- description: List of <function>/<agent> to instance immediately. If omitted, the cross-link prompt runs.
14
-
15
- outputs:
16
- project_path: string
17
- instance_paths: list
18
-
19
- steps:
20
- - id: validate
21
- description: |
22
- Confirm cwd is repo root. Validate ${inputs.project} slug. Confirm
23
- projects/${inputs.project}/ does not exist live or in _archive/projects/.
24
- If ${inputs.agents} provided, validate every <function>/<agent>/ exists globally.
25
- If any are missing, abort and tell the user to run create-agent first.
26
-
27
- - id: scaffold_project
28
- tool: bash
29
- args:
30
- command: bash scripts/new-project.sh ${inputs.project}
31
- description: Create projects/<project>/ with template files.
32
-
33
- - id: resolve_agents
34
- description: |
35
- Branch on whether ${inputs.agents} was provided.
36
- - If provided: use the list directly.
37
- - If omitted: discover all <function>/<agent>/ folders containing agent.md
38
- across functions registered in .config/functions.yaml. If empty, skip
39
- instancing and report "no agents exist yet — run create-agent first."
40
- Otherwise present a multi-select via AskUserQuestion with options
41
- [All agents, ...each discovered <function>/<agent>, None — leave project bare]
42
- and multiSelect: true. Resolve "All agents" to the full list,
43
- "None" or empty to an empty list.
44
-
45
- - id: instance_agents
46
- tool: bash
47
- args:
48
- command: |
49
- for entry in ${resolved_agents}; do
50
- fn="${entry%/*}"; agent="${entry#*/}"
51
- bash scripts/new-agent-instance.sh ${inputs.project} "$fn" "$agent"
52
- done
53
- description: |
54
- For each resolved agent, run new-agent-instance.sh. Script prompts
55
- interactively for tool bindings declared in the agent's
56
- ## Tools and bindings section. Skip with Enter or "skip" to leave
57
- placeholders. After each instance, append a line to
58
- projects/${inputs.project}/CLAUDE.md under ## Active agent instances.
59
-
60
- - id: report
61
- description: |
62
- Print all paths created — project root + every instance — and surface
63
- the instance count.
64
-
65
- approval_channel: session