businesslens 0.7.2 → 0.9.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 (245) hide show
  1. package/CHANGELOG.md +433 -6
  2. package/README.md +65 -26
  3. package/dist/businesslensThemeLabVariants.d.ts +1 -22
  4. package/dist/businesslensThemeLabVariants.js +1 -63
  5. package/dist/cli.js +2488 -642
  6. package/dist/{logo-Bmv9IEAA.js → logo-ByUBSRUb.js} +1 -1
  7. package/dist/logo.js +1 -1
  8. package/dist/portable-DLmp7hXK.d.ts +2074 -0
  9. package/dist/portable-DmgFo37G.js +1657 -0
  10. package/dist/{report-digest-B5HEnjj6.js → report-digest-BtjFf-4A.js} +1 -1
  11. package/dist/report-digest.d.ts +1 -1
  12. package/dist/report-digest.js +2 -2
  13. package/dist/report.d.ts +8 -2
  14. package/dist/report.js +2 -2
  15. package/dist/viewer/200.html +1 -1
  16. package/dist/viewer/404.html +1 -1
  17. package/dist/viewer/_nuxt/BBXYWdOb.js +34 -0
  18. package/dist/viewer/_nuxt/{CXkZ3uUu.js → BEJDMCE-.js} +1 -1
  19. package/dist/viewer/_nuxt/{0agZip0Q.js → CJcIrhQV.js} +1 -1
  20. package/dist/viewer/_nuxt/Cg_HAYWl.js +37 -0
  21. package/dist/viewer/_nuxt/builds/latest.json +1 -1
  22. package/dist/viewer/_nuxt/builds/meta/dfaa63d9-42ea-4651-be04-5b083359905b.json +1 -0
  23. package/dist/viewer/_nuxt/entry.C6eP1tkN.css +1 -0
  24. package/dist/viewer/_nuxt/index.CKCUwjo1.css +1 -0
  25. package/dist/viewer/index.html +1 -1
  26. package/dist/viewer/site.webmanifest +4 -4
  27. package/docs/business-rules.md +328 -29
  28. package/docs/capabilities.md +289 -24
  29. package/docs/ci.md +10 -6
  30. package/docs/cli-contribute.md +11 -7
  31. package/docs/cli-export.md +8 -2
  32. package/docs/cli-install.md +12 -3
  33. package/docs/cli-lint.md +28 -7
  34. package/docs/cli-open.md +8 -6
  35. package/docs/cli-pull.md +27 -2
  36. package/docs/cli-update.md +1 -1
  37. package/docs/cli-view.md +1 -1
  38. package/docs/cli.md +2 -2
  39. package/docs/domains.md +63 -17
  40. package/docs/entities.md +395 -0
  41. package/docs/experiences.md +52 -23
  42. package/docs/from-a-blueprint.md +11 -7
  43. package/docs/from-an-idea.md +5 -3
  44. package/docs/from-your-repo.md +9 -4
  45. package/docs/index.md +6 -5
  46. package/docs/installation.md +10 -2
  47. package/docs/integration.md +2 -2
  48. package/docs/interfaces.md +55 -7
  49. package/docs/journeys.md +295 -43
  50. package/docs/product-model.md +240 -43
  51. package/docs/product.md +11 -4
  52. package/docs/references.md +95 -18
  53. package/docs/screens.md +86 -33
  54. package/docs/skill-businesslens-ideate.md +25 -4
  55. package/docs/skill-businesslens-map.md +21 -4
  56. package/docs/skill-businesslens-verify.md +8 -8
  57. package/docs/skills.md +1 -1
  58. package/docs/with-plan-mode.md +1 -1
  59. package/docs/with-sdd.md +9 -7
  60. package/layers/nuxt/report-viewer/README.md +78 -44
  61. package/layers/nuxt/report-viewer/app/assets/report-structure.css +3 -1
  62. package/layers/nuxt/report-viewer/app/assets/report-viewer.css +56 -0
  63. package/layers/nuxt/report-viewer/app/components/BlrActorType.vue +75 -0
  64. package/layers/nuxt/report-viewer/app/components/BlrConnections.vue +322 -0
  65. package/layers/nuxt/report-viewer/app/components/BlrContextPlace.vue +80 -0
  66. package/layers/nuxt/report-viewer/app/components/BlrContexts.vue +58 -0
  67. package/layers/nuxt/report-viewer/app/components/BlrEntityLifecycle.vue +197 -0
  68. package/layers/nuxt/report-viewer/app/components/BlrFlowCanvas.vue +345 -0
  69. package/layers/nuxt/report-viewer/app/components/BlrFlowGroup.vue +126 -0
  70. package/layers/nuxt/report-viewer/app/components/BlrFlowLabel.vue +47 -0
  71. package/layers/nuxt/report-viewer/app/components/BlrFlowNode.vue +217 -0
  72. package/layers/nuxt/report-viewer/app/components/BlrFlowRoutedEdge.vue +135 -0
  73. package/layers/nuxt/report-viewer/app/components/BlrFlowSelfEdge.vue +105 -0
  74. package/layers/nuxt/report-viewer/app/components/BlrFlowState.vue +112 -0
  75. package/layers/nuxt/report-viewer/app/components/BlrInterfaceType.vue +100 -0
  76. package/layers/nuxt/report-viewer/app/components/BlrKind.vue +78 -0
  77. package/layers/nuxt/report-viewer/app/components/BlrLinks.vue +56 -0
  78. package/layers/nuxt/report-viewer/app/components/BlrOverview.vue +361 -0
  79. package/layers/nuxt/report-viewer/app/components/BlrPageBlock.vue +93 -0
  80. package/layers/nuxt/report-viewer/app/components/BlrProductTopology.vue +368 -0
  81. package/layers/nuxt/report-viewer/app/components/BlrProse.vue +64 -0
  82. package/layers/nuxt/report-viewer/app/components/BlrRail.vue +131 -0
  83. package/layers/nuxt/report-viewer/app/components/BlrRefs.vue +150 -0
  84. package/layers/nuxt/report-viewer/app/components/BlrReportShell.vue +1403 -0
  85. package/layers/nuxt/report-viewer/app/components/BlrResourceBody.vue +1025 -0
  86. package/layers/nuxt/report-viewer/app/components/BlrResourceCard.vue +166 -0
  87. package/layers/nuxt/report-viewer/app/components/BlrResourcePage.vue +175 -0
  88. package/layers/nuxt/report-viewer/app/components/BlrScenarios.vue +183 -0
  89. package/layers/nuxt/report-viewer/app/components/BlrSearchPalette.vue +72 -0
  90. package/layers/nuxt/report-viewer/app/components/BlrStepContext.vue +24 -0
  91. package/layers/nuxt/report-viewer/app/components/BlrStepEntity.vue +117 -0
  92. package/layers/nuxt/report-viewer/app/components/BusinessLensReportViewer.vue +58 -255
  93. package/layers/nuxt/report-viewer/app/utils/entityLifecycle.ts +192 -0
  94. package/layers/nuxt/report-viewer/app/utils/flowGraph.ts +824 -0
  95. package/layers/nuxt/report-viewer/app/utils/pageSections.ts +115 -0
  96. package/layers/nuxt/report-viewer/app/utils/productTopologyFilters.ts +92 -0
  97. package/layers/nuxt/report-viewer/app/utils/productTopologyGraphs.ts +614 -0
  98. package/layers/nuxt/report-viewer/app/utils/productTopologyLayout.ts +124 -0
  99. package/layers/nuxt/report-viewer/app/utils/productTopologyViews.ts +175 -0
  100. package/layers/nuxt/report-viewer/app/utils/reportMarkdown.ts +139 -0
  101. package/layers/nuxt/report-viewer/app/utils/reportPalette.ts +79 -0
  102. package/layers/nuxt/report-viewer/app/utils/reportWorkspace.ts +1908 -0
  103. package/layers/nuxt/report-viewer/app/utils/resourceCards.ts +281 -0
  104. package/layers/nuxt/report-viewer/app/utils/resourceDocs.ts +32 -0
  105. package/layers/nuxt/report-viewer/app/utils/resourceFacets.ts +226 -0
  106. package/layers/nuxt/report-viewer/app/utils/resourceFacts.ts +141 -0
  107. package/layers/nuxt/report-viewer/app/utils/scenarioRouteWindow.ts +55 -0
  108. package/layers/nuxt/report-viewer/nuxt.config.ts +78 -2
  109. package/layers/nuxt/theme/README.md +43 -0
  110. package/layers/nuxt/theme/app/assets/theme.css +60 -2
  111. package/layers/nuxt/theme/app/components/BusinessLensBrand.vue +62 -0
  112. package/layers/nuxt/theme/app/composables/useBusinessLensThemeHead.ts +16 -0
  113. package/layers/nuxt/{theme-lab/public/brand/icons/marks/m4 → theme/public}/site.webmanifest +4 -4
  114. package/layers/nuxt/theme-lab/app/assets/theme-lab.css +20 -15
  115. package/layers/nuxt/theme-lab/app/components/BusinessLensThemeLabBar.vue +3 -4
  116. package/layers/nuxt/theme-lab/app/composables/useBusinessLensThemeLabHead.ts +1 -10
  117. package/layers/nuxt/theme-lab/app/utils/businesslensThemeLabVariants.ts +0 -63
  118. package/layers/nuxt/theme-lab/nuxt.config.ts +1 -4
  119. package/package.json +26 -8
  120. package/skills/businesslens-ideate/SKILL.md +69 -14
  121. package/skills/businesslens-ideate/references/format.md +398 -64
  122. package/skills/businesslens-ideate/references/planning-rubric.md +51 -23
  123. package/skills/businesslens-map/SKILL.md +135 -18
  124. package/skills/businesslens-map/references/format.md +398 -64
  125. package/skills/businesslens-map/references/mapping-rubric.md +121 -25
  126. package/skills/businesslens-verify/SKILL.md +53 -14
  127. package/skills/businesslens-verify/references/build-handoff.md +6 -4
  128. package/skills/businesslens-verify/references/format.md +399 -65
  129. package/skills/businesslens-verify/references/verification-rubric.md +12 -8
  130. package/dist/portable-BG1UM2eJ.js +0 -576
  131. package/dist/portable-D-39sG6M.d.ts +0 -1192
  132. package/dist/report-view-model.d.ts +0 -98
  133. package/dist/report-view-model.js +0 -80
  134. package/dist/viewer/_nuxt/C2YqwjgQ.js +0 -1
  135. package/dist/viewer/_nuxt/DBtS0ETw.js +0 -37
  136. package/dist/viewer/_nuxt/builds/meta/14019c81-af3a-4f33-ab5e-b0583ecd7aa9.json +0 -1
  137. package/dist/viewer/_nuxt/entry.DU06319b.css +0 -1
  138. package/dist/viewer/brand/icons/marks/m10/site.webmanifest +0 -32
  139. package/dist/viewer/brand/icons/marks/m4/apple-touch-icon.png +0 -0
  140. package/dist/viewer/brand/icons/marks/m4/favicon-32.png +0 -0
  141. package/dist/viewer/brand/icons/marks/m4/favicon.ico +0 -0
  142. package/dist/viewer/brand/icons/marks/m4/favicon.svg +0 -14
  143. package/dist/viewer/brand/icons/marks/m4/icon-192.png +0 -0
  144. package/dist/viewer/brand/icons/marks/m4/icon-512.png +0 -0
  145. package/dist/viewer/brand/icons/marks/m4/maskable-icon-512.png +0 -0
  146. package/dist/viewer/brand/icons/marks/m4/site.webmanifest +0 -32
  147. package/dist/viewer/brand/icons/marks/m7/apple-touch-icon.png +0 -0
  148. package/dist/viewer/brand/icons/marks/m7/favicon-32.png +0 -0
  149. package/dist/viewer/brand/icons/marks/m7/favicon.ico +0 -0
  150. package/dist/viewer/brand/icons/marks/m7/favicon.svg +0 -9
  151. package/dist/viewer/brand/icons/marks/m7/icon-192.png +0 -0
  152. package/dist/viewer/brand/icons/marks/m7/icon-512.png +0 -0
  153. package/dist/viewer/brand/icons/marks/m7/maskable-icon-512.png +0 -0
  154. package/dist/viewer/brand/icons/marks/m7/site.webmanifest +0 -32
  155. package/dist/viewer/brand/icons/marks/m8/apple-touch-icon.png +0 -0
  156. package/dist/viewer/brand/icons/marks/m8/favicon-32.png +0 -0
  157. package/dist/viewer/brand/icons/marks/m8/favicon.ico +0 -0
  158. package/dist/viewer/brand/icons/marks/m8/favicon.svg +0 -8
  159. package/dist/viewer/brand/icons/marks/m8/icon-192.png +0 -0
  160. package/dist/viewer/brand/icons/marks/m8/icon-512.png +0 -0
  161. package/dist/viewer/brand/icons/marks/m8/maskable-icon-512.png +0 -0
  162. package/dist/viewer/brand/icons/marks/m8/site.webmanifest +0 -32
  163. package/dist/viewer/brand/logo/variants/mark-4-dark.svg +0 -11
  164. package/dist/viewer/brand/logo/variants/mark-4.svg +0 -11
  165. package/dist/viewer/brand/logo/variants/mark-7-dark.svg +0 -6
  166. package/dist/viewer/brand/logo/variants/mark-7.svg +0 -6
  167. package/dist/viewer/brand/logo/variants/mark-8-dark.svg +0 -5
  168. package/dist/viewer/brand/logo/variants/mark-8.svg +0 -5
  169. package/dist/viewer/brand/logo/variants/wordmark-11-dark.svg +0 -173
  170. package/dist/viewer/brand/logo/variants/wordmark-11.svg +0 -173
  171. package/docs/actors.md +0 -71
  172. package/docs/scenarios.md +0 -86
  173. package/layers/nuxt/report-viewer/app/utils/report-view-model.ts +0 -12
  174. package/layers/nuxt/theme-lab/app/components/BusinessLensBrand.vue +0 -84
  175. package/layers/nuxt/theme-lab/app/components/BusinessLensThemeLabLogoRow.vue +0 -119
  176. package/layers/nuxt/theme-lab/app/composables/useBusinessLensLogoVariant.ts +0 -78
  177. package/layers/nuxt/theme-lab/app/utils/businesslensThemeLabMarks.d.mts +0 -11
  178. package/layers/nuxt/theme-lab/app/utils/businesslensThemeLabMarks.mjs +0 -29
  179. package/layers/nuxt/theme-lab/public/brand/icons/apple-touch-icon.png +0 -0
  180. package/layers/nuxt/theme-lab/public/brand/icons/favicon-32.png +0 -0
  181. package/layers/nuxt/theme-lab/public/brand/icons/favicon.svg +0 -7
  182. package/layers/nuxt/theme-lab/public/brand/icons/icon-192.png +0 -0
  183. package/layers/nuxt/theme-lab/public/brand/icons/icon-512.png +0 -0
  184. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/apple-touch-icon.png +0 -0
  185. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/favicon-32.png +0 -0
  186. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/favicon.ico +0 -0
  187. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/favicon.svg +0 -7
  188. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/icon-192.png +0 -0
  189. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/icon-512.png +0 -0
  190. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/maskable-icon-512.png +0 -0
  191. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/site.webmanifest +0 -32
  192. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/apple-touch-icon.png +0 -0
  193. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/favicon-32.png +0 -0
  194. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/favicon.ico +0 -0
  195. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/favicon.svg +0 -14
  196. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/icon-192.png +0 -0
  197. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/icon-512.png +0 -0
  198. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/maskable-icon-512.png +0 -0
  199. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/apple-touch-icon.png +0 -0
  200. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/favicon-32.png +0 -0
  201. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/favicon.ico +0 -0
  202. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/favicon.svg +0 -9
  203. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/icon-192.png +0 -0
  204. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/icon-512.png +0 -0
  205. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/maskable-icon-512.png +0 -0
  206. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/site.webmanifest +0 -32
  207. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/apple-touch-icon.png +0 -0
  208. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/favicon-32.png +0 -0
  209. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/favicon.ico +0 -0
  210. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/favicon.svg +0 -8
  211. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/icon-192.png +0 -0
  212. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/icon-512.png +0 -0
  213. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/maskable-icon-512.png +0 -0
  214. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/site.webmanifest +0 -32
  215. package/layers/nuxt/theme-lab/public/brand/icons/maskable-icon-512.png +0 -0
  216. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-4-dark.svg +0 -11
  217. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-4.svg +0 -11
  218. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-7-dark.svg +0 -6
  219. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-7.svg +0 -6
  220. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-8-dark.svg +0 -5
  221. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-8.svg +0 -5
  222. package/layers/nuxt/theme-lab/public/brand/logo/variants/wordmark-11-dark.svg +0 -173
  223. package/layers/nuxt/theme-lab/public/brand/logo/variants/wordmark-11.svg +0 -173
  224. package/layers/nuxt/theme-lab/public/favicon.ico +0 -0
  225. package/layers/nuxt/theme-lab/public/site.webmanifest +0 -32
  226. package/plans/shared-theme-lab.md +0 -136
  227. /package/dist/viewer/brand/logo/{variants/mark-10-dark.svg → mark-dark.svg} +0 -0
  228. /package/dist/viewer/brand/logo/{variants/mark-10.svg → mark.svg} +0 -0
  229. /package/dist/viewer/brand/logo/{variants/wordmark-3-dark.svg → wordmark-dark.svg} +0 -0
  230. /package/dist/viewer/brand/logo/{variants/wordmark-3.svg → wordmark.svg} +0 -0
  231. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/apple-touch-icon.png +0 -0
  232. /package/layers/nuxt/{theme-lab → theme}/public/brand/icons/businesslens-app-icon.svg +0 -0
  233. /package/layers/nuxt/{theme-lab → theme}/public/brand/icons/businesslens-maskable-icon.svg +0 -0
  234. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/favicon-32.png +0 -0
  235. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/favicon.ico +0 -0
  236. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/favicon.svg +0 -0
  237. /package/layers/nuxt/{theme-lab → theme}/public/brand/icons/icon-1024.png +0 -0
  238. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/icon-192.png +0 -0
  239. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/icon-512.png +0 -0
  240. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/maskable-icon-512.png +0 -0
  241. /package/layers/nuxt/{theme-lab/public/brand/logo/variants/mark-10-dark.svg → theme/public/brand/logo/mark-dark.svg} +0 -0
  242. /package/layers/nuxt/{theme-lab/public/brand/logo/variants/mark-10.svg → theme/public/brand/logo/mark.svg} +0 -0
  243. /package/layers/nuxt/{theme-lab/public/brand/logo/variants/wordmark-3-dark.svg → theme/public/brand/logo/wordmark-dark.svg} +0 -0
  244. /package/layers/nuxt/{theme-lab/public/brand/logo/variants/wordmark-3.svg → theme/public/brand/logo/wordmark.svg} +0 -0
  245. /package/layers/nuxt/{theme-lab/public/brand/icons → theme/public}/favicon.ico +0 -0
