@owlmeans/viable-common 0.0.25 → 0.0.26

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 (111) hide show
  1. package/README.md +3 -3
  2. package/agent-meta/manifest.json +2 -2
  3. package/agent-meta/skills/agent-presentation/SKILL.md +1 -1
  4. package/agent-meta/skills/viable-common/SKILL.md +109 -8
  5. package/build/blueprint/case.d.ts.map +1 -1
  6. package/build/blueprint/case.js +58 -16
  7. package/build/blueprint/case.js.map +1 -1
  8. package/build/blueprint/resolve.d.ts.map +1 -1
  9. package/build/blueprint/resolve.js +3 -0
  10. package/build/blueprint/resolve.js.map +1 -1
  11. package/build/blueprint/types.d.ts +44 -2
  12. package/build/blueprint/types.d.ts.map +1 -1
  13. package/build/blueprint/types.js +35 -1
  14. package/build/blueprint/types.js.map +1 -1
  15. package/build/branding.d.ts +5 -1
  16. package/build/branding.d.ts.map +1 -1
  17. package/build/branding.js +6 -0
  18. package/build/branding.js.map +1 -1
  19. package/build/connect/consts.d.ts +21 -0
  20. package/build/connect/consts.d.ts.map +1 -1
  21. package/build/connect/consts.js +21 -0
  22. package/build/connect/consts.js.map +1 -1
  23. package/build/connect/entrypoints.d.ts +15 -1
  24. package/build/connect/entrypoints.d.ts.map +1 -1
  25. package/build/connect/entrypoints.js +16 -1
  26. package/build/connect/entrypoints.js.map +1 -1
  27. package/build/connect/references.d.ts +14 -1
  28. package/build/connect/references.d.ts.map +1 -1
  29. package/build/connect/references.js +4 -0
  30. package/build/connect/references.js.map +1 -1
  31. package/build/connect/schemas.d.ts +12 -1
  32. package/build/connect/schemas.d.ts.map +1 -1
  33. package/build/connect/schemas.js +27 -1
  34. package/build/connect/schemas.js.map +1 -1
  35. package/build/connect/types.d.ts +27 -0
  36. package/build/connect/types.d.ts.map +1 -1
  37. package/build/consts.d.ts +1 -1
  38. package/build/consts.d.ts.map +1 -1
  39. package/build/consts.js +3 -0
  40. package/build/consts.js.map +1 -1
  41. package/build/metadata/types.d.ts +8 -0
  42. package/build/metadata/types.d.ts.map +1 -1
  43. package/build/metadata/types.js.map +1 -1
  44. package/build/planning/helpers.d.ts +2 -1
  45. package/build/planning/helpers.d.ts.map +1 -1
  46. package/build/planning/helpers.js +5 -2
  47. package/build/planning/helpers.js.map +1 -1
  48. package/build/planning/index.d.ts +1 -0
  49. package/build/planning/index.d.ts.map +1 -1
  50. package/build/planning/index.js +1 -0
  51. package/build/planning/index.js.map +1 -1
  52. package/build/planning/landing.d.ts +25 -0
  53. package/build/planning/landing.d.ts.map +1 -0
  54. package/build/planning/landing.js +38 -0
  55. package/build/planning/landing.js.map +1 -0
  56. package/build/planning/schemas.d.ts.map +1 -1
  57. package/build/planning/schemas.js +13 -0
  58. package/build/planning/schemas.js.map +1 -1
  59. package/build/planning/types.d.ts +28 -3
  60. package/build/planning/types.d.ts.map +1 -1
  61. package/build/scaffold/consts.d.ts +8 -0
  62. package/build/scaffold/consts.d.ts.map +1 -1
  63. package/build/scaffold/consts.js +7 -0
  64. package/build/scaffold/consts.js.map +1 -1
  65. package/build/scaffold/schemas.d.ts.map +1 -1
  66. package/build/scaffold/schemas.js +257 -12
  67. package/build/scaffold/schemas.js.map +1 -1
  68. package/build/scaffold/types.d.ts +119 -4
  69. package/build/scaffold/types.d.ts.map +1 -1
  70. package/build/skills/catalogue.d.ts.map +1 -1
  71. package/build/skills/catalogue.js +128 -24
  72. package/build/skills/catalogue.js.map +1 -1
  73. package/build/skills/consts.d.ts +5 -0
  74. package/build/skills/consts.d.ts.map +1 -1
  75. package/build/skills/consts.js +8 -0
  76. package/build/skills/consts.js.map +1 -1
  77. package/build/skills/roles.d.ts.map +1 -1
  78. package/build/skills/roles.js +11 -5
  79. package/build/skills/roles.js.map +1 -1
  80. package/build/types.d.ts +30 -0
  81. package/build/types.d.ts.map +1 -1
  82. package/package.json +8 -8
  83. package/src/blueprint/case.ts +64 -16
  84. package/src/blueprint/resolve.ts +3 -0
  85. package/src/blueprint/types.ts +57 -1
  86. package/src/branding.ts +6 -0
  87. package/src/connect/consts.ts +22 -0
  88. package/src/connect/entrypoints.ts +26 -4
  89. package/src/connect/references.ts +16 -3
  90. package/src/connect/schemas.ts +33 -4
  91. package/src/connect/types.ts +28 -0
  92. package/src/consts.ts +3 -0
  93. package/src/metadata/types.ts +8 -0
  94. package/src/planning/helpers.ts +5 -2
  95. package/src/planning/index.ts +1 -0
  96. package/src/planning/landing.ts +43 -0
  97. package/src/planning/schemas.ts +13 -0
  98. package/src/planning/types.ts +29 -3
  99. package/src/scaffold/consts.ts +10 -0
  100. package/src/scaffold/schemas.ts +262 -13
  101. package/src/scaffold/types.ts +105 -5
  102. package/src/skills/catalogue.ts +129 -24
  103. package/src/skills/consts.ts +8 -0
  104. package/src/skills/roles.ts +11 -5
  105. package/src/types.ts +30 -0
  106. package/tests/blueprint.spec.ts +98 -0
  107. package/tests/branding.spec.ts +21 -1
  108. package/tests/connect-entrypoints.spec.ts +44 -5
  109. package/tests/planning.spec.ts +56 -1
  110. package/tests/scaffold.spec.ts +131 -0
  111. package/tests/skills.spec.ts +63 -2
