naive-framework 0.0.0-stage → 0.1.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 (338) hide show
  1. package/AGENTS.md +61 -0
  2. package/LICENSE +21 -0
  3. package/README.md +37 -2
  4. package/docs/decisions/decisions.json +861 -0
  5. package/docs/ontology.json +796 -0
  6. package/docs/ontology.md +163 -0
  7. package/docs/reference/ROUTES.md +125 -0
  8. package/evidence/benchmarks/2026-10-27-golden.jev.after-catalog-fix.json +558 -0
  9. package/evidence/benchmarks/2026-10-27-golden.jev.json +501 -0
  10. package/evidence/benchmarks/2026-10-27-golden.reasoning-answers.json +177 -0
  11. package/evidence/benchmarks/JEV_VS_REASONING_MODEL_2026-10-27.md +68 -0
  12. package/evidence/capabilities/agent-capabilities.json +86 -0
  13. package/evidence/design-documents.registry.json +2896 -0
  14. package/evidence/evals/evals.json +25 -0
  15. package/evidence/evals/harness-evals.json +140 -0
  16. package/evidence/layer.json +51 -0
  17. package/evidence/skills/agent-capabilities/SKILL.md +35 -0
  18. package/evidence/skills/design-coverage/SKILL.md +57 -0
  19. package/evidence/skills/design-coverage/check.mjs +192 -0
  20. package/evidence/skills/design-coverage/scan.mjs +45 -0
  21. package/evidence/skills/fidelity-ladder-audit/SKILL.md +121 -0
  22. package/evidence/skills/fidelity-ladder-audit/ladder-census.mjs +180 -0
  23. package/evidence/skills/findability/SKILL.md +32 -0
  24. package/evidence/skills/findability/inventory.rb +41 -0
  25. package/evidence/skills/foreshadowing-audit/SKILL.md +183 -0
  26. package/evidence/skills/metrics-review/SKILL.md +177 -0
  27. package/evidence/tooling/integrations.json +153 -0
  28. package/governance/layer.json +101 -0
  29. package/governance/references/references.json +26 -0
  30. package/governance/skills/board-design/SKILL.md +68 -0
  31. package/governance/skills/brand-pillar/SKILL.md +90 -0
  32. package/governance/skills/business-pillar/SKILL.md +96 -0
  33. package/governance/skills/chief-of-staff/SKILL.md +45 -0
  34. package/governance/skills/cofounder-structure/SKILL.md +64 -0
  35. package/governance/skills/cross-pillar-tradeoff/SKILL.md +168 -0
  36. package/governance/skills/equity-and-share-classes/SKILL.md +68 -0
  37. package/governance/skills/executive-roles/SKILL.md +95 -0
  38. package/governance/skills/exit-planning/SKILL.md +66 -0
  39. package/governance/skills/financing-and-investor-rights/SKILL.md +73 -0
  40. package/governance/skills/office-hours-mode/SKILL.md +113 -0
  41. package/governance/skills/product-pillar/SKILL.md +81 -0
  42. package/governance/skills/publication-policy/SKILL.md +63 -0
  43. package/governance/skills/role-and-candidate-authoring/SKILL.md +198 -0
  44. package/governance/skills/stakeholder-update/SKILL.md +177 -0
  45. package/governance/tooling/integrations.json +37 -0
  46. package/governance/venture-template/AGENT_ROLES_AND_DECISION_RIGHTS.md +58 -0
  47. package/governance/venture-template/COMPANY_VAULT_DEFINITION_2026-10-25.md +204 -0
  48. package/governance/venture-template/README.md +74 -0
  49. package/governance/venture-template/decision-rights.json +186 -0
  50. package/governance/venture-template/index.md +151 -0
  51. package/governance/venture-template/pillars/brand.md +209 -0
  52. package/governance/venture-template/pillars/business.md +255 -0
  53. package/governance/venture-template/pillars/product.md +254 -0
  54. package/governance/venture-template/render-roles.py +11 -0
  55. package/governance/venture-template/roles/README.md +85 -0
  56. package/governance/venture-template/roles/agent-roles.json +202 -0
  57. package/governance/venture-template/roles/ceo.md +163 -0
  58. package/governance/venture-template/roles/chief-of-staff.md +153 -0
  59. package/governance/venture-template/roles/cmo.md +165 -0
  60. package/governance/venture-template/roles/coo.md +189 -0
  61. package/governance/venture-template/roles/cto.md +158 -0
  62. package/governance/venture-template/roles/department-head.md +47 -0
  63. package/governance/venture-template/roles/forward-deployed-engineer.md +51 -0
  64. package/governance/venture-template/roles/founder.md +173 -0
  65. package/governance/venture-template/roles/hr-manager.md +49 -0
  66. package/governance/venture-template/roles/talent-acquisition-manager.md +50 -0
  67. package/interface/api/server.mjs +69 -0
  68. package/interface/cli/find-venture.mjs +15 -0
  69. package/interface/cli/mentura.mjs +271 -0
  70. package/interface/cli/naive.mjs +169 -0
  71. package/interface/demo/board.mjs +581 -0
  72. package/interface/demo/decision-harness.mjs +91 -0
  73. package/interface/demo/live-agent.mjs +47 -0
  74. package/interface/harness/evals.mjs +90 -0
  75. package/interface/harness/examples/pt-no-shows.dump.md +19 -0
  76. package/interface/harness/run.mjs +313 -0
  77. package/interface/harness/site.mjs +59 -0
  78. package/interface/layer.json +31 -0
  79. package/interface/mcp/server.mjs +122 -0
  80. package/interface/operator-console/README.md +58 -0
  81. package/interface/provenance.mjs +42 -0
  82. package/interface/references/references.json +28 -0
  83. package/interface/route-aliases.json +32 -0
  84. package/interface/router.mjs +580 -0
  85. package/interface/skills/install-mentura/SKILL.md +88 -0
  86. package/interface/tooling/integrations.json +112 -0
  87. package/knowledge/connectors/README.md +54 -0
  88. package/knowledge/connectors/catalog.mjs +118 -0
  89. package/knowledge/connectors/contract.mjs +56 -0
  90. package/knowledge/connectors/eval.mjs +176 -0
  91. package/knowledge/connectors/filesystem.mjs +79 -0
  92. package/knowledge/connectors/index.mjs +102 -0
  93. package/knowledge/connectors/resolve.mjs +44 -0
  94. package/knowledge/connectors/suite.mjs +80 -0
  95. package/knowledge/layer.json +42 -0
  96. package/knowledge/skills/find-reference/SKILL.md +38 -0
  97. package/knowledge/skills/industry-awareness/SKILL.md +277 -0
  98. package/knowledge/tooling/integrations.json +127 -0
  99. package/knowledge/tooling/questions.md +46 -0
  100. package/operations/FOUNDER_OPERATING_MODEL_CAMPAIGN_2026-10-14.md +16 -0
  101. package/operations/departments.json +162 -0
  102. package/operations/handoff-v2.md +93 -0
  103. package/operations/layer.json +60 -0
  104. package/operations/marketing/check-public.mjs +68 -0
  105. package/operations/marketing/site/README.md +86 -0
  106. package/operations/marketing/site/matrix.json +731 -0
  107. package/operations/marketing/site/plan.mjs +117 -0
  108. package/operations/marketing/site/presence.mjs +252 -0
  109. package/operations/references/references.json +45 -0
  110. package/operations/skills/recruiting/SKILL.md +32 -0
  111. package/operations/skills/team-design/SKILL.md +36 -0
  112. package/operations/skills/tool-selection/SKILL.md +46 -0
  113. package/operations/templates/recruiting-brief.md +35 -0
  114. package/operations/tooling/integrations.json +158 -0
  115. package/package.json +57 -4
  116. package/packages/catalog.json +272 -0
  117. package/packages/cofounder/package.json +42 -0
  118. package/packages/counsel/package.json +47 -0
  119. package/packages/customers/package.json +21 -0
  120. package/packages/decisions/package.json +17 -0
  121. package/packages/engineering/package.json +41 -0
  122. package/packages/evidence/package.json +17 -0
  123. package/packages/finance/package.json +48 -0
  124. package/packages/foundation/package.json +52 -0
  125. package/packages/investor/package.json +57 -0
  126. package/packages/investors/package.json +21 -0
  127. package/packages/legal/package.json +73 -0
  128. package/packages/marketing/package.json +57 -0
  129. package/packages/money/package.json +21 -0
  130. package/packages/operations/package.json +74 -0
  131. package/packages/partner/package.json +38 -0
  132. package/packages/people/package.json +64 -0
  133. package/packages/product/package.json +49 -0
  134. package/packages/raw/package.json +19 -0
  135. package/packages/relationships/package.json +52 -0
  136. package/packages/validation/package.json +99 -0
  137. package/platform/README.md +45 -0
  138. package/platform/connectors/eval.mjs +154 -0
  139. package/platform/connectors/fake-github.mjs +91 -0
  140. package/platform/connectors/github.mjs +105 -0
  141. package/platform/integrations/jev.mjs +30 -0
  142. package/platform/integrations/langsmith-docket.mjs +53 -0
  143. package/platform/integrations/langsmith-setup.mjs +115 -0
  144. package/platform/integrations/langsmith.mjs +47 -0
  145. package/platform/integrations/rho.mjs +145 -0
  146. package/platform/integrations/site.mjs +75 -0
  147. package/platform/kits/README.md +7 -0
  148. package/platform/mcp/research.mjs +64 -0
  149. package/purpose/checklists/vault-and-tooling-consultancy-setup.md +216 -0
  150. package/purpose/frameworks/business-discovery-framework-amendments-2026-05-20.md +181 -0
  151. package/purpose/frameworks/business-discovery-framework.html +938 -0
  152. package/purpose/frameworks/business-discovery-framework.md +326 -0
  153. package/purpose/frameworks/idea-map/README.md +74 -0
  154. package/purpose/frameworks/idea-map/conventions.json +146 -0
  155. package/purpose/frameworks/idea-map/graph.mjs +182 -0
  156. package/purpose/frameworks/idea-map/ideamap.mjs +179 -0
  157. package/purpose/frameworks/idea-map/route.mjs +140 -0
  158. package/purpose/frameworks/onboarding-handoff-framework.md +269 -0
  159. package/purpose/frameworks/post-discovery-deliverable-playbook.md +274 -0
  160. package/purpose/frameworks/product-anatomy/README.md +63 -0
  161. package/purpose/frameworks/product-anatomy/anatomy.mjs +195 -0
  162. package/purpose/frameworks/product-anatomy/examples/polity.answers.reasoned.json +11 -0
  163. package/purpose/frameworks/product-anatomy/examples/polity.json +89 -0
  164. package/purpose/frameworks/product-anatomy/phases.json +107 -0
  165. package/purpose/frameworks/product-anatomy/questions.json +74 -0
  166. package/purpose/kits/validation/README.md +14 -0
  167. package/purpose/kits/validation/references/references.json +122 -0
  168. package/purpose/kits/validation/skills/problem-validation/SKILL.md +43 -0
  169. package/purpose/kits/validation/skills/validation-score/SKILL.md +35 -0
  170. package/purpose/kits/validation/templates/go-to-market.md +19 -0
  171. package/purpose/kits/validation/templates/operations-readiness.md +20 -0
  172. package/purpose/kits/validation/templates/pricing.md +22 -0
  173. package/purpose/kits/validation/templates/problem-interview.md +36 -0
  174. package/purpose/kits/validation/templates/problem.md +45 -0
  175. package/purpose/kits/validation/templates/product-market-fit.md +23 -0
  176. package/purpose/kits/validation/templates/solution.md +18 -0
  177. package/purpose/kits/validation/templates/team.md +19 -0
  178. package/purpose/kits/validation/weights.json +22 -0
  179. package/purpose/layer.json +53 -0
  180. package/purpose/references/references.json +324 -0
  181. package/purpose/skills/ambition-tier/SKILL.md +205 -0
  182. package/purpose/skills/telos/SKILL.md +52 -0
  183. package/purpose/strategic-foundation.json +133 -0
  184. package/purpose/templates/telos-based-smart.md +39 -0
  185. package/purpose/tooling/integrations.json +48 -0
  186. package/schema/README.md +61 -0
  187. package/schema/VERSION +1 -0
  188. package/schema/account.schema.json +79 -0
  189. package/schema/add-department.mjs +41 -0
  190. package/schema/agent-capability.schema.json +94 -0
  191. package/schema/alignment.schema.json +61 -0
  192. package/schema/assess-problem.mjs +131 -0
  193. package/schema/bdd.mjs +56 -0
  194. package/schema/board.schema.json +101 -0
  195. package/schema/check-boundary.mjs +54 -0
  196. package/schema/check-data-model.mjs +170 -0
  197. package/schema/check-data-packages.mjs +83 -0
  198. package/schema/check-departments.mjs +45 -0
  199. package/schema/check-execution.mjs +85 -0
  200. package/schema/check-governance.mjs +98 -0
  201. package/schema/check-integrations.mjs +33 -0
  202. package/schema/check-nextjs-status.mjs +77 -0
  203. package/schema/check-nouns.mjs +49 -0
  204. package/schema/check-private.mjs +61 -0
  205. package/schema/check-provenance.mjs +55 -0
  206. package/schema/check-publication.mjs +96 -0
  207. package/schema/check-ready.mjs +89 -0
  208. package/schema/check-sources.mjs +66 -0
  209. package/schema/check-team.mjs +94 -0
  210. package/schema/check-telos.mjs +59 -0
  211. package/schema/check-validation.mjs +165 -0
  212. package/schema/check-ventures.mjs +81 -0
  213. package/schema/check-where-used.mjs +58 -0
  214. package/schema/data-master.schema.json +14 -0
  215. package/schema/data-model.json +1258 -0
  216. package/schema/data-model.schema.json +152 -0
  217. package/schema/decision-analytics.mjs +77 -0
  218. package/schema/decision-record.schema.json +290 -0
  219. package/schema/decision-rights.schema.json +34 -0
  220. package/schema/decision.schema.json +30 -0
  221. package/schema/decisions.mjs +321 -0
  222. package/schema/department-catalog.schema.json +55 -0
  223. package/schema/department.schema.json +15 -0
  224. package/schema/departments.mjs +32 -0
  225. package/schema/docket-eval.mjs +89 -0
  226. package/schema/docket.mjs +135 -0
  227. package/schema/eval-suite.schema.json +45 -0
  228. package/schema/evidence.schema.json +110 -0
  229. package/schema/examples/migrate/agent.mjs +12 -0
  230. package/schema/examples/workspace/ventures/studio/accounts/bakery/account.json +18 -0
  231. package/schema/examples/workspace/ventures/studio/evidence/.gitkeep +0 -0
  232. package/schema/examples/workspace/ventures/studio/governance/.gitkeep +0 -0
  233. package/schema/examples/workspace/ventures/studio/knowledge/.gitkeep +0 -0
  234. package/schema/examples/workspace/ventures/studio/operations/.gitkeep +0 -0
  235. package/schema/examples/workspace/ventures/studio/print/knowledge/.gitkeep +0 -0
  236. package/schema/examples/workspace/ventures/studio/print/purpose/.gitkeep +0 -0
  237. package/schema/examples/workspace/ventures/studio/print/venture.json +37 -0
  238. package/schema/examples/workspace/ventures/studio/products/brand-care.json +19 -0
  239. package/schema/examples/workspace/ventures/studio/products/brand-kit.json +23 -0
  240. package/schema/examples/workspace/ventures/studio/provenance.jsonl +3 -0
  241. package/schema/examples/workspace/ventures/studio/purpose/.gitkeep +0 -0
  242. package/schema/examples/workspace/ventures/studio/venture.json +43 -0
  243. package/schema/examples/workspace/ventures/tandem/accounts/.gitkeep +0 -0
  244. package/schema/examples/workspace/ventures/tandem/evidence/README.md +3 -0
  245. package/schema/examples/workspace/ventures/tandem/governance/README.md +3 -0
  246. package/schema/examples/workspace/ventures/tandem/governance/agreements/dee-fast.md +3 -0
  247. package/schema/examples/workspace/ventures/tandem/governance/board.json +51 -0
  248. package/schema/examples/workspace/ventures/tandem/governance/departments/finance/charter.md +5 -0
  249. package/schema/examples/workspace/ventures/tandem/governance/departments/finance/department.json +5 -0
  250. package/schema/examples/workspace/ventures/tandem/governance/departments/primary/marketing-and-sales/charter.md +5 -0
  251. package/schema/examples/workspace/ventures/tandem/governance/departments/primary/marketing-and-sales/department.json +5 -0
  252. package/schema/examples/workspace/ventures/tandem/governance/exit.json +33 -0
  253. package/schema/examples/workspace/ventures/tandem/governance/founder-agreement.json +24 -0
  254. package/schema/examples/workspace/ventures/tandem/governance/founder-agreement.md +3 -0
  255. package/schema/examples/workspace/ventures/tandem/governance/ownership.json +131 -0
  256. package/schema/examples/workspace/ventures/tandem/governance/publication-policy.json +171 -0
  257. package/schema/examples/workspace/ventures/tandem/knowledge/README.md +3 -0
  258. package/schema/examples/workspace/ventures/tandem/knowledge/research/friends-feedback-2026-08.md +3 -0
  259. package/schema/examples/workspace/ventures/tandem/knowledge/research/pilot-2026-10.md +3 -0
  260. package/schema/examples/workspace/ventures/tandem/knowledge/research/problem-interviews-2026-09.md +20 -0
  261. package/schema/examples/workspace/ventures/tandem/knowledge/sources.json +8 -0
  262. package/schema/examples/workspace/ventures/tandem/knowledge/where-used.json +13 -0
  263. package/schema/examples/workspace/ventures/tandem/operations/README.md +3 -0
  264. package/schema/examples/workspace/ventures/tandem/operations/departments/finance/README.md +5 -0
  265. package/schema/examples/workspace/ventures/tandem/operations/departments/finance/department.json +5 -0
  266. package/schema/examples/workspace/ventures/tandem/operations/departments/primary/marketing-and-sales/README.md +5 -0
  267. package/schema/examples/workspace/ventures/tandem/operations/departments/primary/marketing-and-sales/department.json +5 -0
  268. package/schema/examples/workspace/ventures/tandem/pillars/brand.md +5 -0
  269. package/schema/examples/workspace/ventures/tandem/pillars/business.md +5 -0
  270. package/schema/examples/workspace/ventures/tandem/pillars/product.md +5 -0
  271. package/schema/examples/workspace/ventures/tandem/products/.gitkeep +0 -0
  272. package/schema/examples/workspace/ventures/tandem/products/shop-app.json +22 -0
  273. package/schema/examples/workspace/ventures/tandem/profile.md +5 -0
  274. package/schema/examples/workspace/ventures/tandem/provenance.jsonl +13 -0
  275. package/schema/examples/workspace/ventures/tandem/purpose/README.md +3 -0
  276. package/schema/examples/workspace/ventures/tandem/purpose/telos.json +78 -0
  277. package/schema/examples/workspace/ventures/tandem/purpose/validation/go-to-market.json +35 -0
  278. package/schema/examples/workspace/ventures/tandem/purpose/validation/pricing.json +37 -0
  279. package/schema/examples/workspace/ventures/tandem/purpose/validation/problem.json +74 -0
  280. package/schema/examples/workspace/ventures/tandem/purpose/validation/product-market-fit.json +66 -0
  281. package/schema/examples/workspace/ventures/tandem/purpose/validation/solution.json +33 -0
  282. package/schema/examples/workspace/ventures/tandem/purpose/validation/team.json +52 -0
  283. package/schema/examples/workspace/ventures/tandem/venture.json +79 -0
  284. package/schema/examples/workspace/ventures/woodworking/knowledge/.gitkeep +0 -0
  285. package/schema/examples/workspace/ventures/woodworking/venture.json +21 -0
  286. package/schema/examples/workspace/workspace.json +8 -0
  287. package/schema/exit.schema.json +74 -0
  288. package/schema/foundation.mjs +118 -0
  289. package/schema/founder-agreement.schema.json +83 -0
  290. package/schema/gate.mjs +39 -0
  291. package/schema/handoff.schema.json +239 -0
  292. package/schema/icp.schema.json +136 -0
  293. package/schema/idea-graph.schema.json +61 -0
  294. package/schema/init-venture.mjs +98 -0
  295. package/schema/integration.schema.json +143 -0
  296. package/schema/knowledge-sources.schema.json +130 -0
  297. package/schema/layer.json +46 -0
  298. package/schema/layer.schema.json +119 -0
  299. package/schema/load-packages.mjs +26 -0
  300. package/schema/marketing-sitemap.schema.json +232 -0
  301. package/schema/migrate-venture.mjs +192 -0
  302. package/schema/need-now.json +601 -0
  303. package/schema/need-now.mjs +107 -0
  304. package/schema/nextjs-status.schema.json +29 -0
  305. package/schema/ownership.schema.json +282 -0
  306. package/schema/packages.json +4 -0
  307. package/schema/packages.mjs +247 -0
  308. package/schema/payouts.mjs +91 -0
  309. package/schema/port-venture.mjs +161 -0
  310. package/schema/product.schema.json +223 -0
  311. package/schema/provenance-entry.schema.json +154 -0
  312. package/schema/publication-policy.schema.json +293 -0
  313. package/schema/raw-source.schema.json +15 -0
  314. package/schema/reference.schema.json +115 -0
  315. package/schema/route-aliases.schema.json +25 -0
  316. package/schema/run-handoff.mjs +51 -0
  317. package/schema/scaffold/defaults.json +54 -0
  318. package/schema/site-presence.schema.json +337 -0
  319. package/schema/strategic-foundation.schema.json +74 -0
  320. package/schema/stream.schema.json +14 -0
  321. package/schema/team-plan.schema.json +157 -0
  322. package/schema/telos.schema.json +197 -0
  323. package/schema/time-to-ready.mjs +93 -0
  324. package/schema/upgrade-venture.mjs +129 -0
  325. package/schema/use-model.mjs +10 -0
  326. package/schema/validate.py +49 -0
  327. package/schema/validation-evidence.schema.json +123 -0
  328. package/schema/validation-go-to-market.schema.json +110 -0
  329. package/schema/validation-operations-readiness.schema.json +91 -0
  330. package/schema/validation-pricing.schema.json +114 -0
  331. package/schema/validation-problem.schema.json +118 -0
  332. package/schema/validation-product-market-fit.schema.json +135 -0
  333. package/schema/validation-solution.schema.json +79 -0
  334. package/schema/validation-team.schema.json +116 -0
  335. package/schema/venture.schema.json +407 -0
  336. package/schema/vocab/business-models.json +298 -0
  337. package/schema/where-used.schema.json +56 -0
  338. package/schema/workspace.schema.json +38 -0