package/CHANGELOG.md CHANGED
@@ -5,7 +5,434 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [0.9.0] - 2026-09-04
9
+
10
+ ### Added
11
+
12
+ - **Entity — one resource type for every thing the Product keeps or reasons
13
+ about.** Identity, not storage, is the test. An Entity carries named facts,
14
+ optional states, and relations in product language; implementation types,
15
+ keys, indexes, join records, and regenerable representations stay out.
16
+ - **Entity relations state both ends.** `one-to-one`, `one-to-many`, and
17
+ `many-to-many` read from the declaring Entity to its target; the inverse is
18
+ derived so two files cannot disagree. Entity pages and the *What it keeps*
19
+ topology view render the product's own relationship graph.
20
+ - **Business Rules can express authorization.** An Entity target selects an
21
+ operation, facts, states, and optional Contexts. `permits` grants name
22
+ actors, a related Entity path, self, unattended work, or configuration, with
23
+ optional fact and state conditions. `lint` rejects Steps and Screens that no
24
+ applicable grant can permit, without claiming runtime authorization has been
25
+ proved.
26
+ - **A Scenario Step says what it does to the Product's things.** Every Step
27
+ carries `entities: []` or entries shaped as
28
+ `{ entity, as, effect, from, to }`, where `effect` is
29
+ `creates|changes|removes|reads`. Lifecycles and reverse edges are composed
30
+ from acceptance Steps rather than authored a second time.
31
+ - **Unattended Scenarios.** A first condition Step may state
32
+ `unattended: true` for schedules, expiry, retry, and other Product-owned
33
+ behavior with no Actor.
34
+ - `agent` joins the Interface types, and an Interface may own shared Screens
35
+ beside its Experiences. A shared Screen is inside every Experience of its
36
+ Interface: a Capability it exposes must be available in each, a Step on it is
37
+ inside a Capability's availability only when every Experience is, and that
38
+ Step counts as Scenario coverage for each.
39
+ - **A Domain states what its Boundary excludes**, in the authored folder and on
40
+ the wire.
41
+ - **The Product Report renders every Entity edge.** Entities have a rail entry,
42
+ collection, page, search results, facts, relations, composed lifecycle, and
43
+ topology presence. An Entity with States reads its lifecycle as a state
44
+ machine on its own tab, with each selecting Rule's grants in full. Scenario
45
+ Steps show what they create, change, remove, or read; Journey outcomes
46
+ summarize what they leave behind; Rules read their grants as sentences.
47
+ - **`spec/rejected.md`** — shapes designed far enough to be costed and then
48
+ chosen against, so the same argument is not had twice. It binds nothing and
49
+ takes rejections and deferrals only: never a plan, a status, or a file
50
+ reference. Entries are appended, so reopening a decision means a superseding
51
+ entry rather than an edit. It carries what a format or report change most
52
+ often re-proposes — tags and free-form metadata, a glossary resource type,
53
+ typed facts, `actors/` as its own collection, permission on a Capability
54
+ target, `transitions` on the Entity, the permission algebra's discarded
55
+ spellings, and Blueprint provenance.
56
+ - BusinessLens now keeps a reviewed Product Model of itself. The Content Feed
57
+ Reader Blueprint and golden Fixture Shop were expanded to exercise Entities,
58
+ relations, lifecycles, unattended behavior, and permission Rules.
59
+
60
+ ### Changed
61
+
62
+ - **Folder schema 8 and Product Report v13 are the only accepted contracts.**
63
+ Historical reports are refused rather than migrated. The report SDK exports
64
+ `ProductReportV13Schema`, `ProductReportV13`, the unversioned current
65
+ aliases, Entity/fact/relation types, Step effect types, and grant types.
66
+ - **A Capability no longer declares Entities and an Entity no longer declares
67
+ transitions.** Scenario Steps are the single source of truth for what happens
68
+ to the things the Product keeps.
69
+ - `## Information kept` is a list of uniquely named facts, so a Rule can govern
70
+ one fact exactly. `## Product states` is retired.
71
+ - Behavioral ids are verb-noun and reuse vocabulary the model already declares.
72
+ Entity, Domain, and Business Rule ids do not begin with a verb. The linter
73
+ derives these naming findings rather than asking an author to judge them.
74
+ - Whether an Interface needs Experiences, and whether it divides, is derived
75
+ rather than judged: audiences are disjoint when no available Capability
76
+ bridges them, with the counterpart exception for symmetric platform pairs.
77
+ Interface entry-point keys may name the Interface's type or another Interface
78
+ from which it is reached.
79
+ - A Business Rule governs at least two behaviors or an independent Context, and
80
+ a Domain states what its Boundary excludes. Both are now linted.
81
+ - **The installer decides ownership by its manifest alone.** A directory that
82
+ merely names a skill and mentions BusinessLens is somebody else's; retired
83
+ skills are removed only when the manifest recorded them; every harness is
84
+ checked before any is written, so a refusal leaves nothing changed. This is
85
+ visible on upgrade: an installation made before the marker existed carries no
86
+ proof it is ours, so `install` and `update` refuse it with *Refusing to
87
+ overwrite … Pass `--force`*. One `--force` re-adopts it, and every later run
88
+ is marked.
89
+ - `businesslens-map`, `businesslens-ideate`, and the authoring branches of
90
+ `businesslens-verify` settle undetermined boundary, granularity, naming, and
91
+ acceptance calls in rounds before writing. They attach the evidence they read
92
+ and surface remaining judgment calls explicitly; ideate's proposed delta ends
93
+ with a `Judgment calls` section, as map's already did.
94
+ - `businesslens-verify` re-derives findings from the current model and
95
+ repository, verifies Entity facts, states, relations, composed transitions,
96
+ Step effects, and Rule grants, and never persists a workflow ledger.
97
+ - The docs define each resource type on its owning page. Actor guidance moved
98
+ into Entities, Capability and Journey pages own their Scenario fields,
99
+ Business Rules owns permission semantics, and the catalog transport — the
100
+ report media type and its `version` parameter — is written where a catalog
101
+ operator reads it.
102
+ - The open page tab lives in the URL (`t`), so a Lifecycle or Scenarios tab
103
+ survives a refresh and can be linked.
104
+ - **The design record under `plans/` is retired; the constraints it carried
105
+ moved into the registers that govern them.** `AGENTS.md` gains *How format
106
+ decisions are judged* — the shipped agent as the standard a rule must meet,
107
+ the ranked quality axes, empirical double-authoring, descriptive and
108
+ generative use judged equally, and the pull-request diff as the binding human
109
+ surface. Its report viewer standards gain four rendering rules and the
110
+ four-row test for making a section render as more than prose.
111
+
112
+ ### Removed
113
+
114
+ - **`actors/` is no longer a collection, and Actor is no longer a resource
115
+ type.** A person or system that acts is an Entity with
116
+ `kind: person|system` and `acts: external|internal`. Actor remains a role.
117
+
118
+ ### Fixed
119
+
120
+ - **`blueprint pull` asks for the report version it can read, and refuses
121
+ another.** The Accept header is derived from the schema's major, and a
122
+ catalog answering with a different `version` parameter is refused before the
123
+ body is parsed. A report of another schema version, from a catalog or a file,
124
+ is refused in one sentence naming both versions instead of a Zod issue dump.
125
+ - **`blueprint open` and `pull` keep the author's coverage prose.** Only
126
+ `method` is rewritten, as the report contract says; the note that
127
+ implementation alignment has not been verified here now lives in `method`
128
+ with the other origin claim, and `limitations` and `rationale` come through
129
+ exactly as authored.
130
+ - **An Experience's `interfaceIds` is exactly the Interface its id names.**
131
+ Expansion files an Experience by its qualified id, so a list saying anything
132
+ else was a second encoding of containment — a report could validate under one
133
+ Interface and expand under another.
134
+ - The stable viewer keeps the current page and its filters through a recompile,
135
+ so `businesslens view` can stay open while the model is edited.
136
+ - The packed Nuxt Layer consumer, viewer documentation, and package manifest
137
+ stay aligned with the current report major; generated Layer `node_modules`
138
+ are excluded from the npm tarball; and `check-repo` pins both registers and
139
+ the CLI header to the report schema's major, so the version cannot go stale
140
+ in prose the way it once did in code.
141
+
142
+ ### Security
143
+
144
+ - **The installer follows no name it did not write.** The installation manifest
145
+ is read out of the target repository, which BusinessLens treats as untrusted,
146
+ and every name it records reaches a recursive remove. A `skills` entry that is
147
+ not a plain directory name now invalidates the marker, a recorded name this
148
+ Product could not have written is left alone, and every removal must resolve
149
+ to a direct child of the skills directory — so a crafted manifest can no
150
+ longer point `install` at a directory outside it.
151
+
152
+ ## [0.8.0] - 2026-08-25
153
+
154
+ ### Added
155
+
156
+ - **Co-located assets.** Files beside `<type>.md` are product assets owned by
157
+ the entity; anything under the reserved `implementation/` directory
158
+ describes this realization and stays home. Class comes from the path, which is
159
+ the only rule a tool writing a capture on CI can satisfy. An optional
160
+ `assets:` list titles and scopes those files without ever setting their class,
161
+ and unlisted files stay legal.
162
+ - An optional `state:` on a reference or asset, valid only on a Screen and
163
+ validated against its `## Product states`, so several captures of one view are
164
+ placed beside the state each depicts instead of arriving as a flat list.
165
+ - A `prd` Reference kind for attaching a product requirements document as
166
+ `intent` or `context` without making that external document the Product Model
167
+ authority.
168
+ - An optional ordered `screens:` list on an Interface or Experience declaring
169
+ reading order over its own children. Reachability stays with the tree.
170
+ - `businesslens view` serves repository files from a read-only, extension-
171
+ allowlisted mount, and the report viewer renders local `visual` references and
172
+ co-located assets as thumbnails instead of inert text.
173
+ - **Every entity has a page**, at its own URL, with the authored body at full
174
+ width — steps, inline routes, decision points, screen states, rule statements,
175
+ connections, and references are no longer confined to a drawer. Every page
176
+ has Overview; Capability and Journey pages alone add Scenarios.
177
+ - **A concrete Actor's marker draws what it is.** The Actor mark carries the
178
+ authored `kind` as its silhouette — a person or a system, at the size every
179
+ other kind's mark uses — and the Product-boundary `relationship` is written as
180
+ a word where each reading has room for it. A Scenario Step names its Actor
181
+ with that mark in a chip that opens the Actor, rather than as prose.
182
+ - The open section and the open entity page live in the URL, so a report has
183
+ deep links, a working browser back button, and a refresh that lands where it
184
+ left. `BusinessLensReportViewer` exposes both as bindable models.
185
+ - Each collection states the question it answers and the derivation behind its
186
+ reading order, in the vocabulary the named topology views already use.
187
+ - Every collection opens grouped by the containment the format declares for it,
188
+ and says so when an entity relates to more than one group.
189
+ - Counterpart Screens, Experiences and Interfaces cross-link from their pages:
190
+ the same thing on another Interface is named as such rather than appearing to
191
+ be a duplicate row.
192
+ - One entity's neighbourhood is drawn on the named Topology canvas, at a width
193
+ that can render it, when the reader chooses the page's Neighbourhood action.
194
+ - The stable BusinessLens Product Report: an entity-first browse, search,
195
+ scenario, journey, and named-topology experience over one complete report
196
+ projection. It renders every authored entity on its page while ranking
197
+ collection and Overview readings for repeated human use.
198
+ - A shared Vue Flow foundation in the report-viewer layer (`@vue-flow/core` with a
199
+ `@dagrejs/dagre` layered layout, both optional peer dependencies): one
200
+ entity box and one container box for nine visual categories (with both
201
+ Scenario types distinguished in content), a fixed relation-verb
202
+ vocabulary, a measured Interface → Experience → Screen containment map, a
203
+ sitemap of the same hierarchy drawn either as a top-down tree or radially
204
+ from the Product core, plus focused entity filtering on the named Topology
205
+ surface.
206
+
207
+ ### Changed
208
+
209
+ - **Context is now the single location concept.** Folder schema 6 replaces
210
+ scalar availability boundaries and Scenario Places with one strict
211
+ `{ place: ... }` Context shape across Capability availability, Scenario
212
+ Steps, and Business Rule selectors. A Context place resolves to an Interface,
213
+ Experience, or Screen; Screens derive their place from their path and declare
214
+ no availability of their own.
215
+ - Product Report v10 mirrors the same model with `{ placeId: ... }` Contexts,
216
+ removes the former availability and Place wire records, and is the only
217
+ accepted report version. The CLI, report SDK, Product Report, bundled skills,
218
+ fixtures, and Content Feed Reader Blueprint consume schema 6 and report v10
219
+ directly.
220
+ - Product Model terminology now names the Interface → Experience → Screen
221
+ hierarchy directly. The under-defined “surface” alias, including
222
+ `surface-parent`, surface-tree IDs, and the former Delivery surfaces view, has
223
+ been replaced by concrete entity names and `screen-parent`.
224
+ - Product Report entity readings present authored Capability Context once
225
+ instead of repeating it in the fact strip and under “Available in.” Derived
226
+ Journey and Scenario Contexts stay with their concrete routes, Screen
227
+ placement stays in identity, and Rule Context selectors stay with
228
+ applicability. Journey starting places retain the exact first route Context
229
+ and appear as “Starts at”; raw entry-point routes remain report data rather
230
+ than human-facing report content.
231
+ - Collection rows, relations, search results, and topology entities open their
232
+ URL-backed pages directly. References stay in Overview, Neighbourhood opens
233
+ Topology, and the inspector and slideover are removed. The private report
234
+ experiment layer remains under the final `report-viewer-lab` name with no
235
+ active report experiments; the background audition remains independent in
236
+ `theme-lab`.
237
+ - **Capability and Journey Scenarios share one route-and-Steps model.** Every
238
+ Scenario now owns named `routes` and one ordered, typed `steps` list. An Actor
239
+ Step names its responsible Actor, a Journey Step may name its Capability, and
240
+ a contextualized Step maps every route to its exact Interface, Experience, or
241
+ Screen. Route-neutral Steps remain first-class without a Context. The
242
+ separate Journey
243
+ `flow`, `operation`, stage ids, per-Step route objects, Scenario-wide Actors
244
+ and availability, authored Screen Scenario backlinks, and Markdown `## Steps`
245
+ are removed. Folder schema 3 and Product Report v7 are no longer accepted;
246
+ this release has no compatibility reader.
247
+ - Every Interface now declares one required interaction `type` (`web`,
248
+ `mobile-app`, `desktop-app`, `cli`, `api`, `webhook`, `messaging`, `voice`,
249
+ or `device`). Reports preserve it directly and use it to distinguish
250
+ Interface contexts visually instead of guessing from ids or route names.
251
+ - A Journey Step names a durable Capability, never a Capability Scenario, while
252
+ its text states the concrete observable action or condition. Capability
253
+ Scenarios may split and merge without leaving dangling Journey composition
254
+ references.
255
+ - **Journey pages have one Scenario reading.** The peer `Flows` tab and the
256
+ duplicate Journey-local diagram are removed because they projected the same
257
+ authored Steps while silently dropping Steps without a Capability. The named
258
+ topology view is now **Journey composition**: it explicitly answers the
259
+ narrower Capability-composition question. Outside visible Domain groupings,
260
+ Capability nodes use the consistent Capability color rather than inheriting
261
+ a Domain color that could be mistaken for status.
262
+ - **Capability and Journey Scenarios share one Steps treatment.** Both render
263
+ the same Step-by-route matrix. Columns use the authored route name and stable
264
+ order; placed cells show the exact typed Interface → Experience → Screen
265
+ hierarchy. Step-kind labels explain Actor actions, Product actions, and
266
+ conditions; Capability labels appear only where they discriminate Journey
267
+ Steps. Steps without a Context and Context transitions are described in
268
+ plain language, without exposing internal route ids.
269
+ - **The report navigation rail lists kinds, flat.** Kinds do not nest —
270
+ instances do — so both Scenario kinds leave the rail and are read on the page
271
+ for the Capability or Journey that owns them. The Capability and Journey main
272
+ screens open their collections directly, without a redundant parent/Scenario
273
+ tab strip. Ten destinations instead of twelve, and no indentation claiming a
274
+ hierarchy the other eight rows have too.
275
+ - **Collection chrome scales with the collection.** The per-relation filter
276
+ dropdowns collapse into one control with a chip per *active* filter, and it is
277
+ not rendered at all below eight entities — seven dropdowns above four Journeys
278
+ was a wall, not an offer. The card-style switcher is gone; the dense row is
279
+ the only layout, and it carries the fact that distinguishes an entity from its
280
+ neighbours (a Screen's scope, a Scenario's parent) where the repeated kind
281
+ label used to be.
282
+ - Entity tables render the name of a relation the format makes single-valued
283
+ rather than the count `1`, and drop any column constant across the rows on
284
+ screen.
285
+ - The bundled skills carry a worked Capability Scenario. The reference every
286
+ skill reads described `routes`, typed `steps`, and per-route Contexts in
287
+ prose but showed no Scenario file, leaving the model's most structured
288
+ artifact to be inferred. The example is single-route, because that is the
289
+ case where the `routes` requirement is least guessable.
290
+ - The bundled skills name the Product's portable identity keys — `summary`,
291
+ `category`, `authors`, and `license`. Report hosts read all four, and a model
292
+ authored without them reaches a Blueprint incomplete.
293
+ - `npm run check` asserts that every entity kind, frontmatter key, and required
294
+ section named in `spec/format.md` also appears in the canonical skill
295
+ reference. The reference may be terser than the contract; it may not omit a
296
+ name, because an agent cannot author a key it was never told about. It found
297
+ the three missing Product keys above on its first run.
298
+ - A README for the `businesslens/nuxt/theme` layer, which shipped as a public
299
+ export with no documentation of its palette roles, type scale,
300
+ `<BusinessLensBrand>` lockup, or icon-family composable.
301
+ - **Folder schema 5 — a breaking change with no compatibility reader.** An
302
+ entity is compact as `<id>.md` until it owns an asset or typed child
303
+ collection, then expands to `<id>/<type>.md`. Both shapes derive the same id
304
+ and cannot coexist. This keeps leaf-heavy collections readable while giving
305
+ every kind—Screens most of all—a co-located namespace when needed.
306
+ `product.md` similarly expands to `product/product.md` only when it owns
307
+ `logo.svg`. Two coexisting shapes, and an expanded folder missing its
308
+ `<type>.md`, are `lint` errors — neither is a state a correct model passes
309
+ through. An expanded folder that owns nothing *yet* is a warning instead: the
310
+ rule still holds, and expansion normalizes the folder back to the compact
311
+ form, but an author reaches the expanded shape in two steps and the
312
+ intermediate step is not a defect.
313
+ - **The Interface → Experience → Screen hierarchy nests.** An Experience
314
+ belongs to exactly one Interface and
315
+ a Screen to exactly one scope, so the path is the parent relation. An
316
+ Experience no longer writes `interfaces:`, a Capability Scenario no longer
317
+ writes `capability:`, a Journey Scenario no longer writes `journey:`, and a
318
+ Screen no longer writes `availability:`. Reparenting is a `git mv` that reads
319
+ correctly in a pull request.
320
+ - **Interface, Experience, and Screen ids are qualified** by the path that
321
+ distinguishes them. Experience and Screen names repeat across Interfaces on purpose: two entities of the same
322
+ kind sharing a path suffix below their Interface are counterparts — the same
323
+ thing on two Interfaces. Behavior-tree ids stay bare and globally unique.
324
+ - **Domain is a subject axis, not a capability folder.** It now requires a
325
+ `## Boundary` section, and only Capability authors `domain:` — a Screen's,
326
+ Experience's or Journey's Domains are derived through their Capabilities
327
+ rather than restated where a second copy could disagree.
328
+ - Product Report `schemaVersion` is `10.0.0`, and the catalog media type moves
329
+ to `version=10`. There is exactly one accepted report version, as before.
330
+ - Scenario documentation moves onto its parent's page. A Scenario is not a
331
+ top-level entity — it has a mandatory single parent that decides its kind —
332
+ so Capability Scenarios are documented in `docs/capabilities.md`, Journey
333
+ Scenarios in `docs/journeys.md`, and the containment rule that separates them
334
+ in `docs/product-model.md`. The standalone `docs/scenarios.md` is removed.
335
+ - An external system is an Actor only when it **initiates** interaction with
336
+ the Product, and only then does it arrive through an Interface.
337
+ Interfaces are inbound by definition; an outbound connection the Product
338
+ opens to a third party — a polled feed, a payment processor, a mail provider,
339
+ a model API — is not an Interface and its far side is not an Actor. Model the
340
+ call inside the Capability that makes it, scope that Capability to the
341
+ Interfaces where an Actor observes the result, and make its
342
+ product-significant failure behavior a Capability Scenario. Direction, not
343
+ ownership, is the axis: the same third party calling the Product back through
344
+ a webhook is a genuine Actor with a genuine Interface. No entity type, folder
345
+ schema, parser, or linter behavior changes — `lint` cannot recover direction
346
+ from the files, so the rule lives in `spec/format.md`, the Product Model
347
+ docs, and the mapping rubric.
348
+ - The Content Feed Reader Blueprint applies that rule. It drops the
349
+ `feed-provider` Actor and the `syndicated-feed-integration` Interface;
350
+ `feed-synchronization` now lives on the Reader-facing Interfaces where its
351
+ result is seen, carries the RSS specification as a context Reference, and is
352
+ triggered by a Reader-initiated refresh on the Source list Screen — a trigger
353
+ the model previously never stated. Its catch-up failure variation no longer
354
+ contradicts itself about whether the backlog was unchanged or caught up.
355
+ - **Breaking.** `businesslens/nuxt/report-viewer` accepts the canonical
356
+ `ProductReportV10` directly and owns the complete Product Report projection
357
+ and topology engine. The lossy `businesslens/report/view-model` export and
358
+ the former whole-report audition layer are removed. The private,
359
+ unpublished `report-viewer-lab` remains as an empty boundary for future
360
+ experiments, while `theme-lab` continues to own background auditions.
361
+ - **Breaking.** Logo, lockup, and favicon selection are no longer theme-lab
362
+ experiments. The approved mark, wordmark, brand renderer, favicon, and
363
+ install-icon family now live at canonical paths in `businesslens/nuxt/theme`;
364
+ `businesslens/theme-lab/variants` exposes background choices only.
365
+ - The Product Report keeps entity identity collision-safe across collections,
366
+ preserves focus across live recompiles, separates Capability and Journey
367
+ Scenario readings, shows Screen-to-Journey derivation provenance, renders
368
+ ordered Journey path lanes, and uses fixed named views instead of a generic
369
+ cross-kind grouping builder. Mobile navigation is a dedicated drawer.
370
+ - Product Report v10 stores authored supporting H2 sections as ordered
371
+ `{ heading, content }` records instead of an opaque Markdown string. Lint
372
+ rejects Journey and Scenario lead prose, duplicate or conflicting structured
373
+ sections, malformed structured lists, and duplicate values in set-valued
374
+ relations rather than allowing authored content to disappear or inflate
375
+ derived relationships.
376
+ - The Content Feed Reader catalog Blueprint now models two actor-facing access
377
+ boundaries: Reader work and Visitor consumption. Feed collection is an
378
+ outbound Capability dependency rather than a synthetic Actor or Interface.
379
+ The model has two Actors, two Interfaces, three Experiences, three Domains,
380
+ eight Screens, ten Capabilities, twenty-four Capability Scenarios, four
381
+ Journeys, eight Journey Scenarios, and four Business Rules. Domains group
382
+ Capabilities on one axis — Sources, Reading, Collections — so no Capability
383
+ needs its Domain's definition widened to admit it.
384
+ - Both teaching models now demonstrate a Journey that is attempted and not
385
+ reached. The Blueprint carries two `not-achieved` Journey Scenarios and the
386
+ golden fixture one, so `result` is an axis with real values rather than a
387
+ constant, and `failureOnlyCapabilityIds` is exercised against authored
388
+ content instead of always deriving empty.
389
+ - The Product Report treats Capability Scenarios and Journey Scenarios as
390
+ separate entity kinds rather than one kind carrying a type flag. They remain
391
+ contained by their Capability or Journey while preserving their own search
392
+ results, pages, terminal results, and derived backlinks.
393
+
394
+ ### Fixed
395
+
396
+ - The release artifact smoke test follows the promoted stable boundaries: it
397
+ requires the approved icon under `theme`, not an old `theme-lab` audition
398
+ path, and rejects the retired lossy Report View Model export instead of
399
+ requiring it. The stale assertions stopped the first `v0.8.0` publish
400
+ attempts before npm.
401
+ - `package.json` no longer lists `plans/shared-theme-lab.md` among its packaged
402
+ files. The file was deleted while the entry stayed, and npm drops a missing
403
+ `files` entry silently, so the packed tarball simply carried no `plans/` at
404
+ all and nothing reported it.
405
+ - The docs group allowlist no longer permits `Learn from examples`, which no
406
+ page has used since the feed-reader walkthrough was removed. An allowed group
407
+ with nothing behind it is a sidebar section the navigation cannot build.
408
+ - Two routes of one Scenario that repeat the same Context place sequence are
409
+ now a finding in both `lint` and report validation. A route id names one
410
+ traversal, so a second id over the same sequence claims a lane the Product
411
+ does not have. The Content Feed Reader Blueprint carried two:
412
+ `publish-on-mobile` and `unlist-from-mobile`, which never left the web
413
+ Interface, and could not have — neither Capability declares a mobile context.
414
+ - Entity pages no longer inherit the scroll offset of the collection or entity
415
+ that opened them, so each reading begins at its own title, identity, and lead.
416
+ - The local viewer resolves the Blueprint logo at `product/logo.svg`, where
417
+ schema 5 puts it once the Product expands.
418
+ - An unexpected entry in a collection is now an explicit finding. A file nested
419
+ one level too deep, or saved with the wrong extension, previously vanished
420
+ from the model with no finding at all.
421
+ - The local viewer's Content-Security-Policy sets `manifest-src`, which was
422
+ blocking `site.webmanifest`.
423
+ - The Product Report light and dark page surfaces are part of the shared theme
424
+ again. The warm base, top glow, and paper grain moved from the optional
425
+ theme-lab audition layer into `businesslens/nuxt/theme`, where the promoted
426
+ Product Report and the bundled local viewer inherit them without depending on a
427
+ lab layer.
428
+ - Journey composition no longer implies a Screen is reached from a Step that
429
+ cannot expose it. A Screen is authored against the whole Journey Scenario, so
430
+ it now attaches to the last Capability-bearing Step whose Capability declares that
431
+ Screen and shares an availability context with it — a non-visual integration
432
+ Step no longer appears to land on a Reader Screen.
433
+ - Journey composition lays ordered Capability-bearing Steps downward with variations side by side. A
434
+ left-to-right chain was wider than the canvas for a short Journey, so it
435
+ scaled the whole graph down and left the height unused.
9
436
 
