naive-framework 0.0.0-stage → 0.2.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 (549) hide show
  1. package/AGENTS.md +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +37 -2
  4. package/docs/decisions/decisions.json +888 -0
  5. package/docs/ontology.json +796 -0
  6. package/docs/ontology.md +163 -0
  7. package/docs/reference/ROUTES.md +124 -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 +102 -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/governance/venture-template/roles/venture-roles.json +62 -0
  68. package/interface/acting.mjs +83 -0
  69. package/interface/adapters/claude-code.json +16 -0
  70. package/interface/adapters/codex.json +14 -0
  71. package/interface/adapters/cursor.json +16 -0
  72. package/interface/adapters.mjs +182 -0
  73. package/interface/api/server.mjs +71 -0
  74. package/interface/boundaries.mjs +218 -0
  75. package/interface/brand.mjs +214 -0
  76. package/interface/cli/find-venture.mjs +15 -0
  77. package/interface/cli/freshness.mjs +59 -0
  78. package/interface/cli/guard.mjs +6 -0
  79. package/interface/cli/mentura.mjs +341 -0
  80. package/interface/cli/naive.mjs +194 -0
  81. package/interface/context.mjs +524 -0
  82. package/interface/demo/board.mjs +581 -0
  83. package/interface/demo/decision-harness.mjs +91 -0
  84. package/interface/demo/live-agent.mjs +47 -0
  85. package/interface/dev/setup.mjs +84 -0
  86. package/interface/gate-hooks.mjs +36 -0
  87. package/interface/harness/evals.mjs +90 -0
  88. package/interface/harness/examples/pt-no-shows.dump.md +19 -0
  89. package/interface/harness/run.mjs +313 -0
  90. package/interface/harness/site.mjs +59 -0
  91. package/interface/instrumentation.mjs +86 -0
  92. package/interface/kit-boundary.mjs +73 -0
  93. package/interface/layer.json +37 -0
  94. package/interface/mcp/server.mjs +162 -0
  95. package/interface/operator-console/README.md +58 -0
  96. package/interface/package-routes.mjs +196 -0
  97. package/interface/provenance.mjs +65 -0
  98. package/interface/reads.mjs +173 -0
  99. package/interface/references/references.json +28 -0
  100. package/interface/release-card.mjs +42 -0
  101. package/interface/route-aliases.json +32 -0
  102. package/interface/router.mjs +653 -0
  103. package/interface/skills/install-mentura/SKILL.md +88 -0
  104. package/interface/skills/naive-setup/SKILL.md +71 -0
  105. package/interface/skills/naive-setup/artifact.html +83 -0
  106. package/interface/tooling/integrations.json +112 -0
  107. package/interface/vitals.mjs +115 -0
  108. package/interface/writes.mjs +190 -0
  109. package/knowledge/connectors/README.md +54 -0
  110. package/knowledge/connectors/catalog.mjs +118 -0
  111. package/knowledge/connectors/contract.mjs +56 -0
  112. package/knowledge/connectors/eval.mjs +176 -0
  113. package/knowledge/connectors/filesystem.mjs +79 -0
  114. package/knowledge/connectors/index.mjs +102 -0
  115. package/knowledge/connectors/resolve.mjs +44 -0
  116. package/knowledge/connectors/suite.mjs +80 -0
  117. package/knowledge/freshness.json +85 -0
  118. package/knowledge/layer.json +50 -0
  119. package/knowledge/skills/find-reference/SKILL.md +38 -0
  120. package/knowledge/skills/industry-awareness/SKILL.md +277 -0
  121. package/knowledge/templates/glossary.md +23 -0
  122. package/knowledge/tooling/integrations.json +127 -0
  123. package/knowledge/tooling/questions.md +46 -0
  124. package/operations/FOUNDER_OPERATING_MODEL_CAMPAIGN_2026-10-14.md +16 -0
  125. package/operations/departments.json +162 -0
  126. package/operations/handoff-v2.md +93 -0
  127. package/operations/layer.json +67 -0
  128. package/operations/marketing/check-public.mjs +68 -0
  129. package/operations/marketing/site/README.md +86 -0
  130. package/operations/marketing/site/matrix.json +731 -0
  131. package/operations/marketing/site/plan.mjs +117 -0
  132. package/operations/marketing/site/presence.mjs +252 -0
  133. package/operations/references/references.json +45 -0
  134. package/operations/skills/recruiting/SKILL.md +32 -0
  135. package/operations/skills/team-design/SKILL.md +36 -0
  136. package/operations/skills/tool-selection/SKILL.md +46 -0
  137. package/operations/templates/marketing-brand.md +46 -0
  138. package/operations/templates/public-assets.md +39 -0
  139. package/operations/templates/recruiting-brief.md +35 -0
  140. package/operations/tooling/integrations.json +158 -0
  141. package/package.json +59 -4
  142. package/packages/catalog.json +280 -0
  143. package/packages/cofounder/package.json +42 -0
  144. package/packages/counsel/package.json +47 -0
  145. package/packages/customers/package.json +41 -0
  146. package/packages/deals/package.json +27 -0
  147. package/packages/decisions/package.json +28 -0
  148. package/packages/engineering/package.json +41 -0
  149. package/packages/evidence/package.json +17 -0
  150. package/packages/finance/frames/fund-without-ceding-control.frame.json +177 -0
  151. package/packages/finance/package.json +48 -0
  152. package/packages/foundation/package.json +59 -0
  153. package/packages/fund/package.json +48 -0
  154. package/packages/investor/package.json +57 -0
  155. package/packages/investors/package.json +21 -0
  156. package/packages/legal/package.json +73 -0
  157. package/packages/marketing/package.json +63 -0
  158. package/packages/money/package.json +42 -0
  159. package/packages/operations/package.json +74 -0
  160. package/packages/partner/package.json +38 -0
  161. package/packages/people/package.json +64 -0
  162. package/packages/product/package.json +49 -0
  163. package/packages/raw/package.json +19 -0
  164. package/packages/relationships/package.json +52 -0
  165. package/packages/validation/package.json +112 -0
  166. package/platform/README.md +51 -0
  167. package/platform/adapter.json +15 -0
  168. package/platform/connectors/eval.mjs +154 -0
  169. package/platform/connectors/fake-github.mjs +91 -0
  170. package/platform/connectors/github.mjs +105 -0
  171. package/platform/integrations/jev.mjs +30 -0
  172. package/platform/integrations/langsmith-docket.mjs +53 -0
  173. package/platform/integrations/langsmith-setup.mjs +115 -0
  174. package/platform/integrations/langsmith.mjs +47 -0
  175. package/platform/integrations/remote-image.mjs +79 -0
  176. package/platform/integrations/rho.mjs +146 -0
  177. package/platform/integrations/site.mjs +75 -0
  178. package/platform/kits/README.md +14 -0
  179. package/platform/kits/agent-upgrade/kit.json +15 -0
  180. package/platform/kits/agent-upgrade/run.mjs +82 -0
  181. package/platform/kits/agent-upgrade/stand-in-agent.mjs +32 -0
  182. package/platform/kits/validation-kickoff/kit.json +29 -0
  183. package/platform/mcp/research.mjs +64 -0
  184. package/platform/webhooks/server.mjs +70 -0
  185. package/purpose/checklists/vault-and-tooling-consultancy-setup.md +216 -0
  186. package/purpose/frameworks/business-discovery-framework-amendments-2026-05-20.md +181 -0
  187. package/purpose/frameworks/business-discovery-framework.html +938 -0
  188. package/purpose/frameworks/business-discovery-framework.md +326 -0
  189. package/purpose/frameworks/idea-map/README.md +74 -0
  190. package/purpose/frameworks/idea-map/conventions.json +146 -0
  191. package/purpose/frameworks/idea-map/graph.mjs +182 -0
  192. package/purpose/frameworks/idea-map/ideamap.mjs +181 -0
  193. package/purpose/frameworks/idea-map/route.mjs +140 -0
  194. package/purpose/frameworks/onboarding-handoff-framework.md +269 -0
  195. package/purpose/frameworks/post-discovery-deliverable-playbook.md +274 -0
  196. package/purpose/frameworks/product-anatomy/README.md +63 -0
  197. package/purpose/frameworks/product-anatomy/anatomy.mjs +195 -0
  198. package/purpose/frameworks/product-anatomy/examples/polity.answers.reasoned.json +11 -0
  199. package/purpose/frameworks/product-anatomy/examples/polity.json +89 -0
  200. package/purpose/frameworks/product-anatomy/phases.json +107 -0
  201. package/purpose/frameworks/product-anatomy/questions.json +74 -0
  202. package/purpose/kits/validation/README.md +14 -0
  203. package/purpose/kits/validation/references/references.json +122 -0
  204. package/purpose/kits/validation/skills/problem-validation/SKILL.md +43 -0
  205. package/purpose/kits/validation/skills/validation-score/SKILL.md +35 -0
  206. package/purpose/kits/validation/templates/go-to-market.md +19 -0
  207. package/purpose/kits/validation/templates/operations-readiness.md +20 -0
  208. package/purpose/kits/validation/templates/pricing.md +22 -0
  209. package/purpose/kits/validation/templates/problem-interview.md +36 -0
  210. package/purpose/kits/validation/templates/problem.md +45 -0
  211. package/purpose/kits/validation/templates/product-market-fit.md +23 -0
  212. package/purpose/kits/validation/templates/solution.md +18 -0
  213. package/purpose/kits/validation/templates/team.md +19 -0
  214. package/purpose/kits/validation/weights.json +22 -0
  215. package/purpose/layer.json +53 -0
  216. package/purpose/references/references.json +324 -0
  217. package/purpose/skills/ambition-tier/SKILL.md +205 -0
  218. package/purpose/skills/telos/SKILL.md +52 -0
  219. package/purpose/strategic-foundation.json +133 -0
  220. package/purpose/templates/telos-based-smart.md +39 -0
  221. package/purpose/tooling/integrations.json +48 -0
  222. package/schema/README.md +62 -0
  223. package/schema/VERSION +1 -0
  224. package/schema/access.mjs +57 -0
  225. package/schema/account.schema.json +79 -0
  226. package/schema/adapter.schema.json +33 -0
  227. package/schema/add-department.mjs +41 -0
  228. package/schema/agent-capability.schema.json +94 -0
  229. package/schema/alignment.schema.json +61 -0
  230. package/schema/assess-problem.mjs +131 -0
  231. package/schema/assets.mjs +212 -0
  232. package/schema/bdd.mjs +56 -0
  233. package/schema/board.schema.json +101 -0
  234. package/schema/brand.mjs +373 -0
  235. package/schema/build-release.mjs +61 -0
  236. package/schema/caching.mjs +505 -0
  237. package/schema/check-assets.mjs +24 -0
  238. package/schema/check-boundary.mjs +54 -0
  239. package/schema/check-brand.mjs +24 -0
  240. package/schema/check-config.mjs +110 -0
  241. package/schema/check-data-model.mjs +170 -0
  242. package/schema/check-data-packages.mjs +83 -0
  243. package/schema/check-departments.mjs +45 -0
  244. package/schema/check-execution.mjs +85 -0
  245. package/schema/check-governance.mjs +98 -0
  246. package/schema/check-integrations.mjs +33 -0
  247. package/schema/check-nextjs-status.mjs +79 -0
  248. package/schema/check-nouns.mjs +49 -0
  249. package/schema/check-people.mjs +70 -0
  250. package/schema/check-private.mjs +61 -0
  251. package/schema/check-provenance.mjs +55 -0
  252. package/schema/check-publication.mjs +96 -0
  253. package/schema/check-ready.mjs +89 -0
  254. package/schema/check-sources.mjs +74 -0
  255. package/schema/check-team.mjs +94 -0
  256. package/schema/check-telos.mjs +59 -0
  257. package/schema/check-validation.mjs +165 -0
  258. package/schema/check-ventures.mjs +81 -0
  259. package/schema/check-where-used.mjs +58 -0
  260. package/schema/data-master.schema.json +14 -0
  261. package/schema/data-model.json +1584 -0
  262. package/schema/data-model.schema.json +152 -0
  263. package/schema/deal.schema.json +80 -0
  264. package/schema/decision-analytics.mjs +77 -0
  265. package/schema/decision-record.schema.json +290 -0
  266. package/schema/decision-rights.schema.json +34 -0
  267. package/schema/decision.schema.json +30 -0
  268. package/schema/decisions.mjs +327 -0
  269. package/schema/department-catalog.schema.json +55 -0
  270. package/schema/department.schema.json +15 -0
  271. package/schema/departments.mjs +32 -0
  272. package/schema/docket-eval.mjs +89 -0
  273. package/schema/docket.mjs +135 -0
  274. package/schema/eval-suite.schema.json +45 -0
  275. package/schema/evidence.schema.json +110 -0
  276. package/schema/examples/frames/judge.mjs +10 -0
  277. package/schema/examples/migrate/agent.mjs +12 -0
  278. package/schema/examples/venture-type/jev.mjs +12 -0
  279. package/schema/examples/workspace/ventures/acme-labs/AGENTS.md +17 -0
  280. package/schema/examples/workspace/ventures/acme-labs/accounts/.gitkeep +0 -0
  281. package/schema/examples/workspace/ventures/acme-labs/decisions/discovery-goal.decision.json +23 -0
  282. package/schema/examples/workspace/ventures/acme-labs/decisions/statement-icp.decision.json +22 -0
  283. package/schema/examples/workspace/ventures/acme-labs/decisions/statement-problem.decision.json +22 -0
  284. package/schema/examples/workspace/ventures/acme-labs/decisions/venture.team.decision.json +37 -0
  285. package/schema/examples/workspace/ventures/acme-labs/knowledge/README.md +3 -0
  286. package/schema/examples/workspace/ventures/acme-labs/knowledge/sources.json +46 -0
  287. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000001.json +12 -0
  288. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000002.json +12 -0
  289. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000003.json +12 -0
  290. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000004.json +12 -0
  291. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000005.json +12 -0
  292. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000006.json +12 -0
  293. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000007.json +12 -0
  294. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000008.json +12 -0
  295. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000009.json +12 -0
  296. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000010.json +12 -0
  297. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000011.json +12 -0
  298. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000012.json +12 -0
  299. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000013.json +12 -0
  300. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000014.json +12 -0
  301. package/schema/examples/workspace/ventures/acme-labs/money/_streams/transactions/stream.json +5 -0
  302. package/schema/examples/workspace/ventures/acme-labs/money/_summary.json +30 -0
  303. package/schema/examples/workspace/ventures/acme-labs/operations/departments/customer-service/README.md +5 -0
  304. package/schema/examples/workspace/ventures/acme-labs/operations/departments/customer-service/department.json +5 -0
  305. package/schema/examples/workspace/ventures/acme-labs/operations/departments/finance/README.md +5 -0
  306. package/schema/examples/workspace/ventures/acme-labs/operations/departments/finance/department.json +5 -0
  307. package/schema/examples/workspace/ventures/acme-labs/operations/departments/human-capital/README.md +5 -0
  308. package/schema/examples/workspace/ventures/acme-labs/operations/departments/human-capital/department.json +5 -0
  309. package/schema/examples/workspace/ventures/acme-labs/operations/departments/it/README.md +5 -0
  310. package/schema/examples/workspace/ventures/acme-labs/operations/departments/it/department.json +5 -0
  311. package/schema/examples/workspace/ventures/acme-labs/operations/departments/marketing-and-sales/README.md +5 -0
  312. package/schema/examples/workspace/ventures/acme-labs/operations/departments/marketing-and-sales/department.json +5 -0
  313. package/schema/examples/workspace/ventures/acme-labs/operations/departments/products/README.md +5 -0
  314. package/schema/examples/workspace/ventures/acme-labs/operations/departments/products/department.json +5 -0
  315. package/schema/examples/workspace/ventures/acme-labs/operations/departments/strategy/README.md +5 -0
  316. package/schema/examples/workspace/ventures/acme-labs/operations/departments/strategy/department.json +5 -0
  317. package/schema/examples/workspace/ventures/acme-labs/people/founders/maya-chen.json +15 -0
  318. package/schema/examples/workspace/ventures/acme-labs/people/people.json +22 -0
  319. package/schema/examples/workspace/ventures/acme-labs/pillars/brand.md +5 -0
  320. package/schema/examples/workspace/ventures/acme-labs/pillars/business.md +5 -0
  321. package/schema/examples/workspace/ventures/acme-labs/pillars/product.md +5 -0
  322. package/schema/examples/workspace/ventures/acme-labs/products/.gitkeep +0 -0
  323. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.core-product.decision.json +28 -0
  324. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.exists.decision.json +38 -0
  325. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.flagship.decision.json +27 -0
  326. package/schema/examples/workspace/ventures/acme-labs/profile.md +12 -0
  327. package/schema/examples/workspace/ventures/acme-labs/provenance.jsonl +12 -0
  328. package/schema/examples/workspace/ventures/acme-labs/raw/dump.md +6 -0
  329. package/schema/examples/workspace/ventures/acme-labs/venture.json +27 -0
  330. package/schema/examples/workspace/ventures/northstar/AGENTS.md +17 -0
  331. package/schema/examples/workspace/ventures/northstar/accounts/.gitkeep +0 -0
  332. package/schema/examples/workspace/ventures/northstar/deals/ductline.json +8 -0
  333. package/schema/examples/workspace/ventures/northstar/deals/kilnworks.json +14 -0
  334. package/schema/examples/workspace/ventures/northstar/decisions/venture.team.decision.json +31 -0
  335. package/schema/examples/workspace/ventures/northstar/evidence/README.md +3 -0
  336. package/schema/examples/workspace/ventures/northstar/fund/decisions/terms.decision.json +27 -0
  337. package/schema/examples/workspace/ventures/northstar/fund/decisions/terms.first-close.decision.json +27 -0
  338. package/schema/examples/workspace/ventures/northstar/fund/decisions/thesis.decision.json +26 -0
  339. package/schema/examples/workspace/ventures/northstar/fund/terms.json +22 -0
  340. package/schema/examples/workspace/ventures/northstar/fund/thesis.json +22 -0
  341. package/schema/examples/workspace/ventures/northstar/governance/README.md +3 -0
  342. package/schema/examples/workspace/ventures/northstar/governance/departments/external-relationships/charter.md +5 -0
  343. package/schema/examples/workspace/ventures/northstar/governance/departments/external-relationships/department.json +5 -0
  344. package/schema/examples/workspace/ventures/northstar/governance/departments/finance/charter.md +5 -0
  345. package/schema/examples/workspace/ventures/northstar/governance/departments/finance/department.json +5 -0
  346. package/schema/examples/workspace/ventures/northstar/governance/departments/human-capital/charter.md +5 -0
  347. package/schema/examples/workspace/ventures/northstar/governance/departments/human-capital/department.json +5 -0
  348. package/schema/examples/workspace/ventures/northstar/governance/departments/risk-and-compliance/charter.md +5 -0
  349. package/schema/examples/workspace/ventures/northstar/governance/departments/risk-and-compliance/department.json +5 -0
  350. package/schema/examples/workspace/ventures/northstar/governance/departments/strategy/charter.md +5 -0
  351. package/schema/examples/workspace/ventures/northstar/governance/departments/strategy/department.json +5 -0
  352. package/schema/examples/workspace/ventures/northstar/knowledge/README.md +3 -0
  353. package/schema/examples/workspace/ventures/northstar/operations/README.md +3 -0
  354. package/schema/examples/workspace/ventures/northstar/operations/departments/external-relationships/README.md +5 -0
  355. package/schema/examples/workspace/ventures/northstar/operations/departments/external-relationships/department.json +5 -0
  356. package/schema/examples/workspace/ventures/northstar/operations/departments/finance/README.md +5 -0
  357. package/schema/examples/workspace/ventures/northstar/operations/departments/finance/department.json +5 -0
  358. package/schema/examples/workspace/ventures/northstar/operations/departments/human-capital/README.md +5 -0
  359. package/schema/examples/workspace/ventures/northstar/operations/departments/human-capital/department.json +5 -0
  360. package/schema/examples/workspace/ventures/northstar/operations/departments/risk-and-compliance/README.md +5 -0
  361. package/schema/examples/workspace/ventures/northstar/operations/departments/risk-and-compliance/department.json +5 -0
  362. package/schema/examples/workspace/ventures/northstar/operations/departments/strategy/README.md +5 -0
  363. package/schema/examples/workspace/ventures/northstar/operations/departments/strategy/department.json +5 -0
  364. package/schema/examples/workspace/ventures/northstar/people/founders/ana-ruiz.json +13 -0
  365. package/schema/examples/workspace/ventures/northstar/people/founders/ben-okafor.json +7 -0
  366. package/schema/examples/workspace/ventures/northstar/people/people.json +27 -0
  367. package/schema/examples/workspace/ventures/northstar/pillars/brand.md +5 -0
  368. package/schema/examples/workspace/ventures/northstar/pillars/business.md +5 -0
  369. package/schema/examples/workspace/ventures/northstar/pillars/product.md +5 -0
  370. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/AGENTS.md +17 -0
  371. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/accounts/.gitkeep +0 -0
  372. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/decisions/venture.team.decision.json +31 -0
  373. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/knowledge/README.md +3 -0
  374. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/customer-service/README.md +5 -0
  375. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/customer-service/department.json +5 -0
  376. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/finance/README.md +5 -0
  377. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/finance/department.json +5 -0
  378. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/human-capital/README.md +5 -0
  379. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/human-capital/department.json +5 -0
  380. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/it/README.md +5 -0
  381. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/it/department.json +5 -0
  382. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/marketing-and-sales/README.md +5 -0
  383. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/marketing-and-sales/department.json +5 -0
  384. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/products/README.md +5 -0
  385. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/products/department.json +5 -0
  386. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/strategy/README.md +5 -0
  387. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/strategy/department.json +5 -0
  388. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/brand.md +5 -0
  389. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/business.md +5 -0
  390. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/product.md +5 -0
  391. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/.gitkeep +0 -0
  392. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.core-product.decision.json +28 -0
  393. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.exists.decision.json +32 -0
  394. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.flagship.decision.json +27 -0
  395. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/profile.md +5 -0
  396. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/venture.json +27 -0
  397. package/schema/examples/workspace/ventures/northstar/products/.gitkeep +0 -0
  398. package/schema/examples/workspace/ventures/northstar/profile.md +5 -0
  399. package/schema/examples/workspace/ventures/northstar/provenance.jsonl +3 -0
  400. package/schema/examples/workspace/ventures/northstar/purpose/README.md +3 -0
  401. package/schema/examples/workspace/ventures/northstar/venture.json +49 -0
  402. package/schema/examples/workspace/ventures/studio/accounts/bakery/account.json +18 -0
  403. package/schema/examples/workspace/ventures/studio/evidence/.gitkeep +0 -0
  404. package/schema/examples/workspace/ventures/studio/governance/.gitkeep +0 -0
  405. package/schema/examples/workspace/ventures/studio/knowledge/.gitkeep +0 -0
  406. package/schema/examples/workspace/ventures/studio/operations/.gitkeep +0 -0
  407. package/schema/examples/workspace/ventures/studio/print/knowledge/.gitkeep +0 -0
  408. package/schema/examples/workspace/ventures/studio/print/purpose/.gitkeep +0 -0
  409. package/schema/examples/workspace/ventures/studio/print/venture.json +37 -0
  410. package/schema/examples/workspace/ventures/studio/products/brand-care.json +19 -0
  411. package/schema/examples/workspace/ventures/studio/products/brand-kit.json +23 -0
  412. package/schema/examples/workspace/ventures/studio/provenance.jsonl +3 -0
  413. package/schema/examples/workspace/ventures/studio/purpose/.gitkeep +0 -0
  414. package/schema/examples/workspace/ventures/studio/venture.json +43 -0
  415. package/schema/examples/workspace/ventures/tandem/accounts/.gitkeep +0 -0
  416. package/schema/examples/workspace/ventures/tandem/evidence/README.md +3 -0
  417. package/schema/examples/workspace/ventures/tandem/governance/README.md +3 -0
  418. package/schema/examples/workspace/ventures/tandem/governance/agreements/dee-fast.md +3 -0
  419. package/schema/examples/workspace/ventures/tandem/governance/board.json +51 -0
  420. package/schema/examples/workspace/ventures/tandem/governance/departments/finance/charter.md +5 -0
  421. package/schema/examples/workspace/ventures/tandem/governance/departments/finance/department.json +5 -0
  422. package/schema/examples/workspace/ventures/tandem/governance/departments/primary/marketing-and-sales/charter.md +5 -0
  423. package/schema/examples/workspace/ventures/tandem/governance/departments/primary/marketing-and-sales/department.json +5 -0
  424. package/schema/examples/workspace/ventures/tandem/governance/exit.json +33 -0
  425. package/schema/examples/workspace/ventures/tandem/governance/founder-agreement.json +24 -0
  426. package/schema/examples/workspace/ventures/tandem/governance/founder-agreement.md +3 -0
  427. package/schema/examples/workspace/ventures/tandem/governance/ownership.json +131 -0
  428. package/schema/examples/workspace/ventures/tandem/governance/publication-policy.json +171 -0
  429. package/schema/examples/workspace/ventures/tandem/knowledge/README.md +3 -0
  430. package/schema/examples/workspace/ventures/tandem/knowledge/research/friends-feedback-2026-08.md +3 -0
  431. package/schema/examples/workspace/ventures/tandem/knowledge/research/pilot-2026-10.md +3 -0
  432. package/schema/examples/workspace/ventures/tandem/knowledge/research/problem-interviews-2026-09.md +20 -0
  433. package/schema/examples/workspace/ventures/tandem/knowledge/sources.json +8 -0
  434. package/schema/examples/workspace/ventures/tandem/knowledge/where-used.json +13 -0
  435. package/schema/examples/workspace/ventures/tandem/operations/README.md +3 -0
  436. package/schema/examples/workspace/ventures/tandem/operations/departments/finance/README.md +5 -0
  437. package/schema/examples/workspace/ventures/tandem/operations/departments/finance/department.json +5 -0
  438. package/schema/examples/workspace/ventures/tandem/operations/departments/primary/marketing-and-sales/README.md +5 -0
  439. package/schema/examples/workspace/ventures/tandem/operations/departments/primary/marketing-and-sales/department.json +5 -0
  440. package/schema/examples/workspace/ventures/tandem/pillars/brand.md +5 -0
  441. package/schema/examples/workspace/ventures/tandem/pillars/business.md +5 -0
  442. package/schema/examples/workspace/ventures/tandem/pillars/product.md +5 -0
  443. package/schema/examples/workspace/ventures/tandem/products/.gitkeep +0 -0
  444. package/schema/examples/workspace/ventures/tandem/products/shop-app.json +22 -0
  445. package/schema/examples/workspace/ventures/tandem/profile.md +5 -0
  446. package/schema/examples/workspace/ventures/tandem/provenance.jsonl +13 -0
  447. package/schema/examples/workspace/ventures/tandem/purpose/README.md +3 -0
  448. package/schema/examples/workspace/ventures/tandem/purpose/telos.json +78 -0
  449. package/schema/examples/workspace/ventures/tandem/purpose/validation/go-to-market.json +35 -0
  450. package/schema/examples/workspace/ventures/tandem/purpose/validation/pricing.json +37 -0
  451. package/schema/examples/workspace/ventures/tandem/purpose/validation/problem.json +74 -0
  452. package/schema/examples/workspace/ventures/tandem/purpose/validation/product-market-fit.json +66 -0
  453. package/schema/examples/workspace/ventures/tandem/purpose/validation/solution.json +33 -0
  454. package/schema/examples/workspace/ventures/tandem/purpose/validation/team.json +52 -0
  455. package/schema/examples/workspace/ventures/tandem/venture.json +79 -0
  456. package/schema/examples/workspace/ventures/woodworking/knowledge/.gitkeep +0 -0
  457. package/schema/examples/workspace/ventures/woodworking/venture.json +21 -0
  458. package/schema/examples/workspace/workspace.json +8 -0
  459. package/schema/exit.schema.json +74 -0
  460. package/schema/foundation.mjs +118 -0
  461. package/schema/founder-agreement.schema.json +83 -0
  462. package/schema/founder.schema.json +72 -0
  463. package/schema/frame.schema.json +240 -0
  464. package/schema/frames.mjs +228 -0
  465. package/schema/freshness-log.schema.json +40 -0
  466. package/schema/freshness-profiles.schema.json +44 -0
  467. package/schema/freshness.mjs +473 -0
  468. package/schema/fund-terms.schema.json +107 -0
  469. package/schema/fund-thesis.schema.json +87 -0
  470. package/schema/gate-drafts.mjs +130 -0
  471. package/schema/gate.mjs +133 -0
  472. package/schema/glossary.schema.json +25 -0
  473. package/schema/handoff.schema.json +239 -0
  474. package/schema/icp.schema.json +136 -0
  475. package/schema/idea-graph.schema.json +61 -0
  476. package/schema/init-venture.mjs +128 -0
  477. package/schema/integration.schema.json +143 -0
  478. package/schema/judgment.schema.json +38 -0
  479. package/schema/kit.schema.json +47 -0
  480. package/schema/kits.mjs +24 -0
  481. package/schema/knowledge-sources.schema.json +260 -0
  482. package/schema/layer.json +59 -0
  483. package/schema/layer.schema.json +119 -0
  484. package/schema/load-packages.mjs +26 -0
  485. package/schema/marketing-brand.schema.json +116 -0
  486. package/schema/marketing-sitemap.schema.json +232 -0
  487. package/schema/migrate-venture.mjs +192 -0
  488. package/schema/migrations/kit-to-package.mjs +94 -0
  489. package/schema/migrations/package-layout.mjs +86 -0
  490. package/schema/model-steps.mjs +717 -0
  491. package/schema/money-summary.schema.json +138 -0
  492. package/schema/naive-config.mjs +165 -0
  493. package/schema/naive-config.schema.json +268 -0
  494. package/schema/need-now.json +772 -0
  495. package/schema/need-now.mjs +108 -0
  496. package/schema/nextjs-status.schema.json +29 -0
  497. package/schema/ownership.schema.json +282 -0
  498. package/schema/packages.json +4 -0
  499. package/schema/packages.mjs +252 -0
  500. package/schema/payouts.mjs +91 -0
  501. package/schema/people.schema.json +86 -0
  502. package/schema/port-venture.mjs +161 -0
  503. package/schema/product.schema.json +223 -0
  504. package/schema/provenance-entry.schema.json +154 -0
  505. package/schema/public-assets.schema.json +76 -0
  506. package/schema/publication-policy.schema.json +293 -0
  507. package/schema/raw-source.schema.json +15 -0
  508. package/schema/reference.schema.json +115 -0
  509. package/schema/release-read.mjs +111 -0
  510. package/schema/releases.mjs +497 -0
  511. package/schema/route-aliases.schema.json +25 -0
  512. package/schema/run-handoff.mjs +51 -0
  513. package/schema/scaffold/defaults.json +54 -0
  514. package/schema/setup.mjs +164 -0
  515. package/schema/site-presence.schema.json +337 -0
  516. package/schema/stale.mjs +111 -0
  517. package/schema/start-release.mjs +41 -0
  518. package/schema/strategic-foundation.schema.json +74 -0
  519. package/schema/stream.schema.json +14 -0
  520. package/schema/structure.mjs +186 -0
  521. package/schema/systems-catalog.json +126 -0
  522. package/schema/systems-catalog.schema.json +78 -0
  523. package/schema/team-plan.schema.json +157 -0
  524. package/schema/telos.schema.json +197 -0
  525. package/schema/time-to-ready.mjs +93 -0
  526. package/schema/trigger.schema.json +44 -0
  527. package/schema/triggers.mjs +237 -0
  528. package/schema/upgrade-registry.schema.json +60 -0
  529. package/schema/upgrade-venture.mjs +107 -0
  530. package/schema/upgrades.json +69 -0
  531. package/schema/upgrades.mjs +385 -0
  532. package/schema/use-model.mjs +10 -0
  533. package/schema/validate.py +58 -0
  534. package/schema/validation-evidence.schema.json +123 -0
  535. package/schema/validation-go-to-market.schema.json +110 -0
  536. package/schema/validation-operations-readiness.schema.json +91 -0
  537. package/schema/validation-pricing.schema.json +114 -0
  538. package/schema/validation-problem.schema.json +118 -0
  539. package/schema/validation-product-market-fit.schema.json +135 -0
  540. package/schema/validation-solution.schema.json +79 -0
  541. package/schema/validation-team.schema.json +116 -0
  542. package/schema/venture-role.schema.json +64 -0
  543. package/schema/venture-type.mjs +62 -0
  544. package/schema/venture-types.json +346 -0
  545. package/schema/venture-types.schema.json +129 -0
  546. package/schema/venture.schema.json +460 -0
  547. package/schema/vocab/business-models.json +298 -0
  548. package/schema/where-used.schema.json +56 -0
  549. package/schema/workspace.schema.json +38 -0