package/README.md CHANGED
@@ -21,7 +21,7 @@ filesystem, no inference SDK. It is safe to import from a browser bundle.
21
21
  ## Installation
22
22
 
23
23
  ```bash
24
- bun add @owlmeans/viable-common@^0.0.25
24
+ bun add @owlmeans/viable-common@^0.0.26
25
25
  ```
26
26
 
27
27
  ## Rules worth knowing before you change something
@@ -39,7 +39,7 @@ means "inherit" has no other spelling. `tests/convert.spec.ts` walks every expor
39
39
  both faults, and for draft-04 tuple `items`.
40
40
 
41
41
  **A field that crosses a version skew carries no `enum`.** A connector is installed with
42
- `npx -y @owlmeans/viable-mcp@^0.1.18-rc.21` and talks to a separately deployed platform, so an executor kind it
42
+ `npx -y @owlmeans/viable-mcp@^0.1.18-rc.22` and talks to a separately deployed platform, so an executor kind it
43
43
  sends must remain an unused capability on an older platform rather than a refused session.
44
44
 
45
45
  **A ceiling exists once.** The inquiry answer cap here equals `DEFAULT_INQUIRY_ANSWER_CHARS` in
@@ -59,7 +59,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
59
59
  your project's skill store (`.agents/skills/`):
60
60
 
61
61
  ```sh
62
- npx @owlmeans/agent-skills@^0.1.18-rc.30
62
+ npx @owlmeans/agent-skills@^0.1.18-rc.31
63
63
  ```
64
64
 
65
65
  The embedded files are version-matched to this package release. Do not edit them
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@owlmeans/viable-common",
4
- "version": "0.0.25",
5
- "generatedAt": "2026-09-19T13:42:56.263Z",
4
+ "version": "0.0.26",
5
+ "generatedAt": "2026-09-21T21:54:22.967Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -6,7 +6,7 @@ description: Shared, runtime-free taxonomy for presenting OwlMeans Viable agent
6
6
 
7
7
  # Agent output presentation
8
8
 
9
- **Install:** `"@owlmeans/viable-common": "^0.0.25"` in `dependencies`
9
+ **Install:** `"@owlmeans/viable-common": "^0.0.26"` in `dependencies`
10
10
 
11
11
  `@owlmeans/viable-common`'s `agent/presentation.ts` owns the browser-safe vocabulary for agent
12
12
  output. Keep the server and every client on `classifyAgentMessage()`; consumers may refine a
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: viable-common
3
- description: How to use @owlmeans/viable-common — the runtime-free contract package of the OwlMeans Viable platform. Covers planning cards and flows, project/story refusals, slot commands and layouts, target integrity, connector domain statuses, conversion vocabulary, generated-project analysis/design/metadata shapes, StoryDesignPort, schema conventions, and wire-version rules. Auto-invoked when importing a viable card type or flow, a slot command, a connector or conversion type, a target-integrity helper, or any *Schema this package exports.
3
+ description: How to use @owlmeans/viable-common — the runtime-free contract package of the OwlMeans Viable platform. Covers planning cards and flows (including the landing-gate fields), project/story refusals, slot commands and layouts, slot metadata keys, target integrity, connector domain statuses and routes, conversion vocabulary, blueprint layers and cases, the persona/skill catalogue and its design house style, generated-project analysis/design/scaffold/metadata shapes, StoryDesignPort, schema conventions, and wire-version rules. Auto-invoked when importing a viable card type or flow, a slot command, a connector or conversion type, a target-integrity helper, or any *Schema this package exports.
4
4
  user-invocable: false
5
5
  ---
6
6
  <!-- AUTO-GENERATED — do not edit. Regenerate via sync-agent-meta. -->
@@ -8,7 +8,7 @@ user-invocable: false
8
8
  # @owlmeans/viable-common
9
9
 
10
10
  **Layer:** Cross-cutting domain (contracts only)
11
- **Install:** `"@owlmeans/viable-common": "^0.0.25"` in `dependencies`
11
+ **Install:** `"@owlmeans/viable-common": "^0.0.26"` in `dependencies`
12
12
  **Subpaths:** `.` · `./slot` · `./connect` · `./convert` · `./integrity`
13
13
  **Runtime-free:** no `@langchain/*`, no filesystem, no Ajv at run time (a devDependency, for the
14
14
  tests that compile the schemas). It depends on `@owlmeans/planning`, `@owlmeans/resource`,
@@ -25,9 +25,9 @@ refusal two spellings, and one ceiling two values.
25
25
 
26
26
  | Subpath | What it declares |
27
27
  |---|---|
28
- | `.` (barrel) | The planning module (`VIABLE_*_TYPE`, `VIABLE_TYPE_SCHEMAS`, `VIABLE_FLOW_SCHEMAS`, `ViableStoryStatus`/`ViableProjectStatus` and their transitions, `ViableSpecCategory`, `ViableRelationship`, `ViableChannel`, `ViableProjectCard`/`ViableStoryCard`, the card helpers, the `Project*` refusals); `SlotMetadata` and the three metadata vocabularies (`metadataConfigs`, `metadataLists`, `metadataSecrets`); `ProjectArea` / `AREA_PATHS` / `AREA_ACCESS` / `AREA_TIER`; `ModelRole` and the viable `ExecutionState`; `ViableSkill` / `ViablePersona` / `VIABLE_SKILLS`; the BA, dev, UX, design and scaffold shapes and their schemas, `StoryDesignPort`; `ModerationCategory` / `ModerationSubject` / `decideModeration`; the `docs/` metadata paths; `PreviewEventType` |
28
+ | `.` (barrel) | The planning module (`VIABLE_*_TYPE`, `VIABLE_TYPE_SCHEMAS`, `VIABLE_FLOW_SCHEMAS`, `ViableStoryStatus`/`ViableProjectStatus` and their transitions, `ViableSpecCategory`, `ViableRelationship`, `ViableChannel`, `ViableProjectCard`/`ViableStoryCard`, the card helpers, the landing sentence helpers, the `Project*` refusals); `SlotMetadata` and the three metadata vocabularies (`metadataConfigs`, `metadataLists`, `metadataSecrets`), `BRANDING_ENV_KEYS` / `brandingEnv`; `ProjectArea` / `AREA_PATHS` / `AREA_ACCESS` / `AREA_TIER`; `ModelRole` and the viable `ExecutionState`; `ViableSkill` / `ViablePersona` / `VIABLE_SKILLS`; the blueprint, its cases and `landingGatePreferenceOf`; the BA, dev, UX, design and scaffold shapes and their schemas, `StoryDesignPort`; `ModerationCategory` / `ModerationSubject` / `decideModeration`; the `docs/` metadata paths; `PreviewEventType` |
29
29
  | `./slot` | `SlotCommandType` and the `SlotFileCommand` / `SlotShellCommand` / `SlotGitCommand` sets, `SubProject`, `WorkloadKind`, the target ports and process markers, `slotOrigin` / `targetRedirectUrisForOrigin` |