10
437
  ## [0.7.2] - 2026-08-05
11
438
 
@@ -68,10 +495,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
68
495
  - `report only` verification mode, an explicit missing-builder handoff, and an
69
496
  unchanged-gap stopping rule. Verification findings are re-derived rather than
70
497
  persisted in a receipt or ledger.
71
- - Accepted decisions covering [repository-owned files](./adr/0004-write-nothing-outside-businesslens.md),
72
- [unified References](./adr/0008-unified-references-and-portable-reports.md),
73
- [non-persisted verification](./adr/0006-verification-is-not-persisted.md),
74
- and the [three-skill boundary](./adr/0007-three-skills-and-one-verification-loop.md).
498
+ - Accepted decisions covering repository-owned files, unified References,
499
+ non-persisted verification, and the three-skill boundary.
75
500
 
76
501
  ### Changed
77
502
 
@@ -271,7 +696,9 @@ Initial public launch of the repository.
271
696
  `docs/format.md`.
272
697
  - Claude plugin manifest and marketplace entry.
273
698
 
274
- [Unreleased]: https://github.com/businesslens/pdd/compare/v0.7.2...HEAD
699
+ [Unreleased]: https://github.com/businesslens/pdd/compare/v0.9.0...HEAD
700
+ [0.9.0]: https://github.com/businesslens/pdd/compare/v0.8.0...v0.9.0
701
+ [0.8.0]: https://github.com/businesslens/pdd/compare/v0.7.2...v0.8.0
275
702
  [0.7.2]: https://github.com/businesslens/pdd/compare/v0.7.1...v0.7.2