@@ -0,0 +1,195 @@
1
+ // Product Anatomy Matrix runner, version 0.3.0 (unevaluated).
2
+ //
3
+ // node anatomy.mjs request <venture> print the Jev request; sends nothing
4
+ // node anatomy.mjs score <venture> <answers.json> --send ask Jev, write the answers file
5
+ // node anatomy.mjs matrix <venture> <answers.json> [--json] deduce portfolio roles for every phase (Markdown, or JSON)
6
+ //
7
+ // <venture> is a venture folder (venture.json plus products/*.json, EE-011) or a
8
+ // single input file with `venture`, `core`, `products` and `flows`.
9
+ //
10
+ // Order matters: the venture's core product (promise, who it is made to, what it must
11
+ // not deliver, the competence behind it) is fixed first, and every product is
12
+ // judged against it. Jev answers the typed questions in questions.json, one per
13
+ // product. Spillover comes from each product's `flows_to` (or the input's `flows`). A wedge flows into the
14
+ // flagship or is a standalone part of it (`part_of`); a revenue engine needs a revenue score of at least
15
+ // must_hold.revenue_engine. Must-holds are checked in
16
+ // code, never by Jev. Weights live in phases.json, so re-weighting a phase never
17
+ // needs re-scoring. Without TYPESAFE_API_KEY, a reasoning model fills the same
18
+ // answers file by hand and says so in its `scorer` field.
19
+
20
+ import { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
21
+ import { dirname, join } from "node:path";
22
+ import { fileURLToPath } from "node:url";
23
+
24
+ const here = dirname(fileURLToPath(import.meta.url));
25
+ const ENDPOINT = "https://api.typesafe.ai/v1/systemone";
26
+ const MODEL = "jev-latest";
27
+ const load = (p) => JSON.parse(readFileSync(p, "utf8"));
28
+ const { questions } = load(join(here, "questions.json"));
29
+ const { phases: allPhases, must_hold, tie } = load(join(here, "phases.json"));
30
+ // Discovery has no weights: no product is ranked before the core product exists.
31
+ const phases = allPhases.filter((p) => p.weights);
32
+
33
+ // A venture folder is read as one input: venture.json, products/*.json, flows from flows_to.
34
+ function readVenture(path) {
35
+ if (!statSync(path).isDirectory()) {
36
+ const input = load(path);
37
+ input.venture ??= input.company;
38
+ return input;
39
+ }
40
+ const venture = load(join(path, "venture.json"));
41
+ const dir = join(path, "products");
42
+ const cards = existsSync(dir) ? readdirSync(dir).filter((f) => f.endsWith(".json")).map((f) => load(join(dir, f))) : [];
43
+ const products = Object.fromEntries(cards.map((c) => [c.id, c]));
44
+ const flows = cards.flatMap((c) => (c.flows_to ?? []).map((to) => ({ from: c.id, to })));
45
+ return { venture, core: venture.core, products, flows };
46
+ }
47
+
48
+ function request(input) {
49
+ const qs = {};
50
+ for (const pid of Object.keys(input.products)) {
51
+ for (const [qid, q] of Object.entries(questions)) {
52
+ qs[`${qid}:${pid}`] = { ...q, instructions: `About the product in \`products.${pid}\`: ${q.instructions}` };
53
+ }
54
+ }
55
+ return { state: { venture: { ...input.venture, core: input.core }, products: input.products }, model: MODEL, questions: qs };
56
+ }
57
+
58
+ async function score(input, outPath) {
59
+ if (!process.env.TYPESAFE_API_KEY) {
60
+ console.error("No TYPESAFE_API_KEY set: fill the answers file with a reasoning model instead, and name it in `scorer`.");
61
+ process.exit(3);
62
+ }
63
+ const res = await fetch(ENDPOINT, {
64
+ method: "POST",
65
+ headers: { Authorization: `Bearer ${process.env.TYPESAFE_API_KEY}`, "Content-Type": "application/json" },
66
+ body: JSON.stringify(request(input)),
67
+ });
68
+ if (!res.ok) throw new Error(`TypeSafe returned ${res.status}: ${await res.text()}`);
69
+ const { answers } = await res.json();
70
+ const out = { scorer: MODEL, scored: new Date().toISOString(), answers: {} };
71
+ for (const [key, a] of Object.entries(answers)) {
72
+ const [qid, pid] = key.split(":");
73
+ out.answers[pid] ??= {};
74
+ out.answers[pid][qid] = a.type === "noul" ? a.noul : a.score;
75
+ out.answers[pid][`${qid}_confidence`] = a.confidence ?? null;
76
+ }
77
+ writeFileSync(outPath, JSON.stringify(out, null, 2) + "\n");
78
+ console.log(`wrote ${outPath} (${Object.keys(answers).length} answers from ${MODEL})`);
79
+ }
80
+
81
+ function norm(qid, v) {
82
+ const q = questions[qid];
83
+ return q.type === "score" ? v / (q.criteria.length - 1) : v;
84
+ }
85
+
86
+ function deduce(input, answersFile) {
87
+ const A = answersFile.answers;
88
+ const pids = Object.keys(input.products);
89
+ const out = Object.fromEntries(pids.map((p) => [p, 0]));
90
+ for (const f of input.flows ?? []) out[f.from] += 1;
91
+ const maxOut = Math.max(1, ...Object.values(out));
92
+ const phaseIndex = Object.fromEntries(phases.map((p, i) => [p.id, i]));
93
+ const now = phaseIndex[input.venture.phase] ?? -1; // -1: still in discovery, every phase is a projection
94
+
95
+ // Substrate: the product that is the core competence itself, phase-independent.
96
+ const substrate = pids.filter((p) => A[p].competence_draw >= 2.5)
97
+ .sort((a, b) => A[b].competence_draw - A[a].competence_draw || out[b] - out[a])[0] ?? null;
98
+
99
+ const byPhase = phases.map((ph, i) => {
100
+ const allowed = (p) => i >= phaseIndex[input.products[p].allowed_from ?? phases[0].id];
101
+ const rows = pids.map((p) => {
102
+ const w = ph.weights;
103
+ let sum = 0, total = 0;
104
+ for (const [c, wt] of Object.entries(w)) {
105
+ sum += wt * (c === "spillover" ? out[p] / maxOut : norm(c, A[p][c]));
106
+ total += wt;
107
+ }
108
+ const fails = [];
109
+ if (!allowed(p)) fails.push(`not allowed until ${input.products[p].allowed_from}`);
110
+ if (A[p].promise_delivery < must_hold.flagship.promise_delivery_at_least) fails.push("does not deliver the promise directly");
111
+ if (A[p].promise_breach >= must_hold.flagship.promise_breach_below) fails.push("could breach the promise");
112
+ return { p, score: sum / total, fails };
113
+ }).sort((a, b) => b.score - a.score);
114
+
115
+ const eligible = rows.filter((r) => !r.fails.length);
116
+ const flagship = eligible[0]?.p ?? null;
117
+ const tied = eligible.filter((r) => r.p !== flagship && eligible[0].score - r.score < tie).map((r) => r.p);
118
+ // A revenue engine needs real revenue, not merely the most of very little.
119
+ const topRevenue = Math.max(...pids.filter(allowed).map((p) => A[p].revenue));
120
+ const revenue = topRevenue < must_hold.revenue_engine.revenue_at_least ? []
121
+ : pids.filter((p) => allowed(p) && A[p].revenue === topRevenue);
122
+ // A wedge leads users into the flagship: it flows into it, or it is a part of the
123
+ // flagship kit that also stands alone (part_of, EE-015).
124
+ const leadsIn = (p) => (input.flows ?? []).some((f) => f.from === p && f.to === flagship)
125
+ || (input.products[p].part_of ?? []).includes(flagship);
126
+ // Each role is kept as an id (for data) and as the words the Markdown shows.
127
+ const role = {}, roleIds = {};
128
+ for (const p of pids) {
129
+ const r = [], ids = [];
130
+ const add = (id, text) => { ids.push(id); r.push(text); };
131
+ if (p === flagship) add("flagship", "flagship");
132
+ if (p === substrate) add("substrate", "substrate");
133
+ if (revenue.includes(p)) add("revenue-engine", revenue.length > 1 ? "revenue engine (tied)" : "revenue engine");
134
+ if (!r.length) {
135
+ if (!allowed(p)) add("option", `option (allowed from ${input.products[p].allowed_from})`);
136
+ else if (leadsIn(p) && A[p].ready >= 2) add("wedge", "wedge");
137
+ else if (A[p].promise_delivery <= 1 && A[p].competence_draw <= 1) add("unassigned", "unassigned: weak tie to the core");
138
+ else add("end-product", "end product");
139
+ }
140
+ role[p] = r.join(" + ");
141
+ roleIds[p] = { roles: ids, ...(revenue.includes(p) && revenue.length > 1 ? { revenue_engine_tied: true } : {}), ...(!allowed(p) ? { allowed_from: input.products[p].allowed_from } : {}) };
142
+ }
143
+ return { phase: ph, rows, flagship, tied, role, roleIds, projection: i > now };
144
+ });
145
+
146
+ byPhase.forEach((b, i) => {
147
+ const next = byPhase[i + 1];
148
+ if (next && next.flagship && next.flagship !== b.flagship) b.successor = next.flagship;
149
+ });
150
+ return { substrate, byPhase, out };
151
+ }
152
+
153
+ // The matrix as data (A-001): what the Markdown report shows, for tests and agents to read.
154
+ function toJson(input, answersFile, d) {
155
+ return {
156
+ venture: input.venture.id ?? input.venture.name, phase: input.venture.phase, scorer: answersFile.scorer,
157
+ substrate: d.substrate,
158
+ phases: d.byPhase.map((b) => ({
159
+ id: b.phase.id, name: b.phase.name, projection: b.projection, flagship: b.flagship, tied: b.tied, successor: b.successor ?? null,
160
+ roles: b.roleIds,
161
+ role_text: b.role,
162
+ scores: Object.fromEntries(b.rows.map((r) => [r.p, { score: +r.score.toFixed(2), flagship_fails: r.fails }])),
163
+ })),
164
+ };
165
+ }
166
+
167
+ function report(input, answersFile, d) {
168
+ const name = (p) => input.products[p].name;
169
+ const lines = [`# Product Anatomy Matrix: ${input.venture.name}`, "",
170
+ `Scored by: ${answersFile.scorer.replace(/\.$/, "")}. Current phase: ${input.venture.phase}. Later phases are projections from today's answers; re-answer at each gate.`, "",
171
+ `Core promise: ${input.core.promise}`, ""];
172
+ lines.push("Portfolio role by phase:", "", `| Product | ${phases.map((p) => p.name).join(" | ")} |`, `| --- |${phases.map(() => " --- |").join("")}`);
173
+ for (const p of Object.keys(input.products)) lines.push(`| ${name(p)} | ${d.byPhase.map((b) => b.role[p]).join(" | ")} |`);
174
+ for (const b of d.byPhase) {
175
+ lines.push("", `## ${b.phase.name}${b.projection ? " (projection)" : ""}: ${b.phase.binding_constraint}. Gate: ${b.phase.gate}.`, "",
176
+ "| Product | Phase score | Flagship must-holds |", "| --- | ---: | --- |");
177
+ for (const r of b.rows) lines.push(`| ${name(r.p)} | ${r.score.toFixed(2)} | ${r.fails.length ? r.fails.join("; ") : "pass"} |`);
178
+ lines.push("", `Flagship: ${b.flagship ? name(b.flagship) : "none passes the must-holds"}${b.tied.length ? ` (tie within ${tie} with ${b.tied.map(name).join(", ")})` : ""}.${b.successor ? ` Successor: ${name(b.successor)}.` : ""}`);
179
+ }
180
+ return lines.join("\n");
181
+ }
182
+
183
+ const [cmd, inputPath, answersPath] = process.argv.slice(2).filter((a) => a !== "--send" && a !== "--json");
184
+ if (!inputPath) { console.error("usage: node anatomy.mjs request|score|matrix <input.json> [answers.json] [--send]"); process.exit(2); }
185
+ const input = readVenture(inputPath);
186
+ if (!input.core) { console.error("This venture has no core product yet. State it before ranking products (it is required once the venture leaves discovery)."); process.exit(2); }
187
+ if (cmd === "request") console.log(JSON.stringify(request(input), null, 2));
188
+ else if (cmd === "score") {
189
+ if (!process.argv.includes("--send")) { console.log(JSON.stringify(request(input), null, 2)); console.error("Printed only. Add --send to call TypeSafe."); }
190
+ else await score(input, answersPath);
191
+ } else if (cmd === "matrix") {
192
+ const answers = load(answersPath);
193
+ const d = deduce(input, answers);
194
+ console.log(process.argv.includes("--json") ? JSON.stringify(toJson(input, answers, d), null, 2) : report(input, answers, d));
195
+ } else { console.error(`unknown command ${cmd}`); process.exit(2); }
@@ -0,0 +1,11 @@
1
+ {
2
+ "scorer": "reasoning model (Claude), not Jev: no TYPESAFE_API_KEY in the session that wrote this. Draft for Torian to correct; replace by running `score --send`.",
3
+ "scored": "2026-10-26T22:50:00Z",
4
+ "answers": {
5
+ "social": { "promise_delivery": 3, "competence_draw": 2, "promise_breach": 0.3, "job_intensity": 2, "ready": 3, "revenue": 1, "reversibility": 2 },
6
+ "docket": { "promise_delivery": 1, "competence_draw": 1, "promise_breach": 0.4, "job_intensity": 2, "ready": 2, "revenue": 1, "reversibility": 3 },
7
+ "polity-os": { "promise_delivery": 2, "competence_draw": 2, "promise_breach": 0.1, "job_intensity": 3, "ready": 1, "revenue": 3, "reversibility": 0 },
8
+ "data": { "promise_delivery": 1, "competence_draw": 3, "promise_breach": 0.05, "job_intensity": 2, "ready": 2, "revenue": 3, "reversibility": 2 },
9
+ "nico": { "promise_delivery": 0, "competence_draw": 0, "promise_breach": 0.3, "job_intensity": 1, "ready": 0, "revenue": 1, "reversibility": 3 }
10
+ }
11
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "venture": {
3
+ "name": "Polity",
4
+ "phase": "validation",
5
+ "team": "One founder working with AI agents; no employees.",
6
+ "current_state": "Polity Social (the polity-app web app, with Polity Search on its home page) is in build and use. Polity OS has an observer-mode prototype that reads public records only. The other products are defined but not built.",
7
+ "standing_decisions": [
8
+ "D-038: no services sold to governments before Stage 2; before Stage 2, everything about government serves the public."
9
+ ]
10
+ },
11
+ "core": {
12
+ "source": "Vision, Mission, Promise working lock, 2026-07-27 (applied to VISION_SPEC as a Class 2 patch)",
13
+ "promise": "When you trust Polity, you can find the institutional geometry that governs you, rendered with primary-source evidence or an explicit incomplete grade.",
14
+ "promised_to": "Members of the public: the people governed by the institutions Polity indexes.",
15
+ "must_not": "Spin or unlabeled persuasion delivered under Polity's name.",
16
+ "competence": "Indexing institutional geometry (jurisdictions, institutions, offices, seats, occupants, instruments, events, primary records) and rendering it with retrieval, quotation, grading and citation, including honest incompleteness."
17
+ },
18
+ "products": {
19
+ "social": {
20
+ "name": "Polity Social",
21
+ "faces": "the public",
22
+ "description": "The civic social network and Polity's public home: Polity Search over the index, representatives and places by address, notebooks, news, quantitative views, and pages for organisations (absorbs Notebook, Quant, News and the website builder)."
23
+ },
24
+ "docket": {
25
+ "name": "Docket",
26
+ "faces": "the public",
27
+ "description": "A friend-group conversation docket: friends form a group, add topics and media sources, and vote on what to discuss. Format first (works on paper), could be a plugin for Telegram, Discord or Slack, and absorbs the classroom and education use. Debate is one mode; good conversation is the goal."
28
+ },
29
+ "polity-os": {
30
+ "name": "Polity OS",
31
+ "faces": "governments and organisations as tenants, citizens as members",
32
+ "allowed_from": "beachhead",
33
+ "allowed_from_reason": "D-038 makes it the Stage 2 product. Mapping Polity's Stage 2 to the Beachhead phase is a draft assumption.",
34
+ "description": "One national multi-tenant operating system for governing bodies: governments and organisations run their procedures, agendas, votes and records on it; citizens are members. Merges the Citizens and Government editions and Justice. Today only an observer that turns public records into advisory validity reports."
35
+ },
36
+ "data": {
37
+ "name": "Polity Data",
38
+ "faces": "institutions, developers and researchers (no direct public face)",
39
+ "description": "The cited, structured index of institutional records, offered headless: API, datasets and reports for institutions, media, researchers and developers. Most justice-record work lives here."
40
+ },
41
+ "nico": {
42
+ "name": "Nico",
43
+ "faces": "the public",
44
+ "description": "A personal knowledge system that models a person's own values and ideas (Idionaut is one mode). No stated link yet to civic records."
45
+ }
46
+ },
47
+ "flows": [
48
+ {
49
+ "from": "data",
50
+ "to": "social",
51
+ "carries": "cited records"
52
+ },
53
+ {
54
+ "from": "data",
55
+ "to": "docket",
56
+ "carries": "cited sources for topics"
57
+ },
58
+ {
59
+ "from": "data",
60
+ "to": "polity-os",
61
+ "carries": "jurisdiction and procedure records"
62
+ },
63
+ {
64
+ "from": "data",
65
+ "to": "nico",
66
+ "carries": "positions and votes"
67
+ },
68
+ {
69
+ "from": "social",
70
+ "to": "docket",
71
+ "carries": "users and topics"
72
+ },
73
+ {
74
+ "from": "social",
75
+ "to": "nico",
76
+ "carries": "users"
77
+ },
78
+ {
79
+ "from": "docket",
80
+ "to": "social",
81
+ "carries": "groups who arrive through friends"
82
+ },
83
+ {
84
+ "from": "polity-os",
85
+ "to": "data",
86
+ "carries": "primary records created by tenants"
87
+ }
88
+ ]
89
+ }
@@ -0,0 +1,107 @@
1
+ {
2
+ "version": "0.3.0",
3
+ "note": "Succession Matrix phases, gates and weights, version 0.x (unevaluated). The five phases are the venture phases of EE-012. Discovery has no weights: no product is ranked before the core product exists. Weights: 1 low, 2 medium, 3 high. Spillover is computed from flows_to, not asked. Changing a weight never needs re-scoring. Sources: purpose/references/references.json.",
4
+ "phases": [
5
+ {
6
+ "id": "discovery",
7
+ "name": "Discovery",
8
+ "question": "Does a real problem exist, and who has it?",
9
+ "gate": "Problem-solution fit",
10
+ "references": [
11
+ "blank-2005-four-steps"
12
+ ]
13
+ },
14
+ {
15
+ "id": "validation",
16
+ "name": "Validation",
17
+ "question": "Will people adopt this solution and keep using it?",
18
+ "binding_constraint": "proof that a niche wants the thing badly, and keeps using it",
19
+ "gate": "Product-market fit: retention holds",
20
+ "references": [
21
+ "blank-2005-four-steps",
22
+ "moore-1991-crossing-the-chasm",
23
+ "andreessen-2007-only-thing-that-matters",
24
+ "dixon-2010-thin-edge-of-the-wedge"
25
+ ],
26
+ "weights": {
27
+ "promise_delivery": 3,
28
+ "competence_draw": 2,
29
+ "job_intensity": 3,
30
+ "ready": 3,
31
+ "spillover": 1,
32
+ "revenue": 1,
33
+ "reversibility": 2
34
+ }
35
+ },
36
+ {
37
+ "id": "beachhead",
38
+ "name": "Beachhead",
39
+ "question": "Can we win one segment repeatably, at a profitable cost?",
40
+ "binding_constraint": "winning one mainstream segment outright",
41
+ "gate": "Repeatability",
42
+ "references": [
43
+ "moore-1991-crossing-the-chasm",
44
+ "zook-allen-2012-repeatability"
45
+ ],
46
+ "weights": {
47
+ "promise_delivery": 3,
48
+ "competence_draw": 2,
49
+ "job_intensity": 3,
50
+ "ready": 2,
51
+ "spillover": 2,
52
+ "revenue": 2,
53
+ "reversibility": 2
54
+ }
55
+ },
56
+ {
57
+ "id": "scale",
58
+ "name": "Scale",
59
+ "question": "How fast can we take the mass market?",
60
+ "binding_constraint": "scale, revenue and margin",
61
+ "gate": "Market leadership with healthy margins",
62
+ "references": [
63
+ "moore-1995-inside-the-tornado"
64
+ ],
65
+ "weights": {
66
+ "promise_delivery": 3,
67
+ "competence_draw": 3,
68
+ "job_intensity": 2,
69
+ "ready": 1,
70
+ "spillover": 3,
71
+ "revenue": 3,
72
+ "reversibility": 1
73
+ }
74
+ },
75
+ {
76
+ "id": "platform",
77
+ "name": "Platform",
78
+ "question": "What will others build on, so the venture can't be displaced?",
79
+ "binding_constraint": "becoming what others build on before the core goes stale",
80
+ "gate": "Others build on it",
81
+ "references": [
82
+ "baghai-coley-white-1999-alchemy-of-growth",
83
+ "google-2026-six-phase-model"
84
+ ],
85
+ "weights": {
86
+ "promise_delivery": 3,
87
+ "competence_draw": 3,
88
+ "job_intensity": 1,
89
+ "ready": 1,
90
+ "spillover": 3,
91
+ "revenue": 2,
92
+ "reversibility": 3
93
+ }
94
+ }
95
+ ],
96
+ "must_hold": {
97
+ "flagship": {
98
+ "promise_delivery_at_least": 2,
99
+ "promise_breach_below": 0.5,
100
+ "allowed_in_phase": true
101
+ },
102
+ "revenue_engine": {
103
+ "revenue_at_least": 2
104
+ }
105
+ },
106
+ "tie": 0.1
107
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "note": "Product Anatomy Matrix questions, version 0.x (unevaluated). Each is one typed judgment per product, asked against the venture's core product in `venture.core`. Weights live in phases.json, apart from the answers.",
4
+ "questions": {
5
+ "promise_delivery": {
6
+ "type": "score",
7
+ "instructions": "When the people the core promise is made to use this product, how directly do they get what `venture.core.promise` promises?",
8
+ "criteria": [
9
+ "They do not get it from this product at all",
10
+ "They get it only indirectly, through another product or an intermediary",
11
+ "They get part of it directly from this product",
12
+ "They get the whole promise directly from this product"
13
+ ]
14
+ },
15
+ "competence_draw": {
16
+ "type": "score",
17
+ "instructions": "How much does this product depend on the core competence described in `venture.core.competence`?",
18
+ "criteria": [
19
+ "It does not use the core competence",
20
+ "It uses the core competence's outputs now and then",
21
+ "It is built on the core competence and would not work without it",
22
+ "It is the core competence itself, offered as a product"
23
+ ]
24
+ },
25
+ "promise_breach": {
26
+ "type": "noul",
27
+ "instructions": "As described, could this product lead people to receive what `venture.core.must_not` rules out, under the venture's name?",
28
+ "criteria": {
29
+ "true": "Yes: the product's normal use could deliver what the promise rules out",
30
+ "false": "No: its normal use stays within the promise"
31
+ }
32
+ },
33
+ "job_intensity": {
34
+ "type": "score",
35
+ "instructions": "How strongly do this product's first users feel the problem it solves?",
36
+ "criteria": [
37
+ "A mild preference: they would not change their habits for it",
38
+ "A noticeable annoyance they would fix if it were easy",
39
+ "A real pain they already spend time or money working around",
40
+ "An urgent pain they would adopt an unfinished product to fix"
41
+ ]
42
+ },
43
+ "ready": {
44
+ "type": "score",
45
+ "instructions": "Given `venture.members` (people and agents, each with a role), `venture.phase` and this product's `status`, how close is this product to being usable by real users? Agents count as team for work they can do under the venture's decision rights.",
46
+ "criteria": [
47
+ "It is an idea; most of it would need building with people the venture does not have",
48
+ "Parts exist, but it needs major work or people the venture does not have",
49
+ "Most of it exists, or it could be built by the current team within a few months",
50
+ "Real users can use it now"
51
+ ]
52
+ },
53
+ "revenue": {
54
+ "type": "score",
55
+ "instructions": "How strong is this product's own path to revenue, without counting what it does for the other products?",
56
+ "criteria": [
57
+ "No credible revenue path",
58
+ "A weak or distant revenue path",
59
+ "A clear revenue path that others in its market already prove",
60
+ "Buyers who would pay now, with a clear price"
61
+ ]
62
+ },
63
+ "reversibility": {
64
+ "type": "score",
65
+ "instructions": "If the venture led with this product and it proved the wrong choice, how easily could it back off?",
66
+ "criteria": [
67
+ "Very hard: commitments to customers, contracts or regulators would be broken",
68
+ "Hard: it would cost significant money, trust or time",
69
+ "Moderate: some sunk work and some disappointed users",
70
+ "Easy: little would be lost"
71
+ ]
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,14 @@
1
+ # Validation kit
2
+
3
+ Purpose layer, second kit (EE-026). How probable it is that a venture is validated, from cited evidence rather than a declared phase.
4
+
5
+ | Part | Where |
6
+ | --- | --- |
7
+ | Record types | One per sub-score: `schema/validation-<sub-score>.schema.json` at `<venture>/purpose/validation/<sub-score>.json`; all share `schema/validation-evidence.schema.json` |
8
+ | Weights | `weights.json`: weights and floors by go-to-market path and venture kind (version 0.x, unevaluated) |
9
+ | Grading and score | `node schema/check-validation.mjs <dir> [--json] [--score]`: GRADE levels per evidence item and record, data facts (Ellis share, retention levelling off, team gaps), and the validation score |
10
+ | Skills | `skills/problem-validation/`, `skills/validation-score/` |
11
+ | Templates | `templates/<sub-score>.md` for each record, plus `templates/problem-interview.md` |
12
+ | References | `references/references.json` |
13
+
14
+ Sub-scores: problem, solution, product-market fit, pricing, go-to-market, team, operations readiness per MAD tier.
@@ -0,0 +1,122 @@
1
+ {
2
+ "layer": "purpose",
3
+ "references": [
4
+ {
5
+ "id": "grade-handbook",
6
+ "title": "GRADE Handbook",
7
+ "authors": [
8
+ "GRADE Working Group"
9
+ ],
10
+ "year": 2013,
11
+ "kind": "standard",
12
+ "summary": "Certainty of evidence rated high, moderate, low or very low. Randomized trials start high and observational studies low; certainty drops for risk of bias, inconsistency, indirectness, imprecision and publication bias, and rises for a large effect or a dose-response gradient.",
13
+ "url": "https://gdt.gradepro.org/app/handbook/handbook.html",
14
+ "checked": "2026-10-27",
15
+ "informs": [
16
+ "rule:evidence-grade",
17
+ "field:validation-evidence.kind",
18
+ "field:validation-evidence.audience",
19
+ "field:validation-evidence.sample"
20
+ ],
21
+ "stance": {
22
+ "is": "adapted",
23
+ "why": "The four levels and the start-then-downgrade method are kept; study design becomes the kind of signal (behavior starts high, stated intent low), indirectness becomes audience fit and imprecision becomes sample size."
24
+ }
25
+ },
26
+ {
27
+ "id": "fitzpatrick-2013-mom-test",
28
+ "title": "The Mom Test",
29
+ "authors": [
30
+ "Rob Fitzpatrick"
31
+ ],
32
+ "year": 2013,
33
+ "kind": "book",
34
+ "summary": "Ask about people's lives and past behavior, not about your idea; compliments, generalities and hypotheticals are not data, and commitment is the real signal.",
35
+ "url": "https://www.momtestbook.com/",
36
+ "checked": "2026-10-27",
37
+ "informs": [
38
+ "field:validation-evidence.specificity",
39
+ "field:validation-evidence.kind",
40
+ "rule:evidence-grade"
41
+ ],
42
+ "stance": {
43
+ "is": "adopted",
44
+ "why": "Its ranking of signals (commitment over compliments, past facts over hypotheticals) sets the starting grades and the specificity downgrade; its method is the problem-interview template."
45
+ }
46
+ },
47
+ {
48
+ "id": "cb-insights-2026-startup-failure",
49
+ "title": "The top 9 reasons startups fail",
50
+ "authors": [
51
+ "CB Insights"
52
+ ],
53
+ "year": 2026,
54
+ "kind": "article",
55
+ "summary": "Analysis of startup post-mortems; poor product-market fit was cited in 43% of failures (causes overlap).",
56
+ "url": "https://www.cbinsights.com/research/report/startup-failure-reasons-top/",
57
+ "checked": "2026-10-27",
58
+ "informs": [
59
+ "rule:validation-fails-closed"
60
+ ],
61
+ "stance": {
62
+ "is": "adopted",
63
+ "why": "The most common cause of failure is building what the market does not need, so a validation claim with no evidence grades very low instead of passing."
64
+ }
65
+ },
66
+ {
67
+ "id": "vohra-2018-superhuman-pmf-engine",
68
+ "title": "How Superhuman Built an Engine to Find Product Market Fit",
69
+ "authors": [
70
+ "Rahul Vohra"
71
+ ],
72
+ "year": 2018,
73
+ "kind": "article",
74
+ "summary": "Applies Sean Ellis's leading indicator: ask active users how they would feel if they could no longer use the product; 40% or more answering 'very disappointed' marks product-market fit. Segment the answers and work on the users who almost said very disappointed.",
75
+ "url": "https://review.firstround.com/how-superhuman-built-an-engine-to-find-product-market-fit/",
76
+ "checked": "2026-10-27",
77
+ "informs": [
78
+ "field:validation-product-market-fit.ellis",
79
+ "rule:ellis-share"
80
+ ],
81
+ "stance": {
82
+ "is": "adopted",
83
+ "why": "The Ellis share is recorded as data and reported beside the grade; 40% is the usual bar."
84
+ }
85
+ },
86
+ {
87
+ "id": "van-westendorp-1976-price-sensitivity",
88
+ "title": "NSS Price Sensitivity Meter: a new approach to study consumer perception of prices",
89
+ "authors": [
90
+ "Peter H. van Westendorp"
91
+ ],
92
+ "year": 1976,
93
+ "kind": "paper",
94
+ "summary": "Four questions (too cheap, cheap, expensive, too expensive) give an acceptable price range from stated responses.",
95
+ "informs": [
96
+ "field:validation-pricing.points"
97
+ ],
98
+ "stance": {
99
+ "is": "adopted",
100
+ "why": "The pricing template uses its four questions; the answers are stated evidence and grade below real payments."
101
+ }
102
+ },
103
+ {
104
+ "id": "wasserman-2012-founders-dilemmas",
105
+ "title": "The Founder's Dilemmas",
106
+ "authors": [
107
+ "Noam Wasserman"
108
+ ],
109
+ "year": 2012,
110
+ "kind": "book",
111
+ "summary": "Evidence on founding teams: when to add cofounders, the costs of founding with friends and family, splitting roles and equity.",
112
+ "informs": [
113
+ "field:validation-team.cofounder_sought",
114
+ "field:validation-team.needed"
115
+ ],
116
+ "stance": {
117
+ "is": "adopted",
118
+ "why": "The team template asks which skills the coming phases need and which a cofounder should bring, before choosing people."
119
+ }
120
+ }
121
+ ]
122
+ }
@@ -0,0 +1,43 @@
1
+ ---
2
+ type: knowledge
3
+ tags: [everything-ecosystem, skills, purpose, validation, problem, evidence]
4
+ ai-model: claude-opus-5.5
5
+ created: 2026-10-27T20:21:00Z
6
+ source: hybrid
7
+ name: problem-validation
8
+ description: >
9
+ Help a builder show that the problem their venture solves is real, with cited
10
+ evidence instead of a statement: who has it, how they cope today, what it
11
+ costs them, and what the evidence is strong enough for (explore, prototype,
12
+ charge, raise), with no single score and never a "not viable" verdict.
13
+ Writes purpose/validation/problem.json; schema/assess-problem.mjs assesses it
14
+ after asking the person to fill in what is missing or run as is (EE-026, EE-050).
15
+ MANDATORY TRIGGERS: problem validation, validate the problem, is this a real
16
+ problem, customer discovery, problem interview, Mom Test, pain point,
17
+ evidence for the problem, market research for the problem, problem-solution fit.
18
+ ---
19
+
20
+ # Problem validation
21
+
22
+ Purpose layer, validation kit (EE-026, EE-050). Writes `purpose/validation/problem.json`; `node schema/assess-problem.mjs <venture dir>` (route `purpose/validation/assess`) says what its evidence is strong enough for. The behaviors it keeps are in `features/problem-assessment.feature`.
23
+
24
+ ## The rule: no verdict from missing evidence
25
+
26
+ There is no score and no "not viable". The problem splits into four assumptions (it exists, our segment has it, it hurts enough that people already spend on it, why now), and each gets a label from its evidence: demonstrated, inferred, assumed, unknown or contradicted. The labels say which commitment the evidence supports: explore, prototype, charge or raise. Missing evidence is unknown, never a verdict against the idea. Competitors with paying customers count for the problem. Only first-hand behavior or commitment from five or more people in the segment demonstrates; anything reported (a vendor's customer count, a report) infers. Contradicted needs evidence against from the segment at least as strong as the evidence for.
27
+
28
+ ## Steps
29
+
30
+ 1. **Run the assessment first.** When the record is missing or incomplete it does not assess; it lists what is missing and what running as is would mean. **Show the person that list and ask whether to fill it in or run as is.** Never choose for them: pass `as_is` (CLI `--as-is`, MCP and API `as_is: true`) only after they chose it.
31
+ 2. **Fill in** what they chose to fill: `statement`, `segment`, `cost` or `workarounds`, `why_now`, and for each evidence item the `assumption` it bears on. Use `templates/problem.md`.
32
+ 3. **Find the cheapest evidence for the blocking assumption.** The result names it and a test. Competitors and desk research are quick and infer; interviews with five or more people in the segment (`templates/problem-interview.md`) and workarounds they already pay for can demonstrate. Save notes in the venture folder, so items are first-hand.
33
+ 4. **Record evidence against as well** (`supports: false`).
34
+ 5. **Run again** and tell the person what the evidence now supports and the next test, in those words.
35
+
36
+ ## When to stop
37
+
38
+ When the evidence supports the commitment the founder is about to make. Prototyping needs the problem and its cost inferred; charging needs the segment and the cost demonstrated. Don't research past the next commitment.
39
+
40
+ ## Guardrails
41
+
42
+ - Never invent evidence or fill a source with a plausible URL. A missing source is an open question.
43
+ - Interview notes may hold personal data. Keep names out of the notes, or keep the notes out of any public repository.