30
- | `./connect` | `ConnectTarget`, `ConnectLlm`, `ConnectHarness`, `ConnectExecutor`, `ConnectOpKind`, `ConnectProjectStatus`, `ConnectStoryStatus`, `ConnectPipelineState`, `ConnectWaitReason`, `ModelTier` + `tierOfRole`/`clampTier`, `ModelTask*`, `InquiryPayload` + `ConnectInquiryKind`, the session and domain-status views, the `Connect*` error family, `connectProtocols(opts)` and every `*Schema` behind them |
30
+ | `./connect` | `ConnectTarget`, `ConnectLlm`, `ConnectHarness`, `ConnectExecutor`, `ConnectOpKind`, `ConnectProjectStatus`, `ConnectStoryStatus`, `ConnectPipelineState`, `ConnectWaitReason`, `ConnectProjectBranding` / `ConnectProjectBrandingSave`, `ModelTier` + `tierOfRole`/`clampTier`, `ModelTask*`, `InquiryPayload` + `ConnectInquiryKind`, the session and domain-status views, the `Connect*` error family, `connectProtocols(opts)` and every `*Schema` behind them |
31
31
  | `./convert` | `ConversionStage`/`Status`/`Decision` and the `stageAfter`/`decisionFor`/`canEnter` transitions, `OriginKind`/`Shape`/`State`, `StackId` + `STACK_FAMILY`, `ArchitectureCase`, `ConvertibilityVerdict`/`Reason`, the census classifiers (`fileClassOf`, `sizeClassOf`, `entropyClassOf`, `binaryByExtension`), the `docs/conversion/` paths, `CONVERTED_ORIGIN_DIR`, `SOURCE_LIST_EXCLUSIONS`, `CENSUS_SKIP_DIRS`, `RELOCATE_ALWAYS_KEEP`, and the model-answer schemas the conversion asks with |
32
32
  | `./integrity` | `TargetLayout` + `TARGET_LAYOUTS`, `detectTargetLayout`, `verifyTargetShape`, `TARGET_INTEGRITY_FILES`, `TARGET_PROTECTED_FILES`, `isLegacyLayout`, `targetPackageName` |
33
33
 
@@ -110,12 +110,13 @@ the wire and in target files — a parent agent's vocabulary, which never change
110
110
  | project `description` | `description` |
111
111
  | project `specification` / `vision` / `designSystem` | specification bodies, categories `specification` / `vision` / `design-system` |
112
112
  | project `formerAliases`, `language`, `blueprint`, `blueprintCase`, `gameKind`, `target`, `origin`, `connectLlmMode`, `converterLlmMode` | `fields.*` |
113
+ | the landing-gate decision | project `fields.landing` — `{ story: code \| null, at }` |
113
114
  | story narrative (`story`) | `title` |
114
115
  | story `code` | `code` |
115
116
  | story `status` | `status` (same strings) |
116
117
  | story `projectId` | `parent` |
117
118
  | story position in the flow | `order` — a double; a connective story sits between two flow steps (`3.5`) |
118
- | story `area`, `primary`, `actor`, `warning`, `kind` | `fields.*` (`kind` is persisted) |
119
+ | story `area`, `primary`, `actor`, `warning`, `kind`, `landing` | `fields.*` (`kind` is persisted) |
119
120
  | a story's design | specification `design` under the STORY card |
120
121
  | the scaffold plan | specification `scaffold` under the PROJECT card |
121
122
 
@@ -124,6 +125,27 @@ still valid when it is checked, because validation runs after the planning middl
124
125
  viable plugin fills the area of a narrative a person wrote. `storyFieldsOf` answers an absent area
125
126
  as `guest` and an absent flag as `false`.
126
127
 
128
+ ### The landing gate on the cards
129
+
130
+ The landing gate is the key end-user story a guest starts on the landing page and continues on its
131
+ full-scale screen after signing in. Two fields record it, and they answer different questions:
132
+
133
+ - project `fields.landing` is the DECISION, in three states: absent — never decided (a run that has
134
+ not reached it, a project older than the gate); `{ story: null, at }` — decided, no gate;
135
+ `{ story: <code>, at }` — that story. A failed decision is never written: `null` would read as a
136
+ decided "none" and nothing would ask again. The schema keeps `story` nullable for exactly that
137
+ reason, and `at` carries no `format` because the planning registry compiles without ajv-formats.
138
+ - story `fields.landing: true` marks the chosen card — at most one per project — and is what the
139
+ design and development stages key on. `storyWriteInputOf` copies it into
140
+ `StoryWriteInput.landing` only when set, so `StoryMeta.landing` appears only in that story's
141
+ `docs/stories/<code>.md`; like `primary` it is the CARD's and is never passed in
142
+ `StoryWriteContent`.
143
+
144
+ The chosen narrative also carries `LANDING_STORY_SENTENCE`, appended by `withLandingSentence` — a
145
+ note for the people reading the board, never the authority. It is idempotent (checked with
146
+ `hasLandingSentence`, whitespace-insensitive), joined with one space, and never pushes a title past
147
+ `TITLE_MAX`: a narrative with no room is returned uncut rather than truncated.
148
+
127
149
  ### Slots
128
150
 
129
151
  | Card | Category | Format | Rule |
@@ -221,8 +243,17 @@ in a design, a slot or a connector schema:
221
243
  - **`items` is never an array.** A draft-04 tuple is refused wherever the schema reaches a
222
244
  provider or a collection validator.
223
245
 