276
703
  [0.7.1]: https://github.com/businesslens/pdd/compare/v0.7.0...v0.7.1
277
704
  [0.7.0]: https://github.com/businesslens/pdd/compare/v0.6.0...v0.7.0
package/README.md CHANGED
@@ -6,7 +6,8 @@
6
6
 
7
7
  **Product-Driven Development for coding agents.** BusinessLens keeps intended
8
8
  product behavior in a Git-tracked `.businesslens/` Product Model: who the
9
- product serves, what they accomplish, and which rules must remain true.
9
+ product serves, what they accomplish, what it keeps and what changes it, and
10
+ which rules must remain true, including who may act.
10
11
 
11
12
  The model is Markdown, reviewable in pull requests, and useful without a hosted
12
13
  service. `businesslens lint` checks its structure. The `businesslens-verify`
@@ -16,19 +17,19 @@ resolution loop.
16
17
  ```text
17
18
  .businesslens/
18
19
  ├── README.md
19
- ├── product.md
20
- ├── actors/
21
- ├── interfaces/
22
- ├── experiences/
23
- ├── screens/ # optional product views
24
- ├── domains/ # optional organization
25
- ├── capabilities/
26
- ├── business-rules/
27
- ├── journeys/<id>/journey.md
28
- │ └── scenarios/<id>.md
20
+ ├── product.md # or product/product.md beside logo.svg
21
+ ├── entities/<id>.md # or <id>/entity.md with assets; the ones that act carry kind and acts
22
+ ├── interfaces/<id>.md # or <id>/interface.md with screens/ or experiences/
23
+ ├── domains/<id>.md # or <id>/domain.md with assets; optional collection
24
+ ├── capabilities/<id>.md # or <id>/capability.md with scenarios/ or assets
25
+ ├── journeys/<id>.md # or <id>/journey.md with scenarios/ or assets; optional
26
+ ├── business-rules/<id>.md # or <id>/business-rule.md with assets
29
27
  └── coverage.md
30
28
  ```
