naive-framework 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/AGENTS.md +2 -1
  2. package/docs/decisions/decisions.json +42 -0
  3. package/docs/reference/ROUTES.md +36 -37
  4. package/evidence/skills/fidelity-ladder-audit/ladder-census.mjs +2 -1
  5. package/governance/layer.json +2 -1
  6. package/governance/venture-template/roles/venture-roles.json +62 -0
  7. package/interface/acting.mjs +83 -0
  8. package/interface/adapters/claude-code.json +16 -0
  9. package/interface/adapters/codex.json +14 -0
  10. package/interface/adapters/cursor.json +16 -0
  11. package/interface/adapters.mjs +183 -0
  12. package/interface/api/server.mjs +4 -2
  13. package/interface/boundaries.mjs +219 -0
  14. package/interface/brand.mjs +215 -0
  15. package/interface/cli/freshness.mjs +59 -0
  16. package/interface/cli/guard.mjs +6 -0
  17. package/interface/cli/mentura.mjs +82 -11
  18. package/interface/cli/naive.mjs +44 -14
  19. package/interface/context.mjs +525 -0
  20. package/interface/demo/board.mjs +9 -8
  21. package/interface/demo/decision-harness.mjs +4 -3
  22. package/interface/dev/setup.mjs +84 -0
  23. package/interface/gate-hooks.mjs +37 -0
  24. package/interface/harness/evals.mjs +10 -9
  25. package/interface/harness/run.mjs +16 -15
  26. package/interface/instrumentation.mjs +87 -0
  27. package/interface/kit-boundary.mjs +73 -0
  28. package/interface/layer.json +8 -2
  29. package/interface/mcp/server.mjs +47 -7
  30. package/interface/package-routes.mjs +197 -0
  31. package/interface/provenance.mjs +28 -4
  32. package/interface/reads.mjs +174 -0
  33. package/interface/release-card.mjs +43 -0
  34. package/interface/router.mjs +110 -36
  35. package/interface/skills/naive-setup/SKILL.md +71 -0
  36. package/interface/skills/naive-setup/artifact.html +83 -0
  37. package/interface/vitals.mjs +116 -0
  38. package/interface/writes.mjs +190 -0
  39. package/knowledge/connectors/catalog.mjs +3 -2
  40. package/knowledge/connectors/filesystem.mjs +10 -5
  41. package/knowledge/connectors/index.mjs +3 -2
  42. package/knowledge/freshness.json +85 -0
  43. package/knowledge/layer.json +11 -3
  44. package/knowledge/templates/glossary.md +23 -0
  45. package/operations/layer.json +10 -3
  46. package/operations/marketing/check-public.mjs +7 -6
  47. package/operations/marketing/site/plan.mjs +4 -3
  48. package/operations/marketing/site/presence.mjs +4 -3
  49. package/operations/templates/marketing-brand.md +46 -0
  50. package/operations/templates/public-assets.md +39 -0
  51. package/package.json +3 -1
  52. package/packages/catalog.json +8 -0
  53. package/packages/customers/package.json +21 -1
  54. package/packages/deals/package.json +27 -0
  55. package/packages/decisions/package.json +12 -1
  56. package/packages/finance/frames/fund-without-ceding-control.frame.json +177 -0
  57. package/packages/foundation/package.json +8 -1
  58. package/packages/fund/package.json +48 -0
  59. package/packages/marketing/package.json +10 -4
  60. package/packages/money/package.json +24 -3
  61. package/packages/validation/package.json +13 -0
  62. package/platform/README.md +6 -0
  63. package/platform/adapter.json +15 -0
  64. package/platform/integrations/remote-image.mjs +79 -0
  65. package/platform/integrations/rho.mjs +9 -7
  66. package/platform/kits/README.md +8 -1
  67. package/platform/kits/agent-upgrade/kit.json +15 -0
  68. package/platform/kits/agent-upgrade/run.mjs +82 -0
  69. package/platform/kits/agent-upgrade/stand-in-agent.mjs +32 -0
  70. package/platform/kits/validation-kickoff/kit.json +29 -0
  71. package/platform/webhooks/server.mjs +70 -0
  72. package/purpose/frameworks/idea-map/ideamap.mjs +4 -2
  73. package/purpose/frameworks/idea-map/route.mjs +5 -4
  74. package/purpose/frameworks/product-anatomy/anatomy.mjs +2 -1
  75. package/schema/README.md +1 -0
  76. package/schema/access.mjs +58 -0
  77. package/schema/adapter.schema.json +33 -0
  78. package/schema/add-department.mjs +3 -2
  79. package/schema/assess-problem.mjs +3 -2
  80. package/schema/assets.mjs +213 -0
  81. package/schema/brand.mjs +374 -0
  82. package/schema/build-release.mjs +61 -0
  83. package/schema/caching.mjs +506 -0
  84. package/schema/check-assets.mjs +24 -0
  85. package/schema/check-brand.mjs +24 -0
  86. package/schema/check-config.mjs +111 -0
  87. package/schema/check-data-model.mjs +2 -1
  88. package/schema/check-data-packages.mjs +5 -4
  89. package/schema/check-execution.mjs +4 -3
  90. package/schema/check-nextjs-status.mjs +3 -1
  91. package/schema/check-people.mjs +84 -0
  92. package/schema/check-private.mjs +2 -1
  93. package/schema/check-ready.mjs +6 -5
  94. package/schema/check-sources.mjs +11 -2
  95. package/schema/check-where-used.mjs +4 -3
  96. package/schema/data-model.json +334 -8
  97. package/schema/deal.schema.json +80 -0
  98. package/schema/decision-analytics.mjs +2 -1
  99. package/schema/decisions.mjs +21 -12
  100. package/schema/examples/frames/judge.mjs +10 -0
  101. package/schema/examples/venture-type/jev.mjs +12 -0
  102. package/schema/examples/workspace/ventures/acme-labs/AGENTS.md +17 -0
  103. package/schema/examples/workspace/ventures/acme-labs/accounts/.gitkeep +0 -0
  104. package/schema/examples/workspace/ventures/acme-labs/decisions/discovery-goal.decision.json +23 -0
  105. package/schema/examples/workspace/ventures/acme-labs/decisions/statement-icp.decision.json +22 -0
  106. package/schema/examples/workspace/ventures/acme-labs/decisions/statement-problem.decision.json +22 -0
  107. package/schema/examples/workspace/ventures/acme-labs/decisions/venture.team.decision.json +37 -0
  108. package/schema/examples/workspace/ventures/acme-labs/knowledge/README.md +3 -0
  109. package/schema/examples/workspace/ventures/acme-labs/knowledge/sources.json +46 -0
  110. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000001.json +12 -0
  111. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000002.json +12 -0
  112. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000003.json +12 -0
  113. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000004.json +12 -0
  114. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000005.json +12 -0
  115. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000006.json +12 -0
  116. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000007.json +12 -0
  117. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000008.json +12 -0
  118. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000009.json +12 -0
  119. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000010.json +12 -0
  120. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000011.json +12 -0
  121. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000012.json +12 -0
  122. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000013.json +12 -0
  123. package/schema/examples/workspace/ventures/acme-labs/money/30000000-0000-4000-8000-000000000014.json +12 -0
  124. package/schema/examples/workspace/ventures/acme-labs/money/_streams/transactions/stream.json +5 -0
  125. package/schema/examples/workspace/ventures/acme-labs/money/_summary.json +30 -0
  126. package/schema/examples/workspace/ventures/acme-labs/operations/departments/customer-service/README.md +5 -0
  127. package/schema/examples/workspace/ventures/acme-labs/operations/departments/customer-service/department.json +5 -0
  128. package/schema/examples/workspace/ventures/acme-labs/operations/departments/finance/README.md +5 -0
  129. package/schema/examples/workspace/ventures/acme-labs/operations/departments/finance/department.json +5 -0
  130. package/schema/examples/workspace/ventures/acme-labs/operations/departments/human-capital/README.md +5 -0
  131. package/schema/examples/workspace/ventures/acme-labs/operations/departments/human-capital/department.json +5 -0
  132. package/schema/examples/workspace/ventures/acme-labs/operations/departments/it/README.md +5 -0
  133. package/schema/examples/workspace/ventures/acme-labs/operations/departments/it/department.json +5 -0
  134. package/schema/examples/workspace/ventures/acme-labs/operations/departments/marketing-and-sales/README.md +5 -0
  135. package/schema/examples/workspace/ventures/acme-labs/operations/departments/marketing-and-sales/department.json +5 -0
  136. package/schema/examples/workspace/ventures/acme-labs/operations/departments/products/README.md +5 -0
  137. package/schema/examples/workspace/ventures/acme-labs/operations/departments/products/department.json +5 -0
  138. package/schema/examples/workspace/ventures/acme-labs/operations/departments/strategy/README.md +5 -0
  139. package/schema/examples/workspace/ventures/acme-labs/operations/departments/strategy/department.json +5 -0
  140. package/schema/examples/workspace/ventures/acme-labs/people/founders/maya-chen.json +15 -0
  141. package/schema/examples/workspace/ventures/acme-labs/people/people.json +22 -0
  142. package/schema/examples/workspace/ventures/acme-labs/pillars/brand.md +5 -0
  143. package/schema/examples/workspace/ventures/acme-labs/pillars/business.md +5 -0
  144. package/schema/examples/workspace/ventures/acme-labs/pillars/product.md +5 -0
  145. package/schema/examples/workspace/ventures/acme-labs/products/.gitkeep +0 -0
  146. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.core-product.decision.json +28 -0
  147. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.exists.decision.json +38 -0
  148. package/schema/examples/workspace/ventures/acme-labs/products/decisions/product.flagship.decision.json +27 -0
  149. package/schema/examples/workspace/ventures/acme-labs/profile.md +12 -0
  150. package/schema/examples/workspace/ventures/acme-labs/provenance.jsonl +12 -0
  151. package/schema/examples/workspace/ventures/acme-labs/raw/dump.md +6 -0
  152. package/schema/examples/workspace/ventures/acme-labs/venture.json +27 -0
  153. package/schema/examples/workspace/ventures/northstar/AGENTS.md +17 -0
  154. package/schema/examples/workspace/ventures/northstar/accounts/.gitkeep +0 -0
  155. package/schema/examples/workspace/ventures/northstar/deals/ductline.json +8 -0
  156. package/schema/examples/workspace/ventures/northstar/deals/kilnworks.json +14 -0
  157. package/schema/examples/workspace/ventures/northstar/decisions/venture.team.decision.json +31 -0
  158. package/schema/examples/workspace/ventures/northstar/evidence/README.md +3 -0
  159. package/schema/examples/workspace/ventures/northstar/fund/decisions/terms.decision.json +27 -0
  160. package/schema/examples/workspace/ventures/northstar/fund/decisions/terms.first-close.decision.json +27 -0
  161. package/schema/examples/workspace/ventures/northstar/fund/decisions/thesis.decision.json +26 -0
  162. package/schema/examples/workspace/ventures/northstar/fund/terms.json +22 -0
  163. package/schema/examples/workspace/ventures/northstar/fund/thesis.json +22 -0
  164. package/schema/examples/workspace/ventures/northstar/governance/README.md +3 -0
  165. package/schema/examples/workspace/ventures/northstar/governance/departments/external-relationships/charter.md +5 -0
  166. package/schema/examples/workspace/ventures/northstar/governance/departments/external-relationships/department.json +5 -0
  167. package/schema/examples/workspace/ventures/northstar/governance/departments/finance/charter.md +5 -0
  168. package/schema/examples/workspace/ventures/northstar/governance/departments/finance/department.json +5 -0
  169. package/schema/examples/workspace/ventures/northstar/governance/departments/human-capital/charter.md +5 -0
  170. package/schema/examples/workspace/ventures/northstar/governance/departments/human-capital/department.json +5 -0
  171. package/schema/examples/workspace/ventures/northstar/governance/departments/risk-and-compliance/charter.md +5 -0
  172. package/schema/examples/workspace/ventures/northstar/governance/departments/risk-and-compliance/department.json +5 -0
  173. package/schema/examples/workspace/ventures/northstar/governance/departments/strategy/charter.md +5 -0
  174. package/schema/examples/workspace/ventures/northstar/governance/departments/strategy/department.json +5 -0
  175. package/schema/examples/workspace/ventures/northstar/knowledge/README.md +3 -0
  176. package/schema/examples/workspace/ventures/northstar/operations/README.md +3 -0
  177. package/schema/examples/workspace/ventures/northstar/operations/departments/external-relationships/README.md +5 -0
  178. package/schema/examples/workspace/ventures/northstar/operations/departments/external-relationships/department.json +5 -0
  179. package/schema/examples/workspace/ventures/northstar/operations/departments/finance/README.md +5 -0
  180. package/schema/examples/workspace/ventures/northstar/operations/departments/finance/department.json +5 -0
  181. package/schema/examples/workspace/ventures/northstar/operations/departments/human-capital/README.md +5 -0
  182. package/schema/examples/workspace/ventures/northstar/operations/departments/human-capital/department.json +5 -0
  183. package/schema/examples/workspace/ventures/northstar/operations/departments/risk-and-compliance/README.md +5 -0
  184. package/schema/examples/workspace/ventures/northstar/operations/departments/risk-and-compliance/department.json +5 -0
  185. package/schema/examples/workspace/ventures/northstar/operations/departments/strategy/README.md +5 -0
  186. package/schema/examples/workspace/ventures/northstar/operations/departments/strategy/department.json +5 -0
  187. package/schema/examples/workspace/ventures/northstar/people/founders/ana-ruiz.json +13 -0
  188. package/schema/examples/workspace/ventures/northstar/people/founders/ben-okafor.json +7 -0
  189. package/schema/examples/workspace/ventures/northstar/people/people.json +27 -0
  190. package/schema/examples/workspace/ventures/northstar/pillars/brand.md +5 -0
  191. package/schema/examples/workspace/ventures/northstar/pillars/business.md +5 -0
  192. package/schema/examples/workspace/ventures/northstar/pillars/product.md +5 -0
  193. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/AGENTS.md +17 -0
  194. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/accounts/.gitkeep +0 -0
  195. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/decisions/venture.team.decision.json +31 -0
  196. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/knowledge/README.md +3 -0
  197. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/customer-service/README.md +5 -0
  198. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/customer-service/department.json +5 -0
  199. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/finance/README.md +5 -0
  200. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/finance/department.json +5 -0
  201. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/human-capital/README.md +5 -0
  202. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/human-capital/department.json +5 -0
  203. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/it/README.md +5 -0
  204. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/it/department.json +5 -0
  205. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/marketing-and-sales/README.md +5 -0
  206. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/marketing-and-sales/department.json +5 -0
  207. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/products/README.md +5 -0
  208. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/products/department.json +5 -0
  209. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/strategy/README.md +5 -0
  210. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/operations/departments/strategy/department.json +5 -0
  211. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/brand.md +5 -0
  212. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/business.md +5 -0
  213. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/pillars/product.md +5 -0
  214. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/.gitkeep +0 -0
  215. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.core-product.decision.json +28 -0
  216. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.exists.decision.json +32 -0
  217. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/products/decisions/product.flagship.decision.json +27 -0
  218. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/profile.md +5 -0
  219. package/schema/examples/workspace/ventures/northstar/portfolio/kilnworks/venture.json +27 -0
  220. package/schema/examples/workspace/ventures/northstar/products/.gitkeep +0 -0
  221. package/schema/examples/workspace/ventures/northstar/profile.md +5 -0
  222. package/schema/examples/workspace/ventures/northstar/provenance.jsonl +3 -0
  223. package/schema/examples/workspace/ventures/northstar/purpose/README.md +3 -0
  224. package/schema/examples/workspace/ventures/northstar/venture.json +49 -0
  225. package/schema/foundation.mjs +8 -7
  226. package/schema/founder.schema.json +72 -0
  227. package/schema/frame.schema.json +240 -0
  228. package/schema/frames.mjs +229 -0
  229. package/schema/freshness-log.schema.json +40 -0
  230. package/schema/freshness-profiles.schema.json +44 -0
  231. package/schema/freshness.mjs +474 -0
  232. package/schema/fund-terms.schema.json +107 -0
  233. package/schema/fund-thesis.schema.json +87 -0
  234. package/schema/gate-drafts.mjs +131 -0
  235. package/schema/gate.mjs +105 -11
  236. package/schema/glossary.schema.json +25 -0
  237. package/schema/init-venture.mjs +69 -21
  238. package/schema/judgment.schema.json +38 -0
  239. package/schema/kit.schema.json +47 -0
  240. package/schema/kits.mjs +24 -0
  241. package/schema/knowledge-sources.schema.json +145 -15
  242. package/schema/layer.json +16 -3
  243. package/schema/marketing-brand.schema.json +116 -0
  244. package/schema/migrate-venture.mjs +8 -7
  245. package/schema/migrations/kit-to-package.mjs +95 -0
  246. package/schema/migrations/package-layout.mjs +90 -0
  247. package/schema/model-steps.mjs +718 -0
  248. package/schema/money-summary.schema.json +138 -0
  249. package/schema/naive-config.mjs +166 -0
  250. package/schema/naive-config.schema.json +268 -0
  251. package/schema/need-now.json +171 -0
  252. package/schema/need-now.mjs +8 -6
  253. package/schema/packages.mjs +21 -15
  254. package/schema/payouts.mjs +3 -2
  255. package/schema/people.schema.json +85 -0
  256. package/schema/port-venture.mjs +206 -132
  257. package/schema/public-assets.schema.json +76 -0
  258. package/schema/release-read.mjs +112 -0
  259. package/schema/releases.mjs +498 -0
  260. package/schema/run-handoff.mjs +5 -4
  261. package/schema/setup.mjs +165 -0
  262. package/schema/stale.mjs +112 -0
  263. package/schema/start-release.mjs +41 -0
  264. package/schema/structure.mjs +187 -0
  265. package/schema/systems-catalog.json +126 -0
  266. package/schema/systems-catalog.schema.json +78 -0
  267. package/schema/time-to-ready.mjs +7 -6
  268. package/schema/trigger.schema.json +44 -0
  269. package/schema/triggers.mjs +238 -0
  270. package/schema/upgrade-registry.schema.json +60 -0
  271. package/schema/upgrade-venture.mjs +96 -118
  272. package/schema/upgrades.json +69 -0
  273. package/schema/upgrades.mjs +386 -0
  274. package/schema/validate.py +19 -10
  275. package/schema/venture-paths.mjs +85 -0
  276. package/schema/venture-role.schema.json +64 -0
  277. package/schema/venture-type.mjs +62 -0
  278. package/schema/venture-types.json +346 -0
  279. package/schema/venture-types.schema.json +129 -0
  280. package/schema/venture.schema.json +61 -0
  281. package/schema/workspace.schema.json +5 -1
@@ -19,6 +19,7 @@
19
19
  import { existsSync, readdirSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
20
20
  import { dirname, join } from "node:path";
21
21
  import { customerNeeds, factsOf, MATRIX, needs, typesOf, weights } from "./presence.mjs";
22
+ import { ventureFile } from "../../../schema/venture-paths.mjs";
22
23
 
23
24
  const load = (p) => JSON.parse(readFileSync(p, "utf8"));
24
25
  export const SITEMAP = "operations/marketing/sitemap.json";
@@ -33,10 +34,10 @@ const RECORD_FILE = { venture: "venture.json", icp: "purpose/icp.json", "validat
33
34
 
34
35
  /** The offerings: each product, what kind of offering it is, whom it is offered to and whom it serves through them. */
35
36
  export function offeringsOf(dir) {
36
- const icp = existsSync(join(dir, "purpose/icp.json")) ? load(join(dir, "purpose/icp.json")) : { profiles: [] };
37
+ const icp = existsSync(join(ventureFile(dir, "purpose/icp.json"))) ? load(join(ventureFile(dir, "purpose/icp.json"))) : { profiles: [] };
37
38
  const profiles = new Map(icp.profiles.map((p) => [p.id, p]));
38
39
  const primary = icp.profiles.find((p) => p.primary) ?? icp.profiles[0];
39
- const pdir = join(dir, "products");
40
+ const pdir = join(ventureFile(dir, "products"));
40
41
  const products = existsSync(pdir) ? readdirSync(pdir).filter((f) => f.endsWith(".json")).map((f) => load(join(pdir, f))).filter((p) => !["retired", "archived", "idea"].includes(p.status)) : [];
41
42
  return { profiles, products: products.map((p) => {
42
43
  // Who it is offered to: the product says so; otherwise the profiles others are reached through
@@ -104,7 +105,7 @@ if (import.meta.url === `file://${process.argv[1]}`) {
104
105
  if (!dir || !existsSync(join(dir, "venture.json"))) { console.error("usage: node plan.mjs <venture> [--raising] [--hiring] [--contributors] [--write] [--json]"); process.exit(2); }
105
106
  const has = (n) => process.argv.includes(`--${n}`);
106
107
  const r = plan(dir, { flags: Object.fromEntries(["raising", "hiring", "contributors"].filter(has).map((k) => [k, true])) });
107
- if (has("write")) { mkdirSync(join(dir, dirname(SITEMAP)), { recursive: true }); writeFileSync(join(dir, SITEMAP), JSON.stringify(r, null, 2) + "\n"); }
108
+ if (has("write")) { mkdirSync(join(dir, dirname(SITEMAP)), { recursive: true }); writeFileSync(ventureFile(dir, SITEMAP), JSON.stringify(r, null, 2) + "\n"); }
108
109
  if (has("json")) console.log(JSON.stringify(r, null, 2));
109
110
  else {
110
111
  console.log(`${r.name}: site planned for ${r.audience.offered_to.map((p) => p.id).join(", ") || "no ICP yet"} (${r.audience.types.map((t) => t.label).join(", ") || "customers in general"})${r.audience.partner_led ? "; partner-led" : ""}`);
@@ -22,6 +22,7 @@
22
22
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
23
23
  import { dirname, join } from "node:path";
24
24
  import { fileURLToPath } from "node:url";
25
+ import { ventureFile } from "../../../schema/venture-paths.mjs";
25
26
 
26
27
  const here = dirname(fileURLToPath(import.meta.url));
27
28
  const load = (p) => JSON.parse(readFileSync(p, "utf8"));
@@ -34,7 +35,7 @@ const r2 = (x) => Math.round(x * 100) / 100;
34
35
  /** The venture's facts: flags the founder gave, else what its ICP record says about who it courts. */
35
36
  export function factsOf(dir, flags = {}) {
36
37
  const f = { raising: false, hiring: false, contributors: false };
37
- const icpFile = dir && join(dir, "purpose/icp.json");
38
+ const icpFile = dir && join(ventureFile(dir, "purpose/icp.json"));
38
39
  if (icpFile && existsSync(icpFile)) {
39
40
  const said = JSON.stringify(load(icpFile)).toLowerCase();
40
41
  if (/investor|angel|\bvc\b/.test(said)) f.raising = true;
@@ -57,7 +58,7 @@ export function icpOf(dir, site) {
57
58
  const who = ok.filter((p) => /customer|solution|who|industr|use-case|about|for-/i.test(p.path));
58
59
  const says = [...new Set([home, ...who].filter(Boolean).flatMap((p) => (p.text ?? "").match(SAYS) ?? []).map((x) => x.trim()))].slice(0, 8);
59
60
  const opening = (home?.text ?? "").slice(0, 500);
60
- const icpFile = dir && join(dir, "purpose/icp.json");
61
+ const icpFile = dir && join(ventureFile(dir, "purpose/icp.json"));
61
62
  const stated = icpFile && existsSync(icpFile) ? (load(icpFile).profiles ?? []).map((p) => p.who ?? p.description ?? p.name).filter(Boolean) : null;
62
63
  return { text: [says.join(" | "), opening].filter(Boolean).join(" || "), source: says.length ? "site" : "inferred", says,
63
64
  cite: says.length ? `what the site says about who it is for (${says.length} phrase${says.length > 1 ? "s" : ""}), with the home page's opening` : "the home page's opening text (inferred: the site does not say outright who it is for)",
@@ -237,7 +238,7 @@ if (import.meta.url === `file://${process.argv[1]}`) {
237
238
  const answers = opt("answers") ? (load(opt("answers")).answers ?? load(opt("answers"))) : null;
238
239
  const facts = factsOf(dir, Object.fromEntries(["raising", "hiring", "contributors"].filter(has).map((k) => [k, true])));
239
240
  const r = score(site, { answers, facts, icp: icpOf(dir, site), venture: dir ? load(join(dir, "venture.json")).id : null });
240
- if (dir) { mkdirSync(join(dir, dirname(PRESENCE)), { recursive: true }); writeFileSync(join(dir, PRESENCE), JSON.stringify(r, null, 2) + "\n"); }
241
+ if (dir) { mkdirSync(join(dir, dirname(PRESENCE)), { recursive: true }); writeFileSync(ventureFile(dir, PRESENCE), JSON.stringify(r, null, 2) + "\n"); }
241
242
  console.log(JSON.stringify(r, null, 2));
242
243
  } else if (a && existsSync(join(a, "venture.json"))) {
243
244
  if (!existsSync(join(a, PRESENCE))) { console.error(`${PRESENCE} does not exist yet: read the site first (node interface/harness/site.mjs <url> --venture <dir>)`); process.exit(1); }
@@ -0,0 +1,46 @@
1
+ ---
2
+ type: template
3
+ tags: [everything-ecosystem, operations, marketing, brand, template]
4
+ ai-model: claude-opus-5.5
5
+ created: 2026-10-29T06:04:07Z
6
+ source: hybrid
7
+ ---
8
+
9
+ # Template: brand
10
+
11
+ Fills `<venture>/marketing/brand.json` (`schema/marketing-brand.schema.json`). The brand is the venture's global stylesheet: every agent's layout carries its voice and fonts, and `marketing/brand/tokens` renders it as design tokens and CSS for any interface. Check it with `mentura marketing/brand check`.
12
+
13
+ ```json
14
+ {
15
+ "version": "0.1.0",
16
+ "venture": "<venture id>",
17
+ "name": "<the name as the brand writes it>",
18
+ "colors": { "accent": "#1d4e89", "ink": "#111111", "paper": "#ffffff" },
19
+ "typefaces": [
20
+ { "id": "inter", "family": "Inter", "source": "self-hosted", "license": "OFL-1.1", "files": ["public/fonts/inter.woff2"], "fallback": ["system-ui", "sans-serif"] }
21
+ ],
22
+ "fonts": { "body": "inter", "heading": "inter" },
23
+ "voice": {
24
+ "tone": ["plain", "warm"],
25
+ "rules": [{ "id": "no-jargon", "avoid": ["synergy", "leverage"], "use": "work with", "why": "our customers do not talk like this" }]
26
+ },
27
+ "marks": [
28
+ { "kind": "logo", "asset": "public/logo.svg" },
29
+ { "kind": "icon", "asset": "public/icon.svg" },
30
+ { "kind": "apple-icon", "asset": "public/apple-icon.png" },
31
+ { "kind": "favicon", "asset": "public/favicon.ico" }
32
+ ],
33
+ "design_systems": [{ "id": "radix", "name": "Radix Colors", "url": "https://www.radix-ui.com/colors", "version": "3.0.0", "license": "MIT", "uses": ["the blue scale"] }],
34
+ "scopes": [{ "for": "investors", "colors": { "accent": "#000000" }, "voice": { "tone": ["direct"] } }]
35
+ }
36
+ ```
37
+
38
+ ## What each part means
39
+
40
+ - **Colors** are hex values by token name.
41
+ - **Typefaces** are defined once, each with its license. A self-hosted face names its files in `public/`, each registered in `public/assets.json` under the same license. A remote face fails the check: every reader's browser would call another host.
42
+ - **Fonts** assign a typeface to a role everywhere. A scope can assign a different one under a route prefix.
43
+ - **Voice** is the stylesheet for words: the tone, and phrases the venture never uses, with what to use instead.
44
+ - **Marks** are the logo and icons. An apple-icon is a 180x180 PNG, an icon is square, a favicon is an ICO.
45
+ - **Design systems** are linked, never copied in.
46
+ - **Scopes** override the brand for a route prefix. The nearer scope wins.
@@ -0,0 +1,39 @@
1
+ ---
2
+ type: template
3
+ tags: [everything-ecosystem, operations, marketing, assets, template]
4
+ ai-model: claude-opus-5.5
5
+ created: 2026-10-29T06:04:07Z
6
+ source: hybrid
7
+ ---
8
+
9
+ # Template: public assets
10
+
11
+ Fills `<venture>/public/assets.json` (`schema/public-assets.schema.json`), the register of what the venture ships as it is. Do not write it by hand: `mentura assets add` registers a file and code fills its facts; `mentura assets fill` refreshes them. Check it with `mentura public/assets check`.
12
+
13
+ ```json
14
+ {
15
+ "version": "0.1.0",
16
+ "remote_hosts": ["images.example.com"],
17
+ "assets": [
18
+ {
19
+ "path": "public/logo.svg",
20
+ "source": "Acme design",
21
+ "license": "owned",
22
+ "credit": "Acme",
23
+ "alt": { "text": "Acme wordmark", "by": "agent" },
24
+ "facts": { "type": "svg", "width": 200, "height": 60, "bytes": 812, "sha256": "<filled by code>" }
25
+ }
26
+ ],
27
+ "remote": [
28
+ { "id": "images-example-com-clinic", "url": "https://images.example.com/clinic.jpg", "license": "all-rights-reserved", "credit": "Ana Photo" }
29
+ ]
30
+ }
31
+ ```
32
+
33
+ ## The rules the check holds
34
+
35
+ - Every file in `public/` has an entry with a source, a license and a credit.
36
+ - Facts are read from the file by code. An entry whose facts differ from the file fails.
37
+ - An image needs alt text unless it is marked decorative. Alt text an agent wrote is pending until a person confirms it with `mentura assets confirm`.
38
+ - A remote image is a link with a note in `raw/sources/<id>/`. A full copy in `public/` needs a license that allows one.
39
+ - `remote_hosts` lists the hosts an agent may fetch from.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "naive-framework",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Naive, a venture development framework: conventions, routes, records, checks and an agent interface for building a venture.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -47,6 +47,8 @@
47
47
  "!**/*.pem",
48
48
  "!**/*.key",
49
49
  "!**/_private/",
50
+ "!**/_internal/",
51
+ "!platform/agents/",
50
52
  "!**/.DS_Store"
51
53
  ],
52
54
  "keywords": [
@@ -74,6 +74,14 @@
74
74
  "marketing-sitemap"
75
75
  ]
76
76
  },
77
+ "public-assets": {
78
+ "after": []
79
+ },
80
+ "marketing-brand": {
81
+ "after": [
82
+ "public-assets"
83
+ ]
84
+ },
77
85
  "site-presence": {
78
86
  "after": []
79
87
  },
@@ -16,6 +16,26 @@
16
16
  "templates": [],
17
17
  "checks": ["schema/check-data-packages.mjs"],
18
18
  "skill": null,
19
- "use_model": [],
19
+ "use_model": [
20
+ {
21
+ "step": "stage",
22
+ "kind": "choice",
23
+ "for_each": "customers",
24
+ "question": "Which buying stage do the notes {item.notes} put this customer at?",
25
+ "inputs": ["item.notes"],
26
+ "options": ["aware", "trying", "paying", "gone"],
27
+ "threshold": 0.7
28
+ },
29
+ {
30
+ "step": "summary",
31
+ "kind": "draft",
32
+ "for_each": "customers",
33
+ "after": ["stage"],
34
+ "question": "Write one plain sentence about this customer from the notes {item.notes} and the stage {steps.stage}, with the seat count written as {{seats}}.",
35
+ "inputs": ["item.notes"],
36
+ "computed": { "seats": { "item": "seats" } },
37
+ "keep": ["seats"]
38
+ }
39
+ ],
20
40
  "complete": false
21
41
  }
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "deals",
3
+ "title": "Deals",
4
+ "kind": "data",
5
+ "purpose": "A fund's pipeline: one [id].json per company, from sourced to invested or passed (EE-082). An investment becomes a nested venture under portfolio/. Never complete.",
6
+ "required": [],
7
+ "optional": [],
8
+ "refs": [
9
+ "fund-thesis"
10
+ ],
11
+ "gates": [
12
+ "coverage",
13
+ "freshness"
14
+ ],
15
+ "layer": "purpose",
16
+ "records": [
17
+ "deal"
18
+ ],
19
+ "schemas": [
20
+ "schema/deal.schema.json"
21
+ ],
22
+ "templates": [],
23
+ "checks": [],
24
+ "skill": null,
25
+ "use_model": [],
26
+ "complete": false
27
+ }
@@ -13,5 +13,16 @@
13
13
  "templates": [],
14
14
  "checks": [],
15
15
  "skill": null,
16
- "use_model": []
16
+ "use_model": [],
17
+ "use_cache": [
18
+ {
19
+ "route": "governance/decisions",
20
+ "level": "record",
21
+ "life": "minutes",
22
+ "vary": [
23
+ "hour",
24
+ "env:DECISIONS_NOW"
25
+ ]
26
+ }
27
+ ]
17
28
  }
@@ -0,0 +1,177 @@
1
+ {
2
+ "id": "fund-without-ceding-control",
3
+ "title": "Fund growth without ceding control",
4
+ "functions": [
5
+ "finance",
6
+ "governance"
7
+ ],
8
+ "triggers": [
9
+ "I need investors to scale but I don't want to give up control",
10
+ "I want to raise money without losing control of my company",
11
+ "I need funding but I don't want to give away equity",
12
+ "I don't want investors telling me what to do"
13
+ ],
14
+ "goal": "{goal}",
15
+ "premises": [
16
+ {
17
+ "id": "needs-outside-money",
18
+ "claim": "Reaching the venture's goal needs outside money now, beyond what revenue, customers or partners can fund within the current runway.",
19
+ "attack": "test-the-goal",
20
+ "reads": [
21
+ "goal",
22
+ "phase",
23
+ "revenue",
24
+ "runway"
25
+ ]
26
+ },
27
+ {
28
+ "id": "money-means-ownership",
29
+ "claim": "For this venture, taking outside money means selling ownership.",
30
+ "attack": "split-the-dimension",
31
+ "reads": [
32
+ "phase",
33
+ "revenue",
34
+ "jurisdiction"
35
+ ]
36
+ },
37
+ {
38
+ "id": "ownership-means-control",
39
+ "claim": "For this venture, giving up ownership means giving up control.",
40
+ "attack": "split-the-dimension",
41
+ "reads": [
42
+ "cap_table",
43
+ "control_rights"
44
+ ]
45
+ },
46
+ {
47
+ "id": "control-is-one-thing",
48
+ "claim": "The control the founder wants to keep is one thing, not several separate rights.",
49
+ "attack": "name-the-control",
50
+ "reads": [
51
+ "control_rights"
52
+ ]
53
+ }
54
+ ],
55
+ "attacks": [
56
+ "test-the-goal",
57
+ "split-the-dimension",
58
+ "name-the-control",
59
+ "false-dichotomy",
60
+ "sequence-not-choose"
61
+ ],
62
+ "dichotomy": "Take outside money and lose control, or keep control and grow more slowly.",
63
+ "reframe": "With the goal \"{goal}\", which ways of funding it keep the specific control rights the founder will not give up, in the {phase} phase?",
64
+ "composes": [
65
+ "which-control-matters",
66
+ "fund-growth-how"
67
+ ],
68
+ "props": [
69
+ "phase",
70
+ "goal",
71
+ "revenue",
72
+ "runway",
73
+ "cap_table",
74
+ "control_rights",
75
+ "jurisdiction"
76
+ ],
77
+ "freshness": {
78
+ "look_for": [
79
+ "funding structures that separate money from ownership",
80
+ "structures that separate ownership from votes, board seats or vetoes"
81
+ ],
82
+ "filter_by": [
83
+ "jurisdiction",
84
+ "phase",
85
+ "revenue"
86
+ ],
87
+ "max_age_days": 180,
88
+ "cite": true
89
+ },
90
+ "reasoning": [
91
+ "Restate the goal and the decisions hidden in the founder's sentence before proposing anything.",
92
+ "Test each premise as a yes/no proposition against the venture's facts; say unknown when the facts do not settle it.",
93
+ "Say whether the trade is false, a real trade-off, or a sequence.",
94
+ "Draw funding options only from a dated, cited lookup, never from memory.",
95
+ "Return decisions with open options. Do not pick one."
96
+ ],
97
+ "emits": [
98
+ {
99
+ "id": "which-control-matters",
100
+ "question": "Which control rights will the founder not give up?",
101
+ "options": [
102
+ "the product's direction",
103
+ "votes on major decisions",
104
+ "board seats",
105
+ "vetoes over a sale or new money",
106
+ "day-to-day authority to run the venture",
107
+ "the mission"
108
+ ],
109
+ "layer": "governance",
110
+ "needed_in": "discovery"
111
+ },
112
+ {
113
+ "id": "fund-growth-how",
114
+ "question": "Which way of funding the goal keeps the control rights the founder will not give up?",
115
+ "options_from": "lookup",
116
+ "layer": "governance",
117
+ "needed_in": "validation"
118
+ }
119
+ ],
120
+ "cases": [
121
+ {
122
+ "id": "solo-saas-pre-revenue",
123
+ "facts": {
124
+ "phase": "discovery",
125
+ "goal": "ten paying clinics by June",
126
+ "revenue": "none",
127
+ "runway": "4 months of the founder's savings",
128
+ "cap_table": "the founder owns 100%",
129
+ "control_rights": "the product's direction",
130
+ "jurisdiction": "Texas, USA"
131
+ },
132
+ "expect": {
133
+ "needs-outside-money": "unknown",
134
+ "money-means-ownership": "unknown",
135
+ "ownership-means-control": "no",
136
+ "control-is-one-thing": "yes",
137
+ "dichotomy": "sequence"
138
+ }
139
+ },
140
+ {
141
+ "id": "services-firm-profitable",
142
+ "facts": {
143
+ "phase": "beachhead",
144
+ "goal": "open a second office",
145
+ "revenue": "profitable, 30% margins",
146
+ "runway": "18 months from cash flow",
147
+ "cap_table": "two founders, 50/50",
148
+ "control_rights": "day-to-day authority and the timing of a sale",
149
+ "jurisdiction": "Ontario, Canada"
150
+ },
151
+ "expect": {
152
+ "needs-outside-money": "no",
153
+ "money-means-ownership": "unknown",
154
+ "ownership-means-control": "no",
155
+ "control-is-one-thing": "no",
156
+ "dichotomy": "false"
157
+ }
158
+ },
159
+ {
160
+ "id": "hardware-pre-revenue-board",
161
+ "facts": {
162
+ "phase": "validation",
163
+ "goal": "ship 500 units of a medical device through regulatory approval by 2028",
164
+ "revenue": "none",
165
+ "runway": "2 months",
166
+ "cap_table": "the founder owns 100%",
167
+ "control_rights": "a majority of the board and votes on every major decision",
168
+ "jurisdiction": "Delaware, USA"
169
+ },
170
+ "expect": {
171
+ "needs-outside-money": "yes",
172
+ "control-is-one-thing": "no",
173
+ "dichotomy": "trade-off"
174
+ }
175
+ }
176
+ ]
177
+ }
@@ -48,5 +48,12 @@
48
48
  "schema/foundation.mjs"
49
49
  ],
50
50
  "skill": null,
51
- "use_model": []
51
+ "use_model": [],
52
+ "use_cache": [
53
+ {
54
+ "route": "purpose/foundation",
55
+ "level": "record",
56
+ "life": "hours"
57
+ }
58
+ ]
52
59
  }
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "fund",
3
+ "title": "Fund",
4
+ "kind": "core",
5
+ "purpose": "A fund's foundation: the thesis it invests on and the terms it raises under (EE-082). The VC fund venture type starts with it; a startup never needs it.",
6
+ "department": "finance",
7
+ "layer": "purpose",
8
+ "records": [
9
+ "fund-thesis",
10
+ "fund-terms"
11
+ ],
12
+ "required": [
13
+ "fund-thesis",
14
+ "fund-terms"
15
+ ],
16
+ "optional": [],
17
+ "refs": [],
18
+ "planned": [],
19
+ "base": {
20
+ "discovery": 0.0,
21
+ "validation": 0.0,
22
+ "beachhead": 0.0,
23
+ "scale": 0.0,
24
+ "platform": 0.0
25
+ },
26
+ "when": [
27
+ {
28
+ "if": "type:vc-fund",
29
+ "at_least": 0.9
30
+ }
31
+ ],
32
+ "why": "Only a fund or firm raises on a thesis and terms",
33
+ "unlocks": [
34
+ "raising from limited partners",
35
+ "screening deals against the thesis"
36
+ ],
37
+ "gates": [
38
+ "a person has confirmed the thesis and the terms"
39
+ ],
40
+ "schemas": [
41
+ "schema/fund-thesis.schema.json",
42
+ "schema/fund-terms.schema.json"
43
+ ],
44
+ "templates": [],
45
+ "checks": [],
46
+ "skill": null,
47
+ "use_model": []
48
+ }
@@ -9,14 +9,15 @@
9
9
  ],
10
10
  "optional": [
11
11
  "marketing-content",
12
- "site-presence"
12
+ "site-presence",
13
+ "marketing-brand",
14
+ "public-assets"
13
15
  ],
14
16
  "refs": [
15
17
  "icp",
16
18
  "product"
17
19
  ],
18
20
  "planned": [
19
- "brand voice and guidelines",
20
21
  "campaigns",
21
22
  "sales pipeline"
22
23
  ],
@@ -48,10 +49,15 @@
48
49
  ],
49
50
  "schemas": [
50
51
  "schema/marketing-sitemap.schema.json",
51
- "schema/site-presence.schema.json"
52
+ "schema/site-presence.schema.json",
53
+ "schema/marketing-brand.schema.json",
54
+ "schema/public-assets.schema.json"
52
55
  ],
53
56
  "templates": [],
54
- "checks": [],
57
+ "checks": [
58
+ "schema/check-brand.mjs",
59
+ "schema/check-assets.mjs"
60
+ ],
55
61
  "skill": null,
56
62
  "use_model": []
57
63
  }
@@ -10,11 +10,32 @@
10
10
  "coverage",
11
11
  "freshness"
12
12
  ],
13
+ "gate_rules": [
14
+ {
15
+ "id": "money-to-finance",
16
+ "routes": [
17
+ "money/[id]"
18
+ ],
19
+ "actors": [
20
+ "agent"
21
+ ],
22
+ "then": "owner",
23
+ "note": "Money master data an agent writes goes to the finance function's owner before it is the record"
24
+ }
25
+ ],
13
26
  "layer": "purpose",
14
- "records": ["money-account"],
15
- "schemas": ["schema/data-master.schema.json"],
27
+ "records": [
28
+ "money-account",
29
+ "money-summary"
30
+ ],
31
+ "schemas": [
32
+ "schema/data-master.schema.json",
33
+ "schema/money-summary.schema.json"
34
+ ],
16
35
  "templates": [],
17
- "checks": ["schema/check-data-packages.mjs"],
36
+ "checks": [
37
+ "schema/check-data-packages.mjs"
38
+ ],
18
39
  "skill": null,
19
40
  "use_model": [],
20
41
  "complete": false
@@ -42,6 +42,9 @@
42
42
  "gates": [
43
43
  "a person has confirmed every required record and every record this package reads"
44
44
  ],
45
+ "gate_rules": [
46
+ { "id": "validation-low-confidence", "routes": ["validation/**", "foundation/problem", "people/team"], "actors": ["agent"], "when": { "confidence_below": "confidence" }, "then": "owner", "note": "A validation record an agent is not confident in goes to its function owner" }
47
+ ],
45
48
  "schemas": [
46
49
  "schema/validation-problem.schema.json",
47
50
  "schema/validation-solution.schema.json",
@@ -72,6 +75,16 @@
72
75
  "path": "purpose/kits/validation/skills/problem-validation/SKILL.md"
73
76
  },
74
77
  "use_model": [],
78
+ "use_cache": [
79
+ {
80
+ "route": "purpose/validation/assess",
81
+ "level": "record",
82
+ "life": "hours",
83
+ "vary": [
84
+ "day"
85
+ ]
86
+ }
87
+ ],
75
88
  "layer": "purpose",
76
89
  "records": [
77
90
  "validation-problem",
@@ -39,6 +39,12 @@ The framework can still load a platform connector by the module path in `knowled
39
39
  | `integrations/langsmith-docket.mjs` | The docket's evidence as a LangSmith experiment: the scenario states as a dataset, and one scored run of the docket and the judge (Jev) as an experiment over it (EE-075). Needs `LANGSMITH_API_KEY` |
40
40
  | `integrations/rho.mjs` | Rho, the founder's bank and spend suite, as the venture's money source: syncs `money/` (accounts, a sensitive append-only transactions stream, and a summary) over Rho's MCP server, calling only read-only tools (EE-070). Rho's sandbox by default; `--live` needs `RHO_API_TOKEN` |
41
41
  | `integrations/site.mjs` | Reads a venture's website: the home page and the pages it links to, as text, with where each sits (EE-062). Uses `FIRECRAWL_API_KEY` when set, a plain fetch otherwise |
42
+ | `adapter.json` | Mentura as Naive's first adapter, as Vercel is for Next.js: `mentura adapters verify mentura` runs the connector contract suite, the webhooks and the kits (Z-4) |
43
+ | `kits/agent-upgrade/` | The agent-run upgrade behind `naive upgrade --agent`: an agent does the guides' by-hand steps on a staged copy, and the framework's checks decide (U-3). `stand-in-agent.mjs` runs offline |
44
+ | `kits/validation-kickoff/` | An automation over the validation package: once the foundation is complete, it proposes the decision to start validating (M-12) |
45
+ | `kits/test.mjs` | Tests for the kits, with the stand-in agent |
46
+ | `webhooks/server.mjs` | Signed webhooks from systems of record: a change marks the summaries that read it stale (V-9). Secrets come from `NAIVE_WEBHOOK_SECRET_<SOURCE>` |
47
+ | `webhooks/test.mjs` | Tests for the webhooks, offline |
42
48
 
43
49
  ## Not yet moved
44
50
 
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "mentura",
3
+ "title": "Mentura",
4
+ "kind": "platform",
5
+ "reads": ["knowledge/sources.json", "naive.config.json"],
6
+ "files": [],
7
+ "skills": null,
8
+ "verify": [
9
+ "platform/connectors/eval.mjs",
10
+ "platform/webhooks/test.mjs",
11
+ "platform/kits/test.mjs"
12
+ ],
13
+ "sources": [],
14
+ "note": "Mentura is Naive's first adapter, as Vercel is for Next.js (Z-4): it runs the framework's record contract over vendor sources (GitHub), receives systems of record's change notifications (webhooks) and holds the kits. It is verified when it passes the framework's tests: the connector contract suite (knowledge/connectors/suite.mjs) and the router over a GitHub source, both run by platform/connectors/eval.mjs, and the platform's tests of the framework hooks it implements."
15
+ }