246
+ **A schema that validates a STORED document only grows optional.** `ScaffoldPlanSchema` is both a
247
+ model-answer schema and the validator of the project card's `scaffold` slot, so a plan written
248
+ before a field existed must still pass whenever it is carried into a new revision. Every field
249
+ added to it — the hero's `secondary`/`browse` links, `steps`, `labels`, `closing`, a feature's bento
250
+ `fragment`, the landing `gate` — is optional in the type and `nullable` in the schema, and a count
251
+ the model should respect ("4 tiles", "5–8 chips") lives in the `description` and is clamped in
252
+ code, never as `minItems`/`maxItems`. The descriptions are what the planning model reads, so they
253
+ state each field's purpose and bounds; `gate.target` is filled by code and described as such.
254
+
224
255
  **A field that crosses a version skew carries no `enum`.** Users run
225
- `npx -y @owlmeans/viable-mcp@^0.1.18-rc.21` (the moving prerelease tag) against a separately deployed
256
+ `npx -y @owlmeans/viable-mcp@^0.1.18-rc.22` (the moving prerelease tag) against a separately deployed
226
257
  platform, so `ConnectCapabilitiesSchema.executors.items`
227
258
  is a bare string: a newer executor kind must stay an unused capability on an older platform, never
228
259
  a refused session. Apply the same reasoning to anything else a newer connector may send an older
