@synap-core/cli 1.8.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/dist/commands/agent-chat.d.ts +47 -0
  2. package/dist/commands/agent-chat.js +250 -0
  3. package/dist/commands/agent-chat.js.map +1 -0
  4. package/dist/commands/agent-run.js +3 -4
  5. package/dist/commands/agent-run.js.map +1 -1
  6. package/dist/commands/agents.js +85 -46
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/automation.js +2 -1
  9. package/dist/commands/automation.js.map +1 -1
  10. package/dist/commands/bridge-setup.d.ts +66 -0
  11. package/dist/commands/bridge-setup.js +1112 -0
  12. package/dist/commands/bridge-setup.js.map +1 -0
  13. package/dist/commands/cap-connections.d.ts +28 -0
  14. package/dist/commands/cap-connections.js +224 -0
  15. package/dist/commands/cap-connections.js.map +1 -0
  16. package/dist/commands/capability.d.ts +89 -0
  17. package/dist/commands/capability.js +1523 -0
  18. package/dist/commands/capability.js.map +1 -0
  19. package/dist/commands/centrality.d.ts +20 -0
  20. package/dist/commands/centrality.js +94 -0
  21. package/dist/commands/centrality.js.map +1 -0
  22. package/dist/commands/connect.d.ts +2 -0
  23. package/dist/commands/connect.js +16 -35
  24. package/dist/commands/connect.js.map +1 -1
  25. package/dist/commands/context.js +4 -6
  26. package/dist/commands/context.js.map +1 -1
  27. package/dist/commands/data-extra.d.ts +1 -0
  28. package/dist/commands/data-extra.js +34 -10
  29. package/dist/commands/data-extra.js.map +1 -1
  30. package/dist/commands/data.d.ts +4 -4
  31. package/dist/commands/data.js +241 -184
  32. package/dist/commands/data.js.map +1 -1
  33. package/dist/commands/diagnose.d.ts +20 -0
  34. package/dist/commands/diagnose.js +143 -0
  35. package/dist/commands/diagnose.js.map +1 -0
  36. package/dist/commands/digest.d.ts +17 -0
  37. package/dist/commands/digest.js +121 -0
  38. package/dist/commands/digest.js.map +1 -0
  39. package/dist/commands/discover.d.ts +2 -0
  40. package/dist/commands/discover.js +25 -8
  41. package/dist/commands/discover.js.map +1 -1
  42. package/dist/commands/events.js +2 -1
  43. package/dist/commands/events.js.map +1 -1
  44. package/dist/commands/explain.d.ts +1 -1
  45. package/dist/commands/explain.js +18 -15
  46. package/dist/commands/explain.js.map +1 -1
  47. package/dist/commands/facet.d.ts +29 -0
  48. package/dist/commands/facet.js +113 -0
  49. package/dist/commands/facet.js.map +1 -0
  50. package/dist/commands/graph.js +2 -1
  51. package/dist/commands/graph.js.map +1 -1
  52. package/dist/commands/import.d.ts +38 -0
  53. package/dist/commands/import.js +440 -0
  54. package/dist/commands/import.js.map +1 -0
  55. package/dist/commands/init.js +35 -16
  56. package/dist/commands/init.js.map +1 -1
  57. package/dist/commands/keys.js +3 -4
  58. package/dist/commands/keys.js.map +1 -1
  59. package/dist/commands/knowledge.d.ts +2 -0
  60. package/dist/commands/knowledge.js +61 -9
  61. package/dist/commands/knowledge.js.map +1 -1
  62. package/dist/commands/launch.d.ts +50 -0
  63. package/dist/commands/launch.js +790 -0
  64. package/dist/commands/launch.js.map +1 -0
  65. package/dist/commands/lens.d.ts +45 -0
  66. package/dist/commands/lens.js +386 -0
  67. package/dist/commands/lens.js.map +1 -0
  68. package/dist/commands/market.d.ts +209 -0
  69. package/dist/commands/market.js +1368 -0
  70. package/dist/commands/market.js.map +1 -0
  71. package/dist/commands/mcp.d.ts +42 -0
  72. package/dist/commands/mcp.js +184 -0
  73. package/dist/commands/mcp.js.map +1 -0
  74. package/dist/commands/observe.js +14 -11
  75. package/dist/commands/observe.js.map +1 -1
  76. package/dist/commands/open.d.ts +21 -4
  77. package/dist/commands/open.js +45 -4
  78. package/dist/commands/open.js.map +1 -1
  79. package/dist/commands/pod.d.ts +100 -0
  80. package/dist/commands/pod.js +359 -0
  81. package/dist/commands/pod.js.map +1 -0
  82. package/dist/commands/pods.d.ts +1 -0
  83. package/dist/commands/pods.js +77 -15
  84. package/dist/commands/pods.js.map +1 -1
  85. package/dist/commands/proposals-actions.js +40 -3
  86. package/dist/commands/proposals-actions.js.map +1 -1
  87. package/dist/commands/purge.d.ts +23 -0
  88. package/dist/commands/purge.js +148 -0
  89. package/dist/commands/purge.js.map +1 -0
  90. package/dist/commands/raycast.d.ts +15 -0
  91. package/dist/commands/raycast.js +153 -0
  92. package/dist/commands/raycast.js.map +1 -0
  93. package/dist/commands/sessions.js +45 -21
  94. package/dist/commands/sessions.js.map +1 -1
  95. package/dist/commands/skill-manage.d.ts +21 -0
  96. package/dist/commands/skill-manage.js +195 -0
  97. package/dist/commands/skill-manage.js.map +1 -0
  98. package/dist/commands/skills-commands.js +2 -1
  99. package/dist/commands/skills-commands.js.map +1 -1
  100. package/dist/commands/skills.js +4 -3
  101. package/dist/commands/skills.js.map +1 -1
  102. package/dist/commands/status.d.ts +3 -1
  103. package/dist/commands/status.js +166 -14
  104. package/dist/commands/status.js.map +1 -1
  105. package/dist/commands/statusline.d.ts +24 -0
  106. package/dist/commands/statusline.js +450 -0
  107. package/dist/commands/statusline.js.map +1 -0
  108. package/dist/commands/subscribe.js +2 -2
  109. package/dist/commands/subscribe.js.map +1 -1
  110. package/dist/commands/tools.d.ts +30 -0
  111. package/dist/commands/tools.js +315 -0
  112. package/dist/commands/tools.js.map +1 -0
  113. package/dist/commands/versions.d.ts +27 -0
  114. package/dist/commands/versions.js +277 -0
  115. package/dist/commands/versions.js.map +1 -0
  116. package/dist/commands/view.js +3 -2
  117. package/dist/commands/view.js.map +1 -1
  118. package/dist/commands/whoami.d.ts +21 -0
  119. package/dist/commands/whoami.js +129 -0
  120. package/dist/commands/whoami.js.map +1 -0
  121. package/dist/index.js +776 -60
  122. package/dist/index.js.map +1 -1
  123. package/dist/lib/approval-poll.d.ts +42 -0
  124. package/dist/lib/approval-poll.js +52 -0
  125. package/dist/lib/approval-poll.js.map +1 -0
  126. package/dist/lib/auth.d.ts +29 -6
  127. package/dist/lib/auth.js +105 -94
  128. package/dist/lib/auth.js.map +1 -1
  129. package/dist/lib/bundle-version.d.ts +11 -0
  130. package/dist/lib/bundle-version.js +33 -0
  131. package/dist/lib/bundle-version.js.map +1 -0
  132. package/dist/lib/capture-lane.d.ts +30 -12
  133. package/dist/lib/capture-lane.js +71 -14
  134. package/dist/lib/capture-lane.js.map +1 -1
  135. package/dist/lib/cp-packages.d.ts +121 -0
  136. package/dist/lib/cp-packages.js +218 -0
  137. package/dist/lib/cp-packages.js.map +1 -0
  138. package/dist/lib/describe-lens.d.ts +46 -0
  139. package/dist/lib/describe-lens.js +33 -0
  140. package/dist/lib/describe-lens.js.map +1 -0
  141. package/dist/lib/hub-client.d.ts +78 -1
  142. package/dist/lib/hub-client.js +474 -22
  143. package/dist/lib/hub-client.js.map +1 -1
  144. package/dist/lib/installed.d.ts +51 -0
  145. package/dist/lib/installed.js +70 -0
  146. package/dist/lib/installed.js.map +1 -0
  147. package/dist/lib/next-steps.d.ts +61 -0
  148. package/dist/lib/next-steps.js +146 -0
  149. package/dist/lib/next-steps.js.map +1 -0
  150. package/dist/lib/pod.d.ts +91 -19
  151. package/dist/lib/pod.js +222 -56
  152. package/dist/lib/pod.js.map +1 -1
  153. package/dist/lib/project-ref.d.ts +95 -0
  154. package/dist/lib/project-ref.js +144 -0
  155. package/dist/lib/project-ref.js.map +1 -0
  156. package/dist/lib/project.d.ts +35 -0
  157. package/dist/lib/project.js +39 -0
  158. package/dist/lib/project.js.map +1 -0
  159. package/dist/lib/session-lens.d.ts +33 -0
  160. package/dist/lib/session-lens.js +76 -0
  161. package/dist/lib/session-lens.js.map +1 -0
  162. package/dist/lib/skill-import.d.ts +40 -0
  163. package/dist/lib/skill-import.js +203 -0
  164. package/dist/lib/skill-import.js.map +1 -0
  165. package/dist/lib/skills-installer.d.ts +17 -6
  166. package/dist/lib/skills-installer.js +133 -19
  167. package/dist/lib/skills-installer.js.map +1 -1
  168. package/dist/lib/suite.d.ts +28 -0
  169. package/dist/lib/suite.js +29 -0
  170. package/dist/lib/suite.js.map +1 -0
  171. package/dist/lib/superwhisper-import.d.ts +40 -0
  172. package/dist/lib/superwhisper-import.js +389 -0
  173. package/dist/lib/superwhisper-import.js.map +1 -0
  174. package/dist/lib/targets.d.ts +49 -1
  175. package/dist/lib/targets.js +420 -288
  176. package/dist/lib/targets.js.map +1 -1
  177. package/dist/lib/unwrapList.d.ts +1 -0
  178. package/dist/lib/unwrapList.js +20 -0
  179. package/dist/lib/unwrapList.js.map +1 -0
  180. package/dist/utils/logger.d.ts +2 -0
  181. package/dist/utils/logger.js +10 -2
  182. package/dist/utils/logger.js.map +1 -1
  183. package/package.json +9 -4
  184. package/skills/agent-os/SKILL.md +212 -0
  185. package/skills/manifest.json +5 -0
  186. package/skills/onboard/SKILL.md +186 -0
  187. package/skills/synap/SKILL.md +1182 -37
  188. package/skills/synap/_order.txt +37 -0
  189. package/skills/synap/_skill.yaml +24 -0
  190. package/skills/synap/authentication.md +10 -0
  191. package/skills/synap/automations.md +264 -0
  192. package/skills/synap/capabilities.md +107 -0
  193. package/skills/synap/capture.md +10 -0
  194. package/skills/synap/cli-operations.md +107 -0
  195. package/skills/synap/common-mistakes.md +12 -0
  196. package/skills/synap/creative-loop.md +43 -0
  197. package/skills/synap/crm.md +117 -0
  198. package/skills/synap/diagnostics.md +35 -0
  199. package/skills/synap/digesting-a-channel.md +38 -0
  200. package/skills/synap/document-embeds.md +123 -0
  201. package/skills/synap/escalation-ladder.md +71 -0
  202. package/skills/synap/focus-sessions.md +47 -0
  203. package/skills/synap/governance-rules.md +64 -0
  204. package/skills/synap/governance.md +6 -6
  205. package/skills/synap/graph-gardening.md +21 -0
  206. package/skills/synap/inline-patterns.md +38 -0
  207. package/skills/synap/lenses.md +38 -0
  208. package/skills/synap/linking-principle.md +39 -0
  209. package/skills/synap/linking.md +1 -0
  210. package/skills/synap/mental-model.md +45 -0
  211. package/skills/synap/more.md +7 -0
  212. package/skills/synap/multi-entity-capture.md +10 -0
  213. package/skills/synap/next-action.md +37 -0
  214. package/skills/synap/north-star.md +17 -0
  215. package/skills/synap/operating-mode-rules.md +45 -0
  216. package/skills/synap/operating-mode.md +9 -0
  217. package/skills/synap/quick-reference.md +67 -0
  218. package/skills/synap/reading.md +43 -0
  219. package/skills/synap/recap.md +21 -0
  220. package/skills/synap/reflexes.md +46 -0
  221. package/skills/synap/response-style.md +21 -0
  222. package/skills/synap/scope.md +13 -0
  223. package/skills/synap/showing.md +17 -0
  224. package/skills/synap/user-model.md +25 -0
  225. package/skills/synap/viewframe-cells.md +290 -0
  226. package/skills/synap/work-flow.md +113 -0
  227. package/skills/synap/worked-examples.md +53 -0
  228. package/skills/synap/workspace-design.md +45 -0
  229. package/skills/synap/workspace-edges.md +49 -0
  230. package/skills/synap/writes.md +156 -0
  231. package/skills/synap-schema/SKILL.md +97 -6
  232. package/skills/synap-schema/_order.txt +13 -0
  233. package/skills/synap-schema/_skill.yaml +22 -0
  234. package/skills/synap-schema/before-you-touch.md +14 -0
  235. package/skills/synap-schema/common-mistakes.md +9 -0
  236. package/skills/synap-schema/creating-profiles.md +17 -0
  237. package/skills/synap-schema/discover-profiles.md +24 -0
  238. package/skills/synap-schema/entity-scope.md +8 -0
  239. package/skills/synap-schema/extend-vs-create.md +31 -0
  240. package/skills/synap-schema/more.md +6 -0
  241. package/skills/synap-schema/overlay-properties.md +22 -0
  242. package/skills/synap-schema/profiles.md +3 -0
  243. package/skills/synap-schema/property-defs.md +29 -0
  244. package/skills/synap-schema/read-before-write.md +50 -0
  245. package/skills/synap-schema/relations.md +18 -0
  246. package/skills/synap-schema/worked-example.md +30 -0
  247. package/skills/synap-ui/SKILL.md +26 -2
  248. package/skills/synap-ui/_order.txt +13 -0
  249. package/skills/synap-ui/_skill.yaml +23 -0
  250. package/skills/synap-ui/ai-companion.md +27 -0
  251. package/skills/synap-ui/arranging-bento.md +8 -0
  252. package/skills/synap-ui/before-you-build.md +20 -0
  253. package/skills/synap-ui/bento-layouts.md +35 -0
  254. package/skills/synap-ui/common-mistakes.md +10 -0
  255. package/skills/synap-ui/creating-views.md +26 -0
  256. package/skills/synap-ui/four-builds.md +24 -0
  257. package/skills/synap-ui/more.md +7 -0
  258. package/skills/synap-ui/proposing-vs-extending.md +11 -0
  259. package/skills/synap-ui/view-list.md +24 -0
  260. package/skills/synap-ui/views.md +3 -0
  261. package/skills/synap-ui/worked-example.md +18 -0
  262. package/skills/synap-ui/workspaces.md +47 -0
  263. package/templates/automations/bookmark-enrichment.automation.json +44 -0
  264. package/templates/automations/mail-feed.automation.json +86 -0
  265. package/templates/automations/url-bookmark-capture.automation.json +70 -0
  266. package/templates/skills/README.md +21 -0
  267. package/templates/skills/authoring-automations/SKILL.md +95 -0
  268. package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
  269. package/templates/skills/authoring-capabilities/SKILL.md +93 -0
  270. package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
  271. package/templates/skills/authoring-playbooks/SKILL.md +102 -0
  272. package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
  273. package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
  274. package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
  275. package/templates/skills/coordinating-agents/SKILL.md +32 -0
  276. package/templates/skills/coordinating-branches/SKILL.md +27 -0
  277. package/templates/skills/mapping-the-server/SKILL.md +54 -0
  278. package/templates/skills/reading-client-progress/SKILL.md +65 -0
  279. package/templates/skills/routing-to-channels/SKILL.md +54 -0
  280. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  281. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  282. package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  283. package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  284. package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  285. package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  286. package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  287. package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  288. package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  289. package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  290. package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  291. package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  292. package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  293. package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  294. package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  295. package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  296. package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  297. package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  298. package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  299. package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  300. package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  301. package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  302. package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  303. package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  304. package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  305. package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  306. package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  307. package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  308. package/dist/commands/connectors.d.ts +0 -31
  309. package/dist/commands/connectors.js +0 -276
  310. package/dist/commands/connectors.js.map +0 -1
  311. package/dist/commands/finish.d.ts +0 -25
  312. package/dist/commands/finish.js +0 -274
  313. package/dist/commands/finish.js.map +0 -1
  314. package/dist/commands/openclaw.d.ts +0 -40
  315. package/dist/commands/openclaw.js +0 -1148
  316. package/dist/commands/openclaw.js.map +0 -1
  317. package/dist/commands/security-audit.d.ts +0 -12
  318. package/dist/commands/security-audit.js +0 -100
  319. package/dist/commands/security-audit.js.map +0 -1
  320. package/dist/lib/hardening.d.ts +0 -18
  321. package/dist/lib/hardening.js +0 -214
  322. package/dist/lib/hardening.js.map +0 -1
  323. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -881
  324. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -907
  325. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -907
  326. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -851
  327. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  328. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1143
  329. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  330. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -111
  331. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -77
  332. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -639
@@ -0,0 +1,160 @@
1
+ # Worked examples: how a great review looks
2
+
3
+ This document contains real review snippets, anonymized just enough to be reusable. Use them as a calibration set for tone, depth, and structure.
4
+
5
+ ## Example 1: Q2 Description review
6
+
7
+ ### What the client submitted
8
+
9
+ > *"Antevorta is a French gold tokenization platform built for retail investors. Our solution makes gold ownership simple and secure. Antevorte (sic) leverages blockchain for ownership transparency. Investors hold tokenized fractions of LBMA-certified Swiss vault gold. We target 10,000 investors in Year 1 across Europe."*
10
+
11
+ ### Status
12
+
13
+ UNDERSELLING (rewrite required)
14
+
15
+ ### Review (client-friendly French commentary)
16
+
17
+ *"Le Q2 actuel contient trois faiblesses qui ont coûté l'acceptation à plusieurs dossiers passés. D'abord, le mot Stellar n'apparaît pas. Trois dossiers récents (Tessera Labs $150K SCF #42, Stableyard $119.5K SCF #40, Move-to-Stellar $115K SCF #42) ont été rejetés en partie parce que le panel ne voyait pas pourquoi le projet avait choisi Stellar plutôt qu'une autre chaîne. Deuxième faiblesse, la typo "Antevorte" au lieu d'Antevorta crée un doute sur l'attention portée au dossier (la cohérence orthographique compte). Troisième faiblesse, la promesse "10,000 investors in Year 1" ressemble à un TAM générique sans canal de distribution nommé, un facteur récurrent de rejet (Stableyard, Resolva $120K SCF #42, Paenote $150K SCF #40). Le positionnement "bankruptcy-proof Swiss-grade gold" qui apparaît sur le site n'est pas dans le dossier, alors que c'est précisément la différenciation forte. La réécriture surface cette positioning, le partenaire vault, le cadre réglementaire Art L.411-2 CMF, et la primitive Soroban GoldCoin.rs avec engagement open-source MIT."*
18
+
19
+ ### Rewrite / Action (paste-ready English)
20
+
21
+ > *"Antevorta is the first French gold tokenization platform issuing bankruptcy-proof NFT gold certificates on Stellar Soroban, custodied in Swiss-grade vaults (Loomis or MKS PAMP, to confirm).*
22
+ >
23
+ > *Product: each NFT GoldCoin maps 1:1 to a physical gold coin stored in our LBMA-certified vault partner, with the certificate transferable peer-to-peer or redeemable for physical delivery. Soroban GoldCoin.rs (MIT open-source) handles ownership transfer and atomic settlement against USDC.*
24
+ >
25
+ > *Why Stellar: gold coins trade in low-margin secondary markets where EVM gas (5 to 50 USD per transfer) breaks unit economics. Stellar's sub-cent fees and 5-second finality make peer-to-peer gold transfers viable at retail size for the first time.*
26
+ >
27
+ > *Traction: pre-launch under the placement privé Art L.411-2 CMF framework, with KYC-cleared distribution to French wealth advisors (CGPs) and family offices. Co-founders bring credentials including SKEMA Track Finance and Quants, Nordea Asset Management institutional client coverage, Bitget COO Apprentice, and Top 0.1 percent IMC Worldwide Quant Trading Competition.*
28
+ >
29
+ > *Day-1 distribution: French CGP network and HNW family offices via existing pipeline."*
30
+
31
+ (Character count: 1004 chars, refine to land at 990-998.)
32
+
33
+ ---
34
+
35
+ ## Example 2: Q10 Team review
36
+
37
+ ### What the client submitted
38
+
39
+ > *"Vincent (CEO) has experience in finance and entrepreneurship. Jules (COO) handles gold market and HNW client management. William (CTO) handles technical architecture and smart contract development."*
40
+
41
+ ### Status
42
+
43
+ BLOCKER (rewrite required, plus enrichment from LinkedIn)
44
+
45
+ ### Review (client-friendly French commentary)
46
+
47
+ *"Le Q10 actuel pose deux problèmes majeurs. D'abord, l'absence des noms de famille et des URLs LinkedIn déclenche le facteur de rejet le plus fréquent de notre base de données: cinq dossiers récents ont été rejetés pour la même raison (Sorotrack $150K SCF #40 trois fois, AION_FI $146.5K SCF #40 PRF, Tessera Labs $150K SCF #42, REAPP $115K SCF #42, Pollar $72K SCF #42). Le panel a besoin de pouvoir vérifier qui ils financent. Deuxième problème, le Q10 actuel sous-vend massivement la team par rapport à ce que leurs LinkedIn révèlent. Vincent (SKEMA Track Finance and Quants 2024-2026, Nova Lisbon Master Impact Entrepreneurship, BNP Paribas Client Advisor, Nordea Asset Management institutional clients across Europe, Singapore, Latam on multi-asset SICAV funds, Bitget COO Apprentice Program), Jules (SKEMA Master Finance Strategy Entrepreneurship 2024-2027, Toronto Metropolitan University exchange Spring 2026 International Finance, Banque Populaire Corporate Account Manager intern, Red Bull Student Marketeer), William (KU Leuven Master Financial Economics, Top 0.1 percent IMC Worldwide Quant Trading Competition sur 30 000+ participants, Bitget Builder 1+ an, certifications DeFi Future of Finance + PE/VC + Bloomberg Market Concepts, Greenhill Capital Belgium Student Investment Club 385K EUR AUM). Le Top 0.1 percent IMC est particulièrement important parce qu'il crédibilise William comme CTO avec une compétence quant directement applicable au design de smart contracts Soroban. Le combo Bitget COO Apprentice + Builder signale des relations actives dans l'écosystème crypto (Bitget est top 5 CEX mondial). La réécriture intègre toutes ces credentials."*
48
+
49
+ ### Rewrite / Action (paste-ready English)
50
+
51
+ > *"Vincent [LastName], CEO and Co-founder (Paris, France)*
52
+ > *LinkedIn: https://www.linkedin.com/in/[handle]/*
53
+ > *Education: SKEMA Business School PGE Track Finance and Quants 2024-2026, Nova SBE Lisbon Master Impact Entrepreneurship 2022-2023.*
54
+ > *Experience: Nordea Asset Management (financial models for institutional clients across Europe, Singapore, Latam on Equity, Fixed Income, Multi-Asset SICAV funds), BNP Paribas Client Advisor (wealth management initiatives), Bitget COO Apprentice Program (crypto ecosystem).*
55
+ > *Role at Antevorta: leads regulatory framework (Art L.411-2 CMF, placement prive) and CGP distribution channel.*
56
+ >
57
+ > *Jules [LastName], COO and Co-founder (Paris, France)*
58
+ > *LinkedIn: https://www.linkedin.com/in/[handle]/*
59
+ > *Education: SKEMA Business School Master PGE Finance, Strategy, Entrepreneurship 2024-2027, Toronto Metropolitan University exchange Spring 2026 International Finance.*
60
+ > *Experience: Banque Populaire Corporate Account Manager intern, Red Bull Student Marketeer.*
61
+ > *Role at Antevorta: gold market sourcing, HNW relationship management, vault partner relations.*
62
+ >
63
+ > *William Muller, CTO and Co-founder ([city], Belgium)*
64
+ > *LinkedIn: https://www.linkedin.com/in/[handle]/*
65
+ > *GitHub: https://github.com/[handle]*
66
+ > *Education: KU Leuven Master Financial Economics.*
67
+ > *Recognition: Top 0.1 percent at IMC Worldwide Quant Trading Competition (out of 30,000+ participants).*
68
+ > *Experience: Bitget Builder 1+ year, Greenhill Capital Belgium Student Investment Club (385K EUR AUM).*
69
+ > *Certifications: DeFi (Future of Finance), PE/VC, Bloomberg Market Concepts.*
70
+ > *Role at Antevorta: Soroban smart contract architecture (GoldCoin.rs), backend, vault custody integration.*
71
+ >
72
+ > *Company: Antevorta SAS (RCS Paris [registry number to confirm]).*
73
+ > *Website: https://antevorta-gold.com/ | X: @AntevortaGold."*
74
+
75
+ ---
76
+
77
+ ## Example 3: Q15 Budget review
78
+
79
+ ### What the client submitted
80
+
81
+ > *"Budget: $150,000."*
82
+
83
+ ### Status
84
+
85
+ WEAK (rewrite required, drop budget)
86
+
87
+ ### Review (client-friendly English commentary)
88
+
89
+ > *"The maximum ask of $150K triggers heightened scrutiny in our experience. In past SCF rounds, five maximum-ask dossiers were rejected specifically because the scope or team did not justify the maximum (StellarRead $150K, Easner $150K, Tessera Labs $150K, AION_FI $146.5K, $NRG Token $150K). The Antevorta scope matches more closely to Bando ($75K SCF #42 winner, real estate RWA Mexico) and below The Signal ($121K SCF #42 winner, B2B marketplace with one Soroban contract). With three founders, one core Soroban contract (GoldCoin.rs), and a French regulatory framework not yet filed, we recommend $110,000 structured as three equivalent tranches of $36,667. This sits between Bando's narrow-pilot anchor and The Signal's broader-distribution anchor, signaling that you have calibrated the ask. Going to $144K (For Yield benchmark) would require an 11-person team plus AMF filing, neither of which currently applies."*
90
+
91
+ ### Rewrite / Action
92
+
93
+ > *"Budget: $110,000. Three equivalent tranches of $36,667. Budget anchored on Bando ($75K SCF #42 winner, narrow-pilot RWA) and The Signal ($121K SCF #42 winner, B2B distribution), sized for Antevorta's three-founder team, single core Soroban contract, and pre-filed regulatory framework."*
94
+
95
+ ---
96
+
97
+ ## Example 4: Q8 Thumbnail review
98
+
99
+ ### What the client submitted
100
+
101
+ > *"[Thumbnail field empty]"*
102
+
103
+ ### Status
104
+
105
+ BLOCKER
106
+
107
+ ### Review (client-friendly English commentary)
108
+
109
+ > *"Q8 is empty. This single missing field is enough to put the dossier in Information Collection status, which is how five past dossiers died without ever reaching panel review (The Strategists $150K SCF #42, Cushion $118.4K SCF #41, Payala $150K SCF #41, Neon Wallet $129K SCF #41, SendbyKatika $150K SCF #40). The fix takes 15 minutes: your website already has a deployed og-image.webp at https://antevorta-gold.com/og-image.webp which can be cropped to 1200x630 px. Upload that to Q8."*
110
+
111
+ ### Rewrite / Action
112
+
113
+ > *"Upload thumbnail: 1200x630 px. Source: https://antevorta-gold.com/og-image.webp (already deployed on your website, crop to spec). Alternative: generate a new split-screen showing a tokenized gold coin on one side, the Soroban logo on the other, with title 'Antevorta: Gold on Stellar'."*
114
+
115
+ ---
116
+
117
+ ## Example 5: Banner verdict text
118
+
119
+ ### What it looks like in the Excel banner row
120
+
121
+ > *"Antevorta Gold Abstract Review v2"*
122
+ > *"Estimated 35 to 45 percent probability of acceptance as currently drafted, lifting to 65 to 75 percent after the seven fixes below. Major lift comes from re-surfacing the LinkedIn credentials in Q10 (SKEMA Track Finance and Quants, Bitget COO Apprentice, Top 0.1 percent IMC Worldwide Quant Trading, KU Leuven Financial Economics), adding Stellar reasoning to Q2, naming the vault partner, and uploading Q8 thumbnail."*
123
+ > *"Recommended budget: $110,000 Integration Track, anchored on Bando ($75K SCF #42 winner) and The Signal ($121K SCF #42 winner)."*
124
+
125
+ ---
126
+
127
+ ## Example 6: Chat summary after delivery
128
+
129
+ After saving the Excel and calling `present_files`, the chat message looks like:
130
+
131
+ > *"Dossier livré, fichier v2 sauvegardé.*
132
+ >
133
+ > *Verdict: estimated 35 to 45 percent probability now, 65 to 75 percent after the seven priority fixes.*
134
+ >
135
+ > *Top 5 fixes (in priority order):*
136
+ > *1. Q10 Team: ENRICH with LinkedIn credentials (Top 0.1 percent IMC Quant, Bitget COO Apprentice, KU Leuven, Nordea Asset Management institutional clients). This alone lifts probability by roughly 15 to 20 points.*
137
+ > *2. Q8 Thumbnail: upload from existing og-image.webp on the website. Empty Q8 risks Information Collection status (five past dossiers died this way).*
138
+ > *3. Q2 Description: rewrite to surface 'bankruptcy-proof Swiss-grade gold on Stellar' positioning. Fix Antevorte typo to Antevorta.*
139
+ > *4. Q15 Budget: drop from $150K to $110K to align with Bando and The Signal precedents. Three past max-ask dossiers in regulated RWA were rejected.*
140
+ > *5. Q12 Discord usernames: replace slash separator with comma per SCF instruction.*
141
+ >
142
+ > *Recommended budget anchor: $110K Integration Track, three tranches of $36,667.*
143
+ >
144
+ > *[Open the file](computer://path/to/Antevorta_Abstract_Review_v2.xlsx)"*
145
+
146
+ ---
147
+
148
+ ## Calibration checklist
149
+
150
+ Use these examples to calibrate every review you produce:
151
+
152
+ 1. Is each finding anchored on a named past dossier? (Examples 1-4 cite Sorotrack, Stableyard, AION_FI, etc.)
153
+ 2. Is each rewrite paste-ready English? (Examples 1-3 show this.)
154
+ 3. Does the budget cite a specific named anchor with a specific amount? (Example 3 cites Bando $75K and The Signal $121K.)
155
+ 4. Is the language client-friendly with zero internal jargon? (No "kill signature" appears anywhere in the examples.)
156
+ 5. Is each finding paired with a fix and an effort estimate (15 min, 1h, 1 day)?
157
+ 6. Does the banner give an honest probability range with the specific lift?
158
+ 7. Is the file free of em-dashes?
159
+
160
+ If yes to all seven, the review is ready.
@@ -0,0 +1,253 @@
1
+ """
2
+ Abstract Review Builder
3
+ =======================
4
+
5
+ Scaffolds the 4-sheet Excel deliverable for an SCF Abstract review.
6
+
7
+ Usage:
8
+ Customize the FIELDS list, CHECKLIST, COMPARABLES, INTEGRATION_AUDIT,
9
+ BANNER_TEXT and PROJECT_NAME for the dossier being reviewed,
10
+ then run: python abstract-review-builder.py
11
+
12
+ Outputs:
13
+ {PROJECT_NAME}_Abstract_Review_v{VERSION}.xlsx
14
+
15
+ Conventions:
16
+ - Column D (rewrites) MUST be paste-ready English.
17
+ - Column C (commentary) can be French or English depending on client.
18
+ - NEVER use "kill signature" anywhere in any cell.
19
+ - NEVER use em-dashes anywhere in any cell.
20
+ """
21
+
22
+ from openpyxl import Workbook
23
+ from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
24
+ from openpyxl.utils import get_column_letter
25
+ import sys
26
+
27
+ PROJECT_NAME = "ProjectX"
28
+ VERSION = "1"
29
+ OUT = f"/sessions/eloquent-inspiring-cannon/mnt/outputs/{PROJECT_NAME}_Abstract_Review_v{VERSION}.xlsx"
30
+
31
+ BANNER_TEXT = (
32
+ f"{PROJECT_NAME} Abstract Review v{VERSION}: estimated XX to YY percent probability of acceptance "
33
+ f"as currently drafted, lifting to AA to BB percent after the N fixes below. "
34
+ f"Recommended budget anchor: $XXX,000 Integration Track, anchored on [Named Past Winner] ($YYK SCF #NN)."
35
+ )
36
+
37
+ # -------------------------------------------------------------------
38
+ # Sheet 1: Field-by-Field Review
39
+ # -------------------------------------------------------------------
40
+ # Format: (Field, Status, Review (FR or EN), Rewrite/Action (EN paste-ready))
41
+ FIELDS = [
42
+ ("Q1 Project Title", "STRONG", "Le titre est specifique...", "[Project Name]"),
43
+ ("Q2 Description", "WEAK", "Le Q2 manque...", "[Project Name] is [the positioning], serving [segment]. The product: ... Why Stellar: ... Traction: ... Day-1 distribution: ..."),
44
+ ("Q3 Project Category", "SOLID", "Bien choisi...", "Application"),
45
+ ("Q4 Traction", "UNDERSELLING", "Le dossier ne mentionne pas...", "PRODUCT: [url, x, github, metrics]. PIPELINE: ... PARTNERS: ... RECOGNITIONS: ..."),
46
+ ("Q5 Website URL", "STRONG", "URL valide", "https://yourdomain.com/"),
47
+ ("Q6 Integration Description", "WEAK", "Aucun nom de contrat...", "[Project] uses Soroban as ... Phase 1 ... Phase 2 ... Phase 3 ... Why Stellar ... Integration List items: ..."),
48
+ ("Q7 Track", "SOLID", "Integration Track est defendable", "Integration Track"),
49
+ ("Q8 Thumbnail", "BLOCKER", "Q8 vide. Five past dossiers died in Information Collection status...", "Upload 1200x630 thumbnail. Source: existing og-image.webp on website."),
50
+ ("Q9 Submitter type", "SOLID", "Entity est correct", "Entity"),
51
+ ("Q10 Team", "UNDERSELLING", "Le Q10 sous-vend la team. LinkedIn credentials a integrer...", "[Founder 1 with LinkedIn URL + role + experience + recognition...]"),
52
+ ("Q11 Number of team members", "SOLID", "Coherent avec Q10", "3"),
53
+ ("Q12 Discord usernames", "WEAK", "Separateur slash au lieu de virgule par instruction SCF", "username1, username2, username3"),
54
+ ]
55
+
56
+ # -------------------------------------------------------------------
57
+ # Sheet 2: Checklist Pre-Submit
58
+ # -------------------------------------------------------------------
59
+ # Format: (Priority, Item, Field, Effort, Why it matters, Status)
60
+ CHECKLIST = [
61
+ ("BLOCKER", "Upload thumbnail Q8 from existing og-image.webp", "Q8", "15 min", "Empty Q8 risks Information Collection status. Five past dossiers died this way.", ""),
62
+ ("CRITICAL", "Add LinkedIn URLs for all three co-founders in Q10", "Q10", "30 min", "Anonymous founders is the most reliable predictor of rejection in our database.", ""),
63
+ ("CRITICAL", "Enrich Q10 with named credentials (schools, prior roles, recognitions)", "Q10", "1h", "Surface signals the team underestimates: IMC Top 0.1 pct, Bitget COO Apprentice, Bloomberg Market Concepts.", ""),
64
+ ("IMPORTANT", "Rewrite Q2 to surface Stellar positioning", "Q2", "1h", "No mention of Stellar in Q2 is a pattern shared by several rejected dossiers.", ""),
65
+ ("IMPORTANT", "Drop budget from $150K to anchor on Bando + The Signal", "Q15 in Build phase", "5 min", "Max ask without scope triggers heightened scrutiny.", ""),
66
+ ("STRATEGIC", "Add 2-3 SCF Integration List items to Q6", "Q6", "30 min", "Strongest dossiers leverage 3-7 Integration List items.", ""),
67
+ ("STRATEGIC", "Fix Q12 Discord separator from slash to comma", "Q12", "5 min", "Small detail signals attention to instructions.", ""),
68
+ ]
69
+
70
+ # -------------------------------------------------------------------
71
+ # Sheet 3: Comparables Corpus
72
+ # -------------------------------------------------------------------
73
+ # Format: (Project, Round, Budget, Verdict, Category, Profile, Lesson)
74
+ COMPARABLES = [
75
+ (f"{PROJECT_NAME} (current dossier)", "SCF #44", "TBD", "TBD", "Application / Financial Protocol", "Profile snapshot one-liner.", "N/A this is the current dossier."),
76
+ ("The Signal", "SCF #42", "$121,000", "Won", "B2B marketplace + escrow", "2 doxxed cofounders, DealEscrow.rs, Atomic Splits, B2B verticals named.", "Closest budget anchor for $115K-$125K dossiers."),
77
+ ("Bando", "SCF #42", "$75,000", "Won", "RWA real estate Mexico", "Doxxed team, named brokerage partner, country pilot.", "Anchor for narrow-pilot dossiers at $75K-$90K."),
78
+ ("TheXBank", "SCF #40", "$89,500", "Won", "Africa banking", "Doxxed team, country pilot named.", "Anchor for emerging-market banking $80K-$100K."),
79
+ ("AION_FI Protocol", "SCF #40", "$146,500", "Panel Review Failed", "Credit cards", "Anonymous team, no BIN sponsor.", "Same risk if regulatory partners not named."),
80
+ ("Stablpay", "SCF #40", "$129,100", "Panel Review Failed", "Stablecoin rail India", "No FIU partner named.", "Same risk for regulated geographies without partners."),
81
+ ("Sorotrack", "SCF #40", "$150,000", "Panel Review Failed (3x)", "Stellar tracker", "Solo dev only by handle 'Gemy'.", "Doxxing depth matters at high budget."),
82
+ ("Stableyard", "SCF #40", "$119,500", "Rejected", "Asia QR stablecoin", "Brand collision + vague TAM.", "Brand search before submitting."),
83
+ ("Lend.xyz", "SCF #42", "$120,000", "Rejected", "RWA real estate", "Lost to Bando same round.", "Audit prior winners before submitting same vertical."),
84
+ ("Tessera Labs", "SCF #42", "$150,000", "Rejected", "Confidential payments", "Anonymous + brand collision + duplicates X-Ray.", "Three patterns in one dossier."),
85
+ ("$NRG Token", "SCF #41", "$150,000", "Rejected", "Fan token rewards", "Earn-to-X + bolt-on + max ask.", "Pattern stack."),
86
+ ("StellarRead", "SCF #40", "$150,000", "Panel Review Failed", "Read-to-earn", "Earn-to-X at max ask.", "Earn-to-X has 100 pct rejection rate."),
87
+ ("Easner", "SCF #40", "$150,000", "Panel Review Failed", "Stripe for Stablecoins", "No banking partner.", "Generic positioning + no partner."),
88
+ ("Rebond (target)", "SCF #44", "$132,000", "TBD", "Green bond RWA", "Doxxed team, 4 LOIs, Art L.411-2 framework.", "Anchor for dossiers with named LOIs at $130K."),
89
+ ("For Yield (target)", "SCF #44", "$144,000", "TBD", "Regulated DeFi yield", "11-team, PSCA AMF filed, 7-8M EUR AUM.", "Anchor for regulated DeFi at $140-145K."),
90
+ ]
91
+
92
+ # -------------------------------------------------------------------
93
+ # Sheet 4: Integration List Audit
94
+ # -------------------------------------------------------------------
95
+ # Format: (Category, Item, Status, Recommendation, Effort)
96
+ INTEGRATION_AUDIT = [
97
+ ("On/Off-ramping", "Anchor Platform", "TO ADD", "Mandatory for EUR-to-USDC fiat ramp.", "1+ month"),
98
+ ("On/Off-ramping", "Bridge", "OPTIONAL", "For Stripe-style multi-currency.", "1-5 days"),
99
+ ("On/Off-ramping", "MoneyGram", "NOT RELEVANT", "Targets emerging-market cash, not aligned.", "1+ month"),
100
+ ("On/Off-ramping", "Mercuryo", "OPTIONAL", "Lower-effort fiat-crypto ramp alternative.", "1-2 weeks"),
101
+ ("DeFi Yield", "DeFindex", "MENTIONED / TO ADD", "For yield routing if scope includes yield product.", "1-2 weeks"),
102
+ ("DeFi Protocol", "Blend v2", "OPTIONAL", "Lending pool primitive.", "1+ month"),
103
+ ("DeFi Protocol", "Aquarius", "OPTIONAL", "DEX and LP pools.", "<1 day"),
104
+ ("DeFi Protocol", "Soroswap", "OPTIONAL", "DEX aggregation.", "1-2 weeks"),
105
+ ("DeFi Protocol", "Stellar Broker", "OPTIONAL", "Alternative router.", "1-5 days"),
106
+ ("Cross-chain", "Allbridge", "OPTIONAL", "EVM stablecoin bridging.", "TBD"),
107
+ ("Cross-chain", "Near Intents", "OPTIONAL", "Cross-chain execution layer.", "<1 day"),
108
+ ("Cross-chain", "Axelar", "OPTIONAL", "General messaging.", "TBD"),
109
+ ("Payments", "Stellar Disbursement Platform", "NOT RELEVANT / OPTIONAL", "Use for bulk payouts.", "1-2 weeks"),
110
+ ("Wallets", "Stellar Wallets Kit", "TO ADD", "Default multi-wallet connector.", "<1 day"),
111
+ ("Wallets", "Freighter Connect", "OPTIONAL", "SDF-maintained browser wallet.", "1-2 weeks"),
112
+ ("Wallets", "Privy", "TO ADD", "Mandatory for non-crypto-native distribution (CGPs, family offices).", "<1 day"),
113
+ ("Wallets", "DFNS", "OPTIONAL", "Institutional MPC custody.", "1-5 days"),
114
+ ]
115
+
116
+
117
+ # ===================================================================
118
+ # Excel generation
119
+ # ===================================================================
120
+
121
+ STATUS_FILLS = {
122
+ "STRONG": PatternFill(start_color="C6EFCE", fill_type="solid"),
123
+ "SOLID": PatternFill(start_color="E2F0D9", fill_type="solid"),
124
+ "UNDERSELLING": PatternFill(start_color="FFEB9C", fill_type="solid"),
125
+ "WEAK": PatternFill(start_color="FCD5B5", fill_type="solid"),
126
+ "BLOCKER": PatternFill(start_color="FFC7CE", fill_type="solid"),
127
+ }
128
+
129
+ PRIORITY_FILLS = {
130
+ "BLOCKER": PatternFill(start_color="FFC7CE", fill_type="solid"),
131
+ "CRITICAL": PatternFill(start_color="FCD5B5", fill_type="solid"),
132
+ "IMPORTANT": PatternFill(start_color="FFEB9C", fill_type="solid"),
133
+ "STRATEGIC": PatternFill(start_color="DDEBF7", fill_type="solid"),
134
+ }
135
+
136
+ VERDICT_FILLS = {
137
+ "Won": PatternFill(start_color="C6EFCE", fill_type="solid"),
138
+ "Rejected": PatternFill(start_color="FCD5B5", fill_type="solid"),
139
+ "Panel Review Failed": PatternFill(start_color="FFC7CE", fill_type="solid"),
140
+ "Panel Review Failed (3x)": PatternFill(start_color="FFC7CE", fill_type="solid"),
141
+ "Information Collection": PatternFill(start_color="F2F2F2", fill_type="solid"),
142
+ "TBD": PatternFill(start_color="FFFFFF", fill_type="solid"),
143
+ }
144
+
145
+ STATUS_AUDIT_FILLS = {
146
+ "MENTIONED": PatternFill(start_color="C6EFCE", fill_type="solid"),
147
+ "TO ADD": PatternFill(start_color="FFEB9C", fill_type="solid"),
148
+ "OPTIONAL": PatternFill(start_color="DDEBF7", fill_type="solid"),
149
+ "NOT RELEVANT": PatternFill(start_color="F2F2F2", fill_type="solid"),
150
+ "MENTIONED / TO ADD": PatternFill(start_color="FFEB9C", fill_type="solid"),
151
+ "NOT RELEVANT / OPTIONAL": PatternFill(start_color="F2F2F2", fill_type="solid"),
152
+ }
153
+
154
+ BORDER = Border(
155
+ left=Side(style="thin", color="D9D9D9"),
156
+ right=Side(style="thin", color="D9D9D9"),
157
+ top=Side(style="thin", color="D9D9D9"),
158
+ bottom=Side(style="thin", color="D9D9D9"),
159
+ )
160
+
161
+ HEADER_FONT = Font(bold=True, color="FFFFFF")
162
+ HEADER_FILL = PatternFill(start_color="0E1116", fill_type="solid")
163
+
164
+
165
+ def add_banner(ws, text, n_cols):
166
+ ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=n_cols)
167
+ ws.cell(row=1, column=1, value=text).font = Font(bold=True, color="FFFFFF", size=12)
168
+ ws.cell(row=1, column=1).fill = HEADER_FILL
169
+ ws.cell(row=1, column=1).alignment = Alignment(wrap_text=True, vertical='center')
170
+ ws.row_dimensions[1].height = 80
171
+
172
+
173
+ def add_header_row(ws, headers, row=2):
174
+ for col, h in enumerate(headers, start=1):
175
+ cell = ws.cell(row=row, column=col, value=h)
176
+ cell.font = HEADER_FONT
177
+ cell.fill = HEADER_FILL
178
+ cell.alignment = Alignment(wrap_text=True, vertical='center')
179
+ cell.border = BORDER
180
+
181
+
182
+ def write_data_row(ws, row_idx, values, fills=None):
183
+ for col, val in enumerate(values, start=1):
184
+ cell = ws.cell(row=row_idx, column=col, value=val)
185
+ cell.alignment = Alignment(wrap_text=True, vertical='top')
186
+ cell.border = BORDER
187
+ if fills and col in fills:
188
+ cell.fill = fills[col]
189
+
190
+
191
+ def set_widths(ws, widths):
192
+ for col, w in enumerate(widths, start=1):
193
+ ws.column_dimensions[get_column_letter(col)].width = w
194
+
195
+
196
+ def build():
197
+ wb = Workbook()
198
+
199
+ # Sheet 1: Abstract Review
200
+ ws1 = wb.active
201
+ ws1.title = "Abstract Review"
202
+ add_banner(ws1, BANNER_TEXT, 4)
203
+ add_header_row(ws1, ["Field", "Status", "Review", "Rewrite / Action"], row=2)
204
+ set_widths(ws1, [22, 20, 70, 80])
205
+ for i, (field, status, review, rewrite) in enumerate(FIELDS, start=3):
206
+ write_data_row(ws1, i, [field, status, review, rewrite],
207
+ fills={2: STATUS_FILLS.get(status, PatternFill())})
208
+
209
+ # Sheet 2: Checklist
210
+ ws2 = wb.create_sheet("Checklist Pre-Submit")
211
+ add_banner(ws2, f"{PROJECT_NAME} Pre-Submission Checklist v{VERSION}", 6)
212
+ add_header_row(ws2, ["Priority", "Item", "Field", "Effort", "Why it matters", "Status"], row=2)
213
+ set_widths(ws2, [14, 50, 14, 12, 60, 14])
214
+ for i, (prio, item, field, effort, why, status) in enumerate(CHECKLIST, start=3):
215
+ write_data_row(ws2, i, [prio, item, field, effort, why, status],
216
+ fills={1: PRIORITY_FILLS.get(prio, PatternFill())})
217
+
218
+ # Sheet 3: Comparables Corpus
219
+ ws3 = wb.create_sheet("Comparables Corpus")
220
+ add_banner(ws3, f"{PROJECT_NAME} Corpus Comparables (15 past submissions vs current)", 7)
221
+ add_header_row(ws3, ["Project", "Round", "Budget", "Verdict", "Category", "Profile snapshot", "Lesson for current dossier"], row=2)
222
+ set_widths(ws3, [26, 12, 14, 22, 26, 40, 50])
223
+ for i, (proj, rnd, budget, verdict, cat, profile, lesson) in enumerate(COMPARABLES, start=3):
224
+ write_data_row(ws3, i, [proj, rnd, budget, verdict, cat, profile, lesson],
225
+ fills={4: VERDICT_FILLS.get(verdict, PatternFill())})
226
+
227
+ # Sheet 4: Integration List Audit
228
+ ws4 = wb.create_sheet("Audit Integration List")
229
+ add_banner(ws4, f"{PROJECT_NAME} SCF Integration List Audit", 5)
230
+ add_header_row(ws4, ["Category", "Item", "Status in dossier", "Recommendation", "Effort"], row=2)
231
+ set_widths(ws4, [20, 30, 22, 60, 14])
232
+ for i, (cat, item, status, reco, effort) in enumerate(INTEGRATION_AUDIT, start=3):
233
+ write_data_row(ws4, i, [cat, item, status, reco, effort],
234
+ fills={3: STATUS_AUDIT_FILLS.get(status, PatternFill())})
235
+
236
+ wb.save(OUT)
237
+ print(f"Saved: {OUT}")
238
+
239
+ # QA check: count em-dashes
240
+ from openpyxl import load_workbook
241
+ wb2 = load_workbook(OUT)
242
+ em = 0
243
+ for ws in wb2.worksheets:
244
+ for row in ws.iter_rows():
245
+ for cell in row:
246
+ if cell.value and isinstance(cell.value, str) and ", " in cell.value:
247
+ em += 1
248
+ print(f"em-dash cells: {em} (expect 0)")
249
+ print(f"Sheets: {wb2.sheetnames}")
250
+
251
+
252
+ if __name__ == "__main__":
253
+ build()
@@ -0,0 +1,213 @@
1
+ """
2
+ Build Review Builder
3
+ ====================
4
+
5
+ Scaffolds the 4-sheet Excel deliverable for an SCF Build phase review.
6
+
7
+ Same structure as abstract-review-builder.py with Build-phase fields (Q1-Q17).
8
+ Customize FIELDS, CHECKLIST, COMPARABLES, INTEGRATION_AUDIT, BANNER_TEXT,
9
+ PROJECT_NAME, VERSION and run: python build-review-builder.py.
10
+ """
11
+
12
+ from openpyxl import Workbook
13
+ from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
14
+ from openpyxl.utils import get_column_letter
15
+
16
+ PROJECT_NAME = "ProjectX"
17
+ VERSION = "1"
18
+ OUT = f"/sessions/eloquent-inspiring-cannon/mnt/outputs/{PROJECT_NAME}_Build_Review_v{VERSION}.xlsx"
19
+
20
+ BANNER_TEXT = (
21
+ f"{PROJECT_NAME} Build Review v{VERSION}: estimated XX to YY percent probability of acceptance "
22
+ f"as currently drafted, lifting to AA to BB percent after the N fixes below. "
23
+ f"Recommended budget anchor: $XXX,000 Integration Track, anchored on [Named Past Winner] ($YYK SCF #NN)."
24
+ )
25
+
26
+ # -------------------------------------------------------------------
27
+ # Sheet 1: Field-by-Field Review (Build phase Q1-Q17)
28
+ # -------------------------------------------------------------------
29
+ FIELDS = [
30
+ ("Q1 Project Title", "STRONG", "Coherent avec Abstract.", "[Project Name]"),
31
+ ("Q2 Submission Title (40 chars)", "SOLID", "Specifique.", "[Stellar-Native [Specific Build]]"),
32
+ ("Q3 One Sentence (130 chars)", "WEAK", "Generic.", "[Verb] [defined offering] to help [audience] [problem] with [secret sauce]."),
33
+ ("Q4 Project URL", "STRONG", "Valide.", "https://yourdomain.com/"),
34
+ ("Q5 Code URL", "BLOCKER", "Empty Q5 is pre-screen rejection.", "https://github.com/[org]/[repo] with README + MIT + scaffold."),
35
+ ("Q6 Video URL", "BLOCKER", "Empty Q6 is pre-screen rejection.", "https://youtube.com/watch?v=[id] with 5-segment script under 3 min."),
36
+ ("Q7 Soroban", "SOLID", "Yes correct.", "Yes"),
37
+ ("Q8 Product and Services", "WEAK", "Contracts non nommes.", "Component 1: [Contract.rs]. Stellar use: [item]. Impact: [...]"),
38
+ ("Q9 Traction Evidence", "UNDERSELLING", "Manque LOIs nominees.", "Live URLs, metrics, named clients, recognitions."),
39
+ ("Q10 Technical Architecture", "BLOCKER", "Empty.", "Public Notion or GitHub markdown with C4 L1+L2 + data flows."),
40
+ ("Q11 Tranche intro", "WEAK", "Pas d'anchor.", "$X, three tranches of $X/3. NOT FUNDED: marketing. Anchored on [Named Past Winner]."),
41
+ ("Q12 Tranche 1 MVP", "WEAK", "Vague.", "Deliverable: [contract]. Measure: testnet deployed at [addr]. Date: T+N weeks. Budget: $X."),
42
+ ("Q13 Tranche 2 Testnet", "WEAK", "Vague.", "Same format per deliverable."),
43
+ ("Q14 Tranche 3 Mainnet", "WEAK", "Vague.", "Same format + quantified mainnet targets."),
44
+ ("Q15 Budget Total", "WEAK", "Drop to anchor.", "$[anchored amount]"),
45
+ ("Q16 Go-To-Market", "UNDERSELLING", "Manque grant note.", "Phase 1: ... Grant note: SCF funds dev only, marketing self-funded."),
46
+ ("Q17 Success Criteria", "WEAK", "Pas de quantification.", "MVP / Testnet / Mainnet + quantified targets + ecosystem + business + long-term."),
47
+ ]
48
+
49
+ # Re-use the rest of the structure from abstract-review-builder.py (CHECKLIST,
50
+ # COMPARABLES, INTEGRATION_AUDIT, fills, build function). For brevity here
51
+ # we focus on the structural differences.
52
+
53
+ CHECKLIST = [
54
+ ("BLOCKER", "Ship testnet contract + add URL to Q5", "Q5", "5-7 days", "Empty Q5 is pre-screen rejection.", ""),
55
+ ("BLOCKER", "Record 3-min video + upload to Q6", "Q6", "6-8 hours", "Empty Q6 is pre-screen rejection.", ""),
56
+ ("BLOCKER", "Publish Technical Architecture on Notion + add URL to Q10", "Q10", "4-6 hours", "Empty Q10 is pre-screen rejection.", ""),
57
+ ("CRITICAL", "Add named LOIs/clients to Q9", "Q9", "1 day", "Named traction removes 'will this find users?' objection.", ""),
58
+ ("CRITICAL", "Add grant note to Q16 ('SCF funds dev only')", "Q16", "15 min", "Blocks marketing-budget-misuse pattern.", ""),
59
+ ("IMPORTANT", "Quantify Tranche 3 mainnet targets", "Q14", "30 min", "Reviewers need something to verify at final tranche.", ""),
60
+ ("STRATEGIC", "Add 2-3 SCF Integration List items to Q8", "Q8", "30 min", "Strongest dossiers leverage 3-7 items.", ""),
61
+ ]
62
+
63
+ COMPARABLES = [
64
+ (f"{PROJECT_NAME} (current)", "SCF #44", "TBD", "TBD", "Application", "Profile.", "N/A current dossier."),
65
+ ("The Signal", "SCF #42", "$121,000", "Won", "B2B marketplace", "2 doxxed cofounders, DealEscrow.rs, Atomic Splits.", "Anchor for $115-125K."),
66
+ ("Bando", "SCF #42", "$75,000", "Won", "RWA Mexico", "Doxxed, brokerage partner, pilot.", "Anchor for $75-90K narrow pilots."),
67
+ ("TheXBank", "SCF #40", "$89,500", "Won", "Africa banking", "Doxxed, country pilot.", "Anchor for emerging markets banking."),
68
+ ("Latch + KMP", "SCF #41 RFP", "RFP", "Won", "Compliance tooling", "Compliance for Soroban ecosystem.", "Anchor for compliance dossiers."),
69
+ ("Orion + OctoPos", "SCF #41 RFP", "RFP", "Won", "DeFi Positions API", "Open data API across DeFi.", "Anchor for indexer dossiers."),
70
+ ("Sorotrack", "SCF #40+41+42", "$150K + $50K + $50K", "PRF 3x", "Tracker", "Solo dev by handle.", "Doxxing matters."),
71
+ ("Reactor Trade", "SCF #41", "$115,000", "Rejected", "Trading", "Lost to Helix Labs same round.", "Audit competing teams."),
72
+ ("Lend.xyz", "SCF #42", "$120,000", "Rejected", "RWA real estate", "Lost to Bando.", "Sharper sub-niche."),
73
+ ("Tessera Labs", "SCF #42", "$150,000", "Rejected", "Confidential payments", "Anonymous + brand collision + duplicates X-Ray.", "Three patterns stacked."),
74
+ ("PathPulse AI", "SCF #41/#42", "$137K / $128K", "Rejected 2x", "Computer-vision data", "Bolt-on without Stellar reason.", "Stellar-specific story needed."),
75
+ ("Goated App", "SCF #41", "$120,000", "Rejected", "Predictions", "No licensing plan.", "Regulated category needs framework."),
76
+ ("Kyros OS", "SCF #41", "$135,000", "Rejected", "Spanish tax", "No AEAT/Hacienda partner.", "Regulated needs partner."),
77
+ ("Rebond (target)", "SCF #44", "$132,000", "TBD", "Green bonds", "4 LOIs, Art L.411-2.", "Anchor for $130K+ with LOIs."),
78
+ ("For Yield (target)", "SCF #44", "$144,000", "TBD", "Regulated DeFi", "PSCA AMF, 7-8M EUR AUM.", "Anchor for $140K+ regulated."),
79
+ ]
80
+
81
+ INTEGRATION_AUDIT = [
82
+ ("Wallets", "Stellar Wallets Kit", "TO ADD", "Default multi-wallet connector.", "<1 day"),
83
+ ("Wallets", "Privy", "OPTIONAL", "For non-crypto-native users.", "<1 day"),
84
+ ("Wallets", "DFNS", "OPTIONAL", "For institutional MPC custody.", "1-5 days"),
85
+ ("On/Off-ramping", "Anchor Platform", "TO ADD / NOT RELEVANT", "Add if fiat ramp needed.", "1+ month"),
86
+ ("On/Off-ramping", "Bridge", "OPTIONAL", "Alternative ramp.", "1-5 days"),
87
+ ("DeFi Yield", "DeFindex", "OPTIONAL", "For yield routing.", "1-2 weeks"),
88
+ ("DeFi", "Blend v2", "OPTIONAL", "Lending pools.", "1+ month"),
89
+ ("DeFi", "Aquarius", "OPTIONAL", "DEX/LP.", "<1 day"),
90
+ ("DeFi", "Soroswap", "OPTIONAL", "DEX aggregation.", "1-2 weeks"),
91
+ ("Cross-chain", "Allbridge", "OPTIONAL", "Stablecoin bridging.", "TBD"),
92
+ ("Cross-chain", "Near Intents", "OPTIONAL", "Cross-chain execution.", "<1 day"),
93
+ ("Payments", "Stellar Disbursement Platform", "OPTIONAL / NOT RELEVANT", "For bulk payouts.", "1-2 weeks"),
94
+ ]
95
+
96
+ # Same styling and build() as abstract-review-builder.py
97
+ STATUS_FILLS = {
98
+ "STRONG": PatternFill(start_color="C6EFCE", fill_type="solid"),
99
+ "SOLID": PatternFill(start_color="E2F0D9", fill_type="solid"),
100
+ "UNDERSELLING": PatternFill(start_color="FFEB9C", fill_type="solid"),
101
+ "WEAK": PatternFill(start_color="FCD5B5", fill_type="solid"),
102
+ "BLOCKER": PatternFill(start_color="FFC7CE", fill_type="solid"),
103
+ }
104
+ PRIORITY_FILLS = {
105
+ "BLOCKER": PatternFill(start_color="FFC7CE", fill_type="solid"),
106
+ "CRITICAL": PatternFill(start_color="FCD5B5", fill_type="solid"),
107
+ "IMPORTANT": PatternFill(start_color="FFEB9C", fill_type="solid"),
108
+ "STRATEGIC": PatternFill(start_color="DDEBF7", fill_type="solid"),
109
+ }
110
+ VERDICT_FILLS = {
111
+ "Won": PatternFill(start_color="C6EFCE", fill_type="solid"),
112
+ "Rejected": PatternFill(start_color="FCD5B5", fill_type="solid"),
113
+ "PRF 3x": PatternFill(start_color="FFC7CE", fill_type="solid"),
114
+ "Rejected 2x": PatternFill(start_color="FCD5B5", fill_type="solid"),
115
+ "TBD": PatternFill(start_color="FFFFFF", fill_type="solid"),
116
+ }
117
+ STATUS_AUDIT_FILLS = {
118
+ "MENTIONED": PatternFill(start_color="C6EFCE", fill_type="solid"),
119
+ "TO ADD": PatternFill(start_color="FFEB9C", fill_type="solid"),
120
+ "OPTIONAL": PatternFill(start_color="DDEBF7", fill_type="solid"),
121
+ "NOT RELEVANT": PatternFill(start_color="F2F2F2", fill_type="solid"),
122
+ "TO ADD / NOT RELEVANT": PatternFill(start_color="FFEB9C", fill_type="solid"),
123
+ "OPTIONAL / NOT RELEVANT": PatternFill(start_color="DDEBF7", fill_type="solid"),
124
+ }
125
+ BORDER = Border(
126
+ left=Side(style="thin", color="D9D9D9"),
127
+ right=Side(style="thin", color="D9D9D9"),
128
+ top=Side(style="thin", color="D9D9D9"),
129
+ bottom=Side(style="thin", color="D9D9D9"),
130
+ )
131
+ HEADER_FONT = Font(bold=True, color="FFFFFF")
132
+ HEADER_FILL = PatternFill(start_color="0E1116", fill_type="solid")
133
+
134
+
135
+ def add_banner(ws, text, n_cols):
136
+ ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=n_cols)
137
+ c = ws.cell(row=1, column=1, value=text)
138
+ c.font = Font(bold=True, color="FFFFFF", size=12)
139
+ c.fill = HEADER_FILL
140
+ c.alignment = Alignment(wrap_text=True, vertical='center')
141
+ ws.row_dimensions[1].height = 80
142
+
143
+
144
+ def add_header_row(ws, headers, row=2):
145
+ for col, h in enumerate(headers, start=1):
146
+ cell = ws.cell(row=row, column=col, value=h)
147
+ cell.font = HEADER_FONT
148
+ cell.fill = HEADER_FILL
149
+ cell.alignment = Alignment(wrap_text=True, vertical='center')
150
+ cell.border = BORDER
151
+
152
+
153
+ def write_data_row(ws, row_idx, values, fills=None):
154
+ for col, val in enumerate(values, start=1):
155
+ cell = ws.cell(row=row_idx, column=col, value=val)
156
+ cell.alignment = Alignment(wrap_text=True, vertical='top')
157
+ cell.border = BORDER
158
+ if fills and col in fills:
159
+ cell.fill = fills[col]
160
+
161
+
162
+ def set_widths(ws, widths):
163
+ for col, w in enumerate(widths, start=1):
164
+ ws.column_dimensions[get_column_letter(col)].width = w
165
+
166
+
167
+ def build():
168
+ wb = Workbook()
169
+ ws1 = wb.active
170
+ ws1.title = "Build Review"
171
+ add_banner(ws1, BANNER_TEXT, 4)
172
+ add_header_row(ws1, ["Field", "Status", "Review", "Rewrite / Action"], row=2)
173
+ set_widths(ws1, [26, 20, 70, 80])
174
+ for i, (field, status, review, rewrite) in enumerate(FIELDS, start=3):
175
+ write_data_row(ws1, i, [field, status, review, rewrite],
176
+ fills={2: STATUS_FILLS.get(status, PatternFill())})
177
+
178
+ ws2 = wb.create_sheet("Checklist Pre-Submit")
179
+ add_banner(ws2, f"{PROJECT_NAME} Pre-Submission Checklist v{VERSION}", 6)
180
+ add_header_row(ws2, ["Priority", "Item", "Field", "Effort", "Why it matters", "Status"], row=2)
181
+ set_widths(ws2, [14, 50, 14, 12, 60, 14])
182
+ for i, (prio, item, field, effort, why, status) in enumerate(CHECKLIST, start=3):
183
+ write_data_row(ws2, i, [prio, item, field, effort, why, status],
184
+ fills={1: PRIORITY_FILLS.get(prio, PatternFill())})
185
+
186
+ ws3 = wb.create_sheet("Comparables Corpus")
187
+ add_banner(ws3, f"{PROJECT_NAME} Corpus Comparables", 7)
188
+ add_header_row(ws3, ["Project", "Round", "Budget", "Verdict", "Category", "Profile", "Lesson"], row=2)
189
+ set_widths(ws3, [26, 14, 18, 18, 26, 40, 50])
190
+ for i, (proj, rnd, budget, verdict, cat, profile, lesson) in enumerate(COMPARABLES, start=3):
191
+ write_data_row(ws3, i, [proj, rnd, budget, verdict, cat, profile, lesson],
192
+ fills={4: VERDICT_FILLS.get(verdict, PatternFill())})
193
+
194
+ ws4 = wb.create_sheet("Audit Integration List")
195
+ add_banner(ws4, f"{PROJECT_NAME} SCF Integration List Audit", 5)
196
+ add_header_row(ws4, ["Category", "Item", "Status in dossier", "Recommendation", "Effort"], row=2)
197
+ set_widths(ws4, [20, 30, 24, 60, 14])
198
+ for i, (cat, item, status, reco, effort) in enumerate(INTEGRATION_AUDIT, start=3):
199
+ write_data_row(ws4, i, [cat, item, status, reco, effort],
200
+ fills={3: STATUS_AUDIT_FILLS.get(status, PatternFill())})
201
+
202
+ wb.save(OUT)
203
+ print(f"Saved: {OUT}")
204
+ from openpyxl import load_workbook
205
+ wb2 = load_workbook(OUT)
206
+ em = sum(1 for ws in wb2.worksheets for row in ws.iter_rows() for cell in row
207
+ if cell.value and isinstance(cell.value, str) and ", " in cell.value)
208
+ print(f"em-dash cells: {em} (expect 0)")
209
+ print(f"Sheets: {wb2.sheetnames}")
210
+
211
+
212
+ if __name__ == "__main__":
213
+ build()