31
29
 
30
+ Leaf resources stay compact as `<id>.md`. A resource expands to
31
+ `<id>/<type>.md` only when it needs a namespace for assets or child resources.
32
+
32
33
  ## Getting started
33
34
 
34
35
  Install the skills:
@@ -93,25 +94,61 @@ Catalog contribution stays in the CLI; there is no contribution skill.
93
94
  ## Product Model semantics
94
95
 
95
96
  - `references` optionally attach intent, implementation, or context artifacts
96
- to any semantic entity. They are navigation and supporting material, not
97
+ to any semantic resource. They are navigation and supporting material, not
97
98
  proof or verification receipts.
98
99
  - `coverage.status` describes model breadth: `draft` while the model itself is
99
100
  under review, `partial` with known unmapped areas, and `complete` when the
100
- intended product scope is modeled.
101
+ intended product breadth is modeled.
101
102
  - A complete model may contain zero References.
102
103
  - A Product may expose several Interfaces—such as web, mobile, CLI, and a
103
104
  supported API—without being classified as one of those delivery forms.
104
- - Experiences are coherent usage contexts across Interfaces; exact
105
- Interface–Experience availability says where behavior is promised.
106
- - Domains are optional Capability groupings, and Journeys may cross them.
107
- - Screens are optional platform-neutral product views. Screenshots and other
108
- visuals remain external References, not model assets or proof.
105
+ - Experiences are optional coherent usage contexts, each belonging to exactly
106
+ one Interface. Availability is a list of strict Context objects whose
107
+ `place` is an undivided Interface or an Experience.
108
+ - Domains are optional regions of subject matter. Only a Capability authors
109
+ `domain:`; every other Domain relation is derived.
110
+ - Screens are optional platform-neutral product views, nested in the Interface
111
+ or Experience that contains them. Their path supplies their place. Product
112
+ assets sit beside the resource they describe; anything
113
+ under `implementation/` describes this realization and stays home.
109
114
  - `lint` checks format, required content, relationships, Reference grammar, and