@@ -250,12 +281,76 @@ card into the names a parent agent reads (`name` = title, `alias` = code, the th
250
281
  plus the card's `status` and `intrinsic` as plain strings, and `ConnectConfirmBody` carries the
251
282
  three brief parts including `designSystem`.
252
283
 
284
+ A project's branding is read and saved at `/project/:id/branding` (`connect.project.branding.get`
285
+ GET, `.save` POST) under `base` — the guard and the ownership gate, no paid gate. The save body
286
+ (`ConnectProjectBrandingSaveSchema`) is a PATCH of strings with structural bounds only
287
+ (`CONNECT_BRANDING_*_MAX`, each equal to its twin in the platform's branding contract); what makes a
288
+ value acceptable — non-empty copyright and organization, a legal link that is `https://` or a
289
+ same-origin path, a real Google tag id — is the platform's rule, applied to the MERGED record. The
290
+ platform credit is never part of either record: hiding it is a paid capability with its own route.
291
+
253
292
  Long work is read through the domain that owns it: `ConnectProjectStatus`, `ConnectStoryStatus`,
254
293
  `ConversionStatusView` and `ConnectPipelineState`. Each view composes its current card/record, run,
255
294
  pending inquiry and `waitingFor` reason; none exposes a generic technical operation identity. Add a
256
295
  new long-running domain by extending its status view and endpoint, not by adding a parallel polling
257
296
  vocabulary.
258
297
 
298
+ ## Slot metadata keys: optional means omitted
299
+
300
+ `SlotMetadata` is what the platform signs and pushes into a slot, and a slot publisher validates it
301
+ against its own declared schema — refusing the WHOLE configuration with a 401 when the body carries
302
+ a key it does not know. A key added after slots exist is therefore OPTIONAL in the type and OMITTED
303
+ from a push while unset: `brandingGoogleTag` (in `metadataConfigs`), `cspSources` (in
304
+ `SlotListMetadata`). The build ENVIRONMENT is different — `brandingEnv` always emits every
305
+ `BRANDING_ENV_KEYS` entry, `BRANDING_GOOGLE_TAG` as `''` when unset, because the application's own
306
+ build reads `''` as "none".
307
+
308
+ `metadataConfigs` / `metadataLists` / `metadataSecrets` enumerate what an owner STORES — one
309
+ `project-config` / `project-secret` row per key, loaded on every metadata read. `cspSources` is not
310
+ an owner setting, so it is declared on the type and kept out of them. The Google tag's CSP hosts
311
+ never travel in it: the publisher derives them from `brandingGoogleTag` itself (and from the record a
312
+ production build writes), so the tag and the hosts it needs cannot disagree.
313
+
314
+ ## Blueprint layers and the case table
315
+
316
+ A `Blueprint` has five REQUIRED build layers (`technology`, `stack`, `template`, `createApp`,
317
+ `packages`) and one OPTIONAL `experience` layer — what the product should do for its users,
318
+ changing no dependency and no coder prompt. Read it only through a helper that answers the default
319
+ for an absent layer: `landingGatePreferenceOf(blueprint)` answers `LandingGatePreference.Allow` for
320
+ no layer, no key or a value this deploy does not know. `freezeBlueprint` freezes the layer when
321
+ present and never adds it when absent.
322
+
323
+ The preference is a PRIOR for the model that decides the landing gate, never the decision:
324
+
325
+ | Case | `experience.landingGate` | `ViableSkill.LandingGate` added to |
326
+ |---|---|---|
327
+ | `web`, `ai-pipeline`, `ai-agent` | `encourage` | `BusinessAnalyst`, `UxDesigner`, `LayoutArchitect`, `ComponentArchitect`, `UiViewCoder`, `UiNavCoder` |
328
+ | `scalable` | `allow` | — |
329
+ | `game` | `discourage` | — |
330
+
331
+ A case's `personaSkills` are composed with `joinPersonaSkills`, which UNIONS a persona two maps
332
+ both name — an object spread keeps only the last list and silently drops the other case's skill.
333
+ `applyBlueprintCase` then unions the case's persona skills with the base blueprint's.
334
+
335
+ ## The design house style in the catalogue
336
+
337
+ The `VisualDesigner` persona and the `ShadcnUi` skill teach one house style, and the template seed
338
+ ships the same values: a white ground (black in dark mode) on `bg-background`; colour from ONE
339
+ product accent, never from a background; depth only from a hairline, the neutral tile (`bg-muted`)
340
+ and one `shadow-floating`; a heavy grotesk display face with tight tracking; motion that belongs
341
+ to the illustration. The older classes (`gradient-heading`, `glass-card`, `eyebrow`, `glow-orb`,
342
+ the soft/raised/glow shadows, `pulse-soft`, `spin-slow`) stay DEFINED because existing targets use
343
+ them, are repainted flat, and are never taught as decoration. Any of it changes only when the
344
+ customer's specification explicitly asks — a named background colour, a dark-only or coloured
345
+ theme, a brand palette, gradients; the product's subject matter is not a request.
346
+ `tests/skills.spec.ts` pins both texts against drifting back.
347
+
348
+ `ViableSkill.LandingGate` teaches the gate-worthy story, the gate card, the synchronous handoff
349
+ (`writeLandingHandoff` then `useLogin(target)` in one gesture) and the full-scale screen that reads
350
+ and clears it. Every `ViableSkill` member has a body in `VIABLE_SKILLS` and a weight in
351
+ `SKILL_ORDER`: the prompt service skips an alias it cannot resolve, so a missing body is a rule no
352
+ model ever receives.
353
+
259
354
  ## Closed sets that mean something
260
355
 
261
356
  - **`ProjectArea`** — guest `/`, user `/frontoffice`, admin `/admin`, operator `/backoffice`. A
@@ -344,8 +439,14 @@ with it.
344
439
  helpers — status keys as literals, `failed` intrinsically planned, the transition table — the type
345
440
  declarations, slots with no co-located category, code policies, reserved types outside `cardTypes`,
346
441
  the field schemas accepting `null` and refusing an undeclared field or a value outside a closed
347
- set, the card helpers, the `follows` anchor, and the refusals' type names surviving a marshal),
348
- `connect-entrypoints.spec.ts` (the tree's protocol count, no story route, the job-id round trip),
442
+ set, the landing fields and the landing sentence, the card helpers, the `follows` anchor, and the
443
+ refusals' type names surviving a marshal), `scaffold.spec.ts` (an old-shape and a new-shape plan
444
+ both passing the schema and the `scaffold` slot, `null` optionals accepted, no `minItems`),
445
+ `blueprint.spec.ts` (each case's gate preference, the default, and the persona-skill unions),
446
+ `branding.spec.ts` (the build env and the metadata vocabulary), `skills.spec.ts` (every skill has a
447
+ body and a weight, the handler wrap-once teaching, the house style and the landing-gate skill),
448
+ `connect-entrypoints.spec.ts` (the tree's protocol count, no story route, the job-id round trip,
449
+ the branding routes and their save body),
349
450
  `convert.spec.ts` (the three structural walks over the barrel, the
350
451
  conversion schemas compiling, a nullable enum accepting `null` under Ajv while still refusing an
351
452
  unknown member, the census classifiers and the stage transitions), `connect-convert.spec.ts` (the
@@ -1 +1 @@
1
- {"version":3,"file":"case.d.ts","sourceRoot":"","sources":["../../src/blueprint/case.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;;;;;;;;;GAYG;AACH,oBAAY,aAAa;IACvB,mGAAmG;IACnG,GAAG,QAAQ;IACX,+EAA+E;IAC/E,QAAQ,aAAa;IACrB,gFAAgF;IAChF,UAAU,gBAAgB;IAC1B,uFAAuF;IACvF,OAAO,aAAa;IACpB,iFAAiF;IACjF,IAAI,SAAS;CACd;AAED;;;;;;;GAOG;AACH,oBAAY,QAAQ;IAClB,MAAM,WAAW;IACjB,UAAU,gBAAgB;IAC1B,UAAU,gBAAgB;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,aAAa,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,8FAA8F;IAC9F,KAAK,EAAE,cAAc,CAAA;CACtB;AA0ED;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,uBAAuB,CA+G1E,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,uBAAuB,GAAG,SACqB,CAAA;AAE/F,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,aAAa,EAM/C,CAAA"}
1
+ {"version":3,"file":"case.d.ts","sourceRoot":"","sources":["../../src/blueprint/case.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;;;;;;;;;GAYG;AACH,oBAAY,aAAa;IACvB,mGAAmG;IACnG,GAAG,QAAQ;IACX,+EAA+E;IAC/E,QAAQ,aAAa;IACrB,gFAAgF;IAChF,UAAU,gBAAgB;IAC1B,uFAAuF;IACvF,OAAO,aAAa;IACpB,iFAAiF;IACjF,IAAI,SAAS;CACd;AAED;;;;;;;GAOG;AACH,oBAAY,QAAQ;IAClB,MAAM,WAAW;IACjB,UAAU,gBAAgB;IAC1B,UAAU,gBAAgB;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,aAAa,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,8FAA8F;IAC9F,KAAK,EAAE,cAAc,CAAA;CACtB;AAkHD;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAsH1E,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,uBAAuB,GAAG,SACqB,CAAA;AAE/F,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,aAAa,EAM/C,CAAA"}
@@ -2,6 +2,7 @@ import { SubProject } from '../slot/consts.js';
2
2
  import { ViableSkill } from '../skills/consts.js';
3
3
  import { ViablePersona } from '../skills/roles.js';
4
4
  import { aiLibraryList, gameLibraryList } from '../skills/catalogue.js';
5
+ import { LandingGatePreference } from './types.js';
5
6
  /**
6
7
  * WHICH KIND of product is being built on a blueprint.
7
8
  *
@@ -45,8 +46,8 @@ export var GameKind;
45
46
  /** What every AI case installs. The langchain peers are declared here, at ONE range. */
46
47
  const AI_DEPS = {
47
48
  [SubProject.Backend]: {
48
- '@owlmeans/llm': '^0.1.18-rc.30',
49
- '@owlmeans/agent': '^0.1.18-rc.31',
49
+ '@owlmeans/llm': '^0.1.18-rc.31',
50
+ '@owlmeans/agent': '^0.1.18-rc.32',
50
51
  '@langchain/core': '^1.2.9',
51
52
  '@langchain/anthropic': '^1.5.8',
52
53
  '@langchain/openai': '^1.5.10',
@@ -66,12 +67,6 @@ const AI_SKILLS = [
66
67
  ViableSkill.TargetLlm,
67
68
  ViableSkill.LibrariesAi,
68
69
  ];
69
- /**
70
- * What the analysis stage is told about a product whose value is a model.
71
- *
72
- * The pairing rule is the load-bearing one: an agent holds no permissions and owns no screen, so
73
- * a story that is the AGENT's work is invisible unless a human story starts it and watches it.
74
- */
75
70
  /**
76
71
  * What the API side is told once a project may have a queue.
77
72
  *
@@ -85,6 +80,12 @@ const PRODUCER_PERSONA_SKILLS = {
85
80
  [ViablePersona.ApiArchitect]: [ViableSkill.QueueDiscipline, ViableSkill.WorkerJobs],
86
81
  [ViablePersona.ApiCoder]: [ViableSkill.WorkerJobs],
87
82
  };
83
+ /**
84
+ * What the analysis stage is told about a product whose value is a model.
85
+ *
86
+ * The pairing rule is the load-bearing one: an agent holds no permissions and owns no screen, so
87
+ * a story that is the AGENT's work is invisible unless a human story starts it and watches it.
88
+ */
88
89
  const AI_PERSONA_SKILLS = {
89
90
  ...PRODUCER_PERSONA_SKILLS,
90
91
  [ViablePersona.BusinessAnalyst]: [ViableSkill.AgenticChoice],
@@ -94,6 +95,40 @@ const AI_PERSONA_SKILLS = {
94
95
  ViableSkill.AgenticChoice, ViableSkill.TargetLlm, ViableSkill.LibrariesAi,
95
96
  ],
96
97
  };
98
+ /**
99
+ * Join persona-skill maps, UNIONING a persona two maps both name.
100
+ *
101
+ * An object spread would keep only the last map's list for that persona — `BusinessAnalyst`
102
+ * carries `AgenticChoice` in an AI case and `LandingGate` from the gate map, and a spread would
103
+ * silently drop whichever came first.
104
+ */
105
+ const joinPersonaSkills = (...maps) => {
106
+ const out = {};
107
+ for (const map of maps) {
108
+ for (const [persona, skills] of Object.entries(map)) {
109
+ const key = persona;
110
+ out[key] = [...new Set([...(out[key] ?? []), ...(skills ?? [])])];
111
+ }
112
+ }
113
+ return out;
114
+ };
115
+ /**
116
+ * Who has to know the landing-gate pattern in a case that encourages one.
117
+ *
118
+ * The analyst decides whether a story is gate-worthy and plans the gate's copy; the UX designer
119
+ * shapes the full-scale screen that continues what the guest started; the frontend personas draw
120
+ * the gate, write the handoff and read it back. Nobody else touches it.
121
+ */
122
+ const LANDING_GATE_PERSONA_SKILLS = {
123
+ [ViablePersona.BusinessAnalyst]: [ViableSkill.LandingGate],
124
+ [ViablePersona.UxDesigner]: [ViableSkill.LandingGate],
125
+ [ViablePersona.LayoutArchitect]: [ViableSkill.LandingGate],
126
+ [ViablePersona.ComponentArchitect]: [ViableSkill.LandingGate],
127
+ [ViablePersona.UiViewCoder]: [ViableSkill.LandingGate],
128
+ [ViablePersona.UiNavCoder]: [ViableSkill.LandingGate],
129
+ };
130
+ /** The experience layer of a case whose product usually has a step a guest can begin. */
131
+ const ENCOURAGE_GATE = { landingGate: LandingGatePreference.Encourage };
97
132
  const GAME_PERSONA_SKILLS = {
98
133
  [ViablePersona.BusinessAnalyst]: [ViableSkill.GameDesign],
99
134
  [ViablePersona.UxDesigner]: [ViableSkill.GameDesign, ViableSkill.GameUi],
@@ -129,7 +164,9 @@ party, nothing walks an unbounded set, nothing is scheduled. Most products are t
129
164
  patch: {
130
165
  packages: {
131
166
  capabilities: { postgres: true, kv: false, queue: false, worker: false, agents: false, validation: true },
167
+ personaSkills: LANDING_GATE_PERSONA_SKILLS,
132
168
  },
169
+ experience: ENCOURAGE_GATE,
133
170
  },
134
171
  },
135
172
  [BlueprintCase.Scalable]: {
@@ -150,6 +187,9 @@ to call a model at all.
150
187
  capabilities: { postgres: true, kv: true, queue: true, worker: true, agents: false, validation: true },
151
188
  personaSkills: PRODUCER_PERSONA_SKILLS,
152
189
  },
190
+ // Neutral: the named off-request part is usually operator-side work, and whether a guest
191
+ // can begin anything is the specification's to say.
192
+ experience: { landingGate: LandingGatePreference.Allow },
153
193
  },
154
194
  },
155
195
  [BlueprintCase.AiPipeline]: {
@@ -170,8 +210,9 @@ application, and never merely a scalable one.
170
210
  deps: AI_DEPS,
171
211
  libraries: AI_LIBRARIES,
172
212
  skills: AI_SKILLS,
173
- personaSkills: AI_PERSONA_SKILLS,
213
+ personaSkills: joinPersonaSkills(AI_PERSONA_SKILLS, LANDING_GATE_PERSONA_SKILLS),
174
214
  },
215
+ experience: ENCOURAGE_GATE,
175
216
  },
176
217
  },
177
218
  [BlueprintCase.AiAgent]: {
@@ -189,18 +230,16 @@ in advance.
189
230
  deps: {
190
231
  [SubProject.Backend]: {
191
232
  ...AI_DEPS[SubProject.Backend],
192
- '@owlmeans/agent-skills': '^0.1.18-rc.30',
233
+ '@owlmeans/agent-skills': '^0.1.18-rc.31',
193
234
  },
194
235
  },
195
236
  libraries: AI_LIBRARIES,
196
237
  skills: [...AI_SKILLS, ViableSkill.TargetAgentTools],
197
- personaSkills: {
198
- ...AI_PERSONA_SKILLS,
199
- [ViablePersona.WorkerCoder]: [
200
- ...AI_PERSONA_SKILLS[ViablePersona.WorkerCoder], ViableSkill.TargetAgentTools,
201
- ],
202
- },
238
+ personaSkills: joinPersonaSkills(AI_PERSONA_SKILLS, LANDING_GATE_PERSONA_SKILLS, {
239
+ [ViablePersona.WorkerCoder]: [ViableSkill.TargetAgentTools],
240
+ }),
203
241
  },
242
+ experience: ENCOURAGE_GATE,
204
243
  },
205
244
  },
206
245
  [BlueprintCase.Game]: {
@@ -222,6 +261,9 @@ is not it.
222
261
  skills: [ViableSkill.GameScene, ViableSkill.GameUi, ViableSkill.LibrariesGame],
223
262
  personaSkills: { ...PRODUCER_PERSONA_SKILLS, ...GAME_PERSONA_SKILLS },
224
263
  },
264
+ // A game's first value is PLAYING it, and the play screen is its own front door — a
265
+ // pick-and-preview card on a landing page is the wrong shape for it.
266
+ experience: { landingGate: LandingGatePreference.Discourage },
225
267
  },
