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