@@ -0,0 +1,197 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "telos.schema.json",
4
+ "title": "Telos",
5
+ "description": "The end a venture exists to reach, at <venture>/purpose/telos.json (EE-023): start with the end. It states the end state, how anyone would know it was reached (measures), what the owners intend to happen when it is reached (owner outcome), and, for each phase of the Succession Matrix, the exit criteria that must be true to leave it, each serving at least one measure. Other layers read it instead of asking again: the governance layer's exit.json prefers the owner outcome's path, and MAD's governance tier takes its success measure from the primary measure. schema/check-telos.mjs checks it. Written by the owner; an agent may draft it but not settle it.",
6
+ "type": "object",
7
+ "required": [
8
+ "statement",
9
+ "end_state",
10
+ "measures",
11
+ "owner_outcome"
12
+ ],
13
+ "additionalProperties": false,
14
+ "properties": {
15
+ "statement": {
16
+ "type": "string",
17
+ "description": "The end, in one sentence: what the venture is for when it has done its job"
18
+ },
19
+ "end_state": {
20
+ "type": "string",
21
+ "description": "What is true in the world when the end is reached"
22
+ },
23
+ "horizon": {
24
+ "type": [
25
+ "integer",
26
+ "string"
27
+ ],
28
+ "description": "The year the end should be reached by, or 'open'"
29
+ },
30
+ "measures": {
31
+ "type": "array",
32
+ "minItems": 1,
33
+ "items": {
34
+ "type": "object",
35
+ "required": [
36
+ "id",
37
+ "statement",
38
+ "kind"
39
+ ],
40
+ "additionalProperties": false,
41
+ "properties": {
42
+ "id": {
43
+ "type": "string",
44
+ "pattern": "^[a-z0-9-]+$"
45
+ },
46
+ "statement": {
47
+ "type": "string"
48
+ },
49
+ "target": {
50
+ "type": "string"
51
+ },
52
+ "kind": {
53
+ "enum": [
54
+ "revenue",
55
+ "usage_or_adoption",
56
+ "cost_or_time_saved",
57
+ "compliance_met",
58
+ "learning",
59
+ "flow_and_lead_time",
60
+ "impact"
61
+ ],
62
+ "description": "The kind of measure; the first six match MAD's success_measure answers, impact is a change in the world beyond the venture"
63
+ },
64
+ "primary": {
65
+ "type": "boolean",
66
+ "description": "Exactly one measure is primary"
67
+ }
68
+ }
69
+ }
70
+ },
71
+ "owner_outcome": {
72
+ "type": "object",
73
+ "required": [
74
+ "path"
75
+ ],
76
+ "additionalProperties": false,
77
+ "properties": {
78
+ "path": {
79
+ "enum": [
80
+ "acquisition",
81
+ "ipo",
82
+ "secondary-sale",
83
+ "merger",
84
+ "management-buyout",
85
+ "wind-down",
86
+ "hold"
87
+ ],
88
+ "description": "What the owners intend to happen once the end is reached; hold means they keep it"
89
+ },
90
+ "why": {
91
+ "type": "string"
92
+ }
93
+ }
94
+ },
95
+ "phases": {
96
+ "type": "array",
97
+ "items": {
98
+ "type": "object",
99
+ "required": [
100
+ "phase",
101
+ "exit_criteria"
102
+ ],
103
+ "additionalProperties": false,
104
+ "properties": {
105
+ "phase": {
106
+ "enum": [
107
+ "discovery",
108
+ "validation",
109
+ "beachhead",
110
+ "scale",
111
+ "platform"
112
+ ]
113
+ },
114
+ "exit_criteria": {
115
+ "type": "array",
116
+ "minItems": 1,
117
+ "items": {
118
+ "type": "object",
119
+ "required": [
120
+ "id",
121
+ "statement",
122
+ "serves"
123
+ ],
124
+ "additionalProperties": false,
125
+ "properties": {
126
+ "id": {
127
+ "type": "string",
128
+ "pattern": "^[a-z0-9-]+$"
129
+ },
130
+ "statement": {
131
+ "type": "string"
132
+ },
133
+ "serves": {
134
+ "type": "array",
135
+ "minItems": 1,
136
+ "items": {
137
+ "type": "string"
138
+ },
139
+ "description": "Measure ids this criterion moves the venture toward"
140
+ },
141
+ "evidence": {
142
+ "type": "string",
143
+ "description": "How it is shown: a check command, an evidence record, or a metric"
144
+ }
145
+ }
146
+ }
147
+ }
148
+ }
149
+ },
150
+ "description": "Per phase, what must be true to leave it; refines that phase's generic gate in purpose/frameworks/product-anatomy/phases.json for this venture"
151
+ },
152
+ "steering": {
153
+ "type": "object",
154
+ "additionalProperties": false,
155
+ "description": "How the venture decides to start, keep going or stop, when it reviews that, and what happens when evidence says the direction is wrong (EE-040; MAD's governance tier reads these as go_decision, review_cadence and change_of_direction). Who may make each call is in the decision rights: continue-or-stop and change-direction.",
156
+ "properties": {
157
+ "go_decision": {
158
+ "enum": [
159
+ "test-hypotheses-first",
160
+ "business-case-upfront",
161
+ "owner-judgment",
162
+ "last-responsible-moment",
163
+ "other"
164
+ ],
165
+ "description": "test-hypotheses-first: assumptions are written down and tested with real people before committing. business-case-upfront: a case is approved before work starts. owner-judgment: the owner decides as they go. last-responsible-moment: commitments wait until delay costs more than deciding."
166
+ },
167
+ "review": {
168
+ "enum": [
169
+ "per-experiment",
170
+ "per-release",
171
+ "fixed-period",
172
+ "continuous",
173
+ "none"
174
+ ],
175
+ "description": "When the decision to continue is reviewed: after each experiment or customer test, at each release or milestone, on a calendar, continuously from watched measures, or never formally"
176
+ },
177
+ "review_period": {
178
+ "type": "string",
179
+ "description": "For fixed-period: the period, such as quarterly"
180
+ },
181
+ "change_of_direction": {
182
+ "enum": [
183
+ "pivot-on-evidence",
184
+ "formal-change-control",
185
+ "owner-decides",
186
+ "public-proposal",
187
+ "other"
188
+ ],
189
+ "description": "pivot-on-evidence: changing the product, customer or model is expected and planned for. formal-change-control: a change request the deciders approve or reject. owner-decides: the owner adjusts as they see fit. public-proposal: anyone proposes in public and maintainers decide by a published rule."
190
+ },
191
+ "note": {
192
+ "type": "string"
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
@@ -0,0 +1,93 @@
1
+ // Time to running, and time to ready per layer and per MAD tier (the telos's Option B measure).
2
+ //
3
+ // running: the venture is operating when its core promise is written, a product is live with at
4
+ // least one account, and the next phase's exit criteria exist in the telos.
5
+ // The date is the latest of the dates those records first appeared.
6
+ // layer ready: every record the need-now score suggests for the current phase exists in that
7
+ // layer; the date is when the last of them first appeared. A layer still missing one is not
8
+ // ready, and the missing records are listed.
9
+ // tier ready: the operations-readiness record's ready_on per MAD tier.
10
+ // A record's date is when git first saw the file, else the file's own updated or opened date.
11
+ //
12
+ // node schema/time-to-ready.mjs <venture dir> [--json]
13
+
14
+ import { execFileSync } from "node:child_process";
15
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
16
+ import { join, dirname } from "node:path";
17
+ import { needNow } from "./need-now.mjs";
18
+
19
+ const load = (p) => JSON.parse(readFileSync(p, "utf8"));
20
+ const day = (d) => d ? d.slice(0, 10) : null;
21
+ const days = (a, b) => a && b ? Math.round((new Date(b) - new Date(a)) / 864e5) : null;
22
+
23
+ function firstSeen(file) {
24
+ try {
25
+ const out = execFileSync("git", ["log", "--diff-filter=A", "--follow", "--format=%as", "--", file], { cwd: dirname(file), encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim().split("\n").filter(Boolean);
26
+ if (out.length) return out[out.length - 1];
27
+ } catch {}
28
+ try { const j = load(file); if (j.updated || j.opened) return day(j.updated ?? j.opened); } catch {}
29
+ return day(statSync(file).mtime.toISOString());
30
+ }
31
+
32
+ const files = (d, base = d) => existsSync(d) ? readdirSync(d, { withFileTypes: true }).flatMap((e) =>
33
+ e.isDirectory() ? files(join(d, e.name), base) : [join(d, e.name).slice(base.length + 1)]) : [];
34
+ const glob = (g) => new RegExp("^" + g.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*\//g, "\0").replace(/\*/g, "[^/]*").replace(/\0/g, "(?:[^/]+/)*") + "$");
35
+
36
+ export function timeToReady(dir) {
37
+ const repo = new URL("..", import.meta.url).pathname;
38
+ const model = load(join(repo, "schema/data-model.json"));
39
+ const v = load(join(dir, "venture.json"));
40
+ const start = day(v.opened) ?? firstSeen(join(dir, "venture.json"));
41
+ const here = files(dir);
42
+ const where = (type) => {
43
+ const rels = (model.records.find((r) => r.id === type)?.paths ?? []).filter((p) => p.startsWith("instance/**/")).map((p) => p.slice("instance/**/".length));
44
+ return here.filter((x) => rels.some((g) => glob(g).test(x)));
45
+ };
46
+ const seen = (type) => { const fs = where(type); return fs.length ? fs.map((f) => firstSeen(join(dir, f))).sort()[0] : null; };
47
+
48
+ // Running.
49
+ const nn = needNow(dir);
50
+ const products = where("product").map((f) => ({ f, p: load(join(dir, f)) }));
51
+ const offered = products.filter(({ p }) => p.status === "live");
52
+ const telosFile = where("telos")[0];
53
+ const telos = telosFile ? load(join(dir, telosFile)) : null;
54
+ const conditions = {
55
+ promise: v.core?.promise ? firstSeen(join(dir, "venture.json")) : null,
56
+ product_offered: offered.length ? offered.map(({ f }) => firstSeen(join(dir, f))).sort()[0] : null,
57
+ first_account: seen("account"),
58
+ next_exit_criteria: nn.next && telos?.phases?.some((p) => p.phase === nn.next) ? firstSeen(join(dir, telosFile)) : null,
59
+ };
60
+ const missing = Object.entries(conditions).filter(([, d]) => !d).map(([k]) => k);
61
+ const runningOn = missing.length ? null : Object.values(conditions).sort().at(-1);
62
+
63
+ // Layers.
64
+ const layers = {};
65
+ for (const row of nn.rows.filter((r) => r.status === "held" || r.status === "suggest now")) {
66
+ const l = row.layer ?? "system";
67
+ layers[l] ??= { dates: [], missing: [] };
68
+ const d = seen(row.type);
69
+ if (d) layers[l].dates.push(d); else layers[l].missing.push(row.type);
70
+ }
71
+ const layerRows = Object.entries(layers).map(([layer, x]) => {
72
+ const on = x.missing.length ? null : x.dates.sort().at(-1) ?? null;
73
+ return { layer, ready_on: on, days: days(start, on), missing: x.missing };
74
+ });
75
+
76
+ // MAD tiers.
77
+ const opsFile = where("validation-operations-readiness")[0];
78
+ const tiers = opsFile ? load(join(dir, opsFile)).tiers.map((t) => ({ tier: t.tier, ready_on: t.ready_on ?? null, days: days(start, t.ready_on) })) : [];
79
+
80
+ return { venture: v.id, phase: nn.phase, started: start, running: { on: runningOn, days: days(start, runningOn), missing, conditions }, layers: layerRows, tiers };
81
+ }
82
+
83
+ if (import.meta.url === `file://${process.argv[1]}`) {
84
+ const dir = process.argv[2];
85
+ if (!dir || !existsSync(join(dir, "venture.json"))) { console.error("usage: node schema/time-to-ready.mjs <venture dir> [--json]"); process.exit(2); }
86
+ const r = timeToReady(dir);
87
+ if (process.argv.includes("--json")) { console.log(JSON.stringify(r, null, 2)); process.exit(0); }
88
+ console.log(`${r.venture}: started ${r.started}, phase ${r.phase}`);
89
+ console.log(r.running.on ? `running since ${r.running.on} (${r.running.days} days to running)` : `not running yet: missing ${r.running.missing.join(", ")}`);
90
+ console.log("\nlayer ready (for what the current phase needs)");
91
+ for (const l of r.layers) console.log(` ${l.layer.padEnd(12)} ${l.ready_on ? `${l.ready_on} (${l.days} days)` : `not ready: ${l.missing.join(", ")}`}`);
92
+ if (r.tiers.length) { console.log("\nMAD tier ready"); for (const t of r.tiers) console.log(` ${t.tier.padEnd(22)} ${t.ready_on ? `${t.ready_on} (${t.days} days)` : "not ready"}`); }
93
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "trigger.schema.json",
4
+ "title": "Trigger",
5
+ "description": "What starts the next step when something happens in a venture (M-12), as React's event handlers and effects trigger actions. An event is a line of the venture's provenance log: a record written, drafted, accepted, confirmed or moved. A trigger lives in naive.config.json triggers, or in a Mentura kit's automations; a kit's automation also names the package it needs, and runs only once that package is complete. A run that fails is recorded and raised as a decision for the founder, never lost (E-7). schema/triggers.mjs runs them.",
6
+ "type": "object",
7
+ "required": ["id", "on", "run"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
11
+ "on": {
12
+ "type": "object",
13
+ "additionalProperties": false,
14
+ "description": "Which provenance entries start it; every field given must match",
15
+ "properties": {
16
+ "activity": {
17
+ "oneOf": [
18
+ { "enum": ["write", "draft", "accept", "baseline", "confirm", "move", "release"] },
19
+ { "type": "array", "minItems": 1, "items": { "enum": ["write", "draft", "accept", "baseline", "confirm", "move", "release"] } }
20
+ ]
21
+ },
22
+ "route": { "type": "string", "description": "A glob over the entry's route, such as foundation/**" },
23
+ "entity": { "type": "string", "description": "A glob over the file the entry names" },
24
+ "by": { "enum": ["person", "agent"], "description": "Only entries by a person, or only by an agent" }
25
+ }
26
+ },
27
+ "run": {
28
+ "type": "object",
29
+ "additionalProperties": false,
30
+ "description": "The next step: one router call, or a decision proposed for a person",
31
+ "properties": {
32
+ "route": { "type": "string" },
33
+ "action": { "enum": ["read", "check", "run", "write", "layout", "view"] },
34
+ "input": {},
35
+ "propose": { "type": "object", "description": "A decision record (decision-record.schema.json) proposed for a person to decide" }
36
+ },
37
+ "oneOf": [ { "required": ["route", "action"] }, { "required": ["propose"] } ]
38
+ },
39
+ "needs": { "type": "string", "description": "The package that must be complete first (required for a kit's automation)" },
40
+ "once": { "type": "boolean", "description": "Run it once only; later events do not start it again" },
41
+ "enabled": { "type": "boolean", "default": true },
42
+ "note": { "type": "string" }
43
+ }
44
+ }
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env node
2
+ // Triggers (M-12) and what happens when one fails (E-7). In React an event handler or an effect starts
3
+ // an action when something happens; in Naive an event is a line of the venture's provenance log (a
4
+ // record written, drafted, accepted, confirmed or moved), and a trigger starts the next step: one router
5
+ // call, or a decision proposed for a person. Triggers come from naive.config.json `triggers`, and from
6
+ // the automations of the Mentura kits the venture lists in `kits`. A kit's automation runs only once
7
+ // the package it needs is complete; until then its run waits, and is retried on every later event.
8
+ //
9
+ // React's error boundaries do not catch errors in event handlers or async code: you catch and store
10
+ // them yourself. So does this. Every run is stored in <venture>/.naive/triggers.json before the cursor
11
+ // moves past its event. A run that fails, or throws, is raised as a decision for the founder (retry,
12
+ // skip this event, or turn the trigger off) and settled when the founder decides it. A crash of the
13
+ // runner itself is kept by the provenance hook and raised on the next run. Nothing is lost.
14
+ //
15
+ // node schema/triggers.mjs <venture dir> [--json] the triggers, their recent runs and open failures
16
+ // node schema/triggers.mjs <venture dir> --fire run what the new events start (the provenance hook does this)
17
+ //
18
+ // Trigger runs act as agents (id trigger-<id>, via router), so their writes meet the same gates as any
19
+ // agent's: a gated record is drafted for a person. A trigger never fires on its own writes.
20
+
21
+ import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs";
22
+ import { join } from "node:path";
23
+ import { entries } from "../interface/provenance.mjs";
24
+ import { call, glob } from "../interface/router.mjs";
25
+ import { decisions, propose } from "./decisions.mjs";
26
+ import { kit } from "./kits.mjs";
27
+ import { CONFIG, readConfig, writeConfig } from "./naive-config.mjs";
28
+ import { packages } from "./packages.mjs";
29
+
30
+ export const STATE = ".naive/triggers.json";
31
+ export const ERRORS = ".naive/trigger-errors.jsonl";
32
+ const load = (p) => JSON.parse(readFileSync(p, "utf8"));
33
+ const now = () => new Date().toISOString();
34
+
35
+ /** The venture's triggers, from its config and its kits, with what is wrong with any of them. */
36
+ export function triggersOf(dir) {
37
+ const cfg = readConfig(dir);
38
+ const off = new Set(cfg.triggers_off ?? []);
39
+ const problems = [];
40
+ const out = (cfg.triggers ?? []).map((t) => ({ ...t, from: "naive.config.json" }));
41
+ for (const name of cfg.kits ?? []) {
42
+ const k = kit(name);
43
+ if (!k) { problems.push(`kit ${name} is listed in ${CONFIG} kits but is not installed (platform/kits/${name}/kit.json)`); continue; }
44
+ for (const a of k.automations ?? []) {
45
+ if (!a.needs) { problems.push(`kit ${name}: automation ${a.id} names no package it needs, so it never runs (a kit's automation runs only once its package is complete)`); continue; }
46
+ out.push({ ...a, id: `${name}-${a.id}`, from: `kit ${name}` });
47
+ }
48
+ }
49
+ const seen = new Set();
50
+ for (const t of out) { if (seen.has(t.id)) problems.push(`trigger ${t.id} is defined twice; the first one runs`); seen.add(t.id); }
51
+ return { triggers: out.filter((t, i) => out.findIndex((x) => x.id === t.id) === i).map((t) => ({ ...t, enabled: t.enabled !== false && !off.has(t.id) })), problems };
52
+ }
53
+
54
+ /** Whether a provenance entry starts a trigger. */
55
+ export function matches(t, e) {
56
+ const on = t.on ?? {};
57
+ const acts = on.activity ? [on.activity].flat() : null;
58
+ if (acts && !acts.includes(e.activity)) return false;
59
+ if (on.route && !(e.route && glob(on.route).test(e.route))) return false;
60
+ if (on.entity && !glob(on.entity).test(e.entity)) return false;
61
+ if (on.by && e.agent?.kind !== on.by) return false;
62
+ return true;
63
+ }
64
+
65
+ function readState(dir) {
66
+ const f = join(dir, STATE);
67
+ if (existsSync(f)) {
68
+ try { const s = load(f); if (Array.isArray(s.runs) && Array.isArray(s.waiting)) return s; } catch {}
69
+ // A state file that cannot be read is kept beside it, and the failure is raised; runs start again from now.
70
+ const kept = `.naive/triggers.unreadable-${Date.now()}.json`;
71
+ renameSync(f, join(dir, kept));
72
+ return { since: now(), cursor: null, runs: [], waiting: [], unreadable: kept };
73
+ }
74
+ // Triggers start with the events after they were configured, not the venture's whole history.
75
+ const cfg = join(dir, CONFIG);
76
+ return { since: existsSync(cfg) ? statSync(cfg).mtime.toISOString() : now(), cursor: null, runs: [], waiting: [] };
77
+ }
78
+ const saveState = (dir, s) => { mkdirSync(join(dir, ".naive"), { recursive: true }); writeFileSync(join(dir, STATE), JSON.stringify(s, null, 2) + "\n"); };
79
+
80
+ const complete = (dir, name) => { try { return packages(dir).complete.includes(name); } catch { return false; } };
81
+ const brief = (x) => (x == null ? null : typeof x === "string" ? x.slice(0, 300) : JSON.stringify(x).slice(0, 300));
82
+
83
+ // E-7: a failed run becomes a decision the founder owes. It fails open: the rest of the venture goes on.
84
+ function raise(dir, run) {
85
+ const v = load(join(dir, "venture.json"));
86
+ // A runner failure can recur across state files, so its id carries the time instead of the run number.
87
+ const id = `trigger-${run.trigger}-failed-${run.trigger === "runner" ? Date.now().toString(36) : run.n}`.replace(/[^a-z0-9-]+/g, "-").slice(0, 80);
88
+ const r = propose(dir, { id, question: `Trigger ${run.trigger} ${run.outcome === "uncaught" ? "crashed" : "failed"} on ${run.activity ?? "an event"} of ${run.entity ?? "the venture"}: ${String(run.error).split("\n")[0].slice(0, 300)}. Retry it, skip this event, or turn the trigger off?`,
89
+ options: ["Retry", "Skip this event", "Turn the trigger off"], layer: "operations", boundary: "fail-open", needed_in: v.phase, decides: { path: CONFIG },
90
+ note: `Raised by schema/triggers.mjs (E-7). The run is kept in ${STATE} as run ${run.n}.` }, { agentId: "naive-triggers", via: "router" });
91
+ return r.ok ? id : null;
92
+ }
93
+
94
+ async function runOne(dir, t, e, state, extra = {}) {
95
+ const v = load(join(dir, "venture.json"));
96
+ const run = { n: state.runs.length + 1, trigger: t.id, from: t.from, event: e?.hash ?? null, entity: e?.entity ?? null, activity: e?.activity ?? null, at: now(), ...extra };
97
+ try {
98
+ let r;
99
+ if (t.run.propose) r = propose(dir, t.run.propose, { agentId: `trigger-${t.id}`, via: "router" });
100
+ else if (typeof t.run.route !== "string") throw new Error(`trigger ${t.id} names no route to run`); // a malformed trigger crashes; the router would read it as a broken route table
101
+ else r = await call({ venture: v.id, workspace: dir, route: t.run.route, action: t.run.action, input: t.run.input, actor: "agent", actor_id: `trigger-${t.id}`, via: "router",
102
+ provenance: { derived_from: e?.entity && !/:\/\//.test(e.entity) ? [e.entity] : undefined, note: `trigger ${t.id} on ${e?.activity ?? "retry"} of ${e?.entity ?? "?"}` } });
103
+ run.outcome = r.ok ? "ran" : "failed";
104
+ if (r.ok) run.result = brief(r.result); else run.error = r.error ?? brief(r.result) ?? "the call did not succeed";
105
+ } catch (err) { run.outcome = "uncaught"; run.error = String(err?.stack ?? err).slice(0, 2000); }
106
+ if (run.outcome !== "ran") { const d = raise(dir, run); run.status = d ? "raised" : "unraised"; if (d) run.decision = d; }
107
+ state.runs.push(run);
108
+ saveState(dir, state);
109
+ return run;
110
+ }
111
+
112
+ /** Settles failures the founder has decided: retry the run, skip its event, or turn the trigger off. */
113
+ export async function settle(dir, state = readState(dir)) {
114
+ const raised = state.runs.filter((r) => r.status === "raised");
115
+ if (!raised.length) return [];
116
+ const ds = new Map(decisions(dir).decisions.map((d) => [d.id, d]));
117
+ const { triggers } = triggersOf(dir);
118
+ const log = entries(dir);
119
+ const done = [];
120
+ for (const run of raised) {
121
+ const d = ds.get(run.decision);
122
+ if (!d || !["decided", "withdrawn"].includes(d.status)) continue;
123
+ const answer = String(d.answer ?? "").toLowerCase();
124
+ if (d.status === "withdrawn" || answer.startsWith("skip")) run.status = "skipped";
125
+ else if (/\boff\b|disable|turn/.test(answer)) {
126
+ const cfg = readConfig(dir);
127
+ cfg.triggers_off = [...new Set([...(cfg.triggers_off ?? []), run.trigger])];
128
+ writeConfig(dir, cfg);
129
+ run.status = "turned off";
130
+ } else if (answer.startsWith("retry")) {
131
+ run.status = "retried";
132
+ const t = triggers.find((x) => x.id === run.trigger);
133
+ const e = log.find((x) => x.hash === run.event);
134
+ saveState(dir, state);
135
+ if (t && t.enabled) { const again = await runOne(dir, t, e, state, { retry_of: run.n }); run.retried_as = again.n; }
136
+ else run.status = "retried, but the trigger is gone or off";
137
+ } else continue;
138
+ run.settled_at = now();
139
+ done.push(run);
140
+ saveState(dir, state);
141
+ }
142
+ return done;
143
+ }
144
+
145
+ /** Runs what the events since the last run start. Returns the runs it made. */
146
+ export async function fire(dir, { rounds = 20 } = {}) {
147
+ const held = process.env.NAIVE_TRIGGERS_ACTIVE;
148
+ process.env.NAIVE_TRIGGERS_ACTIVE = "fire";
149
+ const state = readState(dir);
150
+ const made = [];
151
+ try {
152
+ if (state.unreadable) {
153
+ const run = { n: 1, trigger: "runner", from: "schema/triggers.mjs", at: now(), outcome: "failed", error: `${STATE} could not be read; it is kept at ${state.unreadable} and triggers start again from now` };
154
+ const d = raise(dir, run); run.status = d ? "raised" : "unraised"; if (d) run.decision = d;
155
+ delete state.unreadable; state.runs.push(run); made.push(run); saveState(dir, state);
156
+ }
157
+ // A crash the provenance hook kept is a failure too.
158
+ const ef = join(dir, ERRORS);
159
+ if (existsSync(ef)) {
160
+ for (const l of readFileSync(ef, "utf8").split("\n").filter(Boolean)) {
161
+ const x = JSON.parse(l);
162
+ const run = { n: state.runs.length + 1, trigger: "runner", from: "provenance hook", event: null, entity: null, activity: null, at: x.at, outcome: "uncaught", error: x.error };
163
+ const d = raise(dir, run); run.status = d ? "raised" : "unraised"; if (d) run.decision = d;
164
+ state.runs.push(run); made.push(run);
165
+ }
166
+ writeFileSync(ef, "");
167
+ saveState(dir, state);
168
+ }
169
+ made.push(...await settle(dir, state));
170
+ const { triggers } = triggersOf(dir);
171
+ const active = triggers.filter((t) => t.enabled);
172
+ const ranOnce = (t) => t.once && state.runs.some((r) => r.trigger === t.id && r.outcome === "ran");
173
+ for (let round = 0; round < rounds; round++) {
174
+ const log = entries(dir);
175
+ const at = state.cursor ? log.findIndex((e) => e.hash === state.cursor) + 1 : log.findIndex((e) => e.at >= state.since);
176
+ const pending = at < 0 ? [] : log.slice(at);
177
+ // Runs waiting on a package go first, once the package is complete.
178
+ for (const w of [...state.waiting]) {
179
+ const t = active.find((x) => x.id === w.trigger);
180
+ if (!t || ranOnce(t)) { state.waiting = state.waiting.filter((x) => x !== w); continue; }
181
+ if (!complete(dir, t.needs)) continue;
182
+ state.waiting = state.waiting.filter((x) => x !== w);
183
+ made.push(await runOne(dir, t, log.find((e) => e.hash === w.event), state, { waited_since: w.at }));
184
+ }
185
+ if (!pending.length) break;
186
+ for (const e of pending) {
187
+ for (const t of active) {
188
+ if (!matches(t, e) || e.agent?.id === `trigger-${t.id}` || ranOnce(t)) continue;
189
+ if (t.needs && !complete(dir, t.needs)) {
190
+ if (!state.waiting.some((w) => w.trigger === t.id)) state.waiting.push({ trigger: t.id, event: e.hash, at: now(), needs: t.needs });
191
+ continue;
192
+ }
193
+ made.push(await runOne(dir, t, e, state));
194
+ }
195
+ state.cursor = e.hash;
196
+ saveState(dir, state);
197
+ }
198
+ if (round === rounds - 1 && entries(dir).at(-1)?.hash !== state.cursor) {
199
+ const run = { n: state.runs.length + 1, trigger: "runner", from: "schema/triggers.mjs", at: now(), outcome: "failed", error: `triggers kept starting each other for ${rounds} rounds; the rest wait for the next event` };
200
+ const d = raise(dir, run); run.status = d ? "raised" : "unraised"; if (d) run.decision = d;
201
+ state.runs.push(run); made.push(run); saveState(dir, state);
202
+ }
203
+ }
204
+ return made;
205
+ } finally {
206
+ if (held === undefined) delete process.env.NAIVE_TRIGGERS_ACTIVE; else process.env.NAIVE_TRIGGERS_ACTIVE = held;
207
+ }
208
+ }
209
+
210
+ /** The triggers, the latest runs, what waits on a package, and the failures still open. */
211
+ export function report(dir) {
212
+ const { triggers, problems } = triggersOf(dir);
213
+ // Read only: a listing never moves an unreadable state file aside (the next run does, and raises it).
214
+ const s = (() => { try { return load(join(dir, STATE)); } catch { return { runs: [], waiting: [] }; } })();
215
+ return { triggers: triggers.map((t) => ({ id: t.id, from: t.from, on: t.on, run: t.run.propose ? { propose: t.run.propose.id } : { route: t.run.route, action: t.run.action }, needs: t.needs ?? null, needs_complete: t.needs ? complete(dir, t.needs) : null, enabled: t.enabled, once: !!t.once })),
216
+ problems, runs: s.runs.slice(-10), waiting: s.waiting, open: s.runs.filter((r) => r.status === "raised").map((r) => ({ run: r.n, trigger: r.trigger, error: r.error, decision: r.decision, decide: `mentura decide ${r.decision} --venture ${load(join(dir, "venture.json")).id} --by <your name> --answer "Retry" (or "Skip this event", "Turn the trigger off")` })) };
217
+ }
218
+
219
+ if (import.meta.url === `file://${process.argv[1]}`) {
220
+ const dir = process.argv[2];
221
+ if (!dir || !existsSync(join(dir, "venture.json"))) { console.error("usage: node schema/triggers.mjs <venture dir> [--fire] [--json]"); process.exit(2); }
222
+ const json = process.argv.includes("--json"), quiet = process.argv.includes("--quiet");
223
+ if (process.argv.includes("--fire")) {
224
+ const made = await fire(dir);
225
+ if (json) console.log(JSON.stringify(made, null, 2));
226
+ else if (!quiet) for (const r of made) console.log(`${(r.outcome ?? r.status).padEnd(9)} ${r.trigger}${r.entity ? ` on ${r.activity} of ${r.entity}` : ""}${r.error ? `: ${String(r.error).split("\n")[0]}` : ""}${r.decision && r.status === "raised" ? ` (raised as decision ${r.decision})` : ""}`);
227
+ process.exit(0);
228
+ }
229
+ const r = report(dir);
230
+ if (json) { console.log(JSON.stringify(r, null, 2)); process.exit(0); }
231
+ if (!r.triggers.length) console.log(`no triggers: add them to ${CONFIG} triggers, or list a kit in kits`);
232
+ for (const t of r.triggers) console.log(`trigger ${t.id} (${t.from})${t.enabled ? "" : " [off]"}: on ${JSON.stringify(t.on)} run ${JSON.stringify(t.run)}${t.needs ? `, needs ${t.needs} (${t.needs_complete ? "complete" : "not complete yet"})` : ""}`);
233
+ for (const p of r.problems) console.log(`problem ${p}`);
234
+ for (const x of r.runs) console.log(`run ${String(x.n).padEnd(5)} ${x.outcome.padEnd(9)} ${x.trigger}${x.entity ? ` on ${x.activity} of ${x.entity}` : ""}${x.status ? ` [${x.status}]` : ""}`);
235
+ for (const w of r.waiting) console.log(`waiting ${w.trigger}: needs the ${w.needs} package complete`);
236
+ for (const o of r.open) console.log(`failed ${o.trigger} (run ${o.run}): ${String(o.error).split("\n")[0]}\n ${o.decide}`);
237
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "upgrade-registry.schema.json",
4
+ "title": "Upgrade registry",
5
+ "description": "Naive's versions, the migrations between them, and each package's version and channel (schema/upgrades.json, EE-076). naive upgrade reads it from the installed copy. A migration rewrites a venture's records when the framework or one package changes, like a Next.js codemod; a version's guide is bundled in docs/upgrades/.",
6
+ "type": "object",
7
+ "required": ["framework", "versions", "migrations", "packages"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "framework": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$", "description": "The installed framework version" },
11
+ "note": { "type": "string" },
12
+ "channels": { "type": "object", "additionalProperties": { "type": "string" } },
13
+ "versions": {
14
+ "type": "array",
15
+ "minItems": 1,
16
+ "items": {
17
+ "type": "object",
18
+ "required": ["version", "date", "summary", "guide", "migrations"],
19
+ "additionalProperties": false,
20
+ "properties": {
21
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
22
+ "date": { "type": "string", "format": "date" },
23
+ "summary": { "type": "string" },
24
+ "guide": { "type": ["string", "null"], "description": "The upgrade guide for this version, a repository path, or null for the first version" },
25
+ "migrations": { "type": "array", "items": { "type": "string" }, "description": "Framework migrations that move a venture onto this version, in order" }
26
+ }
27
+ }
28
+ },
29
+ "migrations": {
30
+ "type": "array",
31
+ "items": {
32
+ "type": "object",
33
+ "required": ["id", "module", "package"],
34
+ "additionalProperties": false,
35
+ "properties": {
36
+ "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
37
+ "module": { "type": "string", "description": "A module exporting id, describe and apply(dir, ctx)" },
38
+ "package": { "type": ["string", "null"], "description": "The package whose schema changed, or null for a framework migration" },
39
+ "from": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$", "description": "A package migration: the oldest package version it upgrades" },
40
+ "to": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$", "description": "A package migration: the package version it upgrades to" },
41
+ "decision": { "type": "string" },
42
+ "aliases": { "type": "string", "description": "The route aliases file that keeps the old routes working" }
43
+ }
44
+ }
45
+ },
46
+ "packages": {
47
+ "type": "object",
48
+ "additionalProperties": {
49
+ "type": "object",
50
+ "required": ["version", "channel"],
51
+ "additionalProperties": false,
52
+ "properties": {
53
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
54
+ "channel": { "enum": ["stable", "experimental"] },
55
+ "note": { "type": "string" }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }