factoryhub 0.0.0-stage → 0.1.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 (156) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +195 -2
  4. package/factories/README.md +17 -0
  5. package/factories/client-file-readiness/README.md +3 -0
  6. package/factories/client-file-readiness/agents/analyst/agent.md +10 -0
  7. package/factories/client-file-readiness/agents/reviewer/agent.md +10 -0
  8. package/factories/client-file-readiness/agents/writer/agent.md +11 -0
  9. package/factories/client-file-readiness/factory.yaml +12 -0
  10. package/factories/client-file-readiness/flow.yaml +56 -0
  11. package/factories/competitor-teardown/README.md +3 -0
  12. package/factories/competitor-teardown/agents/analyst/agent.md +10 -0
  13. package/factories/competitor-teardown/agents/researcher/agent.md +11 -0
  14. package/factories/competitor-teardown/agents/reviewer/agent.md +10 -0
  15. package/factories/competitor-teardown/agents/writer/agent.md +11 -0
  16. package/factories/competitor-teardown/factory.yaml +11 -0
  17. package/factories/competitor-teardown/flow.yaml +75 -0
  18. package/factories/homepage-audit/README.md +3 -0
  19. package/factories/homepage-audit/agents/analyst/agent.md +10 -0
  20. package/factories/homepage-audit/agents/researcher/agent.md +11 -0
  21. package/factories/homepage-audit/agents/reviewer/agent.md +10 -0
  22. package/factories/homepage-audit/agents/writer/agent.md +11 -0
  23. package/factories/homepage-audit/factory.yaml +11 -0
  24. package/factories/homepage-audit/flow.yaml +77 -0
  25. package/factories/inbox-triage/README.md +3 -0
  26. package/factories/inbox-triage/agents/analyst/agent.md +10 -0
  27. package/factories/inbox-triage/agents/reviewer/agent.md +10 -0
  28. package/factories/inbox-triage/agents/writer/agent.md +11 -0
  29. package/factories/inbox-triage/factory.yaml +11 -0
  30. package/factories/inbox-triage/flow.yaml +57 -0
  31. package/factories/index.json +587 -0
  32. package/factories/launch-kit/README.md +3 -0
  33. package/factories/launch-kit/agents/reviewer/agent.md +10 -0
  34. package/factories/launch-kit/agents/strategist/agent.md +10 -0
  35. package/factories/launch-kit/agents/writer/agent.md +11 -0
  36. package/factories/launch-kit/factory.yaml +12 -0
  37. package/factories/launch-kit/flow.yaml +75 -0
  38. package/factories/meeting-to-actions/CHANGELOG.md +7 -0
  39. package/factories/meeting-to-actions/README.md +15 -0
  40. package/factories/meeting-to-actions/agents/analyst/agent.md +10 -0
  41. package/factories/meeting-to-actions/agents/reviewer/agent.md +10 -0
  42. package/factories/meeting-to-actions/agents/writer/agent.md +11 -0
  43. package/factories/meeting-to-actions/factory.yaml +11 -0
  44. package/factories/meeting-to-actions/flow.yaml +53 -0
  45. package/factories/meeting-to-actions/mindburn.requirements.yaml +8 -0
  46. package/factories/meeting-to-actions/mindburn.tests.yaml +16 -0
  47. package/factories/newsletter-note/README.md +11 -0
  48. package/factories/newsletter-note/agents/reviewer/agent.md +10 -0
  49. package/factories/newsletter-note/agents/writer/agent.md +11 -0
  50. package/factories/newsletter-note/factory.yaml +12 -0
  51. package/factories/newsletter-note/flow.yaml +45 -0
  52. package/factories/newsletter-note/mindburn.tests.yaml +80 -0
  53. package/factories/outreach-pack/README.md +3 -0
  54. package/factories/outreach-pack/agents/reviewer/agent.md +5 -0
  55. package/factories/outreach-pack/agents/writer/agent.md +5 -0
  56. package/factories/outreach-pack/factory.yaml +9 -0
  57. package/factories/outreach-pack/flow.yaml +42 -0
  58. package/factories/prospect-brief/README.md +3 -0
  59. package/factories/prospect-brief/agents/researcher/agent.md +11 -0
  60. package/factories/prospect-brief/agents/reviewer/agent.md +10 -0
  61. package/factories/prospect-brief/agents/strategist/agent.md +10 -0
  62. package/factories/prospect-brief/agents/writer/agent.md +11 -0
  63. package/factories/prospect-brief/factory.yaml +11 -0
  64. package/factories/prospect-brief/flow.yaml +79 -0
  65. package/factories/release-desk/README.md +13 -0
  66. package/factories/release-desk/agents/editor/agent.md +10 -0
  67. package/factories/release-desk/agents/reviewer/agent.md +10 -0
  68. package/factories/release-desk/factory.yaml +13 -0
  69. package/factories/release-desk/flow.yaml +67 -0
  70. package/factories/release-desk/mindburn.tests.yaml +163 -0
  71. package/factories/short-video-cut/README.md +11 -0
  72. package/factories/short-video-cut/agents/reviewer/agent.md +10 -0
  73. package/factories/short-video-cut/agents/writer/agent.md +11 -0
  74. package/factories/short-video-cut/factory.yaml +13 -0
  75. package/factories/short-video-cut/flow.yaml +46 -0
  76. package/factories/short-video-cut/mindburn.tests.yaml +80 -0
  77. package/factories/video-facts/README.md +11 -0
  78. package/factories/video-facts/agents/analyst/agent.md +10 -0
  79. package/factories/video-facts/agents/reviewer/agent.md +10 -0
  80. package/factories/video-facts/factory.yaml +13 -0
  81. package/factories/video-facts/flow.yaml +39 -0
  82. package/factories/video-facts/mindburn.tests.yaml +34 -0
  83. package/factories/video-to-posts/README.md +35 -0
  84. package/factories/video-to-posts/agents/analyst/agent.md +10 -0
  85. package/factories/video-to-posts/agents/reviewer/agent.md +10 -0
  86. package/factories/video-to-posts/agents/writer/agent.md +11 -0
  87. package/factories/video-to-posts/factory.yaml +12 -0
  88. package/factories/video-to-posts/flow.yaml +62 -0
  89. package/factories/video-to-posts/mindburn.tests.yaml +34 -0
  90. package/factories/week-of-posts/README.md +11 -0
  91. package/factories/week-of-posts/agents/reviewer/agent.md +10 -0
  92. package/factories/week-of-posts/agents/writer/agent.md +11 -0
  93. package/factories/week-of-posts/factory.yaml +12 -0
  94. package/factories/week-of-posts/flow.yaml +46 -0
  95. package/factories/week-of-posts/mindburn.tests.yaml +80 -0
  96. package/package.json +92 -4
  97. package/packages/cli/bin/factoryhub.mjs +8 -0
  98. package/packages/cli/package.json +29 -0
  99. package/packages/cli/src/args.mjs +47 -0
  100. package/packages/cli/src/commands/export.mjs +54 -0
  101. package/packages/cli/src/commands/get.mjs +37 -0
  102. package/packages/cli/src/commands/inspect.mjs +65 -0
  103. package/packages/cli/src/commands/list.mjs +24 -0
  104. package/packages/cli/src/commands/login.mjs +161 -0
  105. package/packages/cli/src/commands/logout.mjs +43 -0
  106. package/packages/cli/src/commands/mcp.mjs +25 -0
  107. package/packages/cli/src/commands/new.mjs +147 -0
  108. package/packages/cli/src/commands/pack.mjs +96 -0
  109. package/packages/cli/src/commands/publish.mjs +62 -0
  110. package/packages/cli/src/commands/pull.mjs +59 -0
  111. package/packages/cli/src/commands/push.mjs +115 -0
  112. package/packages/cli/src/commands/resume.mjs +66 -0
  113. package/packages/cli/src/commands/run.mjs +352 -0
  114. package/packages/cli/src/commands/runs.mjs +52 -0
  115. package/packages/cli/src/commands/search.mjs +30 -0
  116. package/packages/cli/src/commands/validate.mjs +79 -0
  117. package/packages/cli/src/commands/whoami.mjs +34 -0
  118. package/packages/cli/src/hosted.mjs +159 -0
  119. package/packages/cli/src/main.mjs +134 -0
  120. package/packages/cli/src/tool-sources.mjs +272 -0
  121. package/packages/cli/src/util.mjs +58 -0
  122. package/packages/engine/lib/catalog.mjs +50 -0
  123. package/packages/engine/lib/credentials.mjs +121 -0
  124. package/packages/engine/lib/hosted.mjs +119 -0
  125. package/packages/engine/lib/hub.mjs +423 -0
  126. package/packages/engine/lib/nango.mjs +157 -0
  127. package/packages/engine/lib/node.mjs +242 -0
  128. package/packages/engine/lib/providers.mjs +57 -0
  129. package/packages/engine/lib/run.mjs +192 -0
  130. package/packages/engine/lib/skill.mjs +229 -0
  131. package/packages/engine/lib/text.mjs +5 -0
  132. package/packages/engine/package.json +45 -0
  133. package/packages/engine/src/author-tests.mjs +78 -0
  134. package/packages/engine/src/compose.mjs +150 -0
  135. package/packages/engine/src/cost.mjs +41 -0
  136. package/packages/engine/src/diagnostics.mjs +21 -0
  137. package/packages/engine/src/factory-engine.mjs +2109 -0
  138. package/packages/engine/src/flow-sources.mjs +135 -0
  139. package/packages/engine/src/index.mjs +9 -0
  140. package/packages/engine/src/markdown.mjs +97 -0
  141. package/packages/engine/src/mcp-client.mjs +429 -0
  142. package/packages/engine/src/package.mjs +116 -0
  143. package/packages/engine/src/run.mjs +308 -0
  144. package/packages/engine/src/tool-sources.mjs +566 -0
  145. package/packages/mcp/bin/factoryhub-mcp.mjs +6 -0
  146. package/packages/mcp/package.json +36 -0
  147. package/packages/mcp/src/server.mjs +310 -0
  148. package/packages/sdk/package.json +28 -0
  149. package/packages/sdk/src/index.d.ts +163 -0
  150. package/packages/sdk/src/index.mjs +266 -0
  151. package/spec/README.md +42 -0
  152. package/spec/factory-format.md +866 -0
  153. package/spec/schema/factory.schema.json +43 -0
  154. package/spec/schema/factory.yaml.json +815 -0
  155. package/spec/schema/flow.schema.json +191 -0
  156. package/spec/skill-export.md +129 -0
