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,87 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "fund-thesis.schema.json",
4
+ "title": "Fund thesis",
5
+ "description": "What a fund invests in and why it wins (fund/thesis.json): rounds, sectors, geographies, check size, and the edge. The fund's strategic foundation, as the problem record is a startup's.",
6
+ "type": "object",
7
+ "required": [
8
+ "venture",
9
+ "statement",
10
+ "rounds",
11
+ "sectors",
12
+ "check_size"
13
+ ],
14
+ "additionalProperties": false,
15
+ "properties": {
16
+ "venture": {
17
+ "type": "string"
18
+ },
19
+ "statement": {
20
+ "type": "string",
21
+ "description": "The thesis in one or two sentences"
22
+ },
23
+ "rounds": {
24
+ "type": "array",
25
+ "minItems": 1,
26
+ "items": {
27
+ "enum": [
28
+ "pre-seed",
29
+ "seed",
30
+ "series-a",
31
+ "series-b",
32
+ "growth",
33
+ "late"
34
+ ]
35
+ }
36
+ },
37
+ "sectors": {
38
+ "type": "array",
39
+ "minItems": 1,
40
+ "items": {
41
+ "type": "string"
42
+ }
43
+ },
44
+ "geographies": {
45
+ "type": "array",
46
+ "items": {
47
+ "type": "string"
48
+ }
49
+ },
50
+ "check_size": {
51
+ "type": "object",
52
+ "required": [
53
+ "min",
54
+ "max",
55
+ "currency"
56
+ ],
57
+ "additionalProperties": false,
58
+ "properties": {
59
+ "min": {
60
+ "type": "number",
61
+ "minimum": 0
62
+ },
63
+ "max": {
64
+ "type": "number",
65
+ "minimum": 0
66
+ },
67
+ "currency": {
68
+ "type": "string",
69
+ "pattern": "^[A-Z]{3}$"
70
+ }
71
+ }
72
+ },
73
+ "ownership_target": {
74
+ "type": "number",
75
+ "minimum": 0,
76
+ "maximum": 1,
77
+ "description": "Target ownership at entry, as a fraction"
78
+ },
79
+ "edge": {
80
+ "type": "string",
81
+ "description": "Why this fund sees, wins or helps deals others do not"
82
+ },
83
+ "why_now": {
84
+ "type": "string"
85
+ }
86
+ }
87
+ }
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env node
2
+ // Held writes (X-2): where the gate's drafts wait and for whom. The gate (schema/gate.mjs) decides;
3
+ // this stores what it held. A held write lands in _drafts/ as before, with a sidecar
4
+ // (<draft>.gate) saying which rule held it and the function owner it was sent to. Where a rule (or
5
+ // gate.variants in naive.config.json) keeps variants, a second agent draft that differs from the
6
+ // first is kept beside it instead of replacing it, like an A/B rewrite: variant a is <draft>,
7
+ // variant b is <draft>.b, and so on. One open decision, in the decisions/ folder beside the record,
8
+ // asks the founder which to accept. Accepting one variant (mentura accept <route> --pick b) decides
9
+ // that decision and removes the others.
10
+ //
11
+ // node schema/gate-drafts.mjs <venture dir> [--owner <role>] [--json] the drafts waiting, by owner
12
+
13
+ import { createHash } from "node:crypto";
14
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
15
+ import { basename, dirname, join } from "node:path";
16
+ import { approve } from "./decisions.mjs";
17
+
18
+ const sha = (s) => createHash("sha256").update(s).digest("hex");
19
+ const LETTERS = "abcdefghijklmnopqrstuvwxyz";
20
+ export const sidecarOf = (draft) => `${draft}.gate`;
21
+ export const variantPath = (draft, v) => (v === "a" ? draft : `${draft}.${v}`);
22
+
23
+ /** The decision that holds a record's variants side by side: its id and venture-relative file. */
24
+ export function variantsDecision(file) {
25
+ const stem = file.replace(/\.json$/, "");
26
+ const id = `variants-${stem.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}`;
27
+ const at = dirname(file) === "." ? "decisions" : `${dirname(file)}/decisions`;
28
+ return { id, path: `${at}/${basename(stem)}.variants.decision.json` };
29
+ }
30
+
31
+ const readJson = (f) => JSON.parse(readFileSync(f, "utf8"));
32
+
33
+ /** The sidecar of a draft, or null. */
34
+ export function sidecar(dir, draft) {
35
+ const f = join(dir, sidecarOf(draft));
36
+ return existsSync(f) ? readJson(f) : null;
37
+ }
38
+
39
+ /**
40
+ * Stores a held write. dir: the venture; draft: _drafts/<file>.draft; file: the record's path; text:
41
+ * the record; verdict: the gate's, or null when only a decision class held it; route; agent: who wrote it.
42
+ * Returns { written, variant, variants, decision }.
43
+ */
44
+ export function writeHeld(dir, { draft, file, text, verdict, route, agent = {} }) {
45
+ const dest = join(dir, draft);
46
+ mkdirSync(dirname(dest), { recursive: true });
47
+ const at = new Date().toISOString();
48
+ const by = agent.id ?? agent.kind ?? "agent";
49
+ const meta = sidecar(dir, draft);
50
+ const keep = !!verdict?.variants && existsSync(dest);
51
+ if (!keep) {
52
+ writeFileSync(dest, text);
53
+ for (const v of meta?.variants ?? []) if (v.variant !== "a") rmSync(join(dir, variantPath(draft, v.variant)), { force: true });
54
+ if (verdict && verdict.then !== "pass") {
55
+ writeFileSync(join(dir, sidecarOf(draft)), JSON.stringify({ route, file, rule: verdict.rule, source: verdict.source, then: verdict.then,
56
+ ...(verdict.owner ? { owner: verdict.owner, function: verdict.function ?? null } : {}), variants: [{ variant: "a", file: draft, by, at, sha256: sha(text) }] }, null, 2) + "\n");
57
+ } else rmSync(join(dir, sidecarOf(draft)), { force: true });
58
+ return { written: draft, variant: "a" };
59
+ }
60
+ // Variants: the first draft stays as a; a draft equal to one already held is that variant.
61
+ const variants = meta?.variants?.length ? meta.variants : [{ variant: "a", file: draft, by: "agent", at, sha256: sha(readFileSync(dest)) }];
62
+ const same = variants.find((v) => v.sha256 === sha(text));
63
+ if (same) return { written: same.file, variant: same.variant, variants: variants.map((v) => v.variant), decision: meta?.decision ?? null };
64
+ const next = LETTERS[variants.length];
65
+ if (!next) throw new Error(`${route} already holds ${variants.length} drafts side by side; accept one first`);
66
+ const vfile = variantPath(draft, next);
67
+ writeFileSync(join(dir, vfile), text);
68
+ variants.push({ variant: next, file: vfile, by, at, sha256: sha(text) });
69
+ const dec = variantsDecision(file);
70
+ const record = {
71
+ id: dec.id,
72
+ question: `Which draft of ${route} do you accept?`,
73
+ decides: { path: file },
74
+ parent: "venture",
75
+ boundary: "fail-open",
76
+ status: "open",
77
+ options: variants.map((v) => `${v.variant}: drafted by ${v.by} at ${v.at}`),
78
+ answer: null,
79
+ note: `The gate kept ${variants.length} differing drafts side by side (rule ${verdict.rule}). Accept one: mentura accept ${route} --pick <letter>`,
80
+ provenance: { drafted_by: { kind: "framework" } },
81
+ };
82
+ mkdirSync(dirname(join(dir, dec.path)), { recursive: true });
83
+ writeFileSync(join(dir, dec.path), JSON.stringify(record, null, 2) + "\n");
84
+ writeFileSync(join(dir, sidecarOf(draft)), JSON.stringify({ ...(meta ?? { route, file, rule: verdict.rule, source: verdict.source, then: verdict.then, ...(verdict.owner ? { owner: verdict.owner, function: verdict.function ?? null } : {}) }), variants, decision: dec.id }, null, 2) + "\n");
85
+ return { written: vfile, variant: next, variants: variants.map((v) => v.variant), decision: dec.id };
86
+ }
87
+
88
+ /** The file of one variant of a draft, to accept. Throws when a draft holds variants and none, or an unknown one, is picked. */
89
+ export function pick(dir, draft, letter) {
90
+ const meta = sidecar(dir, draft);
91
+ const vs = meta?.variants ?? [];
92
+ if (vs.length > 1 && !letter) throw new Error(`${meta.route} holds ${vs.length} drafts side by side (${vs.map((v) => v.variant).join(", ")}): pick one with --pick <letter>`);
93
+ if (!letter || letter === "a") return draft;
94
+ const v = vs.find((x) => x.variant === letter);
95
+ if (!v) throw new Error(`no draft ${letter} of ${meta?.route ?? draft}${vs.length ? ` (there are ${vs.map((x) => x.variant).join(", ")})` : ""}`);
96
+ return v.file;
97
+ }
98
+
99
+ /** After a person accepts a draft: removes every variant and the sidecar, and decides the variants decision. */
100
+ export function settle(dir, draft, { picked = "a", by } = {}) {
101
+ const meta = sidecar(dir, draft);
102
+ for (const v of meta?.variants ?? []) rmSync(join(dir, v.file), { force: true });
103
+ rmSync(join(dir, draft), { force: true });
104
+ rmSync(join(dir, sidecarOf(draft)), { force: true });
105
+ if (!meta?.decision) return { picked };
106
+ const d = approve(dir, meta.decision, { by: by ?? process.env.MENTURA_PERSON ?? "founder", answer: picked, note: `accepted draft ${picked} of ${meta.route}` });
107
+ return { picked, decision: meta.decision, decided: d.ok, ...(d.ok ? {} : { error: d.error }) };
108
+ }
109
+
110
+ /** The drafts waiting in a venture: route, rule, owner and variants. A draft with no sidecar was held by its decision class. */
111
+ export function inbox(dir, owner) {
112
+ const d = join(dir, "_drafts");
113
+ if (!existsSync(d)) return [];
114
+ return readdirSync(d).filter((f) => f.endsWith(".draft")).sort().map((f) => {
115
+ const draft = `_drafts/${f}`;
116
+ const meta = sidecar(dir, draft);
117
+ return { draft, file: f.replace(/\.draft$/, "").replace(/__/g, "/"), route: meta?.route ?? null, rule: meta?.rule ?? null, then: meta?.then ?? "draft",
118
+ owner: meta?.owner ?? null, variants: (meta?.variants ?? [{ variant: "a" }]).map((v) => v.variant), decision: meta?.decision ?? null };
119
+ }).filter((x) => !owner || x.owner === owner);
120
+ }
121
+
122
+ if (import.meta.url === `file://${process.argv[1]}`) {
123
+ const [dir] = process.argv.slice(2).filter((a, i, all) => !a.startsWith("--") && !(i && all[i - 1] === "--owner"));
124
+ if (!dir || !existsSync(join(dir, "venture.json"))) { console.error("usage: node schema/gate-drafts.mjs <venture dir> [--owner <role>] [--json]"); process.exit(2); }
125
+ const i = process.argv.indexOf("--owner");
126
+ const rows = inbox(dir, i > 0 ? process.argv[i + 1] : undefined);
127
+ if (process.argv.includes("--json")) console.log(JSON.stringify(rows, null, 2));
128
+ else if (!rows.length) console.log("no drafts waiting");
129
+ else for (const r of rows) console.log(`${r.file.padEnd(36)} ${r.then.padEnd(6)} ${r.owner ?? "-"} ${r.rule ?? "decision class"} variants ${r.variants.join(", ")}`);
130
+ }
@@ -0,0 +1,133 @@
1
+ // The gate (EE-073, P-5, X-1 to X-6): what happens to a write before it lands. One gate per venture
2
+ // (X-5). Its rules come from three places: the venture's naive.config.json (fail_closed routes and
3
+ // rules), each package's gate_rules in its package definition (imported, unless the config leaves a
4
+ // package out), and two the framework always applies: pinned package versions (U-4) and the acting
5
+ // role's write access (P-27). A rule names the routes it covers in the router's own path patterns
6
+ // (X-6) and says what happens: hold the write as a draft, send it as a draft to the function owner
7
+ // (X-2), or refuse it.
8
+ //
9
+ // The gate is fast and never calls a model (X-4). Confidence routing reads a score the write already
10
+ // carries; a write without a score is never held for confidence. Access is checked here and again
11
+ // at the record by the router, on every read and write (F-5). The gate decides; storing a held
12
+ // write, and keeping differing drafts side by side, is schema/gate-drafts.mjs.
13
+
14
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { may } from "./access.mjs";
17
+ import { configFor, functionOf, packageDefs, packagesOf, pinsBlocking, threshold } from "./naive-config.mjs";
18
+
19
+ const repo = new URL("..", import.meta.url).pathname;
20
+
21
+ /** Package gates, imported from packages/<name>/package.json: the completion gates, as written. No model, no network. */
22
+ export function packageGates() {
23
+ const dir = join(repo, "packages");
24
+ if (!existsSync(dir)) return [];
25
+ return readdirSync(dir).flatMap((name) => {
26
+ const p = join(dir, name, "package.json");
27
+ if (!existsSync(p)) return [];
28
+ const pkg = JSON.parse(readFileSync(p, "utf8"));
29
+ return (pkg.gates ?? []).map((rule) => ({ package: pkg.name, rule }));
30
+ });
31
+ }
32
+
33
+ /**
34
+ * Whether an agent write is held as a draft by fail_closed alone. fail_closed names path prefixes
35
+ * (foundation, or foundation/problem). A person is not held. Kept for callers of the first gate.
36
+ */
37
+ export function hold(config, route, actor) {
38
+ if (actor === "person") return null;
39
+ const closed = config?.fail_closed ?? [];
40
+ const hit = closed.find((g) => route === g || route.startsWith(`${g}/`));
41
+ return hit ? { hold: "draft", rule: hit } : null;
42
+ }
43
+
44
+ /** The gate section of the venture's naive.config.json, with its defaults. */
45
+ export function configOf(dir) {
46
+ return configFor(dir).gate;
47
+ }
48
+
49
+ /**
50
+ * A route pattern as a regular expression, in the router's own path syntax (X-6): a plain route
51
+ * matches itself; an [id] (any [name]) segment or * is one segment; ** is any depth, and a trailing
52
+ * /** covers the route above it too (validation/** covers validation).
53
+ */
54
+ export function patternRe(pattern) {
55
+ const segs = pattern.split("/").filter(Boolean);
56
+ let re = "", sep = false;
57
+ segs.forEach((s, i) => {
58
+ if (s === "**") {
59
+ if (i === segs.length - 1) re += sep ? "(?:/.*)?" : ".*";
60
+ else { re += sep ? "(?:/[^/]+)*/" : "(?:[^/]+/)*"; sep = false; }
61
+ return;
62
+ }
63
+ re += (sep ? "/" : "") + (/^\[[a-z.]+\]$/.test(s) || s === "*" ? "[^/]+" : s.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/]*"));
64
+ sep = true;
65
+ });
66
+ return new RegExp(`^${re}$`);
67
+ }
68
+
69
+ /** Whether a rule's pattern covers a write: the concrete route (product/kettle) or its table route (product/[id]). */
70
+ export function matches(pattern, route, tableRoute) {
71
+ const re = patternRe(pattern);
72
+ return re.test(route) || (!!tableRoute && (pattern === tableRoute || re.test(tableRoute)));
73
+ }
74
+
75
+ /** Gate rules imported from the package definitions (X-5): each package's gate_rules, tagged with the package. */
76
+ export function packageRules(config) {
77
+ const sel = config?.gate?.packages ?? true;
78
+ if (sel === false) return [];
79
+ return packageDefs().filter((p) => sel === true || sel[p.name] !== false)
80
+ .flatMap((p) => (p.gate_rules ?? []).map((r) => ({ ...r, source: `package ${p.name}`, package: p.name })));
81
+ }
82
+
83
+ /** Every rule the venture's gate applies, in order: fail_closed, the config's rules, then the packages'. */
84
+ export function rulesFor(config) {
85
+ const g = config?.gate ?? {};
86
+ return [
87
+ ...(g.fail_closed ?? []).map((p) => ({ id: p, routes: [p, `${p}/**`], then: "draft", actors: ["agent"], source: "naive.config.json", fail_closed: true })),
88
+ ...(g.rules ?? []).map((r) => ({ ...r, source: "naive.config.json" })),
89
+ ...packageRules(config),
90
+ ];
91
+ }
92
+
93
+ const SEVERITY = { pass: 0, draft: 1, owner: 2, refuse: 3 };
94
+
95
+ /**
96
+ * The gate's verdict on one write. Input: config (resolved, from configFor), dir (for access),
97
+ * route (concrete), table (its route-table pattern), record (type), actor (person or agent), role
98
+ * (team-plan id), confidence (a score the write carries, or undefined), exists (the record exists
99
+ * now), decisionOwner (the owner of the record's decision class, if any).
100
+ * Returns { then: pass | draft | owner | refuse, rule, source, owner, variants, why, matched }.
101
+ */
102
+ export function evaluate({ config, dir, route, table, requested, record, actor = "agent", role, confidence, exists, decisionOwner }) {
103
+ const pins = pinsBlocking(config, record);
104
+ if (pins.length) return { then: "refuse", rule: "pinned-version", source: "naive.config.json packages", matched: ["pinned-version"],
105
+ why: pins.map((p) => `${p.package} is pinned to ${p.pinned} but ${p.installed ?? "nothing"} is installed`).join("; ") + ": change the pin or the install first" };
106
+ if (dir && role && ![route, table, requested].some((x) => x && may(dir, role, "write", x)))
107
+ return { then: "refuse", rule: "access", source: "team plan", matched: ["access"], why: `${role} may not write ${route} (team plan routes)` };
108
+ const hits = [];
109
+ for (const r of rulesFor(config)) {
110
+ if (!(r.actors ?? ["agent"]).includes(actor)) continue;
111
+ if (r.roles?.length && !r.roles.includes(role)) continue;
112
+ if (!r.routes.some((p) => matches(p, route, table))) continue;
113
+ const w = r.when ?? {};
114
+ if (w.exists !== undefined && w.exists !== !!exists) continue;
115
+ if (w.confidence_below !== undefined) {
116
+ const limit = typeof w.confidence_below === "number" ? w.confidence_below : threshold(config, w.confidence_below, threshold(config, "confidence", 0.7));
117
+ if (typeof confidence !== "number" || confidence >= limit) continue;
118
+ }
119
+ hits.push(r);
120
+ }
121
+ if (!hits.length) return { then: "pass", rule: null, source: null, matched: [] };
122
+ const top = hits.reduce((a, b) => (SEVERITY[b.then] > SEVERITY[a.then] ? b : a));
123
+ const fn = functionOf(record);
124
+ // The owner: the rule's, else naive.config.json owners by function or by package, else the record's decision-class owner, else the founder.
125
+ const keys = [fn, top.package, ...packagesOf(record).map((p) => p.name)].filter(Boolean);
126
+ const owner = top.then === "owner" ? top.owner ?? keys.map((k) => config?.owners?.[k]).find(Boolean) ?? decisionOwner ?? "founder" : undefined;
127
+ const variants = !!(top.variants ?? config?.gate?.variants);
128
+ const where = top.fail_closed ? `${top.id} fails closed in naive.config.json` : `rule ${top.id} (${top.source})`;
129
+ const why = top.then === "refuse" ? `${where} refuses this write${top.note ? `: ${top.note}` : ""}`
130
+ : top.then === "owner" ? `${where} sends this write to its function owner, ${owner}: written as a draft for them to accept`
131
+ : `${where}: written as a draft for a person to accept`;
132
+ return { then: top.then, rule: top.id, source: top.source, ...(owner ? { owner, function: fn } : {}), variants, why, matched: hits.map((h) => h.id) };
133
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "glossary.schema.json",
4
+ "title": "Package glossary",
5
+ "description": "A package's own terms, at glossary/<package>.json (Y-2, the scoping idea of CSS Modules): each term stays local to the package unless export is true, so an agent working in another package sees only exported terms. Two packages exporting one term with different meanings fail schema/check-brand.mjs. Version 0.x, unevaluated.",
6
+ "type": "object",
7
+ "required": ["package", "terms"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "package": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$", "description": "The package whose terms these are; the file is glossary/<package>.json" },
11
+ "terms": {
12
+ "type": "array",
13
+ "items": {
14
+ "type": "object",
15
+ "required": ["term", "meaning"],
16
+ "additionalProperties": false,
17
+ "properties": {
18
+ "term": { "type": "string", "minLength": 1 },
19
+ "meaning": { "type": "string", "minLength": 1 },
20
+ "export": { "type": "boolean", "description": "true: other packages see it too" }
21
+ }
22
+ }
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,239 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "handoff.schema.json",
4
+ "title": "Handoff",
5
+ "description": "One unit of delegated work, stored at <venture>/operations/handoffs/<id>.json (EE-017). It is the machine half of handoff contract v2 (operations/handoff-v2.md): who holds it, which decision rights it carries, how it is checked, and where it stands. The brief (outcome, work, context) is prose in a Markdown file beside it. schema/check-ready.mjs checks it is ready before work starts; schema/check-execution.mjs checks it against the venture's decision rights and evidence.",
6
+ "type": "object",
7
+ "required": [
8
+ "id",
9
+ "title",
10
+ "venture",
11
+ "role",
12
+ "brief",
13
+ "decision_classes",
14
+ "done_criteria",
15
+ "status",
16
+ "attempts",
17
+ "max_attempts",
18
+ "run_cap"
19
+ ],
20
+ "properties": {
21
+ "id": {
22
+ "type": "string",
23
+ "pattern": "^[a-z0-9-]+$"
24
+ },
25
+ "title": {
26
+ "type": "string"
27
+ },
28
+ "venture": {
29
+ "type": "string",
30
+ "description": "Venture id"
31
+ },
32
+ "products": {
33
+ "type": "array",
34
+ "items": {
35
+ "type": "string"
36
+ },
37
+ "description": "Product ids the work serves"
38
+ },
39
+ "governed_by": {
40
+ "type": "array",
41
+ "items": {
42
+ "type": "string"
43
+ },
44
+ "description": "Decision ids this executes (EE-NNN, G-NNN, D-NNN or an ADR path)"
45
+ },
46
+ "assignment": {
47
+ "type": "string",
48
+ "pattern": "^(A-[0-9]{3}|none)$",
49
+ "description": "Optional: the build-method assignment the work runs under, such as a MAD A-NNN, or none. MAD is a separate product, so Mentura records the reference and does not check it (EE-019, EE-038)"
50
+ },
51
+ "inputs": {
52
+ "type": "array",
53
+ "items": {
54
+ "type": "string"
55
+ },
56
+ "description": "Files the work needs before it can start, from the repo root; check-ready.mjs makes sure they exist"
57
+ },
58
+ "role": {
59
+ "type": "string",
60
+ "description": "Role id from the roles register that holds it (builder, architect and so on)"
61
+ },
62
+ "brief": {
63
+ "type": "string",
64
+ "description": "Path to the Markdown brief, relative to this file"
65
+ },
66
+ "decision_classes": {
67
+ "type": "array",
68
+ "minItems": 1,
69
+ "uniqueItems": true,
70
+ "items": {
71
+ "type": "string"
72
+ },
73
+ "description": "Decision-rights class ids the holder may use without reporting back. Anything outside them is escalated."
74
+ },
75
+ "done_criteria": {
76
+ "type": "array",
77
+ "minItems": 1,
78
+ "items": {
79
+ "type": "object",
80
+ "required": [
81
+ "id",
82
+ "kind",
83
+ "check"
84
+ ],
85
+ "properties": {
86
+ "id": {
87
+ "type": "string",
88
+ "pattern": "^[a-z0-9-]+$"
89
+ },
90
+ "kind": {
91
+ "enum": [
92
+ "conformance",
93
+ "self-proof",
94
+ "review"
95
+ ],
96
+ "description": "conformance: an objective check run as a command, with no model and no reviewer. self-proof: the change exercised for real, with evidence attached (EE-006). review: fit to intent, judged by the named role."
97
+ },
98
+ "check": {
99
+ "type": "string",
100
+ "description": "The command to run, or for review the question the reviewer answers"
101
+ },
102
+ "reviewer": {
103
+ "type": "string",
104
+ "description": "Role id, for review criteria"
105
+ }
106
+ },
107
+ "additionalProperties": false
108
+ }
109
+ },
110
+ "status": {
111
+ "enum": [
112
+ "draft",
113
+ "ready",
114
+ "in-progress",
115
+ "escalated",
116
+ "done"
117
+ ],
118
+ "description": "draft until schema/check-ready.mjs passes and is recorded; then ready, in-progress, escalated or done"
119
+ },
120
+ "ready_check": {
121
+ "type": "object",
122
+ "required": [
123
+ "at",
124
+ "by",
125
+ "version",
126
+ "items"
127
+ ],
128
+ "properties": {
129
+ "at": {
130
+ "type": "string",
131
+ "format": "date-time"
132
+ },
133
+ "by": {
134
+ "type": "string"
135
+ },
136
+ "version": {
137
+ "type": "string"
138
+ },
139
+ "items": {
140
+ "type": "integer"
141
+ }
142
+ },
143
+ "description": "Written by check-ready.mjs --record when every readiness item passed, before execution started"
144
+ },
145
+ "claimed_by": {
146
+ "type": "string",
147
+ "description": "Session or run id of the holder"
148
+ },
149
+ "session_id": {
150
+ "type": "string",
151
+ "description": "Session that wrote the handoff"
152
+ },
153
+ "parent_session_id": {
154
+ "type": "string",
155
+ "description": "Session that assigned it, for lineage"
156
+ },
157
+ "attempts": {
158
+ "type": "integer",
159
+ "minimum": 0
160
+ },
161
+ "max_attempts": {
162
+ "type": "integer",
163
+ "minimum": 1,
164
+ "default": 3
165
+ },
166
+ "run_cap": {
167
+ "type": "string",
168
+ "pattern": "^([0-9]+(m|h)|\\$[0-9]+)$",
169
+ "description": "Wall-clock or spend cap per run, such as 2h or $20"
170
+ },
171
+ "pr": {
172
+ "type": "string",
173
+ "description": "Pull request link once opened"
174
+ },
175
+ "evidence": {
176
+ "type": "array",
177
+ "items": {
178
+ "type": "string"
179
+ },
180
+ "description": "Paths to eval or check results (evidence.schema.json) that prove the done-criteria"
181
+ },
182
+ "escalations": {
183
+ "type": "array",
184
+ "items": {
185
+ "type": "object",
186
+ "required": [
187
+ "class",
188
+ "question",
189
+ "to"
190
+ ],
191
+ "properties": {
192
+ "class": {
193
+ "type": "string",
194
+ "description": "The decision-rights class, or attempts or run-cap"
195
+ },
196
+ "question": {
197
+ "type": "string"
198
+ },
199
+ "to": {
200
+ "type": "string",
201
+ "description": "Role id"
202
+ },
203
+ "blocks": {
204
+ "type": "string"
205
+ },
206
+ "continued": {
207
+ "type": "string"
208
+ },
209
+ "answer": {
210
+ "type": "string"
211
+ }
212
+ },
213
+ "additionalProperties": false
214
+ }
215
+ },
216
+ "lesson": {
217
+ "type": "string",
218
+ "description": "A failure that could recur, and the check one rung higher that would catch it (prose, skill, rule, static analysis, code)"
219
+ },
220
+ "publication": {
221
+ "type": "object",
222
+ "description": "Required when the handoff publishes (public-commitment in decision_classes or escalations): the channel and content rule in the venture's publication policy (EE-025)",
223
+ "required": [
224
+ "channel",
225
+ "content"
226
+ ],
227
+ "additionalProperties": false,
228
+ "properties": {
229
+ "channel": {
230
+ "type": "string"
231
+ },
232
+ "content": {
233
+ "type": "string"
234
+ }
235
+ }
236
+ }
237
+ },
238
+ "additionalProperties": false
239
+ }