naive-framework 0.1.0 → 0.3.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 (281) hide show
  1. package/AGENTS.md +2 -1
  2. package/docs/decisions/decisions.json +42 -0
  3. package/docs/reference/ROUTES.md +36 -37
  4. package/evidence/skills/fidelity-ladder-audit/ladder-census.mjs +2 -1
  5. package/governance/layer.json +2 -1
  6. package/governance/venture-template/roles/venture-roles.json +62 -0
  7. package/interface/acting.mjs +83 -0
  8. package/interface/adapters/claude-code.json +16 -0
  9. package/interface/adapters/codex.json +14 -0
  10. package/interface/adapters/cursor.json +16 -0
  11. package/interface/adapters.mjs +183 -0
  12. package/interface/api/server.mjs +4 -2
  13. package/interface/boundaries.mjs +219 -0
  14. package/interface/brand.mjs +215 -0
  15. package/interface/cli/freshness.mjs +59 -0
  16. package/interface/cli/guard.mjs +6 -0
  17. package/interface/cli/mentura.mjs +82 -11
  18. package/interface/cli/naive.mjs +44 -14
  19. package/interface/context.mjs +525 -0
  20. package/interface/demo/board.mjs +9 -8
  21. package/interface/demo/decision-harness.mjs +4 -3
  22. package/interface/dev/setup.mjs +84 -0
  23. package/interface/gate-hooks.mjs +37 -0
  24. package/interface/harness/evals.mjs +10 -9
  25. package/interface/harness/run.mjs +16 -15
  26. package/interface/instrumentation.mjs +87 -0
  27. package/interface/kit-boundary.mjs +73 -0
  28. package/interface/layer.json +8 -2
  29. package/interface/mcp/server.mjs +47 -7
  30. package/interface/package-routes.mjs +197 -0
  31. package/interface/provenance.mjs +28 -4
  32. package/interface/reads.mjs +174 -0
  33. package/interface/release-card.mjs +43 -0
  34. package/interface/router.mjs +110 -36
  35. package/interface/skills/naive-setup/SKILL.md +71 -0
  36. package/interface/skills/naive-setup/artifact.html +83 -0
  37. package/interface/vitals.mjs +116 -0
  38. package/interface/writes.mjs +190 -0
  39. package/knowledge/connectors/catalog.mjs +3 -2
  40. package/knowledge/connectors/filesystem.mjs +10 -5
  41. package/knowledge/connectors/index.mjs +3 -2
  42. package/knowledge/freshness.json +85 -0
  43. package/knowledge/layer.json +11 -3
  44. package/knowledge/templates/glossary.md +23 -0
  45. package/operations/layer.json +10 -3
  46. package/operations/marketing/check-public.mjs +7 -6
  47. package/operations/marketing/site/plan.mjs +4 -3
  48. package/operations/marketing/site/presence.mjs +4 -3
  49. package/operations/templates/marketing-brand.md +46 -0
  50. package/operations/templates/public-assets.md +39 -0
  51. package/package.json +3 -1
  52. package/packages/catalog.json +8 -0
  53. package/packages/customers/package.json +21 -1
  54. package/packages/deals/package.json +27 -0
  55. package/packages/decisions/package.json +12 -1
  56. package/packages/finance/frames/fund-without-ceding-control.frame.json +177 -0
  57. package/packages/foundation/package.json +8 -1
  58. package/packages/fund/package.json +48 -0
  59. package/packages/marketing/package.json +10 -4
  60. package/packages/money/package.json +24 -3
  61. package/packages/validation/package.json +13 -0
  62. package/platform/README.md +6 -0
  63. package/platform/adapter.json +15 -0
  64. package/platform/integrations/remote-image.mjs +79 -0
  65. package/platform/integrations/rho.mjs +9 -7
  66. package/platform/kits/README.md +8 -1
  67. package/platform/kits/agent-upgrade/kit.json +15 -0
  68. package/platform/kits/agent-upgrade/run.mjs +82 -0
  69. package/platform/kits/agent-upgrade/stand-in-agent.mjs +32 -0
  70. package/platform/kits/validation-kickoff/kit.json +29 -0
  71. package/platform/webhooks/server.mjs +70 -0
  72. package/purpose/frameworks/idea-map/ideamap.mjs +4 -2
  73. package/purpose/frameworks/idea-map/route.mjs +5 -4
  74. package/purpose/frameworks/product-anatomy/anatomy.mjs +2 -1
  75. package/schema/README.md +1 -0
  76. package/schema/access.mjs +58 -0
  77. package/schema/adapter.schema.json +33 -0
  78. package/schema/add-department.mjs +3 -2
  79. package/schema/assess-problem.mjs +3 -2
  80. package/schema/assets.mjs +213 -0
  81. package/schema/brand.mjs +374 -0
  82. package/schema/build-release.mjs +61 -0
  83. package/schema/caching.mjs +506 -0
  84. package/schema/check-assets.mjs +24 -0
  85. package/schema/check-brand.mjs +24 -0
  86. package/schema/check-config.mjs +111 -0
  87. package/schema/check-data-model.mjs +2 -1
  88. package/schema/check-data-packages.mjs +5 -4
  89. package/schema/check-execution.mjs +4 -3
  90. package/schema/check-nextjs-status.mjs +3 -1
  91. package/schema/check-people.mjs +84 -0
  92. package/schema/check-private.mjs +2 -1
  93. package/schema/check-ready.mjs +6 -5
  94. package/schema/check-sources.mjs +11 -2
  95. package/schema/check-where-used.mjs +4 -3
  96. package/schema/data-model.json +334 -8
  97. package/schema/deal.schema.json +80 -0
  98. package/schema/decision-analytics.mjs +2 -1
  99. package/schema/decisions.mjs +21 -12
  100. package/schema/examples/frames/judge.mjs +10 -0
  101. package/schema/examples/venture-type/jev.mjs +12 -0
  102. package/schema/examples/workspace/ventures/acme-labs/AGENTS.md +17 -0
  103. package/schema/examples/workspace/ventures/acme-labs/accounts/.gitkeep +0 -0
  104. package/schema/examples/workspace/ventures/acme-labs/decisions/discovery-goal.decision.json +23 -0
  105. package/schema/examples/workspace/ventures/acme-labs/decisions/statement-icp.decision.json +22 -0
  106. package/schema/examples/workspace/ventures/acme-labs/decisions/statement-problem.decision.json +22 -0
  107. package/schema/examples/workspace/ventures/acme-labs/decisions/venture.team.decision.json +37 -0
  108. package/schema/examples/workspace/ventures/acme-labs/knowledge/README.md +3 -0
  109. package/schema/examples/workspace/ventures/acme-labs/knowledge/sources.json +46 -0
  110. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000001.json +12 -0
  111. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000002.json +12 -0
  112. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000003.json +12 -0
  113. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000004.json +12 -0
  114. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000005.json +12 -0
  115. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000006.json +12 -0
  116. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000007.json +12 -0
  117. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000008.json +12 -0
  118. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000009.json +12 -0
  119. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000010.json +12 -0
  120. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000011.json +12 -0
  121. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000012.json +12 -0
  122. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000013.json +12 -0
  123. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000014.json +12 -0
  124. package/schema/examples/workspace/ventures/acme-labs/money/_streams/transactions/stream.json +5 -0
  125. package/schema/examples/workspace/ventures/acme-labs/money/_summary.json +30 -0
  126. package/schema/examples/workspace/ventures/acme-labs/operations/departments/customer-service/README.md +5 -0
  127. package/schema/examples/workspace/ventures/acme-labs/operations/departments/customer-service/department.json +5 -0
  128. package/schema/examples/workspace/ventures/acme-labs/operations/departments/finance/README.md +5 -0
  129. package/schema/examples/workspace/ventures/acme-labs/operations/departments/finance/department.json +5 -0
  130. package/schema/examples/workspace/ventures/acme-labs/operations/departments/human-capital/README.md +5 -0
  131. package/schema/examples/workspace/ventures/acme-labs/operations/departments/human-capital/department.json +5 -0
  132. package/schema/examples/workspace/ventures/acme-labs/operations/departments/it/README.md +5 -0
  133. package/schema/examples/workspace/ventures/acme-labs/operations/departments/it/department.json +5 -0
  134. package/schema/examples/workspace/ventures/acme-labs/operations/departments/marketing-and-sales/README.md +5 -0
  135. package/schema/examples/workspace/ventures/acme-labs/operations/departments/marketing-and-sales/department.json +5 -0
  136. package/schema/examples/workspace/ventures/acme-labs/operations/departments/products/README.md +5 -0
  137. package/schema/examples/workspace/ventures/acme-labs/operations/departments/products/department.json +5 -0
  138. package/schema/examples/workspace/ventures/acme-labs/operations/departments/strategy/README.md +5 -0
  139. package/schema/examples/workspace/ventures/acme-labs/operations/departments/strategy/department.json +5 -0
  140. package/schema/examples/workspace/ventures/acme-labs/people/founders/maya-chen.json +15 -0
  141. package/schema/examples/workspace/ventures/acme-labs/people/people.json +22 -0
  142. package/schema/examples/workspace/ventures/acme-labs/pillars/brand.md +5 -0
  143. package/schema/examples/workspace/ventures/acme-labs/pillars/business.md +5 -0
  144. package/schema/examples/workspace/ventures/acme-labs/pillars/product.md +5 -0
  145. package/schema/examples/workspace/ventures/acme-labs/products/.gitkeep +0 -0
  146. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.core-product.decision.json +28 -0
  147. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.exists.decision.json +38 -0
  148. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.flagship.decision.json +27 -0
  149. package/schema/examples/workspace/ventures/acme-labs/profile.md +12 -0
  150. package/schema/examples/workspace/ventures/acme-labs/provenance.jsonl +12 -0
  151. package/schema/examples/workspace/ventures/acme-labs/raw/dump.md +6 -0
  152. package/schema/examples/workspace/ventures/acme-labs/venture.json +27 -0
  153. package/schema/examples/workspace/ventures/northstar/AGENTS.md +17 -0
  154. package/schema/examples/workspace/ventures/northstar/accounts/.gitkeep +0 -0
  155. package/schema/examples/workspace/ventures/northstar/deals/ductline.json +8 -0
  156. package/schema/examples/workspace/ventures/northstar/deals/kilnworks.json +14 -0
  157. package/schema/examples/workspace/ventures/northstar/decisions/venture.team.decision.json +31 -0
  158. package/schema/examples/workspace/ventures/northstar/evidence/README.md +3 -0
  159. package/schema/examples/workspace/ventures/northstar/fund/decisions/terms.decision.json +27 -0
  160. package/schema/examples/workspace/ventures/northstar/fund/decisions/terms.first-close.decision.json +27 -0
  161. package/schema/examples/workspace/ventures/northstar/fund/decisions/thesis.decision.json +26 -0
  162. package/schema/examples/workspace/ventures/northstar/fund/terms.json +22 -0
  163. package/schema/examples/workspace/ventures/northstar/fund/thesis.json +22 -0
  164. package/schema/examples/workspace/ventures/northstar/governance/README.md +3 -0
  165. package/schema/examples/workspace/ventures/northstar/governance/departments/external-relationships/charter.md +5 -0
  166. package/schema/examples/workspace/ventures/northstar/governance/departments/external-relationships/department.json +5 -0
  167. package/schema/examples/workspace/ventures/northstar/governance/departments/finance/charter.md +5 -0
  168. package/schema/examples/workspace/ventures/northstar/governance/departments/finance/department.json +5 -0
  169. package/schema/examples/workspace/ventures/northstar/governance/departments/human-capital/charter.md +5 -0
  170. package/schema/examples/workspace/ventures/northstar/governance/departments/human-capital/department.json +5 -0
  171. package/schema/examples/workspace/ventures/northstar/governance/departments/risk-and-compliance/charter.md +5 -0
  172. package/schema/examples/workspace/ventures/northstar/governance/departments/risk-and-compliance/department.json +5 -0
  173. package/schema/examples/workspace/ventures/northstar/governance/departments/strategy/charter.md +5 -0
  174. package/schema/examples/workspace/ventures/northstar/governance/departments/strategy/department.json +5 -0
  175. package/schema/examples/workspace/ventures/northstar/knowledge/README.md +3 -0
  176. package/schema/examples/workspace/ventures/northstar/operations/README.md +3 -0
  177. package/schema/examples/workspace/ventures/northstar/operations/departments/external-relationships/README.md +5 -0
  178. package/schema/examples/workspace/ventures/northstar/operations/departments/external-relationships/department.json +5 -0
  179. package/schema/examples/workspace/ventures/northstar/operations/departments/finance/README.md +5 -0
  180. package/schema/examples/workspace/ventures/northstar/operations/departments/finance/department.json +5 -0
  181. package/schema/examples/workspace/ventures/northstar/operations/departments/human-capital/README.md +5 -0
  182. package/schema/examples/workspace/ventures/northstar/operations/departments/human-capital/department.json +5 -0
  183. package/schema/examples/workspace/ventures/northstar/operations/departments/risk-and-compliance/README.md +5 -0
  184. package/schema/examples/workspace/ventures/northstar/operations/departments/risk-and-compliance/department.json +5 -0
  185. package/schema/examples/workspace/ventures/northstar/operations/departments/strategy/README.md +5 -0
  186. package/schema/examples/workspace/ventures/northstar/operations/departments/strategy/department.json +5 -0
  187. package/schema/examples/workspace/ventures/northstar/people/founders/ana-ruiz.json +13 -0
  188. package/schema/examples/workspace/ventures/northstar/people/founders/ben-okafor.json +7 -0
  189. package/schema/examples/workspace/ventures/northstar/people/people.json +27 -0
  190. package/schema/examples/workspace/ventures/northstar/pillars/brand.md +5 -0
  191. package/schema/examples/workspace/ventures/northstar/pillars/business.md +5 -0
  192. package/schema/examples/workspace/ventures/northstar/pillars/product.md +5 -0
  193. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/AGENTS.md +17 -0
  194. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/accounts/.gitkeep +0 -0
  195. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/decisions/venture.team.decision.json +31 -0
  196. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/knowledge/README.md +3 -0
  197. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/customer-service/README.md +5 -0
  198. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/customer-service/department.json +5 -0
  199. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/finance/README.md +5 -0
  200. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/finance/department.json +5 -0
  201. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/human-capital/README.md +5 -0
  202. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/human-capital/department.json +5 -0
  203. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/it/README.md +5 -0
  204. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/it/department.json +5 -0
  205. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/marketing-and-sales/README.md +5 -0
  206. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/marketing-and-sales/department.json +5 -0
  207. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/products/README.md +5 -0
  208. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/products/department.json +5 -0
  209. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/strategy/README.md +5 -0
  210. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/strategy/department.json +5 -0
  211. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/brand.md +5 -0
  212. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/business.md +5 -0
  213. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/product.md +5 -0
  214. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/.gitkeep +0 -0
  215. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.core-product.decision.json +28 -0
  216. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.exists.decision.json +32 -0
  217. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.flagship.decision.json +27 -0
  218. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/profile.md +5 -0
  219. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/venture.json +27 -0
  220. package/schema/examples/workspace/ventures/northstar/products/.gitkeep +0 -0
  221. package/schema/examples/workspace/ventures/northstar/profile.md +5 -0
  222. package/schema/examples/workspace/ventures/northstar/provenance.jsonl +3 -0
  223. package/schema/examples/workspace/ventures/northstar/purpose/README.md +3 -0
  224. package/schema/examples/workspace/ventures/northstar/venture.json +49 -0
  225. package/schema/foundation.mjs +8 -7
  226. package/schema/founder.schema.json +72 -0
  227. package/schema/frame.schema.json +240 -0
  228. package/schema/frames.mjs +229 -0
  229. package/schema/freshness-log.schema.json +40 -0
  230. package/schema/freshness-profiles.schema.json +44 -0
  231. package/schema/freshness.mjs +474 -0
  232. package/schema/fund-terms.schema.json +107 -0
  233. package/schema/fund-thesis.schema.json +87 -0
  234. package/schema/gate-drafts.mjs +131 -0
  235. package/schema/gate.mjs +105 -11
  236. package/schema/glossary.schema.json +25 -0
  237. package/schema/init-venture.mjs +69 -21
  238. package/schema/judgment.schema.json +38 -0
  239. package/schema/kit.schema.json +47 -0
  240. package/schema/kits.mjs +24 -0
  241. package/schema/knowledge-sources.schema.json +145 -15
  242. package/schema/layer.json +16 -3
  243. package/schema/marketing-brand.schema.json +116 -0
  244. package/schema/migrate-venture.mjs +8 -7
  245. package/schema/migrations/kit-to-package.mjs +95 -0
  246. package/schema/migrations/package-layout.mjs +90 -0
  247. package/schema/model-steps.mjs +718 -0
  248. package/schema/money-summary.schema.json +138 -0
  249. package/schema/naive-config.mjs +166 -0
  250. package/schema/naive-config.schema.json +268 -0
  251. package/schema/need-now.json +171 -0
  252. package/schema/need-now.mjs +8 -6
  253. package/schema/packages.mjs +21 -15
  254. package/schema/payouts.mjs +3 -2
  255. package/schema/people.schema.json +85 -0
  256. package/schema/port-venture.mjs +206 -132
  257. package/schema/public-assets.schema.json +76 -0
  258. package/schema/release-read.mjs +112 -0
  259. package/schema/releases.mjs +498 -0
  260. package/schema/run-handoff.mjs +5 -4
  261. package/schema/setup.mjs +165 -0
  262. package/schema/stale.mjs +112 -0
  263. package/schema/start-release.mjs +41 -0
  264. package/schema/structure.mjs +187 -0
  265. package/schema/systems-catalog.json +126 -0
  266. package/schema/systems-catalog.schema.json +78 -0
  267. package/schema/time-to-ready.mjs +7 -6
  268. package/schema/trigger.schema.json +44 -0
  269. package/schema/triggers.mjs +238 -0
  270. package/schema/upgrade-registry.schema.json +60 -0
  271. package/schema/upgrade-venture.mjs +96 -118
  272. package/schema/upgrades.json +69 -0
  273. package/schema/upgrades.mjs +386 -0
  274. package/schema/validate.py +19 -10
  275. package/schema/venture-paths.mjs +85 -0
  276. package/schema/venture-role.schema.json +64 -0
  277. package/schema/venture-type.mjs +62 -0
  278. package/schema/venture-types.json +346 -0
  279. package/schema/venture-types.schema.json +129 -0
  280. package/schema/venture.schema.json +61 -0
  281. package/schema/workspace.schema.json +5 -1
@@ -390,6 +390,16 @@
390
390
  },
391
391
  "why": "Written by the interfaces on every write, so it costs nothing; run mentura baseline once to adopt records written before it (EE-031)"
392
392
  },
393
+ "naive-config": {
394
+ "base": {
395
+ "discovery": 0.1,
396
+ "validation": 0.2,
397
+ "beachhead": 0.3,
398
+ "scale": 0.4,
399
+ "platform": 0.4
400
+ },
401
+ "why": "Every default holds without it; write one only to change a default: a route that fails closed, a check that only warns, a pinned package"
402
+ },
393
403
  "knowledge-sources": {
394
404
  "base": {
395
405
  "discovery": 0.05,
@@ -410,6 +420,16 @@
410
420
  },
411
421
  "why": "Once one fact (a price, a product name, a plan's limits) is repeated in several places, such as a site, newsletters and a payment provider; before launch there is rarely more than one copy"
412
422
  },
423
+ "freshness-log": {
424
+ "base": {
425
+ "discovery": 0.2,
426
+ "validation": 0.4,
427
+ "beachhead": 0.6,
428
+ "scale": 0.7,
429
+ "platform": 0.8
430
+ },
431
+ "why": "Written by mentura revalidate, verify and phase; costs nothing until a fact changes outside the venture, a record is checked without changing it, or the venture changes phase or pivots"
432
+ },
413
433
  "department": {
414
434
  "base": {
415
435
  "discovery": 0.3,
@@ -537,6 +557,16 @@
537
557
  },
538
558
  "why": "What the founder walks away with; written at the end of each pipeline run, cheap to refresh"
539
559
  },
560
+ "release": {
561
+ "base": {
562
+ "discovery": 0.3,
563
+ "validation": 0.4,
564
+ "beachhead": 0.6,
565
+ "scale": 0.7,
566
+ "platform": 0.7
567
+ },
568
+ "why": "A release to hand someone (an investor, a partner, a hire): the confirmed records frozen in, with named live holes (C-11, I-17). Built with node schema/build-release.mjs when someone outside needs it"
569
+ },
540
570
  "customer": {
541
571
  "base": {
542
572
  "discovery": 0.2,
@@ -596,6 +626,147 @@
596
626
  "platform": 0.3
597
627
  },
598
628
  "why": "The text of a raw source, beside source.json (EE-070)."
629
+ },
630
+ "judgment": {
631
+ "base": {
632
+ "discovery": 0.05,
633
+ "validation": 0.05,
634
+ "beachhead": 0.05,
635
+ "scale": 0.05,
636
+ "platform": 0.05
637
+ },
638
+ "why": "Never written by hand: a judgment is what a package's model step answers when mentura steps run asks it, so there is nothing to suggest"
639
+ },
640
+ "people": {
641
+ "base": {
642
+ "discovery": 0.6,
643
+ "validation": 0.7,
644
+ "beachhead": 0.8,
645
+ "scale": 0.9,
646
+ "platform": 0.9
647
+ },
648
+ "why": "Who is in the venture and which functions each owns; create-venture writes it"
649
+ },
650
+ "founder": {
651
+ "base": {
652
+ "discovery": 0.5,
653
+ "validation": 0.6,
654
+ "beachhead": 0.7,
655
+ "scale": 0.7,
656
+ "platform": 0.7
657
+ },
658
+ "when": [
659
+ {
660
+ "if": "team:cofounders",
661
+ "at_least": 0.8
662
+ }
663
+ ],
664
+ "why": "One file per founder, written by create-venture; links to the founder agreement"
665
+ },
666
+ "fund-thesis": {
667
+ "base": {
668
+ "discovery": 0.0,
669
+ "validation": 0.0,
670
+ "beachhead": 0.0,
671
+ "scale": 0.0,
672
+ "platform": 0.0
673
+ },
674
+ "when": [
675
+ {
676
+ "if": "type:vc-fund",
677
+ "at_least": 0.9
678
+ }
679
+ ],
680
+ "why": "A fund's foundation: what it invests in and why it wins"
681
+ },
682
+ "fund-terms": {
683
+ "base": {
684
+ "discovery": 0.0,
685
+ "validation": 0.0,
686
+ "beachhead": 0.0,
687
+ "scale": 0.0,
688
+ "platform": 0.0
689
+ },
690
+ "when": [
691
+ {
692
+ "if": "type:vc-fund",
693
+ "at_least": 0.9
694
+ }
695
+ ],
696
+ "why": "What the fund raises under; LPs ask for it first"
697
+ },
698
+ "deal": {
699
+ "base": {
700
+ "discovery": 0.0,
701
+ "validation": 0.0,
702
+ "beachhead": 0.0,
703
+ "scale": 0.0,
704
+ "platform": 0.0
705
+ },
706
+ "when": [
707
+ {
708
+ "if": "type:vc-fund",
709
+ "phase": "validation",
710
+ "at_least": 0.7
711
+ },
712
+ {
713
+ "if": "type:vc-fund",
714
+ "phase": "beachhead",
715
+ "at_least": 0.9
716
+ },
717
+ {
718
+ "if": "type:vc-fund",
719
+ "phase": "scale",
720
+ "at_least": 0.9
721
+ }
722
+ ],
723
+ "why": "A fund's pipeline, once it is investing"
724
+ },
725
+ "money-summary": {
726
+ "base": {
727
+ "discovery": 0.1,
728
+ "validation": 0.3,
729
+ "beachhead": 0.6,
730
+ "scale": 0.8,
731
+ "platform": 0.8
732
+ },
733
+ "when": [
734
+ {
735
+ "if": "funding:venture-capital",
736
+ "at_least": 0.6
737
+ }
738
+ ],
739
+ "why": "Written by the money source's sync; cash and runway once money moves"
740
+ },
741
+ "marketing-brand": {
742
+ "base": {
743
+ "discovery": 0.2,
744
+ "validation": 0.4,
745
+ "beachhead": 0.7,
746
+ "scale": 0.8,
747
+ "platform": 0.8
748
+ },
749
+ "why": "One brand every agent and interface reads (colors, licensed typefaces, voice rules, marks), once the venture shows itself in public"
750
+ },
751
+ "public-assets": {
752
+ "base": {
753
+ "discovery": 0.2,
754
+ "validation": 0.4,
755
+ "beachhead": 0.7,
756
+ "scale": 0.8,
757
+ "platform": 0.8
758
+ },
759
+ "why": "The source, license and credit of every file the venture ships as it is, before anything with rights attached is published"
760
+ },
761
+ "glossary": {
762
+ "base": {
763
+ "discovery": 0.1,
764
+ "validation": 0.3,
765
+ "beachhead": 0.5,
766
+ "scale": 0.6,
767
+ "platform": 0.7
768
+ },
769
+ "why": "A package's own terms, once two packages start using one word in different senses"
599
770
  }
600
771
  }
601
772
  }
@@ -3,7 +3,8 @@
3
3
  // type and phase are in schema/need-now.json; facts about the venture raise or lower them:
4
4
  // phase, ambition, funding, legal_form, offering (of any product), software (any product),
5
5
  // path (go-to-market record), people, founders, agents, products (counts), publishes (a handoff
6
- // under public-commitment), team (the answer to Naive's team question: solo, cofounders, looking).
6
+ // under public-commitment), team (the answer to Naive's team question: solo, cofounders, looking),
7
+ // type (the venture type, EE-082).
7
8
  // Departments (EE-047) are scored the same way, from their priors in operations/departments.json, and
8
9
  // held once venture.json lists them. Records that already exist are listed as held; a record in a layer the venture has turned off is
9
10
  // listed as layer off, not suggested. Jev re-scores the priors per venture once the
@@ -14,6 +15,7 @@
14
15
  import { existsSync, readFileSync, readdirSync } from "node:fs";
15
16
  import { join } from "node:path";
16
17
  import { catalog } from "./departments.mjs";
18
+ import { ventureFile } from "./venture-paths.mjs";
17
19
 
18
20
  const root = new URL("..", import.meta.url).pathname;
19
21
  const load = (p) => JSON.parse(readFileSync(p, "utf8"));