110
115
  tracked code-reference paths. `verify` checks meaning against current code.
111
116
 
112
117
  Every model creation path writes `.businesslens/README.md`. BusinessLens never
113
118
  writes target `AGENTS.md`, `CLAUDE.md`, or root README files.
114
119
 
120
+ ## Where the Product Model is defined
121
+
122
+ Use these sources in this order:
123
+
124
+ 1. Read the [Product Model overview](./docs/product-model.md) for the mental
125
+ model and relationship overview.
126
+ 2. Use [`spec/format.md`](./spec/format.md) as the normative contract for the
127
+ authored `.businesslens/` files. It defines every resource type, file shape,
128
+ relation, and semantic boundary, and changes before parser or linter
129
+ behavior changes. Its companion [`spec/report.md`](./spec/report.md) is the
130
+ contract for the serialized Product Report, its portable projection, and
131
+ expansion.
132
+ 3. Use the individual resource type pages under [`docs/`](./docs/) for approachable
133
+ explanations, examples, and the relevant `lint` findings. They restate the
134
+ format contract and must not introduce a second definition.
135
+ 4. Follow [`src/core/model.ts`](./src/core/model.ts),
136
+ [`src/core/frontmatter.ts`](./src/core/frontmatter.ts),
137
+ [`src/core/markdown.ts`](./src/core/markdown.ts), and
138
+ [`src/commands/lint.ts`](./src/commands/lint.ts) to understand what the CLI
139
+ parses and enforces today.
140
+ 5. Use [`src/core/portable.ts`](./src/core/portable.ts) for the generated Product
141
+ Report JSON schema and relationship validation, and
142
+ [`src/commands/export.ts`](./src/commands/export.ts) for the authored-model to
143
+ report projection.
144
+
145
+ The installed skills carry self-contained format summaries and semantic
146
+ rubrics so agents can judge concepts that structural lint cannot prove—for
147
+ example, whether something is genuinely a durable Capability or a coherent
148
+ multi-Capability Journey. Those guides must remain consistent with
149
+ `spec/format.md`; they do not supersede it. Viewer backlinks and topology are
150
+ derived report projections, not additional authored relationships.
151
+
115
152
  ## Documentation