226
268
  },
227
269
  };
@@ -1 +1 @@
1
- {"version":3,"file":"case.js","sourceRoot":"","sources":["../../src/blueprint/case.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"case.js","sourceRoot":"","sources":["../../src/blueprint/case.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/blueprint/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAK3D;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,QAAQ,CAAC,SAAS,OAAO,KAAG,CAWhE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,SAAU,SAAS,UAAU,cAAc,KAAG,SAQ7E,CAAA;AAED,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,SAUrD,CAAA;AAEF,iFAAiF;AACjF,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,CACT,CAAA;AAMzE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,SAAU,SAAS,SAAS,MAAM,KAAG,SAwBnE,CAAA;AAeD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,cACf,SAAS,WAAW,aAAa,KAC3C,WAAW,EAAuD,CAAA"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/blueprint/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAK3D;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,QAAQ,CAAC,SAAS,OAAO,KAAG,CAWhE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,SAAU,SAAS,UAAU,cAAc,KAAG,SAQ7E,CAAA;AAED,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,SAarD,CAAA;AAEF,iFAAiF;AACjF,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,CACT,CAAA;AAMzE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,SAAU,SAAS,SAAS,MAAM,KAAG,SAwBnE,CAAA;AAeD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,cACf,SAAS,WAAW,aAAa,KAC3C,WAAW,EAAuD,CAAA"}
@@ -44,6 +44,9 @@ export const freezeBlueprint = (blueprint) => Object.freeze({
44
44
  ...blueprint.packages,
45
45
  capabilities: Object.freeze({ ...blueprint.packages.capabilities }),
46
46
  }),
47
+ // The one optional layer: frozen when present, and never ADDED when absent, so a blueprint that
48
+ // has none still compares equal to what it was before the layer existed.
49
+ ...(blueprint.experience != null ? { experience: Object.freeze({ ...blueprint.experience }) } : {}),
47
50
  });