@@ -0,0 +1,75 @@
1
+ flow: mindburn.flow/v1
2
+ title: Launch kit
3
+ author: Mindburn Labs
4
+ version: "1.2.0"
5
+ license: MIT
6
+ tags: [marketing, launch]
7
+ time: about 4 minutes
8
+ inputs:
9
+ product:
10
+ type: longtext
11
+ help: "What you are launching, what it does, the price and anything true you can say about results or customers."
12
+ audience:
13
+ type: text
14
+ help: "Who it is for, as specifically as you can, for example \"freelance bookkeepers with 10 to 40 clients\"."
15
+ site:
16
+ type: url
17
+ optional: true
18
+ help: "Your current website, to match the voice."
19
+ launch_offer:
20
+ type: text
21
+ optional: true
22
+ help: "Any launch offer and its end condition, for example \"20% off for the first 50 customers\"."
23
+ market_research:
24
+ type: longtext
25
+ optional: true
26
+ help: "Source-linked market research to inform positioning. Keep product claims grounded in the product facts."
27
+ steps:
28
+ positioning:
29
+ title: Find the positioning
30
+ agent: strategist
31
+ kind: work
32
+ tools: [web_fetch]
33
+ task: |
34
+ If market_research was given, use its sourced comparisons to explain differentiation without treating competitor facts as facts about this product. If a site was given, read its home page to learn the voice and existing claims. Then write the positioning: the audience and the moment they need this, the problem in their words, the promise in one sentence of under 15 words, three reasons to believe it (each tied to a fact from the product input), what it replaces, and the one objection most likely to stop a purchase with an honest answer. Offer two alternative promise sentences below the main one. Describe the voice in one line. Use no fact that is not in the inputs or on the site.
35
+ approve_positioning:
36
+ title: Agree the positioning
37
+ kind: approve
38
+ needs: [positioning]
39
+ shows: positioning
40
+ task: |
41
+ Everything else is written from this. Approve it, pick one of the alternative promises, or correct anything that is wrong about your product or audience.
42
+ landing_page:
43
+ title: Write the landing page
44
+ agent: writer
45
+ kind: work
46
+ needs: [approve_positioning]
47
+ task: |
48
+ Write the landing page from the approved positioning: headline (the promise), a line under it, the main button text, a "how it works" section with three steps, the three reasons to believe as short sections, the objection and its answer, the price and the launch offer if one was given, and a closing call to action. Mark every place where a real testimonial, screenshot or number should go as "[ADD: what belongs here]" instead of inventing one.
49
+ messages:
50
+ title: Write the emails and posts
51
+ agent: writer
52
+ kind: work
53
+ needs: [approve_positioning]
54
+ task: |
55
+ In the same voice write: a launch email under 180 words with two subject lines; three follow-up emails under 100 words each for days 2, 4 and 6, each making one new point (a reason to believe, the objection answered, the offer ending); and five short posts for social channels, each standing alone and each opening differently. State the launch offer exactly as given, with its end condition.
56
+ kit:
57
+ title: Package the kit
58
+ agent: writer
59
+ kind: deliver
60
+ needs: [landing_page, messages]
61
+ task: |
62
+ Assemble the kit in this order: **Positioning** (the approved version, one short block), **Landing page** (full draft), **Launch email**, **Follow-up emails** (with the day for each), **Posts**, and **Before you publish**: a checklist of every "[ADD: ...]" placeholder and any claim you should double-check, plus the order to publish the pieces in.
63
+ check_messages:
64
+ title: Check the kit
65
+ agent: reviewer
66
+ kind: check
67
+ needs: [kit]
68
+ checks: kit
69
+ task: |
70
+ Review every piece of the assembled kit, including the landing page. Every factual product, price, result, customer or offer claim is supported by the inputs or positioning. Every piece uses the approved promise and voice. No invented testimonial, number, customer name or deadline appears. The offer and end condition match the input. Requested word limits and section counts are met, and every missing asset remains marked and appears in the checklist.
71
+
72
+ done:
73
+ - "Every piece uses the approved promise and the same voice."
74
+ - "No claim appears that the inputs do not support."
75
+ - "Every gap that needs a real asset is marked, not filled in."
@@ -0,0 +1,7 @@
1
+ # Changes
2
+
3
+ ## 1.1.1
4
+
5
+ Adds an executable example covering agreed actions, unanswered questions and
6
+ missing owners or deadlines. Includes a model recommendation and a bounded
7
+ short-input cost estimate. The workflow and its six output sections are unchanged.
@@ -0,0 +1,15 @@
1
+ # Meeting to actions
2
+
3
+ Paste the notes or transcript. You get what was decided, who does what by when, what is still open, and the follow-up message for everyone who was there. It only reports what the notes support, and it tells you where an owner or a date was never agreed.
4
+
5
+ The included example uses invented notes with an agreed action, an unowned task
6
+ and an undecided question. The result must keep those distinctions; drafting a
7
+ follow-up does not send it. Read the result before sending it.
8
+
9
+ Run the example on the Hub or with
10
+ `node run.mjs --test --provider anthropic --model claude-haiku-5-5`. Passing text checks are
11
+ a repeatable regression signal, not proof that every transcript will be handled
12
+ correctly. The package includes the model recommendation and the basis of its
13
+ short-input cost estimate; no minimum model has been established. Hosted trials
14
+ used Haiku for writing and Sonnet for review. The local command uses Haiku for
15
+ both, so its quality and cost must be checked separately.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Turns raw material into structured findings that can be checked.
3
+ agentType: CUSTOM
4
+ ---
5
+
6
+ You are the analyst. You take what the person gave and what earlier steps found, and turn it into structured findings: tables, ranked lists, statuses.
7
+
8
+ - Every finding points at the exact words, file or fact it rests on.
9
+ - You never assume what the material does not show. Where something cannot be told, you say what is missing.
10
+ - You rank by what matters most to the person's goal, and you keep to the counts and shapes the step asks for.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Checks work against stated criteria and sends weak work back.
3
+ agentType: REVIEW
4
+ ---
5
+
6
+ You are the reviewer. You hold one piece of work against the criteria you are given and decide whether it passes.
7
+
8
+ - You judge only what is on the page and only against the stated criteria.
9
+ - You fail work for a clear, specific breach you can point to. You never fail it for taste, or for something nobody asked for.
10
+ - When you send work back, each reason is one concrete sentence the author can act on.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Writes the finished words the person will use or send.
3
+ agentType: CUSTOM
4
+ ---
5
+
6
+ You are the writer. You write the finished thing the person will use: the brief, the message, the page, the report.
7
+
8
+ - Plain words, short sentences, the reader's own vocabulary. No filler and no hype.
9
+ - You keep to the sections, word limits and order the step asks for.
10
+ - You add no fact that is not in the inputs or earlier results. Where a real asset or decision is missing, you mark the gap clearly instead of inventing it.
11
+ - What you write should be usable as it stands.
@@ -0,0 +1,11 @@
1
+ schemaVersion: v1alpha1
2
+ name: meeting-to-actions
3
+ description: |
4
+ Turns rough meeting notes or a transcript into decisions, owned actions with
5
+ dates, open questions and a follow-up message ready to send. Use right after
6
+ any meeting where things were agreed.
7
+ repositories: []
8
+ agentDefaults:
9
+ harness:
10
+ type: claude
11
+ model: claude-haiku-5-5
@@ -0,0 +1,53 @@
1
+ flow: mindburn.flow/v1
2
+ title: Meeting to actions
3
+ author: Mindburn Labs
4
+ version: "1.1.1"
5
+ license: MIT
6
+ tags: [operations, productivity]
7
+ time: about 1 minute
8
+ inputs:
9
+ notes:
10
+ type: longtext
11
+ help: "The meeting notes or transcript, as rough as they are."
12
+ context:
13
+ type: text
14
+ optional: true
15
+ help: "Who met and why, for example \"weekly call with the Halden client about the website launch\"."
16
+ steps:
17
+ extraction:
18
+ title: Extract what was agreed
19
+ agent: analyst
20
+ kind: work
21
+ task: |
22
+ Read the notes and pull out four lists. Decisions: what was decided, in one sentence each. Actions: the task, the owner as named in the notes, and the due date as stated. Open questions: things raised and not settled. Risks: anything someone flagged as a worry.
23
+
24
+ Where an action has no owner or no date in the notes, write "owner not agreed" or "date not agreed": never assign one yourself. After each item put a short quote from the notes that supports it. Leave out small talk and anything said but not agreed.
25
+ followup:
26
+ title: Write the follow-up
27
+ agent: writer
28
+ kind: deliver
29
+ needs: [extraction]
30
+ task: |
31
+ Write the follow-up. Sections, in this order:
32
+
33
+ 1. **Summary**: two sentences on what the meeting settled.
34
+ 2. **Decisions**: a numbered list.
35
+ 3. **Actions**: a table with columns Action, Owner, Due. Keep "not agreed" where it applies.
36
+ 4. **Still open**: the open questions, and for each the person best placed to answer, if the notes say.
37
+ 5. **To confirm**: every missing owner or date as a direct question.
38
+ 6. **Message to send**: a follow-up message to the attendees under 150 words, covering decisions, actions and the questions to confirm, ready to paste into email or chat.
39
+
40
+ Do not include the supporting quotes in the follow-up.
41
+ check_extraction:
42
+ title: Check against the notes
43
+ agent: reviewer
44
+ kind: check
45
+ needs: [followup]
46
+ checks: followup
47
+ task: |
48
+ Compare the entire follow-up with the original notes. Every agreed decision and action is included; no owner, due date or fact was invented. Missing owners and dates remain explicit. The action table and message agree. All requested sections are present and the message meets its word limit. Supporting quotes need not appear in the final document.
49
+
50
+ done:
51
+ - "Every action has an owner and date, or says plainly that one was not agreed."
52
+ - "Nothing appears that the notes do not support."
53
+ - "The message can be sent without editing."
@@ -0,0 +1,8 @@
1
+ models:
2
+ recommended: claude-haiku-5-5
3
+ expected_cost:
4
+ currency: USD
5
+ min: 0.008
6
+ max: 0.02
7
+ model: claude-haiku-5-5 (writing) + claude-sonnet-5-5 (review)
8
+ basis: Short-note hosted trials used two Haiku writing calls and one Sonnet review call, with estimated model costs of USD 0.0088128 and 0.0148114. This range applies to that mixed-model configuration, not a Haiku-only local run. Larger transcripts and retries can cost more. Excludes hosting and tool fees; this is an estimate, not a spending cap.
@@ -0,0 +1,16 @@
1
+ version: 1
2
+ cases:
3
+ missing_commitments:
4
+ name: Keeps agreed actions and makes missing commitments explicit
5
+ inputs:
6
+ notes: |
7
+ Decision: use the compact onboarding form.
8
+ Dana agreed to email the revised form to Lee. No deadline was agreed.
9
+ Someone needs to confirm who maintains the help page. Nobody took that task.
10
+ The team discussed a free trial but made no decision about offering it.
11
+ context: Planning for a small product team. These are invented example notes.
12
+ expect:
13
+ contains: [Dana, Lee, onboarding, help page, free trial, not agreed]
14
+ excludes: [sent successfully, already emailed]
15
+ min_length: 200
16
+ max_length: 6000
@@ -0,0 +1,11 @@
1
+ # Newsletter note from the facts
2
+
3
+ Paste the facts sheet of a video, podcast or talk, and the transcript if you have it. You get a note under 120 words for your newsletter that says what the video is about and points readers to it, with "[ADD: link to the video]" where the link goes. A checker holds every sentence against the facts sheet and sends back anything stronger than what you said.
4
+
5
+ The facts sheet can come from "Facts from a video", or you can write your own: one fact a line, each with its timestamp or the first words of the line. "Release desk" puts the note together with the other pieces for one approval.
6
+
7
+ ## Try it on the example
8
+
9
+ The example is invented: Maya, her flat and her video do not exist. Its facts sheet is the one "Facts from a video" should write from her transcript. On the factory page, "Fill in the example" pastes it for you.
10
+
11
+ The example is in `mindburn.tests.yaml`. With the downloaded folder, `node run.mjs --test` runs it and checks that the note leaves the link for you and makes none of the easy roundings. Passing checks are a repeatable regression signal, not proof that every facts sheet will be handled correctly.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Checks work against stated criteria and sends weak work back.
3
+ agentType: REVIEW
4
+ ---
5
+
6
+ You are the reviewer. You hold one piece of work against the criteria you are given and decide whether it passes.
7
+
8
+ - You judge only what is on the page and only against the stated criteria.
9
+ - You fail work for a clear, specific breach you can point to. You never fail it for taste, or for something nobody asked for.
10
+ - When you send work back, each reason is one concrete sentence the author can act on.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Writes the finished words the person will use or send.
3
+ agentType: CUSTOM
4
+ ---
5
+
6
+ You are the writer. You write the finished thing the person will use: the brief, the message, the page, the report.
7
+
8
+ - Plain words, short sentences, the reader's own vocabulary. No filler and no hype.
9
+ - You keep to the sections, word limits and order the step asks for.
10
+ - You add no fact that is not in the inputs or earlier results. Where a real asset or decision is missing, you mark the gap clearly instead of inventing it.
11
+ - What you write should be usable as it stands.
@@ -0,0 +1,12 @@
1
+ schemaVersion: v1alpha1
2
+ name: newsletter-note
3
+ description: |
4
+ Writes a short newsletter note, under 120 words, that tells your readers
5
+ what your new video, podcast or talk is about and points them to it, using
6
+ only the facts sheet. Use after "Facts from a video", or with your own list
7
+ of what you said, when you want to send your list a note in your voice.
8
+ repositories: []
9
+ agentDefaults:
10
+ harness:
11
+ type: claude
12
+ model: sonnet
@@ -0,0 +1,45 @@
1
+ flow: mindburn.flow/v1
2
+ title: Newsletter note from the facts
3
+ author: Mindburn Labs
4
+ version: "1.0.0"
5
+ license: MIT
6
+ tags: [social, marketing]
7
+ time: about 1 minute
8
+ inputs:
9
+ facts:
10
+ type: longtext
11
+ help: "The facts sheet from \"Facts from a video\", or your own list of what you said: one fact a line, each with its timestamp or the first words of the line."
12
+ transcript:
13
+ type: longtext
14
+ optional: true
15
+ help: "The transcript the facts came from. With it, the note can use your exact wording."
16
+ about_you:
17
+ type: text
18
+ optional: true
19
+ help: "Who you are and who reads your newsletter, for example \"I make short videos about building small apps; most of my readers are students\". It sets the voice, not the facts."
20
+ steps:
21
+ note:
22
+ title: Write the newsletter note
23
+ agent: writer
24
+ kind: deliver
25
+ task: |
26
+ Write a note for the speaker's newsletter that tells readers what the video is about and points them to it, in the speaker's voice and, wherever you can, in the speaker's own words as the facts sheet quotes them. Use about_you only for the voice and the audience, never as a source of facts. Sections, in this order:
27
+
28
+ 1. **Newsletter note**: under 120 words, with "[ADD: link to the video]" where the link goes.
29
+ 2. **Facts used**: every factual claim the note makes, each with the facts-sheet ID if the sheet has IDs, its timestamp or first words, and the exact words it rests on.
30
+
31
+ Every fact comes from the facts sheet. If the transcript is given, you may take the speaker's exact wording from it, but only for facts the sheet has. Never round a number, shorten or lengthen a time span, make a result bigger or more certain, drop a qualifier that keeps a claim modest, state an opinion as a fact, work out a figure the sheet does not state, or name a person the sheet does not name. A fact the sheet marks "unclear" is not stated as settled. Write no link, address or date yourself. Add no hype the speaker did not use, and no exclamation marks or emojis unless the sheet quotes them.
32
+ check_note:
33
+ title: Check the note against the facts sheet
34
+ agent: reviewer
35
+ kind: check
36
+ needs: [note]
37
+ checks: note
38
+ task: |
39
+ Compare every sentence of the note with the facts sheet, and with the transcript if it is given. Each number, time span, name, result and quote is on the facts sheet with the same meaning. Send back anything rounded, worked out, made bigger or more certain, a dropped qualifier, an opinion stated as fact, a fact marked "unclear" stated as settled, a quote that is not word for word, and any fact the sheet does not have.
40
+
41
+ Then check the shape: both sections are present and in order, the note is under 120 words, "[ADD: link to the video]" appears in it and no other link or address does, and every factual claim appears under "Facts used". When you send work back, quote the note's words and the source's words side by side so the writer can correct them.
42
+ done:
43
+ - "Every number, time span, name and quote in the note is on the facts sheet, with the same meaning."
44
+ - "The note is under 120 words and marks the link with \"[ADD: link to the video]\" instead of inventing one."
45
+ - "Every factual claim is listed under \"Facts used\" with the words it rests on."
@@ -0,0 +1,80 @@
1
+ version: 1
2
+ cases:
3
+ frying_pan_note:
4
+ name: Writes a short note that leaves the link for the speaker to add
5
+ inputs:
6
+ facts: |
7
+ ## Facts
8
+
9
+ | ID | Where | Fact | Exact words |
10
+ | --- | --- | --- | --- |
11
+ | F1 | [0:00] | The video is the story of how a frying pan made the speaker build an app. | "So this is the story of how a frying pan made me build an app." |
12
+ | F2 | [0:06] | The flat's group chat had 212 messages in one month; the speaker counted them. | "Our flat group chat had 212 messages in one month. I counted." |
13
+ | F3 | [0:06] | Most of those messages were about one frying pan that nobody would wash. | "Most of them were about one frying pan that nobody would wash." |
14
+ | F4 | [0:18] | Five people live in the flat. | "There are five of us in the flat." |
15
+ | F5 | [0:18] | Everyone thought they did the most dishes, and everyone was wrong, the speaker included. | "Everyone thought they did the most dishes. Everyone was wrong, including me." |
16
+ | F6 | [0:31] | The speaker is not a programmer: one coding course at school, most of it forgotten. | "I'm not a programmer. I did one coding course at school and forgot most of it." |
17
+ | F7 | [0:31] | The speaker had been using an AI coding assistant for small things. | "But I'd been using an AI coding assistant for small things" |
18
+ | F8 | [0:47] | The app took two weekends, maybe three counting the weekend spent on the logo. | "It took me two weekends. Maybe three, if you count the weekend I spent on the logo." |
19
+ | F9 | [0:55] | The speaker's first lesson: a whole Saturday went on a logo, and nobody has ever mentioned it. | "I spent a whole Saturday on a logo, and not one person has ever mentioned the logo. Not one." |
20
+ | F10 | [1:06] | When something needs washing, you tap one button, and the app messages the one person who has done the fewest dishes this week. | "When something needs washing, you tap one button. The app looks at who has done the fewest dishes this week and sends that one person a message." |
21
+ | F11 | [1:06] | The app has no points, no leaderboard and no badges. | "No points, no leaderboard, no badges." |
22
+ | F12 | [1:27] | Points came first and made it worse: one flatmate washed single teaspoons to collect points. | "I tried points first. Points made it worse. One flatmate started washing single teaspoons to collect points." |
23
+ | F13 | [1:38] | The speaker's opinion, called a hot take: most chore apps fail because they turn chores into a game. | "So here's my hot take: most chore apps fail because they turn chores into a game." |
24
+ | F14 | [1:38] | Nobody in the flat wanted a game; they wanted the arguing to stop. | "Nobody in my flat wanted a game. We wanted the arguing to stop." |
25
+ | F15 | [1:50] | The group chat went from 212 messages to 9 messages last month, and three of those were about pizza. | "The group chat went from 212 messages to, I checked last night, 9 messages last month. And three of those were about pizza." |
26
+ | F16 | [2:04] | After a friend posted about it, people from other flats started asking for it. | "Then a friend posted about it, and people from other flats started asking for it." |
27
+ | F17 | [2:04] | 38 people signed up in the first week, mostly friends of friends. | "38 people signed up in the first week. Mostly friends of friends, to be fair." |
28
+ | F18 | [2:04] | 11 of them used it again the next day. | "11 of them used it again the next day, which for an app about dishes I'll take." |
29
+ | F19 | [2:22] | Running it costs three pounds a month, after a correction. | "It costs me about four, no, three pounds a month to run. Three." |
30
+ | F20 | [2:28] | What the speaker would do differently: skip the logo, and ask the flatmates what annoyed them before writing a single line. They guessed fairness; it was the frying pan. | "What I'd do differently: skip the logo, and ask my flatmates what annoyed them before writing a single line. I guessed it was fairness. It was the frying pan." |
31
+ | F21 | [2:42] | The speaker's advice: start with the one message the app sends, and write that message first. | "If you build something like this, start with the one message the app sends. Write that message first. Everything else is decoration." |
32
+ | F22 | [2:51] | The pan is clean, for now. | "The pan is clean. For now." |
33
+
34
+ ## Quotes worth using
35
+
36
+ - [0:06] "Our flat group chat had 212 messages in one month. I counted." (F2)
37
+ - [0:55] "not one person has ever mentioned the logo. Not one." (F9)
38
+ - [1:06] "No points, no leaderboard, no badges." (F11)
39
+ - [1:27] "One flatmate started washing single teaspoons to collect points." (F12)
40
+ - [1:38] "We wanted the arguing to stop." (F14)
41
+ - [2:28] "I guessed it was fairness. It was the frying pan." (F20)
42
+ - [2:42] "Write that message first. Everything else is decoration." (F21)
43
+ - [2:51] "The pan is clean. For now." (F22)
44
+
45
+ ## Corrections and unclear
46
+
47
+ - [2:22] The running cost: the speaker says "about four, no, three pounds a month", then "Three." The corrected figure, three pounds a month, is the fact (F19).
48
+ - [0:47] and [0:55] The time on the logo is said two ways: "the weekend I spent on the logo" and "a whole Saturday on a logo". Unclear: quote each where it is said, and do not state how long the logo took.
49
+
50
+ ## Names
51
+
52
+ No one other than the speaker is named.
53
+ transcript: |
54
+ [0:00] So this is the story of how a frying pan made me build an app.
55
+ [0:06] Our flat group chat had 212 messages in one month. I counted. Most of them were about one frying pan that nobody would wash.
56
+ [0:18] There are five of us in the flat. Everyone thought they did the most dishes. Everyone was wrong, including me.
57
+ [0:31] I'm not a programmer. I did one coding course at school and forgot most of it. But I'd been using an AI coding assistant for small things, and I thought, okay, how hard can a dishes app be?
58
+ [0:47] It took me two weekends. Maybe three, if you count the weekend I spent on the logo.
59
+ [0:55] And that's my first lesson. I spent a whole Saturday on a logo, and not one person has ever mentioned the logo. Not one.
60
+ [1:06] Here's how it works, and honestly the trick is how little it does. When something needs washing, you tap one button. The app looks at who has done the fewest dishes this week and sends that one person a message. That's it. No points, no leaderboard, no badges.
61
+ [1:27] I tried points first. Points made it worse. One flatmate started washing single teaspoons to collect points.
62
+ [1:38] So here's my hot take: most chore apps fail because they turn chores into a game. Nobody in my flat wanted a game. We wanted the arguing to stop.
63
+ [1:50] Did it work? The group chat went from 212 messages to, I checked last night, 9 messages last month. And three of those were about pizza.
64
+ [2:04] Then a friend posted about it, and people from other flats started asking for it. 38 people signed up in the first week. Mostly friends of friends, to be fair. 11 of them used it again the next day, which for an app about dishes I'll take.
65
+ [2:22] It costs me about four, no, three pounds a month to run. Three.
66
+ [2:28] What I'd do differently: skip the logo, and ask my flatmates what annoyed them before writing a single line. I guessed it was fairness. It was the frying pan. It's always one frying pan.
67
+ [2:42] If you build something like this, start with the one message the app sends. Write that message first. Everything else is decoration.
68
+ [2:51] Anyway. The pan is clean. For now.
69
+ # Invented sample: Maya, her flat and this video do not exist. The
70
+ # disclosure stays out of the inputs so it does not leak into the result;
71
+ # the README carries it.
72
+ about_you: "I'm Maya. I make short videos about building small apps; most of my viewers are students and first-time builders."
73
+ # The facts sheet is the reference result of "Facts from a video" on the
74
+ # same transcript. Contains: the placeholder for the link, never an invented
75
+ # one. Excludes: the roundings the transcript invites and claims she never made.
76
+ expect:
77
+ contains: ["[ADD: link to the video]", "Facts used", "frying pan"]
78
+ excludes: ["went viral", "in one weekend", "in a weekend", "40 people", "nearly 40", "almost 40", "never coded", "£4", "four pounds a month", "96%", "29%"]
79
+ min_length: 400
80
+ max_length: 4000
@@ -0,0 +1,3 @@
1
+ # Outreach pack
2
+
3
+ Provide checked research, approved launch materials and optionally a contact role. The factory writes and checks drafts for you to review and send. It does not collect contacts, publish or send messages.
@@ -0,0 +1,5 @@
1
+ ---
2
+ description: Checks claims, evidence and message constraints.
3
+ agentType: REVIEW
4
+ ---
5
+ Judge the complete artifact against the stated criteria. Fail unsupported claims and invented personal details with specific reasons.
@@ -0,0 +1,5 @@
1
+ ---
2
+ description: Writes specific, honest outreach from supplied evidence.
3
+ agentType: CUSTOM
4
+ ---
5
+ Write plain messages with one clear ask. Preserve source links and uncertainties. Never imply an email was sent or a campaign was activated.
@@ -0,0 +1,9 @@
1
+ schemaVersion: v1alpha1
2
+ name: outreach-pack
3
+ description: |
4
+ Turns checked market research and launch materials into an outreach pack. Use when the positioning is approved and you need messages to review and send yourself.
5
+ repositories: []
6
+ agentDefaults:
7
+ harness:
8
+ type: claude
9
+ model: sonnet
@@ -0,0 +1,42 @@
1
+ flow: mindburn.flow/v1
2
+ title: Outreach pack
3
+ version: "1.0.0"
4
+ author: Mindburn Labs
5
+ license: MIT
6
+ tags: [sales, launch]
7
+ inputs:
8
+ research:
9
+ type: longtext
10
+ help: Source-linked market research with uncertainties preserved.
11
+ launch_materials:
12
+ type: longtext
13
+ help: Approved positioning and checked launch materials.
14
+ contact_role:
15
+ type: text
16
+ optional: true
17
+ help: The role you want to reach.
18
+ steps:
19
+ angles:
20
+ title: Find the outreach angle
21
+ agent: writer
22
+ kind: work
23
+ task: |
24
+ Use the supplied launch_materials and research to identify two honest reasons the contact_role might care. Each must tie to a supported problem, the approved promise, and a source when based on market research. Never invent a prospect, a personal fact, a customer result, a contact address or a claim.
25
+ pack:
26
+ title: Write the outreach pack
27
+ agent: writer
28
+ kind: deliver
29
+ needs: [angles]
30
+ task: |
31
+ Produce a reusable outreach pack with: the chosen angle and evidence; two subject lines of at most four words; a first email under 110 words with one small question; a follow-up under 60 words adding a supported point; a short direct message under 60 words; and a before-sending checklist. Use explicit [ADD: ...] placeholders for the real recipient, their verified situation and missing facts. Preserve the approved product promise. State that no messages have been sent and no contacts have been collected. This is a draft for human review, not an active campaign.
32
+ review:
33
+ title: Check the outreach pack
34
+ agent: reviewer
35
+ kind: check
36
+ needs: [pack]
37
+ checks: pack
38
+ task: |
39
+ Every product claim matches launch_materials. Every market claim matches research and keeps its source. No personal detail, email address, customer result or recipient-specific claim is invented. Required sections and word limits are met. Placeholders remain explicit. The pack says messages have not been sent.
40
+ done:
41
+ - Every claim is supported by the supplied research or launch materials.
42
+ - Recipient details that are not known remain explicit placeholders.
@@ -0,0 +1,3 @@
1
+ # Prospect brief and first email
2
+
3
+ Give it a company and what you sell. It reads the company's own site and recent public news, finds the reasons they might care right now, lets you pick the angle, and writes an email a person would actually answer. Nothing is sent: you get the drafts.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Finds and reads the sources, and reports only what they say.
3
+ agentType: CUSTOM
4
+ ---
5
+
6
+ You are the researcher. You find the right pages, read them carefully and write down what they actually say.
7
+
8
+ - Quote headlines, prices and claims exactly, and put the page address after every fact.
9
+ - Read the pages you were asked for before looking further. Stay within the page budget you are given.
10
+ - A gap is a finding. When a page cannot be read or a fact is not published, write that down plainly instead of filling it from memory.
11
+ - You do not judge or recommend. The analyst and the writer do that from your notes.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Checks work against stated criteria and sends weak work back.
3
+ agentType: REVIEW
4
+ ---
5
+
6
+ You are the reviewer. You hold one piece of work against the criteria you are given and decide whether it passes.
7
+
8
+ - You judge only what is on the page and only against the stated criteria.
9
+ - You fail work for a clear, specific breach you can point to. You never fail it for taste, or for something nobody asked for.
10
+ - When you send work back, each reason is one concrete sentence the author can act on.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Chooses the angle: what to say, to whom, and why it should work.
3
+ agentType: CUSTOM
4
+ ---
5
+
6
+ You are the strategist. From the facts in hand you choose the angle: who this is for, what to promise, and which facts make it believable.
7
+
8
+ - You offer a clear first choice and real alternatives, and you say which facts you are least sure of.
9
+ - You use only facts from the inputs and earlier steps. A stronger claim that the facts do not support is not an option.
10
+ - The person decides. You make their decision easy to take.
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: Writes the finished words the person will use or send.
3
+ agentType: CUSTOM
4
+ ---
5
+
6
+ You are the writer. You write the finished thing the person will use: the brief, the message, the page, the report.
7
+
8
+ - Plain words, short sentences, the reader's own vocabulary. No filler and no hype.
9
+ - You keep to the sections, word limits and order the step asks for.
10
+ - You add no fact that is not in the inputs or earlier results. Where a real asset or decision is missing, you mark the gap clearly instead of inventing it.
11
+ - What you write should be usable as it stands.
@@ -0,0 +1,11 @@
1
+ schemaVersion: v1alpha1
2
+ name: prospect-brief
3
+ description: |
4
+ Researches one company you want to sell to and writes a one-page brief plus
5
+ a first email and follow-up that mention real, checkable facts about them.
6
+ Use before reaching out to an account that matters.
7
+ repositories: []
8
+ agentDefaults:
9
+ harness:
10
+ type: claude
11
+ model: sonnet
@@ -0,0 +1,79 @@
1
+ flow: mindburn.flow/v1
2
+ title: Prospect brief and first email
3
+ author: Mindburn Labs
4
+ version: "1.1.0"
5
+ license: MIT
6
+ tags: [sales, research]
7
+ time: about 4 minutes
8
+ inputs:
9
+ prospect:
10
+ type: url
11
+ help: "The website of the company you want to reach."
12
+ what_you_sell:
13
+ type: longtext
14
+ help: "What you offer and who it helps, in a few sentences. Include one real result if you have one."
15
+ contact_role:
16
+ type: text
17
+ optional: true
18
+ help: "Who you plan to write to, for example \"head of operations\"."
19
+ steps:
20
+ company_facts:
21
+ title: Read the company's own site
22
+ agent: researcher
23
+ kind: work
24
+ tools: [web_fetch]
25
+ task: |
26
+ Read the prospect's home page and, from its links, the about page and one product or careers page.
27
+
28
+ Write: what the company does and for whom, its size signals (team size, locations, customers named), and what it says it cares about now (launches, hiring, expansion, stated priorities). Put the page address after every fact. If you find little, say so; do not pad.
29
+ recent_news:
30
+ title: Find recent news
31
+ agent: researcher
32
+ kind: work
33
+ tools: [web_search, web_fetch]
34
+ needs: []
35
+ task: |
36
+ Search for news about the prospect company from the last twelve months and read up to two results. Prefer the company's own announcements and established publications.
37
+
38
+ List each item with its date, what happened in one sentence, and the page address. Leave out anything you cannot date or that is about a different company with a similar name. If there is no recent news, say so plainly.
39
+ angles:
40
+ title: Find the angle
41
+ agent: strategist
42
+ kind: work
43
+ needs: [company_facts, recent_news]
44
+ task: |
45
+ From the company facts, the recent news and what_you_sell, propose three angles for a first message. For each: the trigger (a specific fact about them, with its link), why it plausibly matters to the contact_role, and the one-sentence bridge to what you sell. Rank them, strongest first, and say which facts you are least sure of. If the research supports fewer than three honest angles, give fewer.
46
+ approve_angles:
47
+ title: Pick the angle
48
+ kind: approve
49
+ needs: [angles]
50
+ shows: angles
51
+ task: |
52
+ Choose the angle to write from. Approve to use the first one, or say which one you want and anything you know about this company that the research missed.
53
+ email:
54
+ title: Write the email
55
+ agent: writer
56
+ kind: work
57
+ needs: [approve_angles]
58
+ task: |
59
+ Write the first email using the chosen angle. Rules: under 110 words, plain text, no greeting clichés, first sentence is about them and names the trigger fact, one sentence on what you do, one concrete result only if what_you_sell gave one, and one small question as the ask. Then write a follow-up of under 60 words for four days later that adds one new fact instead of repeating. Give two subject lines of four words or fewer.
60
+ brief:
61
+ title: Assemble the brief
62
+ agent: writer
63
+ kind: deliver
64
+ needs: [email]
65
+ task: |
66
+ Write one page with these sections: **Company in three lines**, **Why now** (the chosen angle and its source link), **Email** (subject lines, first email, follow-up, ready to paste), **If they reply** (three likely questions and a one-line honest answer to each, using only what_you_sell), **Sources** (every page used, as links).
67
+ check_email:
68
+ title: Check the brief
69
+ agent: reviewer
70
+ kind: check
71
+ needs: [brief]
72
+ checks: brief
73
+ task: |
74
+ Every fact about the prospect in the entire brief appears in the company facts or recent news and has a source link. Seller claims and answers use only what_you_sell. The chosen angle is preserved. The first email and follow-up meet their word limits, with one ask each and subject lines of four words or fewer. No flattery, greeting cliches or exclamation marks. All requested sections and sources are present.
75
+
76
+ done:
77
+ - "Every fact about the prospect has a source link."
78
+ - "The email could be sent as it stands."
79
+ - "Nothing claims a result the seller did not state."