116
153
 
117
154
  - [Introduction](./docs/index.md) · [Installation](./docs/installation.md) ·
@@ -119,11 +156,11 @@ writes target `AGENTS.md`, `CLAUDE.md`, or root README files.
119
156
  - Start [from your repo](./docs/from-your-repo.md),
120
157
  [from a Blueprint](./docs/from-a-blueprint.md), or
121
158
  [from an idea](./docs/from-an-idea.md)
122
- - [Product Model](./docs/product-model.md) ·
123
- [References](./docs/references.md)
159
+ - [Product Model](./docs/product-model.md) · [References](./docs/references.md)
124
160
  - [Skills](./docs/skills.md) · [CLI](./docs/cli.md) ·
125
161
  [CI/CD](./docs/ci.md)
126
- - [Format contract](./spec/format.md)
162
+ - [Format contract](./spec/format.md) ·
163
+ [Report contract](./spec/report.md)
127
164
 
128
165
  ## Nuxt layers
129
166
 
@@ -131,12 +168,14 @@ The package also exposes separately composable Nuxt layers:
131
168
 
132
169
  - `businesslens/nuxt/report-viewer` renders a Product Report without owning its
133
170
  host navigation or page shell.
134
- - `businesslens/nuxt/theme` provides the stable BusinessLens palette, type, and
135
- semantic UI foundation.
171
+ - `businesslens/nuxt/theme` provides the stable BusinessLens palette, type,
172
+ semantic UI foundation, approved surfaces, logo/wordmark renderer, and
173
+ browser/install icon family.
136
174
  - `businesslens/nuxt/theme-lab` extends that stable theme with the shared,