48
51
  /** Every skill the blueprint asks for, stack first, deduped, order preserved. */
49
52
  export const blueprintSkills = (blueprint) => [...new Set([...blueprint.stack.skills, ...blueprint.packages.skills])];
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/blueprint/resolve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/blueprint/resolve.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,12 @@ import type { TopologyDescriptor } from '../topology/types.js';
15
15
  * Deliberately NOT called a preset: `presets/` in the agent library already means the LLM
16
16
  * model/provider configurations, and the two are asked at different moments about different
17
17
  * things.
18
+ *
19
+ * Five layers are REQUIRED and say what the project is built WITH; the sixth, `experience`, is
20
+ * OPTIONAL and says what its product should do for the people using it. Optional because a
21
+ * blueprint registered before the layer existed — or a patch serialized into a run row — must keep
22
+ * resolving: every reader asks through a helper that answers the default for an absent layer
23
+ * ({@link landingGatePreferenceOf}).
18
24
  */
19
25
  export interface Blueprint {
20
26
  id: string;
@@ -24,22 +30,58 @@ export interface Blueprint {
24
30
  template: TemplateLayer;
25
31
  createApp: CreateAppLayer;
26
32
  packages: PackagesLayer;
33
+ experience?: ExperienceLayer;
27
34
  }
28
35
  /**
29
36
  * The layers, lowest first. A higher layer's value replaces the same key from a lower one.
30
37
  *
31
38
  * The ordering is the point: `technology` overrides everything, because a change of language
32
39
  * invalidates every template, prompt and package below it. Nothing today has more than one
33
- * technology — the ladder exists so that adding one is a data change.
40
+ * technology — the ladder exists so that adding one is a data change. `experience` is last and
41
+ * optional: it shares no key with the five build layers, so its place decides nothing today.
34
42
  */
35
43
  export declare enum BlueprintLayer {
36
44
  Technology = "technology",
37
45
  Stack = "stack",
38
46
  Template = "template",
39
47
  CreateApp = "create-app",
40
- Packages = "packages"
48
+ Packages = "packages",
49
+ Experience = "experience"
41
50
  }
42
51
  export declare const BLUEPRINT_LAYER_ORDER: BlueprintLayer[];
52
+ /**
53
+ * How strongly a product of this kind wants a LANDING GATE — the working entry into the key
54
+ * end-user workflow drawn on the guest home, where a guest starts before signing in.
55
+ *
56
+ * A PRIOR handed to the model that decides, never the decision itself: `Encourage` still lets it
57
+ * answer "no gate" for a product with no end-user step a guest could begin, and `Discourage` still
58
+ * lets it choose one when the specification plainly describes such a step.
59
+ */
60
+ export declare enum LandingGatePreference {
61
+ /** Most products of this kind have a first-value step a guest can begin — look for it. */
62
+ Encourage = "encourage",
63
+ /** Neutral: decide from the specification alone. */
64
+ Allow = "allow",
65
+ /** Products of this kind rarely have one — choose a gate only when the specification asks. */
66
+ Discourage = "discourage"
67
+ }
68
+ /**
69
+ * What the product should do for the people using it, independent of the stack it is built on.
70
+ *
71
+ * A layer of its own rather than a field of `packages`, because it changes no dependency, no
72
+ * capability and no prompt a coder reads — it is asked by the analysis stage about the PRODUCT.
73
+ */
74
+ export interface ExperienceLayer {
75
+ landingGate: LandingGatePreference;
76
+ }
77
+ /**
78
+ * The landing-gate preference of a resolved blueprint.
79
+ *
80
+ * Total: an absent layer, an absent key and a value this deploy does not know (a patch serialized
81
+ * by a newer one) all answer `Allow` — the neutral prior, which leaves the decision to the
82
+ * specification rather than tilting it either way on a value nobody set.
83
+ */
84
+ export declare const landingGatePreferenceOf: (blueprint?: Pick<Blueprint, 'experience'> | null) => LandingGatePreference;
43
85
  /** Language and toolchain. Overrides everything below it. */
44
86
  export interface TechnologyLayer {
45
87
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/blueprint/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/blueprint/types.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * The ordering is the point: `technology` overrides everything, because a change of language
5
5
  * invalidates every template, prompt and package below it. Nothing today has more than one
6
- * technology — the ladder exists so that adding one is a data change.
6
+ * technology — the ladder exists so that adding one is a data change. `experience` is last and
7
+ * optional: it shares no key with the five build layers, so its place decides nothing today.
7
8
  */
8
9
  export var BlueprintLayer;
9
10
  (function (BlueprintLayer) {
@@ -12,6 +13,7 @@ export var BlueprintLayer;
12
13
  BlueprintLayer["Template"] = "template";
13
14
  BlueprintLayer["CreateApp"] = "create-app";
14
15
  BlueprintLayer["Packages"] = "packages";
16
+ BlueprintLayer["Experience"] = "experience";
15
17
  })(BlueprintLayer || (BlueprintLayer = {}));
16
18
  export const BLUEPRINT_LAYER_ORDER = [
17
19
  BlueprintLayer.Technology,
@@ -19,7 +21,39 @@ export const BLUEPRINT_LAYER_ORDER = [
19
21
  BlueprintLayer.Template,
20
22
  BlueprintLayer.CreateApp,
21
23
  BlueprintLayer.Packages,
24
+ BlueprintLayer.Experience,
22
25
  ];
26
+ /**
27
+ * How strongly a product of this kind wants a LANDING GATE — the working entry into the key
28
+ * end-user workflow drawn on the guest home, where a guest starts before signing in.
29
+ *
30
+ * A PRIOR handed to the model that decides, never the decision itself: `Encourage` still lets it
31
+ * answer "no gate" for a product with no end-user step a guest could begin, and `Discourage` still
32
+ * lets it choose one when the specification plainly describes such a step.
33
+ */
34
+ export var LandingGatePreference;
35
+ (function (LandingGatePreference) {
36
+ /** Most products of this kind have a first-value step a guest can begin — look for it. */
37
+ LandingGatePreference["Encourage"] = "encourage";
38
+ /** Neutral: decide from the specification alone. */
39
+ LandingGatePreference["Allow"] = "allow";
40
+ /** Products of this kind rarely have one — choose a gate only when the specification asks. */
41
+ LandingGatePreference["Discourage"] = "discourage";
42
+ })(LandingGatePreference || (LandingGatePreference = {}));
43
+ const LANDING_GATE_PREFERENCES = new Set(Object.values(LandingGatePreference));
44
+ /**
45
+ * The landing-gate preference of a resolved blueprint.
46
+ *
47
+ * Total: an absent layer, an absent key and a value this deploy does not know (a patch serialized
48
+ * by a newer one) all answer `Allow` — the neutral prior, which leaves the decision to the
49
+ * specification rather than tilting it either way on a value nobody set.
50
+ */
51
+ export const landingGatePreferenceOf = (blueprint) => {
52
+ const value = blueprint?.experience?.landingGate;
53
+ return value != null && LANDING_GATE_PREFERENCES.has(value)
54
+ ? value
55
+ : LandingGatePreference.Allow;
56
+ };
23
57
  export var BlueprintPatchKind;
24
58
  (function (BlueprintPatchKind) {
25
59
  /** Deep-merge a JSON document — the manifests, the tsconfigs. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/blueprint/types.ts"],"names":[],"mappings":"AA6BA;;;;;;GAMG;AACH,MAAM,CAAN,IAAY,cAMX;AAND,WAAY,cAAc;IACxB,2CAAyB,CAAA;IACzB,iCAAe,CAAA;IACf,uCAAqB,CAAA;IACrB,0CAAwB,CAAA;IACxB,uCAAqB,CAAA;AACvB,CAAC,EANW,cAAc,KAAd,cAAc,QAMzB;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,cAAc,CAAC,UAAU;IACzB,cAAc,CAAC,KAAK;IACpB,cAAc,CAAC,QAAQ;IACvB,cAAc,CAAC,SAAS;IACxB,cAAc,CAAC,QAAQ;CACxB,CAAA;AA6DD,MAAM,CAAN,IAAY,kBAOX;AAPD,WAAY,kBAAkB;IAC5B,iEAAiE;IACjE,8CAAwB,CAAA;IACxB,4EAA4E;IAC5E,4CAAsB,CAAA;IACtB,6DAA6D;IAC7D,yCAAmB,CAAA;AACrB,CAAC,EAPW,kBAAkB,KAAlB,kBAAkB,QAO7B"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/blueprint/types.ts"],"names":[],"mappings":"AAoCA;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,cAOX;AAPD,WAAY,cAAc;IACxB,2CAAyB,CAAA;IACzB,iCAAe,CAAA;IACf,uCAAqB,CAAA;IACrB,0CAAwB,CAAA;IACxB,uCAAqB,CAAA;IACrB,2CAAyB,CAAA;AAC3B,CAAC,EAPW,cAAc,KAAd,cAAc,QAOzB;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,cAAc,CAAC,UAAU;IACzB,cAAc,CAAC,KAAK;IACpB,cAAc,CAAC,QAAQ;IACvB,cAAc,CAAC,SAAS;IACxB,cAAc,CAAC,QAAQ;IACvB,cAAc,CAAC,UAAU;CAC1B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC/B,0FAA0F;IAC1F,gDAAuB,CAAA;IACvB,oDAAoD;IACpD,wCAAe,CAAA;IACf,8FAA8F;IAC9F,kDAAyB,CAAA;AAC3B,CAAC,EAPW,qBAAqB,KAArB,qBAAqB,QAOhC;AAYD,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAA;AAEtF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,SAAgD,EACzB,EAAE;IACzB,MAAM,KAAK,GAAG,SAAS,EAAE,UAAU,EAAE,WAAW,CAAA;IAEhD,OAAO,KAAK,IAAI,IAAI,IAAI,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC;QACzD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAA;AACjC,CAAC,CAAA;AA6DD,MAAM,CAAN,IAAY,kBAOX;AAPD,WAAY,kBAAkB;IAC5B,iEAAiE;IACjE,8CAAwB,CAAA;IACxB,4EAA4E;IAC5E,4CAAsB,CAAA;IACtB,6DAA6D;IAC7D,yCAAmB,CAAA;AACrB,CAAC,EAPW,kBAAkB,KAAlB,kBAAkB,QAO7B"}