@@ -26,18 +28,18 @@ const glob = (g) => new RegExp("^" + g.replace(/[.+^${}()|[\]\\]/g, "\\$&").repl
26
28
  /** Facts about a venture that the need-now conditions test. */
27
29
  export function factsOf(dir) {
28
30
  const v = load(join(dir, "venture.json"));
29
- const json = (p) => existsSync(join(dir, p)) ? load(join(dir, p)) : null;
30
- const products = existsSync(join(dir, "products")) ? readdirSync(join(dir, "products")).filter((f) => f.endsWith(".json")).map((f) => load(join(dir, "products", f))) : [];
31
+ const json = (p) => existsSync(ventureFile(dir, p)) ? load(ventureFile(dir, p)) : null;
32
+ const products = existsSync(join(ventureFile(dir, "products"))) ? readdirSync(join(ventureFile(dir, "products"))).filter((f) => f.endsWith(".json")).map((f) => load(join(ventureFile(dir, "products"), f))) : [];
31
33
  const members = (v.members ?? []).map((m) => typeof m === "string" ? { kind: "person", role: m } : m);
32
34
  const own = json("governance/ownership.json");
33
- const hDir = join(dir, "operations/handoffs");
35
+ const hDir = join(ventureFile(dir, "operations/handoffs"));
34
36
  const handoffs = existsSync(hDir) ? readdirSync(hDir).filter((f) => f.endsWith(".json")).map((f) => load(join(hDir, f))) : [];
35
37
  // The founding team, as the founder answered Naive's team question (EE-060): solo, cofounders or looking.
36
- const teamFile = join(dir, "decisions/venture.team.decision.json");
38
+ const teamFile = join(ventureFile(dir, "decisions/venture.team.decision.json"));
37
39
  const td = existsSync(teamFile) ? load(teamFile) : null;
38
40
  const team = td?.status === "decided" ? ["solo", "cofounders", "looking"].find((t) => (td.answer ?? "").toLowerCase().startsWith(t)) ?? null : null;
39
41
  return {
40
- team, phase: v.phase, ambition: v.ambition, funding: v.form?.funding, legal_form: v.form?.legal_form,
42
+ team, type: v.type ?? null, phase: v.phase, ambition: v.ambition, funding: v.form?.funding, legal_form: v.form?.legal_form,
41
43
  offering: products.map((p) => p.offering), software: products.some((p) => p.software),
42
44
  path: json("purpose/validation/go-to-market.json")?.path,
43
45
  people: members.filter((m) => m.kind !== "agent").length + (v.owner === "self" && !members.some((m) => m.kind !== "agent") ? 1 : 0),
@@ -29,6 +29,9 @@ import { confirmedIn, filesOf } from "./foundation.mjs";
29
29
  import { route } from "../purpose/frameworks/idea-map/route.mjs";
30
30
 
31
31
  import { loadPackages } from "./load-packages.mjs";
32
+ // Upgrades hook (U-5): packages a venture adopted early in naive.config.json open now.
33
+ import { adopted } from "./naive-config.mjs";
34
+ import { ventureFile } from "./venture-paths.mjs";
32
35
 
33
36
  const repo = new URL("..", import.meta.url).pathname;
34
37
  const load = (p) => JSON.parse(readFileSync(p, "utf8"));
@@ -37,7 +40,7 @@ export const OUT = "package";
37
40
  const MODEL = load(join(repo, "schema/data-model.json"));
38
41
  const PHASES = ["discovery", "validation", "beachhead", "scale", "platform"];
39
42
  const r2 = (x) => Math.round(x * 100) / 100;
40
- const json = (dir, f) => existsSync(join(dir, f)) ? load(join(dir, f)) : null;
43
+ const json = (dir, f) => existsSync(ventureFile(dir, f)) ? load(ventureFile(dir, f)) : null;
41
44
 
42
45
  /** The facts the packages test: need-now's, the founder's flags, and the question matrix's answers. */
43
46
  export function situation(dir, { flags = {}, answers = null } = {}) {
@@ -50,7 +53,7 @@ export function situation(dir, { flags = {}, answers = null } = {}) {
50
53
  const settled = {
51
54
  raising: flags.raising != null ? !!flags.raising : f.funding === "bootstrapped" ? false : undefined,
52
55
  // A site read by site presence; a planned sitemap does not count, since the pipeline plans one for every venture.
53
- site: existsSync(join(dir, "operations/marketing/site-presence.json")) || undefined,
56
+ site: existsSync(join(ventureFile(dir, "operations/marketing/site-presence.json"))) || undefined,
54
57
  partner_led: profiles.some((p) => p.reached_through?.length) || products.some((p) => (p.offered_to ?? []).some((id) => profiles.some((y) => y.reached_through?.includes(id)))) || undefined,
55
58
  hiring: flags.hiring != null ? !!flags.hiring : f.team === "looking" ? true : undefined,
56
59
  regulated: undefined,
@@ -58,7 +61,7 @@ export function situation(dir, { flags = {}, answers = null } = {}) {
58
61
  };
59
62
  const Q = PACKAGES.questions;
60
63
  // Jev's answers from the last written package stand, unless new answers replace them.
61
- const last = existsSync(join(dir, OUT, "venture-package.json")) ? Object.fromEntries(load(join(dir, OUT, "venture-package.json")).situation.questions.filter((q) => q.p != null).map((q) => [`q:${q.id}`, { noul: q.p }])) : {};
64
+ const last = existsSync(join(ventureFile(dir, OUT), "venture-package.json")) ? Object.fromEntries(load(join(ventureFile(dir, OUT), "venture-package.json")).situation.questions.filter((q) => q.p != null).map((q) => [`q:${q.id}`, { noul: q.p }])) : {};
62
65
  answers = { ...last, ...(answers ?? {}) };
63
66
  const questions = Q.items.filter((q) => q.phases.includes(phase)).map((q) => {
64
67
  if (settled[q.id] !== undefined) return { ...q, value: settled[q.id], by: "records" };
@@ -75,8 +78,8 @@ export function request(dir) {
75
78
  const { questions } = situation(dir);
76
79
  const v = load(join(dir, "venture.json"));
77
80
  const say = (o) => o ? JSON.stringify(o).slice(0, 1200) : null;
78
- const dumpFile = ["raw/dump.md", "purpose/ideas/dump.md"].find((f) => existsSync(join(dir, f)));
79
- const dump = dumpFile ? readFileSync(join(dir, dumpFile), "utf8").slice(0, 2500) : null;
81
+ const dumpFile = ["raw/dump.md", "purpose/ideas/dump.md"].find((f) => existsSync(ventureFile(dir, f)));
82
+ const dump = dumpFile ? readFileSync(ventureFile(dir, dumpFile), "utf8").slice(0, 2500) : null;
80
83
  const problem = json(dir, "foundation/problem.json") ?? json(dir, "purpose/validation/problem.json");
81
84
  const icpRec = json(dir, "foundation/icp.json") ?? json(dir, "purpose/icp.json");
82
85
  return { state: { venture: say({ name: v.name, phase: v.phase, ambition: v.ambition, form: v.form, core: v.core }), problem: say(problem), icp: say(icpRec),
@@ -87,9 +90,9 @@ export function request(dir) {
87
90
 
88
91
  /** A record's state in this venture: confirmed by a person, written by an agent, waiting as a draft, or missing. */
89
92
  function stateOf(dir, type) {
90
- const files = filesOf(dir, type).filter((f) => existsSync(join(dir, f)) && !(f.endsWith(".json") && ["retired", "archived"].includes(json(dir, f)?.status)));
93
+ const files = filesOf(dir, type).filter((f) => existsSync(ventureFile(dir, f)) && !(f.endsWith(".json") && ["retired", "archived"].includes(json(dir, f)?.status)));
91
94
  const drafts = (filesOf(dir, type).length ? filesOf(dir, type) : [MODEL.records.find((r) => r.id === type)?.paths?.find((p) => p.startsWith("instance/**/"))?.slice(12)].filter(Boolean))
92
- .filter((f) => !f.includes("*") && existsSync(join(dir, `_drafts/${f.replace(/\//g, "__")}.draft`)));
95
+ .filter((f) => !f.includes("*") && existsSync(ventureFile(dir, `_drafts/${f.replace(/\//g, "__")}.draft`)));
93
96
  if (!files.length) return { status: drafts.length ? "draft" : "missing", files: [], drafts };
94
97
  const confirmed = files.every((f) => confirmedIn(dir, f, null));
95
98
  return { status: drafts.length ? "draft" : confirmed ? "confirmed" : "agent", files, drafts };
@@ -107,6 +110,9 @@ export function packages(dir, { flags = {}, answers = null } = {}) {
107
110
  const v = load(join(dir, "venture.json"));
108
111
  const { phase, facts, questions } = situation(dir, { flags, answers });
109
112
  const next = PHASES[PHASES.indexOf(phase) + 1];
113
+ // Upgrades hook (U-5): a package adopted early opens now, even an experimental one Naive does not model.
114
+ const early = adopted(dir);
115
+ const adopt = (id, f) => (early.has(id) && f.in !== "now" ? { ...f, in: "now", early: true, why: `${f.why}; adopted early in naive.config.json` } : f);
110
116
  let routes = null;
111
117
  try { routes = route(dir); } catch { routes = null; }
112
118
  const dest = new Map((routes?.destinations ?? []).map((d) => [d.id, d]));
@@ -126,20 +132,20 @@ export function packages(dir, { flags = {}, answers = null } = {}) {
126
132
  moves: s.status === "confirmed" ? "done" : waits.length ? "waits" : "now", ...(waits.length && s.status !== "confirmed" ? { waits_on: waits, waits_on_titles: waits.map(titleOf) } : {}),
127
133
  ...(d ? { route: { stage: d.stage, ideas: d.ideas.length, next: d.next ? { by: d.next.by, do: d.next.do, command: d.next.command } : null } } : {}) };
128
134
  };
129
- const core = Object.entries(PACKAGES.core).filter(([, p]) => !p.not_modeled).map(([id, p]) => {
135
+ const core = Object.entries(PACKAGES.core).filter(([id, p]) => !p.not_modeled || early.has(id)).map(([id, p]) => {
130
136
  const records = [...p.required.map((t) => row(t, "required")), ...p.optional.map((t) => row(t, "optional")), ...p.refs.map((t) => row(t, "reads"))];
131
137
  const gate = records.filter((r) => r.role !== "optional");
132
138
  const weight = (r) => (r.role === "optional" ? 0.5 : 1);
133
139
  const progress = r2(records.reduce((s, r) => s + STATUS[r.status] * weight(r), 0) / records.reduce((s, r) => s + weight(r), 0));
134
140
  const state = gate.every((r) => r.status === "confirmed") ? "complete" : gate.every((r) => r.status !== "missing") ? "review" : "building";
135
- return { kind: "core", id, title: p.title, department: p.department, purpose: p.purpose, ...fitOf(p), state, progress, records, planned: p.planned, unlocks: p.unlocks,
141
+ return { kind: "core", id, title: p.title, department: p.department, purpose: p.purpose, ...adopt(id, fitOf(p)), state, progress, records, planned: p.planned, unlocks: p.unlocks,
136
142
  missing: gate.filter((r) => r.status === "missing").map((r) => r.record), to_review: gate.filter((r) => r.status === "agent" || r.status === "draft").map((r) => r.record),
137
143
  moving: records.filter((r) => r.moves === "now" && r.role !== "reads").map((r) => r.record) };
138
144
  });
139
145
  const byId = Object.fromEntries(core.map((p) => [p.id, p]));
140
- const handoff = Object.entries(PACKAGES.handoff).filter(([, p]) => !p.not_modeled).map(([id, p]) => {
146
+ const handoff = Object.entries(PACKAGES.handoff).filter(([id, p]) => !p.not_modeled || early.has(id)).map(([id, p]) => {
141
147
  const from = p.from.map((c) => byId[c]).filter(Boolean);
142
- return { kind: "handoff", id, title: p.title, for: p.for, from: p.from, ...fitOf(p), state: from.every((c) => c.state === "complete") ? "complete" : "building",
148
+ return { kind: "handoff", id, title: p.title, for: p.for, from: p.from, ...adopt(id, fitOf(p)), state: from.every((c) => c.state === "complete") ? "complete" : "building",
143
149
  progress: r2(from.reduce((s, c) => s + c.progress, 0) / from.length), waits_on: from.filter((c) => c.state !== "complete").map((c) => c.id), unlocks: p.unlocks };
144
150
  });
145
151
  const order = (a, b) => ({ now: 0, next: 1, held: 2 }[a.in] - { now: 0, next: 1, held: 2 }[b.in]) || b.fit - a.fit;
@@ -149,7 +155,7 @@ export function packages(dir, { flags = {}, answers = null } = {}) {
149
155
  situation: { facts: Object.fromEntries(questions.map((q) => [q.id, q.value])), questions: questions.map((q) => ({ id: q.id, ask: q.ask, value: q.value, by: q.by, ...(q.p != null ? { p: q.p } : {}), moves: q.moves })) },
150
156
  progress: open.length ? r2(open.reduce((s, p) => s + p.progress, 0) / open.length) : 0,
151
157
  complete: [...core, ...handoff].filter((p) => p.in === "now" && p.state === "complete").map((p) => p.id),
152
- core, handoff, assumes: PACKAGES.assumes, not_modeled: [...Object.entries(PACKAGES.core), ...Object.entries(PACKAGES.handoff)].filter(([, p]) => p.not_modeled).map(([id, p]) => ({ id, title: p.title, why: p.not_modeled })),
158
+ core, handoff, assumes: PACKAGES.assumes, not_modeled: [...Object.entries(PACKAGES.core), ...Object.entries(PACKAGES.handoff)].filter(([id, p]) => p.not_modeled && !early.has(id)).map(([id, p]) => ({ id, title: p.title, why: p.not_modeled })),
153
159
  enhancements: PACKAGES.enhancements,
154
160
  routing: routes ? { included: true, note: "Hackathon demo: each record shows where the founder's ideas for it stand and the one step that moves it (EE-061).", loose: routes.loose?.length ?? 0 } : { included: false } };
155
161
  }
@@ -169,7 +175,7 @@ const LEAD = ["name", "title", "who", "statement", "question", "label", "id"];
169
175
  const lead = (o) => { const k = LEAD.find((k) => typeof o[k] === "string"); return k ? o[k] : ""; };
170
176
  const rest = (o) => { const k = LEAD.find((k) => typeof o[k] === "string"); return Object.fromEntries(Object.entries(o).filter(([x]) => x !== k)); };
171
177
  const body = (dir, f) => {
172
- const t = readFileSync(join(dir, f), "utf8");
178
+ const t = readFileSync(ventureFile(dir, f), "utf8");
173
179
  if (f.endsWith(".json")) return md(JSON.parse(t));
174
180
  return t.replace(/^---\n[\s\S]*?\n---\n/, "").replace(/^#\s.*\n/, "").trim();
175
181
  };
@@ -178,7 +184,7 @@ const STATE = { complete: "complete: its automation may run", review: "every rec
178
184
 
179
185
  /** A new version each time a package completes or the phase changes; earlier versions are kept. */
180
186
  export function versions(dir, r) {
181
- const f = join(dir, OUT, "venture-package.json");
187
+ const f = join(ventureFile(dir, OUT), "venture-package.json");
182
188
  const before = existsSync(f) ? load(f) : null;
183
189
  const list = before?.versions ?? [];
184
190
  const last = list.at(-1);
@@ -191,7 +197,7 @@ export function versions(dir, r) {
191
197
 
192
198
  /** Write the readable view: the manifest, the index, and one document per open core package. */
193
199
  export function write(dir, r) {
194
- const out = join(dir, OUT);
200
+ const out = ventureFile(dir, OUT);
195
201
  mkdirSync(out, { recursive: true });
196
202
  r.versions = versions(dir, r);
197
203
  writeFileSync(join(out, "venture-package.json"), JSON.stringify(r, null, 2) + "\n");
@@ -16,6 +16,7 @@
16
16
 
17
17
  import { existsSync, readFileSync } from "node:fs";
18
18
  import { join } from "node:path";
19
+ import { ventureFile } from "./venture-paths.mjs";
19
20
 
20
21
  export function payouts(own, value) {
21
22
  const classes = new Map(own.classes.map((c) => [c.id, c]));
@@ -74,8 +75,8 @@ export function payouts(own, value) {
74
75
  if (import.meta.url === `file://${process.argv[1]}`) {
75
76
  const [dir, arg] = process.argv.slice(2);
76
77
  if (!dir) { console.error("usage: node schema/payouts.mjs <venture dir> [value] [--json]"); process.exit(2); }
77
- const own = JSON.parse(readFileSync(join(dir, "governance/ownership.json"), "utf8"));
78
- const exitFile = join(dir, "governance/exit.json");
78
+ const own = JSON.parse(readFileSync(join(ventureFile(dir, "governance/ownership.json")), "utf8"));
79
+ const exitFile = join(ventureFile(dir, "governance/exit.json"));
79
80
  const scenarios = arg && !arg.startsWith("--") ? [{ id: "given", value: Number(arg) }]
80
81
  : existsSync(exitFile) ? JSON.parse(readFileSync(exitFile, "utf8")).scenarios ?? [] : [];
81
82
  if (!scenarios.length) { console.error("no scenarios: pass a value or add scenarios to governance/exit.json"); process.exit(2); }
@@ -0,0 +1,85 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "people.schema.json",
4
+ "title": "People",
5
+ "description": "The venture's people (people/people.json): who is in it, in which role, and which functions (hats) each owns. It is to human capital what venture.json is to the venture. A founder also has a file in people/founders/. Names only: no personal details.",
6
+ "type": "object",
7
+ "required": [
8
+ "venture",
9
+ "mode",
10
+ "people"
11
+ ],
12
+ "additionalProperties": false,
13
+ "properties": {
14
+ "venture": {
15
+ "type": "string"
16
+ },
17
+ "mode": {
18
+ "enum": [
19
+ "solo",
20
+ "team"
21
+ ],
22
+ "description": "solo: one person owns every function the venture imports"
23
+ },
24
+ "people": {
25
+ "type": "array",
26
+ "minItems": 1,
27
+ "items": {
28
+ "type": "object",
29
+ "required": [
30
+ "id",
31
+ "name",
32
+ "role"
33
+ ],
34
+ "additionalProperties": false,
35
+ "properties": {
36
+ "id": {
37
+ "type": "string",
38
+ "pattern": "^[a-z0-9-]+$"
39
+ },
40
+ "name": {
41
+ "type": "string"
42
+ },
43
+ "role": {
44
+ "type": "string",
45
+ "description": "A role id from governance/venture-template/roles/venture-roles.json"
46
+ },
47
+ "hats": {
48
+ "type": "array",
49
+ "items": {
50
+ "enum": [
51
+ "strategy",
52
+ "products",
53
+ "marketing-and-sales",
54
+ "supply-chain",
55
+ "service-delivery",
56
+ "customer-service",
57
+ "human-capital",
58
+ "it",
59
+ "finance",
60
+ "assets",
61
+ "risk-and-compliance",
62
+ "external-relationships",
63
+ "capabilities"
64
+ ]
65
+ },
66
+ "uniqueItems": true,
67
+ "description": "The functions this person owns. In the structured layout (EE-086) hats are read from the org chart in venture.json and not stored here"
68
+ },
69
+ "founder_file": {
70
+ "type": "string",
71
+ "pattern": "^people/founders/[a-z0-9-]+\\.json$"
72
+ }
73
+ }
74
+ }
75
+ },
76
+ "founder_agreement": {
77
+ "type": "string",
78
+ "description": "The founder agreement, once there is one (governance/founder-agreement.json)"
79
+ },
80
+ "updated": {
81
+ "type": "string",
82
+ "format": "date"
83
+ }
84
+ }
85
+ }