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,13 @@
1
+ # Release desk
2
+
3
+ Paste the facts sheet and the pieces written from one video: the X and LinkedIn posts, the short-video script and the newsletter note. Leave out any piece you do not have. You get one release packet: the week at a glance, each piece as written, and under "Before you post" every claim once with the words it rests on, every name to ask about and every placeholder still to fill.
4
+
5
+ A checker reads the pieces together. A number that reads one way in a post and another way in the newsletter, a claim the facts sheet does not have, or a line changed without saying so goes back to the desk. Where a piece contradicts the facts sheet, the desk brings that line back to it and lists the change, without repeating the wrong words. Then you approve once: these go out under your name. Nothing is posted for you: you copy what you approve.
6
+
7
+ The pieces can come from "X and LinkedIn posts from the facts", "Short-video script and cut list from the facts" and "Newsletter note from the facts", which all write from the sheet "Facts from a video" makes, or you can paste pieces you wrote yourself.
8
+
9
+ ## Try it on the example
10
+
11
+ The example is invented: Maya, her flat and her video do not exist. Its facts sheet and pieces are written from her transcript, except that two pieces round a figure up, as a person writing by hand might: the short video says the app costs four pounds a month, and the newsletter says nearly 40 people signed up. The packet has to bring both back to the facts sheet. On the factory page, "Fill in the example" pastes it for you.
12
+
13
+ The example is in `mindburn.tests.yaml`. With the downloaded folder, `node run.mjs --test --yes` runs it, approves the packet for you and checks that both roundings are gone. Passing checks are a repeatable regression signal, not proof that every set of pieces will be handled correctly.
@@ -0,0 +1,10 @@
1
+ ---
2
+ description: Puts checked pieces together into one packet without rewriting them.
3
+ agentType: CUSTOM
4
+ ---
5
+
6
+ You are the editor at the release desk. You take pieces that were written and checked separately and put them together, so one person can read them side by side and approve them once.
7
+
8
+ - You keep each piece as it was written. You change a line only where it contradicts the source or another piece, and then only to say what the source says.
9
+ - You list every change you make, so the person can see it.
10
+ - You add nothing: no new facts, posts, names, links or hashtags.
@@ -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,13 @@
1
+ schemaVersion: v1alpha1
2
+ name: release-desk
3
+ description: |
4
+ Puts the posts, the short-video script and the newsletter note written from
5
+ one video into a single release packet: the week at a glance, every piece
6
+ checked against the others and the facts sheet, and every claim listed with
7
+ the words it rests on, for you to approve once. Use when the pieces are
8
+ written and you want to read them side by side before any goes out.
9
+ repositories: []
10
+ agentDefaults:
11
+ harness:
12
+ type: claude
13
+ model: sonnet
@@ -0,0 +1,67 @@
1
+ flow: mindburn.flow/v1
2
+ title: Release desk
3
+ author: Mindburn Labs
4
+ version: "1.0.0"
5
+ license: MIT
6
+ tags: [social, marketing]
7
+ time: about 2 minutes, then your approval
8
+ inputs:
9
+ facts:
10
+ type: longtext
11
+ help: "The facts sheet the pieces were written from, such as the one \"Facts from a video\" writes."
12
+ posts:
13
+ type: longtext
14
+ optional: true
15
+ help: "The X posts and the LinkedIn post, as written. Leave it empty if you have none."
16
+ short_video:
17
+ type: longtext
18
+ optional: true
19
+ help: "The short-video script and its cut list, as written. Leave it empty if you have none."
20
+ newsletter:
21
+ type: longtext
22
+ optional: true
23
+ help: "The newsletter note, as written. Leave it empty if you have none."
24
+ steps:
25
+ packet:
26
+ title: Assemble the release packet
27
+ agent: editor
28
+ kind: deliver
29
+ task: |
30
+ Put the pieces you were given into one release packet that the speaker can approve once and copy from. Sections, in this order:
31
+
32
+ 1. **The week at a glance**: a table with columns Day, Channel, Piece, First line. One row for each post, script and note, on days 1 to 7, no piece on two days. First line is the piece's first line as written.
33
+ 2. **X**: the thread and the single posts.
34
+ 3. **LinkedIn**: the post.
35
+ 4. **Short video**: the script and the cut list.
36
+ 5. **Newsletter**: the note.
37
+ 6. **Before you post**: every factual claim across all the pieces, once each, with the facts-sheet ID if the sheet has IDs, its timestamp or first words, and the exact words it rests on; every person or company the pieces name other than the speaker, so they can be asked; every "[ADD: ...]" still to fill; anything the facts sheet marks "unclear" that a piece touches; and the pieces that were not given.
38
+ 7. **Changes at the desk**: each change you made, or "None."
39
+
40
+ Copy each piece as written, without its own list of facts used: those claims go into "Before you post". If a piece was not given, keep its heading and write "Not given." under it. Change a line only where it contradicts the facts sheet or another piece, and then only to say what the facts sheet says, in the piece's own voice. List each change under "Changes at the desk" by piece and line, with the fact it now rests on. Describe the fix without repeating the wrong words, so nothing wrong can be copied from the packet. Add no posts, facts, names, links or hashtags.
41
+ check_packet:
42
+ title: Check the pieces against each other and the facts
43
+ agent: reviewer
44
+ kind: check
45
+ needs: [packet]
46
+ checks: packet
47
+ task: |
48
+ Check the packet as a whole against the facts sheet and the pieces as given.
49
+
50
+ - No contradictions: every number, time span, name and result reads the same way in every piece, with the same qualifiers.
51
+ - Every claim traceable: each factual claim in the packet is on the facts sheet with the same meaning, and is listed under "Before you post" with the words it rests on.
52
+ - Nothing invented: no fact, figure, name, quote, link or hashtag appears that the facts sheet or the pieces as given do not have, and no "[ADD: ...]" is filled in.
53
+ - Copied faithfully: every line not listed under "Changes at the desk" is word for word as given; every listed change only brings a line back to the facts sheet; the wrong words are not repeated anywhere in the packet.
54
+ - Shape: all seven sections are present and in order, the week at a glance has each piece once and on one day, and a piece that was not given says "Not given." and is named under "Before you post".
55
+
56
+ Send back any breach. When you do, quote the packet's words and the source's words side by side so the editor can correct them.
57
+ approve_packet:
58
+ title: Approve the release packet
59
+ kind: approve
60
+ needs: [check_packet]
61
+ shows: packet
62
+ task: |
63
+ These go out under your name. Approve the packet, or say what to change: a piece to drop, a line that does not sound like you, a fact that is wrong. Nothing is posted for you: you copy what you approve.
64
+ done:
65
+ - "No number, time span, name or result reads differently in two pieces."
66
+ - "Every factual claim in the packet is on the facts sheet and listed under \"Before you post\" with the words it rests on."
67
+ - "Nothing appears that the facts sheet and the pieces as given do not have, and every change at the desk is listed."
@@ -0,0 +1,163 @@
1
+ version: 1
2
+ cases:
3
+ frying_pan_week:
4
+ name: Corrects the pieces that round a figure and lists every claim once
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
+ posts: |
54
+ ## X
55
+
56
+ Thread:
57
+
58
+ 1. Our flat group chat had 212 messages in one month. I counted. Most of them were about one frying pan that nobody would wash. So I built an app.
59
+ 2. 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.
60
+ 3. It took me two weekends. Maybe three, if you count the weekend I spent on the logo.
61
+ 4. When something needs washing, you tap one button. The app messages whoever has done the fewest dishes this week. No points, no leaderboard, no badges.
62
+ 5. I tried points first. Points made it worse. One flatmate started washing single teaspoons to collect points.
63
+ 6. The chat went from 212 messages to 9 last month. Three of those were about pizza. The pan is clean. For now.
64
+
65
+ Single posts:
66
+
67
+ - I spent a whole Saturday on a logo for my dishes app. Not one person has ever mentioned the logo. Not one.
68
+ - If you build something like this, start with the one message the app sends. Write that message first. Everything else is decoration.
69
+
70
+ ## LinkedIn
71
+
72
+ My hot take: most chore apps fail because they turn chores into a game.
73
+
74
+ There are five of us in my flat. Our group chat had 212 messages in one month, most of them about one frying pan that nobody would wash. I'm not a programmer, but I'd been using an AI coding assistant for small things, and the app took me two weekends, maybe three if you count the weekend I spent on the logo.
75
+
76
+ I tried points first. Points made it worse: one flatmate started washing single teaspoons to collect points.
77
+
78
+ Here's how it works now. When something needs washing, you tap one button, and the app messages the one person who has done the fewest dishes this week. No points, no leaderboard, no badges.
79
+
80
+ Last month the chat had 9 messages. 38 people signed up in the first week, mostly friends of friends, and 11 of them used it again the next day.
81
+
82
+ 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.
83
+
84
+ [ADD: link to the video]
85
+
86
+ ## Facts used
87
+
88
+ - F1 [0:00] "So this is the story of how a frying pan made me build an app."
89
+ - F2 [0:06] "Our flat group chat had 212 messages in one month. I counted."
90
+ - F3 [0:06] "Most of them were about one frying pan that nobody would wash."
91
+ - F4 [0:18] "There are five of us in the flat."
92
+ - F6 [0:31] "I'm not a programmer. I did one coding course at school and forgot most of it."
93
+ - F7 [0:31] "But I'd been using an AI coding assistant for small things"
94
+ - F8 [0:47] "It took me two weekends. Maybe three, if you count the weekend I spent on the logo."
95
+ - F9 [0:55] "I spent a whole Saturday on a logo, and not one person has ever mentioned the logo. Not one."
96
+ - F10 [1:06] "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."
97
+ - F11 [1:06] "No points, no leaderboard, no badges."
98
+ - F12 [1:27] "I tried points first. Points made it worse. One flatmate started washing single teaspoons to collect points."
99
+ - F13 [1:38] "So here's my hot take: most chore apps fail because they turn chores into a game."
100
+ - F15 [1:50] "The group chat went from 212 messages to, I checked last night, 9 messages last month. And three of those were about pizza."
101
+ - F17 [2:04] "38 people signed up in the first week. Mostly friends of friends, to be fair."
102
+ - F18 [2:04] "11 of them used it again the next day"
103
+ - F20 [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."
104
+ - F21 [2:42] "If you build something like this, start with the one message the app sends. Write that message first. Everything else is decoration."
105
+ - F22 [2:51] "The pan is clean. For now."
106
+ short_video: |
107
+ ## Script
108
+
109
+ About 30 seconds, about 75 words.
110
+
111
+ - Hook, first two seconds. Clip 1: "Our flat group chat had 212 messages in one month." On screen: "212 messages in one month."
112
+ - Beat 1. Clip 2: "I'm not a programmer. I did one coding course at school and forgot most of it."
113
+ - Beat 2. Clip 3: "I tried points first. Points made it worse. One flatmate started washing single teaspoons to collect points."
114
+ - Beat 3. Clip 4: "The app looks at who has done the fewest dishes this week and sends that one person a message." On screen: "No points, no leaderboard, no badges."
115
+ - Closing line. Clip 5: "Write that message first. Everything else is decoration." On screen: "It costs four pounds a month to run."
116
+
117
+ ## Cut list
118
+
119
+ | Clip | Starts at | First words | Last words | Used for |
120
+ | --- | --- | --- | --- | --- |
121
+ | 1 | [0:06] | "Our flat group chat" | "in one month." | Hook |
122
+ | 2 | [0:31] | "I'm not a programmer." | "forgot most of it." | Beat 1 |
123
+ | 3 | [1:27] | "I tried points first." | "to collect points." | Beat 2 |
124
+ | 4 | [1:06] | "The app looks at" | "that one person a message." | Beat 3 |
125
+ | 5 | [2:42] | "Write that message first." | "Everything else is decoration." | Closing line |
126
+
127
+ ## Facts used
128
+
129
+ - F2 [0:06] "Our flat group chat had 212 messages in one month. I counted."
130
+ - F6 [0:31] "I'm not a programmer. I did one coding course at school and forgot most of it."
131
+ - F10 [1:06] "The app looks at who has done the fewest dishes this week and sends that one person a message."
132
+ - F11 [1:06] "No points, no leaderboard, no badges."
133
+ - F12 [1:27] "I tried points first. Points made it worse. One flatmate started washing single teaspoons to collect points."
134
+ - F21 [2:42] "If you build something like this, start with the one message the app sends. Write that message first. Everything else is decoration."
135
+ newsletter: |
136
+ ## Newsletter note
137
+
138
+ This week's video is the story of how a frying pan made me build an app. Our flat group chat had 212 messages in one month, most of them about one pan that nobody would wash. I'm not a programmer, but with an AI coding assistant it took me two weekends, maybe three. When something needs washing, the app messages whoever has done the fewest dishes this week, with no points and no badges. Last month the chat had 9 messages, and nearly 40 people signed up in the first week. Watch the full video: [ADD: link to the video]
139
+
140
+ ## Facts used
141
+
142
+ - F1 [0:00] "So this is the story of how a frying pan made me build an app."
143
+ - F2 [0:06] "Our flat group chat had 212 messages in one month. I counted."
144
+ - F3 [0:06] "Most of them were about one frying pan that nobody would wash."
145
+ - F6 [0:31] "I'm not a programmer."
146
+ - F7 [0:31] "But I'd been using an AI coding assistant for small things"
147
+ - F8 [0:47] "It took me two weekends. Maybe three, if you count the weekend I spent on the logo."
148
+ - F10 [1:06] "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."
149
+ - F11 [1:06] "No points, no leaderboard, no badges."
150
+ - F15 [1:50] "9 messages last month."
151
+ # Invented sample: Maya, her flat and this video do not exist. The
152
+ # disclosure stays out of the inputs so it does not leak into the packet;
153
+ # the README carries it.
154
+ # The pieces are the reference results of the three writers, except that the
155
+ # short video says the app costs "four pounds a month" and the newsletter says
156
+ # "nearly 40 people" signed up. The packet must bring both back to the facts
157
+ # sheet (three pounds; 38 people) and describe each change without repeating
158
+ # the wrong words, so neither can be copied from it.
159
+ expect:
160
+ contains: ["The week at a glance", "Before you post", "Changes at the desk", "[ADD: link to the video]", "38 people", "three pounds a month"]
161
+ excludes: ["nearly 40", "four pounds a month", "went viral", "in one weekend", "never coded", "96%", "29%"]
162
+ min_length: 3000
163
+ max_length: 20000
@@ -0,0 +1,11 @@
1
+ # Short-video script and cut list 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 script of about 30 seconds for TikTok, Reels or Shorts, with a hook, three beats and a closing line, and a cut list: for each clip, the timestamp it starts in and your exact first and last words. A checker holds every clip against the facts and the timestamps, and every line of on-screen text against the facts sheet.
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. With the transcript, clips can start and end on any of your words in the lines the sheet cites. "Release desk" puts the script 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 script has its sections and none of the easy roundings. Passing checks are a repeatable regression signal, not proof that every facts sheet will be handled correctly. Watch the clips before you post the cut.
@@ -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,13 @@
1
+ schemaVersion: v1alpha1
2
+ name: short-video-cut
3
+ description: |
4
+ Writes a 30-second script for TikTok, Reels or Shorts and a cut list from
5
+ the facts sheet of one video, podcast or talk: a hook, three beats and a
6
+ closing line, each clip with the timestamp and the exact words where it
7
+ starts and ends. Use after "Facts from a video", or with your own list of
8
+ what you said, when you want a short cut that says only what you said.
9
+ repositories: []
10
+ agentDefaults:
11
+ harness:
12
+ type: claude
13
+ model: sonnet
@@ -0,0 +1,46 @@
1
+ flow: mindburn.flow/v1
2
+ title: Short-video script and cut list from the facts
3
+ author: Mindburn Labs
4
+ version: "1.0.0"
5
+ license: MIT
6
+ tags: [social, marketing]
7
+ time: about 2 minutes
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, each clip can start and end on your exact words."
16
+ about_you:
17
+ type: text
18
+ optional: true
19
+ help: "Who you are and who watches, for example \"I make short videos about building small apps; most of my viewers are students\". It sets the voice, not the facts."
20
+ steps:
21
+ script:
22
+ title: Write the script and the cut list
23
+ agent: writer
24
+ kind: deliver
25
+ task: |
26
+ Write a short video cut from the original recording, built on the facts sheet. Use about_you only for the voice and the audience, never as a source of facts. Sections, in this order:
27
+
28
+ 1. **Script**: about 30 seconds for TikTok, Reels or Shorts, no more than 90 spoken words: the hook for the first two seconds, three beats and a closing line. Each part names its clip from the cut list and gives the words the speaker says in it; it may add a short line of on-screen text.
29
+ 2. **Cut list**: a table with columns Clip, Starts at, First words, Last words, Used for. Starts at is the timestamp of the line the clip starts in, such as [0:47], or "no timestamp" if the source has none. First words and last words are the speaker's words where the clip begins and ends, word for word.
30
+ 3. **Facts used**: every factual claim in the clips and the on-screen text, each with the facts-sheet ID if the sheet has IDs, its timestamp or first words, and the exact words it rests on.
31
+
32
+ Every clip is the speaker's own words about a fact on the sheet. If the transcript is given, you may start and end a clip on any words of the lines the sheet cites; otherwise use the exact words the sheet quotes. On-screen text follows the same rules as a post: never round a number, shorten or lengthen a time span, make a result bigger or more certain, drop a qualifier, state an opinion as a fact, or work out a figure the sheet does not state. A fact the sheet marks "unclear" is not stated as settled. Add no hype the speaker did not use, and no emojis.
33
+ check_script:
34
+ title: Check the clips against the facts and timestamps
35
+ agent: reviewer
36
+ kind: check
37
+ needs: [script]
38
+ checks: script
39
+ task: |
40
+ Check every clip against the facts sheet, and the transcript if it is given. Each clip starts at a timestamp the source has, its first and last words appear at that point word for word, and its words carry a fact on the sheet. Send back a clip with a timestamp the source does not have, words that are not the speaker's, or words cut so that they say more than the speaker meant, such as a qualifier cut off. Hold every line of on-screen text to the facts sheet: send back anything rounded, worked out, made bigger or more certain, an opinion stated as fact, or a fact the sheet does not have.
41
+
42
+ Then check the shape: the three sections are present and in order, the script has a hook, three beats and a closing line, each part names a clip that is in the cut list, the script keeps to 90 spoken words, and every factual claim appears under "Facts used". When you send work back, quote the script's words and the source's words side by side so the writer can correct them.
43
+ done:
44
+ - "Every clip starts at a timestamp the source has, and its first and last words are the speaker's, word for word."
45
+ - "No clip or on-screen line says more than the facts sheet: nothing rounded, worked out or made more certain."
46
+ - "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_cut:
4
+ name: Cuts only what the speaker said, at timestamps the transcript has
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. Excludes: the roundings it invites, the running cost before
75
+ # the correction, a result she never claims and percentages she never said.
76
+ expect:
77
+ contains: ["Script", "Cut list", "Hook", "Facts used"]
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: 600
80
+ max_length: 7000
@@ -0,0 +1,11 @@
1
+ # Facts from a video
2
+
3
+ Paste the transcript of a video, podcast or talk. You get a facts sheet: every number, result, claim, opinion and piece of advice the speaker states, each with an ID, the timestamp it came from and the speaker's exact words. Hedges such as "maybe" and "mostly" stay in. Self-corrections use the corrected figure, and anything said two ways is marked "unclear" instead of settled. A checker holds every row against the transcript and sends back anything the speaker did not say.
4
+
5
+ The sheet is what the other factories here write from: "X and LinkedIn posts from the facts", "Short-video script and cut list from the facts" and "Newsletter note from the facts" take it as their first input, and "Release desk" checks their pieces against it. It is also useful on its own, before you write anything from a recording.
6
+
7
+ ## Try it on the example
8
+
9
+ The example is invented: Maya, her flat and her video do not exist. It is the same transcript as in "One video, a week of posts". Her figures are easy to round up, such as "two weekends. Maybe three" and "about four, no, three pounds", so the check has something real to hold the sheet against. 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 sheet keeps the speaker's hedges, uses the corrected cost and adds no percentages she never worked out. Passing checks are a repeatable regression signal, not proof that every transcript will be handled correctly.
@@ -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,13 @@
1
+ schemaVersion: v1alpha1
2
+ name: video-facts
3
+ description: |
4
+ Reads the transcript of one video, podcast or talk and writes a facts sheet:
5
+ every number, result, claim and quote the speaker states, in their own
6
+ words, with each hedge kept and a timestamp or the first words for each.
7
+ Use before you write posts, clips or a newsletter from a video, so every
8
+ line can be checked against what was actually said.
9
+ repositories: []
10
+ agentDefaults:
11
+ harness:
12
+ type: claude
13
+ model: sonnet
@@ -0,0 +1,39 @@
1
+ flow: mindburn.flow/v1
2
+ title: Facts from a video
3
+ author: Mindburn Labs
4
+ version: "1.0.0"
5
+ license: MIT
6
+ tags: [social, marketing]
7
+ time: about 2 minutes
8
+ inputs:
9
+ transcript:
10
+ type: longtext
11
+ help: "The transcript of your video, podcast or talk, pasted as it is. Keep the timestamps if it has them: each fact then points to the moment it came from."
12
+ steps:
13
+ facts:
14
+ title: Write the facts sheet
15
+ agent: analyst
16
+ kind: deliver
17
+ task: |
18
+ Read the whole transcript and write a facts sheet that a writer can work from without the transcript. Sections, in this order:
19
+
20
+ 1. **Facts**: a table with columns ID, Where, Fact, Exact words. One row for each number, count, amount, time span, date, result, claim, opinion, lesson and piece of advice the speaker states. ID is F1, F2 and so on, in transcript order. Where is the timestamp of the line, such as [0:47], or, if the transcript has no timestamps, the first five words of the line in quotes. Fact says the point in plain words and keeps every qualifier the speaker attached, such as "maybe", "about", "mostly" or "to be fair"; an opinion is marked as the speaker's opinion. Exact words are the speaker's own words, word for word, under 40 words.
21
+ 2. **Quotes worth using**: up to eight short lines, word for word, that could stand on their own in a post, each with its Where and the ID of the fact it carries.
22
+ 3. **Corrections and unclear**: each place where the speaker corrects themselves, with the corrected figure as the fact and the correction noted; each figure or detail said two different ways without a correction, marked "unclear" without choosing between them; and each garbled passage, marked "unclear". If there are none, write "None."
23
+ 4. **Names**: every person, company, product or place named, other than the speaker, with its Where. If there are none, write "No one other than the speaker is named."
24
+
25
+ Use only the transcript. Never round a number, shorten or lengthen a time span, turn a hedge into a certainty, work out a figure the speaker did not say, such as a percentage, a total or a change between two numbers, or add a fact from what you know. A shorter sheet is better than a sheet with one fact the speaker did not state.
26
+ check_facts:
27
+ title: Check every fact against the transcript
28
+ agent: reviewer
29
+ kind: check
30
+ needs: [facts]
31
+ checks: facts
32
+ task: |
33
+ Hold every row of the facts sheet against the transcript. For each fact: its Where points to the line it came from; its exact words appear in that line word for word; the fact says no more than those words, with the same numbers, units and time spans; and every qualifier the speaker attached is still there. Send back any figure that is rounded, worked out, or made bigger or more certain than the transcript, any quote that is not word for word, any opinion stated as fact, and any fact the transcript does not state.
34
+
35
+ Then check that no number the speaker states is missing from the sheet, that each self-correction uses the corrected figure and says so, that anything said two ways is marked "unclear" rather than settled, and that all four sections are present and in order. When you send work back, quote the sheet's words and the transcript's words side by side so the analyst can correct them.
36
+ done:
37
+ - "Every fact on the sheet is in the transcript, with the same meaning and the speaker's qualifiers."
38
+ - "Every fact points to a timestamp, or to the first words of its line when the transcript has none."
39
+ - "Every self-correction and every detail said two ways is listed under \"Corrections and unclear\"."
@@ -0,0 +1,34 @@
1
+ version: 1
2
+ cases:
3
+ frying_pan_facts:
4
+ name: Keeps every figure and hedge exactly as the speaker said it
5
+ inputs:
6
+ transcript: |
7
+ [0:00] So this is the story of how a frying pan made me build an app.
8
+ [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.
9
+ [0:18] There are five of us in the flat. Everyone thought they did the most dishes. Everyone was wrong, including me.
10
+ [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?
11
+ [0:47] It took me two weekends. Maybe three, if you count the weekend I spent on the logo.
12
+ [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.
13
+ [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.
14
+ [1:27] I tried points first. Points made it worse. One flatmate started washing single teaspoons to collect points.
15
+ [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.
16
+ [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.
17
+ [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.
18
+ [2:22] It costs me about four, no, three pounds a month to run. Three.
19
+ [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.
20
+ [2:42] If you build something like this, start with the one message the app sends. Write that message first. Everything else is decoration.
21
+ [2:51] Anyway. The pan is clean. For now.
22
+ # Invented sample: Maya, her flat and this video do not exist. The
23
+ # disclosure stays out of the inputs so it does not leak into the result;
24
+ # the README carries it.
25
+ # Contains: the figures with the hedges the speaker attached, the corrected
26
+ # running cost and the sections. Excludes: the easy roundings (two weekends,
27
+ # maybe three; one coding course; 38 sign-ups, mostly friends of friends), a
28
+ # result she never claims, and percentages she never worked out (212 to 9;
29
+ # 11 of 38). A correction is noted, so "four" may appear beside it.
30
+ expect:
31
+ contains: ["212 messages", "38 people", "11 of them", "two weekends", "maybe three", "one coding course", "mostly friends of friends", "three pounds", "frying pan", "Quotes worth using", "Corrections and unclear"]
32
+ excludes: ["went viral", "in one weekend", "in a weekend", "40 people", "nearly 40", "almost 40", "never coded", "96%", "29%"]
33
+ min_length: 1200
34
+ max_length: 14000