137
- opt-in background and brand experiments used by the landing site and local
138
- report viewer. Its ownership and promotion rules are recorded in
139
- [`plans/shared-theme-lab.md`](./plans/shared-theme-lab.md).
175
+ opt-in background experiments used by the landing site and local report
176
+ viewer. A consumer that does not opt in receives the approved stable
177
+ presentation from `theme`; a background graduates by moving into `theme`,
178
+ never by a consumer depending on `theme-lab` in production.
140
179
 
141
180
  ## Safety
142
181
 
@@ -14,26 +14,5 @@ declare const BUSINESSLENS_DARK_BACKGROUNDS: BusinessLensBackgroundVariant[];
14
14
  declare const BUSINESSLENS_DEFAULT_LIGHT_BACKGROUND = "l4";
15
15
  declare const BUSINESSLENS_DEFAULT_DARK_BACKGROUND = "d1";
16
16
  declare function findBusinessLensBackground(list: BusinessLensBackgroundVariant[], id: string | null | undefined, fallback: string): BusinessLensBackgroundVariant;
17
- type BusinessLensLogoDisplay = 'mark' | 'lockup';
18
- interface BusinessLensLogoVariant {
19
- id: string;
20
- name: string;
21
- tagline: string;
22
- /** Basename under `/brand/logo/variants`, without the `-dark` suffix. */
23
- file: string;
24
- }
25
- interface BusinessLensLockupVariant extends BusinessLensLogoVariant {
26
- direction: 'row' | 'column';
27
- wordmarkHeight: number;
28
- symbolScale: number;
29
- gapRatio: number;
30
- }
31
- declare const BUSINESSLENS_MARK_VARIANTS: BusinessLensLogoVariant[];
32
- declare const BUSINESSLENS_LOCKUP_VARIANTS: BusinessLensLockupVariant[];
33
- declare const BUSINESSLENS_DEFAULT_MARK: string;
34
- declare const BUSINESSLENS_DEFAULT_LOCKUP = "k3";
35
- declare const BUSINESSLENS_DEFAULT_LOGO_DISPLAY: BusinessLensLogoDisplay;
36
- declare function businessLensLogoSrc(variant: BusinessLensLogoVariant, dark?: boolean): string;
37
- declare function findBusinessLensLogo<T extends BusinessLensLogoVariant>(list: T[], id: string | null | undefined, fallback: string): T;
38
17
  //#endregion
39
- export { BUSINESSLENS_DARK_BACKGROUNDS, BUSINESSLENS_DEFAULT_DARK_BACKGROUND, BUSINESSLENS_DEFAULT_LIGHT_BACKGROUND, BUSINESSLENS_DEFAULT_LOCKUP, BUSINESSLENS_DEFAULT_LOGO_DISPLAY, BUSINESSLENS_DEFAULT_MARK, BUSINESSLENS_LIGHT_BACKGROUNDS, BUSINESSLENS_LOCKUP_VARIANTS, BUSINESSLENS_MARK_VARIANTS, BusinessLensBackgroundVariant, BusinessLensLockupVariant, BusinessLensLogoDisplay, BusinessLensLogoVariant, businessLensLogoSrc, findBusinessLensBackground, findBusinessLensLogo };
18
+ export { BUSINESSLENS_DARK_BACKGROUNDS, BUSINESSLENS_DEFAULT_DARK_BACKGROUND, BUSINESSLENS_DEFAULT_LIGHT_BACKGROUND, BUSINESSLENS_LIGHT_BACKGROUNDS, BusinessLensBackgroundVariant, findBusinessLensBackground };