@wildo-ai/platform-core-shared 1.1.1 → 1.1.2

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 (51) hide show
  1. package/dist/esm/index.d.ts +7 -0
  2. package/dist/esm/index.d.ts.map +1 -1
  3. package/dist/esm/index.js +7 -0
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.d.ts +3 -3
  6. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.d.ts.map +1 -1
  7. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.js +39 -8
  8. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.js.map +1 -1
  9. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.d.ts +4 -3
  10. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.d.ts.map +1 -1
  11. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.js +37 -6
  12. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.js.map +1 -1
  13. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.d.ts +1 -0
  14. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.d.ts.map +1 -1
  15. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.js +13 -0
  16. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.js.map +1 -1
  17. package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.d.ts +100 -0
  18. package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.d.ts.map +1 -0
  19. package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.js +578 -0
  20. package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.js.map +1 -0
  21. package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.d.ts +98 -0
  22. package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.d.ts.map +1 -0
  23. package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.js +86 -0
  24. package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.js.map +1 -0
  25. package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.d.ts +157 -0
  26. package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.d.ts.map +1 -0
  27. package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.js +258 -0
  28. package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.js.map +1 -0
  29. package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.d.ts +221 -0
  30. package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.d.ts.map +1 -0
  31. package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.js +292 -0
  32. package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.js.map +1 -0
  33. package/dist/esm/workbench/workbench-domain-model.custom.shared.schemas.d.ts +48 -0
  34. package/dist/esm/workbench/workbench-domain-model.custom.shared.schemas.d.ts.map +1 -0
  35. package/dist/esm/workbench/workbench-domain-model.custom.shared.schemas.js +48 -0
  36. package/dist/esm/workbench/workbench-domain-model.custom.shared.schemas.js.map +1 -0
  37. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.d.ts +142 -21
  38. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.d.ts.map +1 -1
  39. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.js +252 -23
  40. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.js.map +1 -1
  41. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.d.ts +280 -55
  42. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.d.ts.map +1 -1
  43. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.js +187 -102
  44. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.js.map +1 -1
  45. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.d.ts +227 -49
  46. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.d.ts.map +1 -1
  47. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.js +464 -85
  48. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.js.map +1 -1
  49. package/dist/tsconfig.build.tsbuildinfo +1 -1
  50. package/package.json +4 -5
  51. package/dist/esm/.builder.pid +0 -9
@@ -10,34 +10,155 @@
10
10
  * companion can serve them.
11
11
  */
12
12
  export declare enum WorkbenchShared_ResourceType {
13
- APPLICATION_MODULES = "workbenchApplicationModules",
14
13
  /**
15
- * Every relationship edge the application's resources declare — how its domain is wired.
14
+ * The application's domain model as ONE row per resource — module membership, specification prose
15
+ * and the relationships that resource participates in, all in the same row.
16
16
  *
17
- * Projected from a DIFFERENT behavior (`resources-registry`) than the modules beside it, which is
18
- * what makes it the surface that proves the adapter generalizes: one binding shape, two behaviors,
19
- * two row shapes, no adapter change.
17
+ * ## Why ONE resource rather than a module list beside an edge list
18
+ *
19
+ * It replaced exactly that, on 2026-08-31. `workbenchApplicationModules` and
20
+ * `workbenchResourceRelationships` were projections of DIFFERENT companion behaviors on DIFFERENT
21
+ * targets, so a graph drawn from both was drawn from two subprocess runs against a working tree an
22
+ * operator is editing — its nodes could describe one state of the application and its edges the
23
+ * next, with nothing able to detect it. The `application-domain-model` behavior answers all four
24
+ * facts from a single import, which is the only shape in which "resources, their relationships and
25
+ * their module membership" is internally consistent.
26
+ *
27
+ * The two were kept for a while on the argument that a flat module list and a flat edge list
28
+ * answered two narrower questions this one did not. Both were then closed rather than argued: every
29
+ * per-edge field the relationships table carried — `isDisabled`, `accessScopeStrategy`,
30
+ * `parentResourceRequirement`, `primaryScope`, `allowCycle` — now rides in
31
+ * `Workbench_DomainResourceRelationship`, and `isDisabled` in particular was a defect while it was
32
+ * missing rather than a gap, because the graph drew a disabled edge exactly like a live one.
33
+ *
34
+ * One thing genuinely did NOT survive, and it is recorded here rather than in a commit message: a
35
+ * module registering ZERO resources produces no row, so it has no node. Wonder CRM's `engine`
36
+ * module is exactly that. The judgement was that a module contributing nothing to the DOMAIN has no
37
+ * place in a domain model, and that engine-scaffolding modules are what
38
+ * `workbenchSpecificationArtifacts` is for — not that the case was overlooked.
39
+ */
40
+ DOMAIN_RESOURCES = "workbenchDomainResources",
41
+ /**
42
+ * Every application-specification family the journey produces that is NOT the application's own
43
+ * structure — the vision, the market, the requirements, the roadmap, the obligations — as one row
44
+ * each, carrying the artifact rendered for a human to read.
45
+ *
46
+ * ## Why the PRODUCT half needed its own resource
47
+ *
48
+ * The three siblings above all project the application's STRUCTURE: modules, edges, resources.
49
+ * None of them can carry a vision brief, because a vision brief is not a resource, an edge or a
50
+ * module — it is a prose document about the product the application is meant to be. Those
51
+ * documents were reachable only by opening a TypeScript file in an editor, which is not a product
52
+ * (issue #162).
53
+ *
54
+ * ## Why one resource rather than one per family
55
+ *
56
+ * The families are heterogeneous, and the two failure modes are symmetric: one destination per
57
+ * family risks a dozen half-built pages, one destination navigating all of them risks a
58
+ * lowest-common-denominator renderer. The answer taken is one destination whose rows are DERIVED
59
+ * from `APPLICATION_SPECIFICATION_SEMANTIC_SCHEMA_BINDINGS` — so the population cannot drift from
60
+ * the authority — grouped by the question each family answers, with an outline renderer as the
61
+ * floor and the artifacts already committed beside a family (`DIAGRAM.md`, `DECISIONS.md`)
62
+ * surfaced verbatim on top of it. The decision and its rejected alternatives are recorded on
63
+ * issue #162.
64
+ */
65
+ SPECIFICATION_ARTIFACTS = "workbenchSpecificationArtifacts",
66
+ /**
67
+ * One row per compiled playbook, carrying its ELIGIBILITY VERDICT — can it run right now, and if
68
+ * not, why not — plus the overwrite/stale annotations a creator weighs before dispatching.
69
+ *
70
+ * The rows are a projection of `listPlaybookEligibility()`, the ~10s recompute the creation
71
+ * board's Playbooks pane renders; the companion serves them through a `{board, computedAt}` cache
72
+ * so resource-surface consumers (RMM, lists) do not multiply the recompute. `computedAt` and the
73
+ * derived journey `phase` are projected onto every row — board-level scalars become row fields,
74
+ * because a resource row must be complete on its own.
75
+ */
76
+ PLAYBOOKS = "workbenchPlaybooks",
77
+ /**
78
+ * One row per build-plan task, in the DISPATCH view: its status (`ready` / `landed` / `blocked`),
79
+ * objective and target kind.
80
+ *
81
+ * DELIBERATELY THIN beside `ASPECT_BUILD_TASK` (`workbenchBuildTasks`), which projects the SAME
82
+ * authored population from the specification artifact with its traceability edges. The two answer
83
+ * different questions — the aspect answers "what did the journey author" (subprocess, from the
84
+ * artifact), this one answers "what can the dispatcher run next and what has landed" (in-process,
85
+ * computed against git by the dispatch service). Authored detail (skillRefs, serves edges) stays
86
+ * on the aspect row sharing the same `taskRef`; duplicating it here would be a second enumeration
87
+ * of the authored shape, one drift away from lying.
88
+ */
89
+ BUILD_PLAN_TASKS = "workbenchBuildPlanTasks",
90
+ /**
91
+ * One row per playbook run's WRITE RECORD — which files it wrote, with `existedBefore` per file —
92
+ * the evidence lane that makes every dispatch on the creation board revertable. Pre-image BYTES
93
+ * are deliberately not projected (they belong to the revert mechanism, not to a list row).
20
94
  */
21
- RESOURCE_RELATIONSHIPS = "workbenchResourceRelationships"
95
+ RUN_WRITE_RECORDS = "workbenchRunWriteRecords",
96
+ /**
97
+ * One row per execution-trace session — the session id, when it started, and how many events and
98
+ * steps it recorded. The detail (events, artifacts) stays on the companion's trace routes for
99
+ * now; this resource is the queryable index the board links from.
100
+ */
101
+ TRACE_SESSIONS = "workbenchTraceSessions",
102
+ ASPECT_VISION_IDEA = "workbenchVisionIdeas",
103
+ ASPECT_VISION_PROBLEM = "workbenchVisionProblems",
104
+ ASPECT_VISION_MISSION = "workbenchVisionMissions",
105
+ ASPECT_VISION_SUCCESS_CRITERION = "workbenchVisionSuccessCriteria",
106
+ ASPECT_VISION_CONSTRAINT = "workbenchVisionConstraints",
107
+ ASPECT_MARKET_CATEGORY = "workbenchMarketCategories",
108
+ ASPECT_MARKET_ICP = "workbenchMarketIcps",
109
+ ASPECT_MARKET_PERSONA = "workbenchMarketPersonas",
110
+ ASPECT_MARKET_JOB = "workbenchMarketJobs",
111
+ ASPECT_MARKET_PAIN = "workbenchMarketPains",
112
+ ASPECT_MARKET_GAIN = "workbenchMarketGains",
113
+ ASPECT_MARKET_TONE_OF_VOICE = "workbenchMarketTonesOfVoice",
114
+ ASPECT_MARKET_BENEFIT = "workbenchMarketBenefits",
115
+ ASPECT_MARKET_POSITIONING = "workbenchMarketPositionings",
116
+ ASPECT_MARKET_CHANNEL = "workbenchMarketChannels",
117
+ ASPECT_MARKET_ALTERNATIVE = "workbenchMarketAlternatives",
118
+ ASPECT_MARKET_TRIGGER = "workbenchMarketTriggers",
119
+ ASPECT_MARKET_BUYING_JOURNEY = "workbenchMarketBuyingJourneys",
120
+ ASPECT_MARKET_PROOF = "workbenchMarketProofs",
121
+ ASPECT_MARKET_OBJECTION = "workbenchMarketObjections",
122
+ ASPECT_MARKET_MESSAGE_TEMPLATE = "workbenchMarketMessageTemplates",
123
+ ASPECT_REQUIREMENT_FUNCTIONAL = "workbenchFunctionalRequirements",
124
+ ASPECT_REQUIREMENT_NON_FUNCTIONAL = "workbenchNonFunctionalRequirements",
125
+ ASPECT_FEATURE_DRAFT = "workbenchFeatureDrafts",
126
+ ASPECT_ROADMAP_PHASE = "workbenchRoadmapPhases",
127
+ ASPECT_PRICING_PLAN = "workbenchPricingPlans",
128
+ ASPECT_BRAND_NAME = "workbenchBrandNames",
129
+ ASPECT_BRAND_LOGO_DIRECTION = "workbenchBrandLogoDirections",
130
+ ASPECT_BRAND_VISUAL_TONE = "workbenchBrandVisualTones",
131
+ ASPECT_BRAND_ASSET = "workbenchBrandAssets",
132
+ ASPECT_DOMAIN_PLAN_MODULE = "workbenchDomainPlanModules",
133
+ ASPECT_DOMAIN_PLAN_RELATIONSHIP = "workbenchDomainPlanRelationships",
134
+ ASPECT_BUILD_TASK = "workbenchBuildTasks",
135
+ ASPECT_PLACEMENT_GROUP = "workbenchPlacementGroups",
136
+ ASPECT_PLACEMENT_DECISION = "workbenchPlacementDecisions",
137
+ ASPECT_COMPLIANCE_CANDIDATE_SECTION = "workbenchComplianceCandidateSections",
138
+ ASPECT_COMPLIANCE_CANDIDATE_VARIANT_SELECTION = "workbenchComplianceCandidateVariantSelections",
139
+ ASPECT_DOCUMENT_FACT_DECLARATION = "workbenchDocumentFactDeclarations",
140
+ ASPECT_AUTHORED_DOCUMENT_FACT_DECLARATION = "workbenchAuthoredDocumentFactDeclarations",
141
+ ASPECT_PROCESSOR_REGISTER_ENTRY = "workbenchProcessorRegisterEntries",
142
+ ASPECT_RELEASE_POLICY_SELECTION = "workbenchReleasePolicySelections",
143
+ ASPECT_DOCUMENT_PUBLICATION_VARIANT = "workbenchDocumentPublicationVariants"
22
144
  }
23
145
  /**
24
146
  * The field each resource is ADDRESSED BY — and it must be a field the rows actually carry.
25
147
  *
26
- * `workbenchApplicationModules` is identified by `moduleId`, not by a composed
27
- * `workbenchApplicationModuleId`. The convention-shaped name was declared here first and no row ever
28
- * carried it: the schema marks `moduleId` as the primary key, the behavior emits `moduleId`, and
29
- * `identityFields: ['moduleId']` composes the id from it. Nothing anywhere produced the other name,
30
- * so every consumer that addresses a row THROUGH this map looked for a field that did not exist.
31
- *
32
- * READ still worked, which is what kept it hidden: the adapter filters by `identityFields`, so
33
- * `GET …/workbench-application-modules/engine` answered 200 while the frontend list refused every
34
- * row click with "could not resolve resource id from list item" — the id it was told to read was
35
- * absent from the item.
36
- *
37
- * Its sibling is the contrast that settles the rule rather than an inconsistency: an edge has no
38
- * natural key, so `workbenchResourceRelationshipId` is SYNTHESIZED from three fields and is a real
39
- * declared field of the schema, present on every row. Both entries now name something real; one
40
- * happens to be the source's own key and the other is composed.
148
+ * ## The rule, and the defect that produced it
149
+ *
150
+ * A convention-shaped name declared here that no row carries makes every consumer addressing a row
151
+ * THROUGH this map look for a field that does not exist. The resource this was measured on
152
+ * (`workbenchApplicationModules`, removed 2026-08-31) declared `workbenchApplicationModuleId` while
153
+ * its schema, its behavior and its `identityFields` all said `moduleId`.
154
+ *
155
+ * READ still worked, which is what kept it hidden: the adapter filters by `identityFields`, so the
156
+ * addressed route answered 200 while the frontend list refused every row click with "could not
157
+ * resolve resource id from list item" — the id it was told to read was absent from the item. A green
158
+ * addressed READ is therefore NOT evidence that this map is right; the list row click is.
159
+ *
160
+ * So an entry here is either the source's OWN key, or a name COMPOSED by `identityFields` and
161
+ * declared as a real field of the schema. Never a name that merely follows the convention.
41
162
  */
42
163
  export declare const WorkbenchShared_ResourceFieldIdentifier: {
43
164
  [key in WorkbenchShared_ResourceType]: string;
@@ -1 +1 @@
1
- {"version":3,"file":"workbench-resources-types.custom.shared.schemas.d.ts","sourceRoot":"","sources":["../../../../src/workbench/workbench-resources-types.custom.shared.schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,oBAAY,4BAA4B;IACtC,mBAAmB,gCAAgC;IACnD;;;;;;OAMG;IACH,sBAAsB,mCAAmC;CAC1D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,uCAAuC,EAAE;KAAG,GAAG,IAAI,4BAA4B,GAAG,MAAM;CAGpG,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,+BAA+B,mCAAmC,CAAC"}
1
+ {"version":3,"file":"workbench-resources-types.custom.shared.schemas.d.ts","sourceRoot":"","sources":["../../../../src/workbench/workbench-resources-types.custom.shared.schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,oBAAY,4BAA4B;IACtC;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,gBAAgB,6BAA6B;IAC7C;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,uBAAuB,oCAAoC;IA6B3D;;;;;;;;;OASG;IACH,SAAS,uBAAuB;IAChC;;;;;;;;;;;OAWG;IACH,gBAAgB,4BAA4B;IAC5C;;;;OAIG;IACH,iBAAiB,6BAA6B;IAC9C;;;;OAIG;IACH,cAAc,2BAA2B;IACzC,kBAAkB,yBAAyB;IAC3C,qBAAqB,4BAA4B;IACjD,qBAAqB,4BAA4B;IACjD,+BAA+B,mCAAmC;IAClE,wBAAwB,+BAA+B;IACvD,sBAAsB,8BAA8B;IACpD,iBAAiB,wBAAwB;IACzC,qBAAqB,4BAA4B;IACjD,iBAAiB,wBAAwB;IACzC,kBAAkB,yBAAyB;IAC3C,kBAAkB,yBAAyB;IAC3C,2BAA2B,gCAAgC;IAC3D,qBAAqB,4BAA4B;IACjD,yBAAyB,gCAAgC;IACzD,qBAAqB,4BAA4B;IACjD,yBAAyB,gCAAgC;IACzD,qBAAqB,4BAA4B;IACjD,4BAA4B,kCAAkC;IAC9D,mBAAmB,0BAA0B;IAC7C,uBAAuB,8BAA8B;IACrD,8BAA8B,oCAAoC;IAClE,6BAA6B,oCAAoC;IACjE,iCAAiC,uCAAuC;IACxE,oBAAoB,2BAA2B;IAC/C,oBAAoB,2BAA2B;IAC/C,mBAAmB,0BAA0B;IAC7C,iBAAiB,wBAAwB;IACzC,2BAA2B,iCAAiC;IAC5D,wBAAwB,8BAA8B;IACtD,kBAAkB,yBAAyB;IAC3C,yBAAyB,+BAA+B;IACxD,+BAA+B,qCAAqC;IACpE,iBAAiB,wBAAwB;IACzC,sBAAsB,6BAA6B;IACnD,yBAAyB,gCAAgC;IACzD,mCAAmC,yCAAyC;IAC5E,6CAA6C,kDAAkD;IAC/F,gCAAgC,sCAAsC;IACtE,yCAAyC,8CAA8C;IACvF,+BAA+B,sCAAsC;IACrE,+BAA+B,qCAAqC;IACpE,mCAAmC,yCAAyC;CAC7E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,uCAAuC,EAAE;KAAG,GAAG,IAAI,4BAA4B,GAAG,MAAM;CAoFpG,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,+BAA+B,mCAAmC,CAAC"}
@@ -11,38 +11,267 @@
11
11
  */
12
12
  export var WorkbenchShared_ResourceType;
13
13
  (function (WorkbenchShared_ResourceType) {
14
- WorkbenchShared_ResourceType["APPLICATION_MODULES"] = "workbenchApplicationModules";
15
14
  /**
16
- * Every relationship edge the application's resources declare — how its domain is wired.
15
+ * The application's domain model as ONE row per resource — module membership, specification prose
16
+ * and the relationships that resource participates in, all in the same row.
17
17
  *
18
- * Projected from a DIFFERENT behavior (`resources-registry`) than the modules beside it, which is
19
- * what makes it the surface that proves the adapter generalizes: one binding shape, two behaviors,
20
- * two row shapes, no adapter change.
18
+ * ## Why ONE resource rather than a module list beside an edge list
19
+ *
20
+ * It replaced exactly that, on 2026-08-31. `workbenchApplicationModules` and
21
+ * `workbenchResourceRelationships` were projections of DIFFERENT companion behaviors on DIFFERENT
22
+ * targets, so a graph drawn from both was drawn from two subprocess runs against a working tree an
23
+ * operator is editing — its nodes could describe one state of the application and its edges the
24
+ * next, with nothing able to detect it. The `application-domain-model` behavior answers all four
25
+ * facts from a single import, which is the only shape in which "resources, their relationships and
26
+ * their module membership" is internally consistent.
27
+ *
28
+ * The two were kept for a while on the argument that a flat module list and a flat edge list
29
+ * answered two narrower questions this one did not. Both were then closed rather than argued: every
30
+ * per-edge field the relationships table carried — `isDisabled`, `accessScopeStrategy`,
31
+ * `parentResourceRequirement`, `primaryScope`, `allowCycle` — now rides in
32
+ * `Workbench_DomainResourceRelationship`, and `isDisabled` in particular was a defect while it was
33
+ * missing rather than a gap, because the graph drew a disabled edge exactly like a live one.
34
+ *
35
+ * One thing genuinely did NOT survive, and it is recorded here rather than in a commit message: a
36
+ * module registering ZERO resources produces no row, so it has no node. Wonder CRM's `engine`
37
+ * module is exactly that. The judgement was that a module contributing nothing to the DOMAIN has no
38
+ * place in a domain model, and that engine-scaffolding modules are what
39
+ * `workbenchSpecificationArtifacts` is for — not that the case was overlooked.
40
+ */
41
+ WorkbenchShared_ResourceType["DOMAIN_RESOURCES"] = "workbenchDomainResources";
42
+ /**
43
+ * Every application-specification family the journey produces that is NOT the application's own
44
+ * structure — the vision, the market, the requirements, the roadmap, the obligations — as one row
45
+ * each, carrying the artifact rendered for a human to read.
46
+ *
47
+ * ## Why the PRODUCT half needed its own resource
48
+ *
49
+ * The three siblings above all project the application's STRUCTURE: modules, edges, resources.
50
+ * None of them can carry a vision brief, because a vision brief is not a resource, an edge or a
51
+ * module — it is a prose document about the product the application is meant to be. Those
52
+ * documents were reachable only by opening a TypeScript file in an editor, which is not a product
53
+ * (issue #162).
54
+ *
55
+ * ## Why one resource rather than one per family
56
+ *
57
+ * The families are heterogeneous, and the two failure modes are symmetric: one destination per
58
+ * family risks a dozen half-built pages, one destination navigating all of them risks a
59
+ * lowest-common-denominator renderer. The answer taken is one destination whose rows are DERIVED
60
+ * from `APPLICATION_SPECIFICATION_SEMANTIC_SCHEMA_BINDINGS` — so the population cannot drift from
61
+ * the authority — grouped by the question each family answers, with an outline renderer as the
62
+ * floor and the artifacts already committed beside a family (`DIAGRAM.md`, `DECISIONS.md`)
63
+ * surfaced verbatim on top of it. The decision and its rejected alternatives are recorded on
64
+ * issue #162.
65
+ */
66
+ WorkbenchShared_ResourceType["SPECIFICATION_ARTIFACTS"] = "workbenchSpecificationArtifacts";
67
+ /*
68
+ * ── FAMILY ASPECT RESOURCES ──────────────────────────────────────────────────────────────────
69
+ *
70
+ * One resource per SECOND-LEVEL aspect of a specification family (the vision's success
71
+ * criteria, the market's ICPs, the roadmap's phases, …), so the product graph the snapshots
72
+ * flatten becomes navigable. Their canonical declaration — item schemas, business keys, edges —
73
+ * is `FAMILY_ASPECTS_REGISTRY` in `@wildo-ai/saas-specifications` (`_core/family-aspects.*`):
74
+ * this enum and the descriptor table beside it are the SPINE's schema-agnostic transcription,
75
+ * held to the registry by a companion-side parity test (the spine deliberately never imports
76
+ * saas-specifications).
77
+ *
78
+ * Same nature as their two siblings above: INTROSPECTION-backed, derived per read from the
79
+ * landed files, READ/LIST only. Their READ pages are NOT addressable — references open them as
80
+ * POPUPS (decided 2026-09-01); the artifacts resource stays the primary surface.
81
+ */
82
+ /*
83
+ * ── The CREATION PLANE (added 2026-09-01, `workbench-creation-board-resources.md` Phase 2) ──
84
+ *
85
+ * The four families below are NOT projections of the application's source: they are the
86
+ * COMPANION'S OWN RUNTIME projections for the one application it serves — the playbook
87
+ * eligibility board, the build-plan dispatch view, the run write-register and the execution
88
+ * traces. They ride the same INTROSPECTION adapter through the same port, but their behaviors
89
+ * materialize IN-PROCESS (no subprocess, no app-dist import), their binding declares the
90
+ * `APPLICATION_RUNTIME` tenancy stance, and their read variants are AUTHENTICATED (`APP_USER`) —
91
+ * the structural projections' `APP_PUBLIC` argument ("anyone with the working tree can already
92
+ * read this") does not extend to runtime state.
93
+ */
94
+ /**
95
+ * One row per compiled playbook, carrying its ELIGIBILITY VERDICT — can it run right now, and if
96
+ * not, why not — plus the overwrite/stale annotations a creator weighs before dispatching.
97
+ *
98
+ * The rows are a projection of `listPlaybookEligibility()`, the ~10s recompute the creation
99
+ * board's Playbooks pane renders; the companion serves them through a `{board, computedAt}` cache
100
+ * so resource-surface consumers (RMM, lists) do not multiply the recompute. `computedAt` and the
101
+ * derived journey `phase` are projected onto every row — board-level scalars become row fields,
102
+ * because a resource row must be complete on its own.
21
103
  */
22
- WorkbenchShared_ResourceType["RESOURCE_RELATIONSHIPS"] = "workbenchResourceRelationships";
104
+ WorkbenchShared_ResourceType["PLAYBOOKS"] = "workbenchPlaybooks";
105
+ /**
106
+ * One row per build-plan task, in the DISPATCH view: its status (`ready` / `landed` / `blocked`),
107
+ * objective and target kind.
108
+ *
109
+ * DELIBERATELY THIN beside `ASPECT_BUILD_TASK` (`workbenchBuildTasks`), which projects the SAME
110
+ * authored population from the specification artifact with its traceability edges. The two answer
111
+ * different questions — the aspect answers "what did the journey author" (subprocess, from the
112
+ * artifact), this one answers "what can the dispatcher run next and what has landed" (in-process,
113
+ * computed against git by the dispatch service). Authored detail (skillRefs, serves edges) stays
114
+ * on the aspect row sharing the same `taskRef`; duplicating it here would be a second enumeration
115
+ * of the authored shape, one drift away from lying.
116
+ */
117
+ WorkbenchShared_ResourceType["BUILD_PLAN_TASKS"] = "workbenchBuildPlanTasks";
118
+ /**
119
+ * One row per playbook run's WRITE RECORD — which files it wrote, with `existedBefore` per file —
120
+ * the evidence lane that makes every dispatch on the creation board revertable. Pre-image BYTES
121
+ * are deliberately not projected (they belong to the revert mechanism, not to a list row).
122
+ */
123
+ WorkbenchShared_ResourceType["RUN_WRITE_RECORDS"] = "workbenchRunWriteRecords";
124
+ /**
125
+ * One row per execution-trace session — the session id, when it started, and how many events and
126
+ * steps it recorded. The detail (events, artifacts) stays on the companion's trace routes for
127
+ * now; this resource is the queryable index the board links from.
128
+ */
129
+ WorkbenchShared_ResourceType["TRACE_SESSIONS"] = "workbenchTraceSessions";
130
+ WorkbenchShared_ResourceType["ASPECT_VISION_IDEA"] = "workbenchVisionIdeas";
131
+ WorkbenchShared_ResourceType["ASPECT_VISION_PROBLEM"] = "workbenchVisionProblems";
132
+ WorkbenchShared_ResourceType["ASPECT_VISION_MISSION"] = "workbenchVisionMissions";
133
+ WorkbenchShared_ResourceType["ASPECT_VISION_SUCCESS_CRITERION"] = "workbenchVisionSuccessCriteria";
134
+ WorkbenchShared_ResourceType["ASPECT_VISION_CONSTRAINT"] = "workbenchVisionConstraints";
135
+ WorkbenchShared_ResourceType["ASPECT_MARKET_CATEGORY"] = "workbenchMarketCategories";
136
+ WorkbenchShared_ResourceType["ASPECT_MARKET_ICP"] = "workbenchMarketIcps";
137
+ WorkbenchShared_ResourceType["ASPECT_MARKET_PERSONA"] = "workbenchMarketPersonas";
138
+ WorkbenchShared_ResourceType["ASPECT_MARKET_JOB"] = "workbenchMarketJobs";
139
+ WorkbenchShared_ResourceType["ASPECT_MARKET_PAIN"] = "workbenchMarketPains";
140
+ WorkbenchShared_ResourceType["ASPECT_MARKET_GAIN"] = "workbenchMarketGains";
141
+ WorkbenchShared_ResourceType["ASPECT_MARKET_TONE_OF_VOICE"] = "workbenchMarketTonesOfVoice";
142
+ WorkbenchShared_ResourceType["ASPECT_MARKET_BENEFIT"] = "workbenchMarketBenefits";
143
+ WorkbenchShared_ResourceType["ASPECT_MARKET_POSITIONING"] = "workbenchMarketPositionings";
144
+ WorkbenchShared_ResourceType["ASPECT_MARKET_CHANNEL"] = "workbenchMarketChannels";
145
+ WorkbenchShared_ResourceType["ASPECT_MARKET_ALTERNATIVE"] = "workbenchMarketAlternatives";
146
+ WorkbenchShared_ResourceType["ASPECT_MARKET_TRIGGER"] = "workbenchMarketTriggers";
147
+ WorkbenchShared_ResourceType["ASPECT_MARKET_BUYING_JOURNEY"] = "workbenchMarketBuyingJourneys";
148
+ WorkbenchShared_ResourceType["ASPECT_MARKET_PROOF"] = "workbenchMarketProofs";
149
+ WorkbenchShared_ResourceType["ASPECT_MARKET_OBJECTION"] = "workbenchMarketObjections";
150
+ WorkbenchShared_ResourceType["ASPECT_MARKET_MESSAGE_TEMPLATE"] = "workbenchMarketMessageTemplates";
151
+ WorkbenchShared_ResourceType["ASPECT_REQUIREMENT_FUNCTIONAL"] = "workbenchFunctionalRequirements";
152
+ WorkbenchShared_ResourceType["ASPECT_REQUIREMENT_NON_FUNCTIONAL"] = "workbenchNonFunctionalRequirements";
153
+ WorkbenchShared_ResourceType["ASPECT_FEATURE_DRAFT"] = "workbenchFeatureDrafts";
154
+ WorkbenchShared_ResourceType["ASPECT_ROADMAP_PHASE"] = "workbenchRoadmapPhases";
155
+ WorkbenchShared_ResourceType["ASPECT_PRICING_PLAN"] = "workbenchPricingPlans";
156
+ WorkbenchShared_ResourceType["ASPECT_BRAND_NAME"] = "workbenchBrandNames";
157
+ WorkbenchShared_ResourceType["ASPECT_BRAND_LOGO_DIRECTION"] = "workbenchBrandLogoDirections";
158
+ WorkbenchShared_ResourceType["ASPECT_BRAND_VISUAL_TONE"] = "workbenchBrandVisualTones";
159
+ WorkbenchShared_ResourceType["ASPECT_BRAND_ASSET"] = "workbenchBrandAssets";
160
+ WorkbenchShared_ResourceType["ASPECT_DOMAIN_PLAN_MODULE"] = "workbenchDomainPlanModules";
161
+ WorkbenchShared_ResourceType["ASPECT_DOMAIN_PLAN_RELATIONSHIP"] = "workbenchDomainPlanRelationships";
162
+ WorkbenchShared_ResourceType["ASPECT_BUILD_TASK"] = "workbenchBuildTasks";
163
+ WorkbenchShared_ResourceType["ASPECT_PLACEMENT_GROUP"] = "workbenchPlacementGroups";
164
+ WorkbenchShared_ResourceType["ASPECT_PLACEMENT_DECISION"] = "workbenchPlacementDecisions";
165
+ WorkbenchShared_ResourceType["ASPECT_COMPLIANCE_CANDIDATE_SECTION"] = "workbenchComplianceCandidateSections";
166
+ WorkbenchShared_ResourceType["ASPECT_COMPLIANCE_CANDIDATE_VARIANT_SELECTION"] = "workbenchComplianceCandidateVariantSelections";
167
+ WorkbenchShared_ResourceType["ASPECT_DOCUMENT_FACT_DECLARATION"] = "workbenchDocumentFactDeclarations";
168
+ WorkbenchShared_ResourceType["ASPECT_AUTHORED_DOCUMENT_FACT_DECLARATION"] = "workbenchAuthoredDocumentFactDeclarations";
169
+ WorkbenchShared_ResourceType["ASPECT_PROCESSOR_REGISTER_ENTRY"] = "workbenchProcessorRegisterEntries";
170
+ WorkbenchShared_ResourceType["ASPECT_RELEASE_POLICY_SELECTION"] = "workbenchReleasePolicySelections";
171
+ WorkbenchShared_ResourceType["ASPECT_DOCUMENT_PUBLICATION_VARIANT"] = "workbenchDocumentPublicationVariants";
23
172
  })(WorkbenchShared_ResourceType || (WorkbenchShared_ResourceType = {}));
24
173
  /**
25
174
  * The field each resource is ADDRESSED BY — and it must be a field the rows actually carry.
26
175
  *
27
- * `workbenchApplicationModules` is identified by `moduleId`, not by a composed
28
- * `workbenchApplicationModuleId`. The convention-shaped name was declared here first and no row ever
29
- * carried it: the schema marks `moduleId` as the primary key, the behavior emits `moduleId`, and
30
- * `identityFields: ['moduleId']` composes the id from it. Nothing anywhere produced the other name,
31
- * so every consumer that addresses a row THROUGH this map looked for a field that did not exist.
32
- *
33
- * READ still worked, which is what kept it hidden: the adapter filters by `identityFields`, so
34
- * `GET …/workbench-application-modules/engine` answered 200 while the frontend list refused every
35
- * row click with "could not resolve resource id from list item" — the id it was told to read was
36
- * absent from the item.
37
- *
38
- * Its sibling is the contrast that settles the rule rather than an inconsistency: an edge has no
39
- * natural key, so `workbenchResourceRelationshipId` is SYNTHESIZED from three fields and is a real
40
- * declared field of the schema, present on every row. Both entries now name something real; one
41
- * happens to be the source's own key and the other is composed.
176
+ * ## The rule, and the defect that produced it
177
+ *
178
+ * A convention-shaped name declared here that no row carries makes every consumer addressing a row
179
+ * THROUGH this map look for a field that does not exist. The resource this was measured on
180
+ * (`workbenchApplicationModules`, removed 2026-08-31) declared `workbenchApplicationModuleId` while
181
+ * its schema, its behavior and its `identityFields` all said `moduleId`.
182
+ *
183
+ * READ still worked, which is what kept it hidden: the adapter filters by `identityFields`, so the
184
+ * addressed route answered 200 while the frontend list refused every row click with "could not
185
+ * resolve resource id from list item" — the id it was told to read was absent from the item. A green
186
+ * addressed READ is therefore NOT evidence that this map is right; the list row click is.
187
+ *
188
+ * So an entry here is either the source's OWN key, or a name COMPOSED by `identityFields` and
189
+ * declared as a real field of the schema. Never a name that merely follows the convention.
42
190
  */
43
191
  export const WorkbenchShared_ResourceFieldIdentifier = {
44
- [WorkbenchShared_ResourceType.APPLICATION_MODULES]: 'moduleId',
45
- [WorkbenchShared_ResourceType.RESOURCE_RELATIONSHIPS]: 'workbenchResourceRelationshipId',
192
+ /*
193
+ * COMPOSED from `resourceType`, following the relationships sibling rather than the modules one.
194
+ *
195
+ * The behavior's rows do carry `resourceType`, so the source's own key could have been used
196
+ * directly — as `moduleId` is. It is composed instead because `resourceType` is a name the FIELD
197
+ * IDENTIFIER MAP would then publish globally: that map is merged with the engine's and consumed by
198
+ * `buildFieldIdentifierToResourceTypeMap`, which resolves a foreign-key field NAME to the resource
199
+ * it points at. A generic identifier there is a name any application could collide with, on a map
200
+ * whose whole job is that names are unambiguous.
201
+ */
202
+ [WorkbenchShared_ResourceType.DOMAIN_RESOURCES]: 'workbenchDomainResourceId',
203
+ /*
204
+ * The FAMILY id, which is the source's own key — the `moduleId` case rather than the composed one.
205
+ *
206
+ * A family id (`vision-brief`, `compliance-program`) is unique by construction: the semantic
207
+ * authority is a map keyed by it. And unlike `resourceType`, it is not a name any application's
208
+ * foreign-key field could collide with on the global field-identifier map, so there is nothing for
209
+ * a composed name to protect against here.
210
+ */
211
+ [WorkbenchShared_ResourceType.SPECIFICATION_ARTIFACTS]: 'family',
212
+ /*
213
+ * Aspect identifiers are all COMPOSED (`workbenchMarketIcpId`), for the same reason as
214
+ * DOMAIN_RESOURCES: the raw business-key field is `ref` on most aspects — a name applications
215
+ * collide with constantly — and this map publishes globally. The projection emits the composed
216
+ * field on every row (value = the business key, the aspect key for singletons, or the indexed
217
+ * fallback), so the "a name the rows actually carry" rule above holds.
218
+ */
219
+ /*
220
+ * The creation-plane identifiers are all COMPOSED (`workbenchPlaybookId` from `playbookRef`, …):
221
+ * the raw business keys (`playbookRef`, `taskRef`, `runId`, `sessionId`) are names an
222
+ * application's own foreign-key fields could collide with on the global field-identifier map,
223
+ * which is the same reason DOMAIN_RESOURCES composes. Unlike DOMAIN_RESOURCES the field is
224
+ * EMITTED BY THE BEHAVIOR rather than composed by `identityFields` — composition refuses any
225
+ * value outside `[a-zA-Z0-9_-]`, and playbook refs (`top_down.phase-gate`) and trace session ids
226
+ * legitimately carry dots — so the projection service sanitizes and duplicate-checks. The "a name
227
+ * the rows actually carry" rule holds either way.
228
+ */
229
+ [WorkbenchShared_ResourceType.PLAYBOOKS]: 'workbenchPlaybookId',
230
+ [WorkbenchShared_ResourceType.BUILD_PLAN_TASKS]: 'workbenchBuildPlanTaskId',
231
+ [WorkbenchShared_ResourceType.RUN_WRITE_RECORDS]: 'workbenchRunWriteRecordId',
232
+ [WorkbenchShared_ResourceType.TRACE_SESSIONS]: 'workbenchTraceSessionId',
233
+ [WorkbenchShared_ResourceType.ASPECT_VISION_IDEA]: 'workbenchVisionIdeaId',
234
+ [WorkbenchShared_ResourceType.ASPECT_VISION_PROBLEM]: 'workbenchVisionProblemId',
235
+ [WorkbenchShared_ResourceType.ASPECT_VISION_MISSION]: 'workbenchVisionMissionId',
236
+ [WorkbenchShared_ResourceType.ASPECT_VISION_SUCCESS_CRITERION]: 'workbenchVisionSuccessCriterionId',
237
+ [WorkbenchShared_ResourceType.ASPECT_VISION_CONSTRAINT]: 'workbenchVisionConstraintId',
238
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_CATEGORY]: 'workbenchMarketCategoryId',
239
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_ICP]: 'workbenchMarketIcpId',
240
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_PERSONA]: 'workbenchMarketPersonaId',
241
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_JOB]: 'workbenchMarketJobId',
242
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_PAIN]: 'workbenchMarketPainId',
243
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_GAIN]: 'workbenchMarketGainId',
244
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_TONE_OF_VOICE]: 'workbenchMarketToneOfVoiceId',
245
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_BENEFIT]: 'workbenchMarketBenefitId',
246
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_POSITIONING]: 'workbenchMarketPositioningId',
247
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_CHANNEL]: 'workbenchMarketChannelId',
248
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_ALTERNATIVE]: 'workbenchMarketAlternativeId',
249
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_TRIGGER]: 'workbenchMarketTriggerId',
250
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_BUYING_JOURNEY]: 'workbenchMarketBuyingJourneyId',
251
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_PROOF]: 'workbenchMarketProofId',
252
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_OBJECTION]: 'workbenchMarketObjectionId',
253
+ [WorkbenchShared_ResourceType.ASPECT_MARKET_MESSAGE_TEMPLATE]: 'workbenchMarketMessageTemplateId',
254
+ [WorkbenchShared_ResourceType.ASPECT_REQUIREMENT_FUNCTIONAL]: 'workbenchFunctionalRequirementId',
255
+ [WorkbenchShared_ResourceType.ASPECT_REQUIREMENT_NON_FUNCTIONAL]: 'workbenchNonFunctionalRequirementId',
256
+ [WorkbenchShared_ResourceType.ASPECT_FEATURE_DRAFT]: 'workbenchFeatureDraftId',
257
+ [WorkbenchShared_ResourceType.ASPECT_ROADMAP_PHASE]: 'workbenchRoadmapPhaseId',
258
+ [WorkbenchShared_ResourceType.ASPECT_PRICING_PLAN]: 'workbenchPricingPlanId',
259
+ [WorkbenchShared_ResourceType.ASPECT_BRAND_NAME]: 'workbenchBrandNameId',
260
+ [WorkbenchShared_ResourceType.ASPECT_BRAND_LOGO_DIRECTION]: 'workbenchBrandLogoDirectionId',
261
+ [WorkbenchShared_ResourceType.ASPECT_BRAND_VISUAL_TONE]: 'workbenchBrandVisualToneId',
262
+ [WorkbenchShared_ResourceType.ASPECT_BRAND_ASSET]: 'workbenchBrandAssetId',
263
+ [WorkbenchShared_ResourceType.ASPECT_DOMAIN_PLAN_MODULE]: 'workbenchDomainPlanModuleId',
264
+ [WorkbenchShared_ResourceType.ASPECT_DOMAIN_PLAN_RELATIONSHIP]: 'workbenchDomainPlanRelationshipId',
265
+ [WorkbenchShared_ResourceType.ASPECT_BUILD_TASK]: 'workbenchBuildTaskId',
266
+ [WorkbenchShared_ResourceType.ASPECT_PLACEMENT_GROUP]: 'workbenchPlacementGroupId',
267
+ [WorkbenchShared_ResourceType.ASPECT_PLACEMENT_DECISION]: 'workbenchPlacementDecisionId',
268
+ [WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_CANDIDATE_SECTION]: 'workbenchComplianceCandidateSectionId',
269
+ [WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_CANDIDATE_VARIANT_SELECTION]: 'workbenchComplianceCandidateVariantSelectionId',
270
+ [WorkbenchShared_ResourceType.ASPECT_DOCUMENT_FACT_DECLARATION]: 'workbenchDocumentFactDeclarationId',
271
+ [WorkbenchShared_ResourceType.ASPECT_AUTHORED_DOCUMENT_FACT_DECLARATION]: 'workbenchAuthoredDocumentFactDeclarationId',
272
+ [WorkbenchShared_ResourceType.ASPECT_PROCESSOR_REGISTER_ENTRY]: 'workbenchProcessorRegisterEntryId',
273
+ [WorkbenchShared_ResourceType.ASPECT_RELEASE_POLICY_SELECTION]: 'workbenchReleasePolicySelectionId',
274
+ [WorkbenchShared_ResourceType.ASPECT_DOCUMENT_PUBLICATION_VARIANT]: 'workbenchDocumentPublicationVariantId',
46
275
  };
47
276
  /**
48
277
  * The frontend-service name the application-creation workbench identifies itself by.
@@ -1 +1 @@
1
- {"version":3,"file":"workbench-resources-types.custom.shared.schemas.js","sourceRoot":"","sources":["../../../../src/workbench/workbench-resources-types.custom.shared.schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAN,IAAY,4BAUX;AAVD,WAAY,4BAA4B;IACtC,mFAAmD,CAAA;IACnD;;;;;;OAMG;IACH,yFAAyD,CAAA;AAC3D,CAAC,EAVW,4BAA4B,KAA5B,4BAA4B,QAUvC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAAsD;IACxG,CAAC,4BAA4B,CAAC,mBAAmB,CAAC,EAAE,UAAU;IAC9D,CAAC,4BAA4B,CAAC,sBAAsB,CAAC,EAAE,iCAAiC;CACzF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,gCAAgC,CAAC","sourcesContent":["/**\n * The workbench's own resource vocabulary.\n *\n * A SEPARATE enum and factory map from `CustomShared_ResourceType`, deliberately. That map has six\n * consumers, two of which must not receive these: `platform-apps-manager` (which would register\n * resources it has no use for, and whose INIT lifecycle applies migrations) and the companion's i18n\n * labelling planner, which enumerates `Object.keys(...)` and would generate labels for them.\n *\n * These resources are INTROSPECTION-backed: nothing is stored, nothing is migrated, and only the\n * companion can serve them.\n */\nexport enum WorkbenchShared_ResourceType {\n APPLICATION_MODULES = 'workbenchApplicationModules',\n /**\n * Every relationship edge the application's resources declare — how its domain is wired.\n *\n * Projected from a DIFFERENT behavior (`resources-registry`) than the modules beside it, which is\n * what makes it the surface that proves the adapter generalizes: one binding shape, two behaviors,\n * two row shapes, no adapter change.\n */\n RESOURCE_RELATIONSHIPS = 'workbenchResourceRelationships',\n}\n\n/**\n * The field each resource is ADDRESSED BY — and it must be a field the rows actually carry.\n *\n * `workbenchApplicationModules` is identified by `moduleId`, not by a composed\n * `workbenchApplicationModuleId`. The convention-shaped name was declared here first and no row ever\n * carried it: the schema marks `moduleId` as the primary key, the behavior emits `moduleId`, and\n * `identityFields: ['moduleId']` composes the id from it. Nothing anywhere produced the other name,\n * so every consumer that addresses a row THROUGH this map looked for a field that did not exist.\n *\n * READ still worked, which is what kept it hidden: the adapter filters by `identityFields`, so\n * `GET …/workbench-application-modules/engine` answered 200 while the frontend list refused every\n * row click with \"could not resolve resource id from list item\" — the id it was told to read was\n * absent from the item.\n *\n * Its sibling is the contrast that settles the rule rather than an inconsistency: an edge has no\n * natural key, so `workbenchResourceRelationshipId` is SYNTHESIZED from three fields and is a real\n * declared field of the schema, present on every row. Both entries now name something real; one\n * happens to be the source's own key and the other is composed.\n */\nexport const WorkbenchShared_ResourceFieldIdentifier: { [key in WorkbenchShared_ResourceType]: string } = {\n [WorkbenchShared_ResourceType.APPLICATION_MODULES]: 'moduleId',\n [WorkbenchShared_ResourceType.RESOURCE_RELATIONSHIPS]: 'workbenchResourceRelationshipId',\n};\n\n/**\n * The frontend-service name the application-creation workbench identifies itself by.\n *\n * Shared because BOTH sides must agree and neither owns it alone: the workbench sends it as\n * `VITE_FRONTEND_SERVICE_NAME` on every `/application-config` and `/i18n/labels` request, and the\n * companion seeds an entry under exactly this key so the engine's `ApplicationConfigController` can\n * answer instead of refusing with `app_configuration_unknown_frontend_service`.\n *\n * Two string literals in two packages would compile perfectly and fail at runtime with an error that\n * names neither of them.\n */\nexport const WORKBENCH_FRONTEND_SERVICE_NAME = 'application-creation-workbench';\n"]}
1
+ {"version":3,"file":"workbench-resources-types.custom.shared.schemas.js","sourceRoot":"","sources":["../../../../src/workbench/workbench-resources-types.custom.shared.schemas.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The workbench's own resource vocabulary.\n *\n * A SEPARATE enum and factory map from `CustomShared_ResourceType`, deliberately. That map has six\n * consumers, two of which must not receive these: `platform-apps-manager` (which would register\n * resources it has no use for, and whose INIT lifecycle applies migrations) and the companion's i18n\n * labelling planner, which enumerates `Object.keys(...)` and would generate labels for them.\n *\n * These resources are INTROSPECTION-backed: nothing is stored, nothing is migrated, and only the\n * companion can serve them.\n */\nexport enum WorkbenchShared_ResourceType {\n /**\n * The application's domain model as ONE row per resource — module membership, specification prose\n * and the relationships that resource participates in, all in the same row.\n *\n * ## Why ONE resource rather than a module list beside an edge list\n *\n * It replaced exactly that, on 2026-08-31. `workbenchApplicationModules` and\n * `workbenchResourceRelationships` were projections of DIFFERENT companion behaviors on DIFFERENT\n * targets, so a graph drawn from both was drawn from two subprocess runs against a working tree an\n * operator is editing — its nodes could describe one state of the application and its edges the\n * next, with nothing able to detect it. The `application-domain-model` behavior answers all four\n * facts from a single import, which is the only shape in which \"resources, their relationships and\n * their module membership\" is internally consistent.\n *\n * The two were kept for a while on the argument that a flat module list and a flat edge list\n * answered two narrower questions this one did not. Both were then closed rather than argued: every\n * per-edge field the relationships table carried — `isDisabled`, `accessScopeStrategy`,\n * `parentResourceRequirement`, `primaryScope`, `allowCycle` — now rides in\n * `Workbench_DomainResourceRelationship`, and `isDisabled` in particular was a defect while it was\n * missing rather than a gap, because the graph drew a disabled edge exactly like a live one.\n *\n * One thing genuinely did NOT survive, and it is recorded here rather than in a commit message: a\n * module registering ZERO resources produces no row, so it has no node. Wonder CRM's `engine`\n * module is exactly that. The judgement was that a module contributing nothing to the DOMAIN has no\n * place in a domain model, and that engine-scaffolding modules are what\n * `workbenchSpecificationArtifacts` is for — not that the case was overlooked.\n */\n DOMAIN_RESOURCES = 'workbenchDomainResources',\n /**\n * Every application-specification family the journey produces that is NOT the application's own\n * structure — the vision, the market, the requirements, the roadmap, the obligations — as one row\n * each, carrying the artifact rendered for a human to read.\n *\n * ## Why the PRODUCT half needed its own resource\n *\n * The three siblings above all project the application's STRUCTURE: modules, edges, resources.\n * None of them can carry a vision brief, because a vision brief is not a resource, an edge or a\n * module — it is a prose document about the product the application is meant to be. Those\n * documents were reachable only by opening a TypeScript file in an editor, which is not a product\n * (issue #162).\n *\n * ## Why one resource rather than one per family\n *\n * The families are heterogeneous, and the two failure modes are symmetric: one destination per\n * family risks a dozen half-built pages, one destination navigating all of them risks a\n * lowest-common-denominator renderer. The answer taken is one destination whose rows are DERIVED\n * from `APPLICATION_SPECIFICATION_SEMANTIC_SCHEMA_BINDINGS` — so the population cannot drift from\n * the authority — grouped by the question each family answers, with an outline renderer as the\n * floor and the artifacts already committed beside a family (`DIAGRAM.md`, `DECISIONS.md`)\n * surfaced verbatim on top of it. The decision and its rejected alternatives are recorded on\n * issue #162.\n */\n SPECIFICATION_ARTIFACTS = 'workbenchSpecificationArtifacts',\n\n /*\n * ── FAMILY ASPECT RESOURCES ──────────────────────────────────────────────────────────────────\n *\n * One resource per SECOND-LEVEL aspect of a specification family (the vision's success\n * criteria, the market's ICPs, the roadmap's phases, …), so the product graph the snapshots\n * flatten becomes navigable. Their canonical declaration — item schemas, business keys, edges —\n * is `FAMILY_ASPECTS_REGISTRY` in `@wildo-ai/saas-specifications` (`_core/family-aspects.*`):\n * this enum and the descriptor table beside it are the SPINE's schema-agnostic transcription,\n * held to the registry by a companion-side parity test (the spine deliberately never imports\n * saas-specifications).\n *\n * Same nature as their two siblings above: INTROSPECTION-backed, derived per read from the\n * landed files, READ/LIST only. Their READ pages are NOT addressable — references open them as\n * POPUPS (decided 2026-09-01); the artifacts resource stays the primary surface.\n */\n /*\n * ── The CREATION PLANE (added 2026-09-01, `workbench-creation-board-resources.md` Phase 2) ──\n *\n * The four families below are NOT projections of the application's source: they are the\n * COMPANION'S OWN RUNTIME projections for the one application it serves — the playbook\n * eligibility board, the build-plan dispatch view, the run write-register and the execution\n * traces. They ride the same INTROSPECTION adapter through the same port, but their behaviors\n * materialize IN-PROCESS (no subprocess, no app-dist import), their binding declares the\n * `APPLICATION_RUNTIME` tenancy stance, and their read variants are AUTHENTICATED (`APP_USER`) —\n * the structural projections' `APP_PUBLIC` argument (\"anyone with the working tree can already\n * read this\") does not extend to runtime state.\n */\n /**\n * One row per compiled playbook, carrying its ELIGIBILITY VERDICT — can it run right now, and if\n * not, why not — plus the overwrite/stale annotations a creator weighs before dispatching.\n *\n * The rows are a projection of `listPlaybookEligibility()`, the ~10s recompute the creation\n * board's Playbooks pane renders; the companion serves them through a `{board, computedAt}` cache\n * so resource-surface consumers (RMM, lists) do not multiply the recompute. `computedAt` and the\n * derived journey `phase` are projected onto every row — board-level scalars become row fields,\n * because a resource row must be complete on its own.\n */\n PLAYBOOKS = 'workbenchPlaybooks',\n /**\n * One row per build-plan task, in the DISPATCH view: its status (`ready` / `landed` / `blocked`),\n * objective and target kind.\n *\n * DELIBERATELY THIN beside `ASPECT_BUILD_TASK` (`workbenchBuildTasks`), which projects the SAME\n * authored population from the specification artifact with its traceability edges. The two answer\n * different questions — the aspect answers \"what did the journey author\" (subprocess, from the\n * artifact), this one answers \"what can the dispatcher run next and what has landed\" (in-process,\n * computed against git by the dispatch service). Authored detail (skillRefs, serves edges) stays\n * on the aspect row sharing the same `taskRef`; duplicating it here would be a second enumeration\n * of the authored shape, one drift away from lying.\n */\n BUILD_PLAN_TASKS = 'workbenchBuildPlanTasks',\n /**\n * One row per playbook run's WRITE RECORD — which files it wrote, with `existedBefore` per file —\n * the evidence lane that makes every dispatch on the creation board revertable. Pre-image BYTES\n * are deliberately not projected (they belong to the revert mechanism, not to a list row).\n */\n RUN_WRITE_RECORDS = 'workbenchRunWriteRecords',\n /**\n * One row per execution-trace session — the session id, when it started, and how many events and\n * steps it recorded. The detail (events, artifacts) stays on the companion's trace routes for\n * now; this resource is the queryable index the board links from.\n */\n TRACE_SESSIONS = 'workbenchTraceSessions',\n ASPECT_VISION_IDEA = 'workbenchVisionIdeas',\n ASPECT_VISION_PROBLEM = 'workbenchVisionProblems',\n ASPECT_VISION_MISSION = 'workbenchVisionMissions',\n ASPECT_VISION_SUCCESS_CRITERION = 'workbenchVisionSuccessCriteria',\n ASPECT_VISION_CONSTRAINT = 'workbenchVisionConstraints',\n ASPECT_MARKET_CATEGORY = 'workbenchMarketCategories',\n ASPECT_MARKET_ICP = 'workbenchMarketIcps',\n ASPECT_MARKET_PERSONA = 'workbenchMarketPersonas',\n ASPECT_MARKET_JOB = 'workbenchMarketJobs',\n ASPECT_MARKET_PAIN = 'workbenchMarketPains',\n ASPECT_MARKET_GAIN = 'workbenchMarketGains',\n ASPECT_MARKET_TONE_OF_VOICE = 'workbenchMarketTonesOfVoice',\n ASPECT_MARKET_BENEFIT = 'workbenchMarketBenefits',\n ASPECT_MARKET_POSITIONING = 'workbenchMarketPositionings',\n ASPECT_MARKET_CHANNEL = 'workbenchMarketChannels',\n ASPECT_MARKET_ALTERNATIVE = 'workbenchMarketAlternatives',\n ASPECT_MARKET_TRIGGER = 'workbenchMarketTriggers',\n ASPECT_MARKET_BUYING_JOURNEY = 'workbenchMarketBuyingJourneys',\n ASPECT_MARKET_PROOF = 'workbenchMarketProofs',\n ASPECT_MARKET_OBJECTION = 'workbenchMarketObjections',\n ASPECT_MARKET_MESSAGE_TEMPLATE = 'workbenchMarketMessageTemplates',\n ASPECT_REQUIREMENT_FUNCTIONAL = 'workbenchFunctionalRequirements',\n ASPECT_REQUIREMENT_NON_FUNCTIONAL = 'workbenchNonFunctionalRequirements',\n ASPECT_FEATURE_DRAFT = 'workbenchFeatureDrafts',\n ASPECT_ROADMAP_PHASE = 'workbenchRoadmapPhases',\n ASPECT_PRICING_PLAN = 'workbenchPricingPlans',\n ASPECT_BRAND_NAME = 'workbenchBrandNames',\n ASPECT_BRAND_LOGO_DIRECTION = 'workbenchBrandLogoDirections',\n ASPECT_BRAND_VISUAL_TONE = 'workbenchBrandVisualTones',\n ASPECT_BRAND_ASSET = 'workbenchBrandAssets',\n ASPECT_DOMAIN_PLAN_MODULE = 'workbenchDomainPlanModules',\n ASPECT_DOMAIN_PLAN_RELATIONSHIP = 'workbenchDomainPlanRelationships',\n ASPECT_BUILD_TASK = 'workbenchBuildTasks',\n ASPECT_PLACEMENT_GROUP = 'workbenchPlacementGroups',\n ASPECT_PLACEMENT_DECISION = 'workbenchPlacementDecisions',\n ASPECT_COMPLIANCE_CANDIDATE_SECTION = 'workbenchComplianceCandidateSections',\n ASPECT_COMPLIANCE_CANDIDATE_VARIANT_SELECTION = 'workbenchComplianceCandidateVariantSelections',\n ASPECT_DOCUMENT_FACT_DECLARATION = 'workbenchDocumentFactDeclarations',\n ASPECT_AUTHORED_DOCUMENT_FACT_DECLARATION = 'workbenchAuthoredDocumentFactDeclarations',\n ASPECT_PROCESSOR_REGISTER_ENTRY = 'workbenchProcessorRegisterEntries',\n ASPECT_RELEASE_POLICY_SELECTION = 'workbenchReleasePolicySelections',\n ASPECT_DOCUMENT_PUBLICATION_VARIANT = 'workbenchDocumentPublicationVariants',\n}\n\n/**\n * The field each resource is ADDRESSED BY — and it must be a field the rows actually carry.\n *\n * ## The rule, and the defect that produced it\n *\n * A convention-shaped name declared here that no row carries makes every consumer addressing a row\n * THROUGH this map look for a field that does not exist. The resource this was measured on\n * (`workbenchApplicationModules`, removed 2026-08-31) declared `workbenchApplicationModuleId` while\n * its schema, its behavior and its `identityFields` all said `moduleId`.\n *\n * READ still worked, which is what kept it hidden: the adapter filters by `identityFields`, so the\n * addressed route answered 200 while the frontend list refused every row click with \"could not\n * resolve resource id from list item\" — the id it was told to read was absent from the item. A green\n * addressed READ is therefore NOT evidence that this map is right; the list row click is.\n *\n * So an entry here is either the source's OWN key, or a name COMPOSED by `identityFields` and\n * declared as a real field of the schema. Never a name that merely follows the convention.\n */\nexport const WorkbenchShared_ResourceFieldIdentifier: { [key in WorkbenchShared_ResourceType]: string } = {\n /*\n * COMPOSED from `resourceType`, following the relationships sibling rather than the modules one.\n *\n * The behavior's rows do carry `resourceType`, so the source's own key could have been used\n * directly — as `moduleId` is. It is composed instead because `resourceType` is a name the FIELD\n * IDENTIFIER MAP would then publish globally: that map is merged with the engine's and consumed by\n * `buildFieldIdentifierToResourceTypeMap`, which resolves a foreign-key field NAME to the resource\n * it points at. A generic identifier there is a name any application could collide with, on a map\n * whose whole job is that names are unambiguous.\n */\n [WorkbenchShared_ResourceType.DOMAIN_RESOURCES]: 'workbenchDomainResourceId',\n /*\n * The FAMILY id, which is the source's own key — the `moduleId` case rather than the composed one.\n *\n * A family id (`vision-brief`, `compliance-program`) is unique by construction: the semantic\n * authority is a map keyed by it. And unlike `resourceType`, it is not a name any application's\n * foreign-key field could collide with on the global field-identifier map, so there is nothing for\n * a composed name to protect against here.\n */\n [WorkbenchShared_ResourceType.SPECIFICATION_ARTIFACTS]: 'family',\n /*\n * Aspect identifiers are all COMPOSED (`workbenchMarketIcpId`), for the same reason as\n * DOMAIN_RESOURCES: the raw business-key field is `ref` on most aspects — a name applications\n * collide with constantly — and this map publishes globally. The projection emits the composed\n * field on every row (value = the business key, the aspect key for singletons, or the indexed\n * fallback), so the \"a name the rows actually carry\" rule above holds.\n */\n /*\n * The creation-plane identifiers are all COMPOSED (`workbenchPlaybookId` from `playbookRef`, …):\n * the raw business keys (`playbookRef`, `taskRef`, `runId`, `sessionId`) are names an\n * application's own foreign-key fields could collide with on the global field-identifier map,\n * which is the same reason DOMAIN_RESOURCES composes. Unlike DOMAIN_RESOURCES the field is\n * EMITTED BY THE BEHAVIOR rather than composed by `identityFields` — composition refuses any\n * value outside `[a-zA-Z0-9_-]`, and playbook refs (`top_down.phase-gate`) and trace session ids\n * legitimately carry dots — so the projection service sanitizes and duplicate-checks. The \"a name\n * the rows actually carry\" rule holds either way.\n */\n [WorkbenchShared_ResourceType.PLAYBOOKS]: 'workbenchPlaybookId',\n [WorkbenchShared_ResourceType.BUILD_PLAN_TASKS]: 'workbenchBuildPlanTaskId',\n [WorkbenchShared_ResourceType.RUN_WRITE_RECORDS]: 'workbenchRunWriteRecordId',\n [WorkbenchShared_ResourceType.TRACE_SESSIONS]: 'workbenchTraceSessionId',\n [WorkbenchShared_ResourceType.ASPECT_VISION_IDEA]: 'workbenchVisionIdeaId',\n [WorkbenchShared_ResourceType.ASPECT_VISION_PROBLEM]: 'workbenchVisionProblemId',\n [WorkbenchShared_ResourceType.ASPECT_VISION_MISSION]: 'workbenchVisionMissionId',\n [WorkbenchShared_ResourceType.ASPECT_VISION_SUCCESS_CRITERION]: 'workbenchVisionSuccessCriterionId',\n [WorkbenchShared_ResourceType.ASPECT_VISION_CONSTRAINT]: 'workbenchVisionConstraintId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_CATEGORY]: 'workbenchMarketCategoryId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_ICP]: 'workbenchMarketIcpId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_PERSONA]: 'workbenchMarketPersonaId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_JOB]: 'workbenchMarketJobId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_PAIN]: 'workbenchMarketPainId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_GAIN]: 'workbenchMarketGainId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_TONE_OF_VOICE]: 'workbenchMarketToneOfVoiceId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_BENEFIT]: 'workbenchMarketBenefitId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_POSITIONING]: 'workbenchMarketPositioningId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_CHANNEL]: 'workbenchMarketChannelId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_ALTERNATIVE]: 'workbenchMarketAlternativeId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_TRIGGER]: 'workbenchMarketTriggerId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_BUYING_JOURNEY]: 'workbenchMarketBuyingJourneyId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_PROOF]: 'workbenchMarketProofId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_OBJECTION]: 'workbenchMarketObjectionId',\n [WorkbenchShared_ResourceType.ASPECT_MARKET_MESSAGE_TEMPLATE]: 'workbenchMarketMessageTemplateId',\n [WorkbenchShared_ResourceType.ASPECT_REQUIREMENT_FUNCTIONAL]: 'workbenchFunctionalRequirementId',\n [WorkbenchShared_ResourceType.ASPECT_REQUIREMENT_NON_FUNCTIONAL]: 'workbenchNonFunctionalRequirementId',\n [WorkbenchShared_ResourceType.ASPECT_FEATURE_DRAFT]: 'workbenchFeatureDraftId',\n [WorkbenchShared_ResourceType.ASPECT_ROADMAP_PHASE]: 'workbenchRoadmapPhaseId',\n [WorkbenchShared_ResourceType.ASPECT_PRICING_PLAN]: 'workbenchPricingPlanId',\n [WorkbenchShared_ResourceType.ASPECT_BRAND_NAME]: 'workbenchBrandNameId',\n [WorkbenchShared_ResourceType.ASPECT_BRAND_LOGO_DIRECTION]: 'workbenchBrandLogoDirectionId',\n [WorkbenchShared_ResourceType.ASPECT_BRAND_VISUAL_TONE]: 'workbenchBrandVisualToneId',\n [WorkbenchShared_ResourceType.ASPECT_BRAND_ASSET]: 'workbenchBrandAssetId',\n [WorkbenchShared_ResourceType.ASPECT_DOMAIN_PLAN_MODULE]: 'workbenchDomainPlanModuleId',\n [WorkbenchShared_ResourceType.ASPECT_DOMAIN_PLAN_RELATIONSHIP]: 'workbenchDomainPlanRelationshipId',\n [WorkbenchShared_ResourceType.ASPECT_BUILD_TASK]: 'workbenchBuildTaskId',\n [WorkbenchShared_ResourceType.ASPECT_PLACEMENT_GROUP]: 'workbenchPlacementGroupId',\n [WorkbenchShared_ResourceType.ASPECT_PLACEMENT_DECISION]: 'workbenchPlacementDecisionId',\n [WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_CANDIDATE_SECTION]: 'workbenchComplianceCandidateSectionId',\n [WorkbenchShared_ResourceType.ASPECT_COMPLIANCE_CANDIDATE_VARIANT_SELECTION]: 'workbenchComplianceCandidateVariantSelectionId',\n [WorkbenchShared_ResourceType.ASPECT_DOCUMENT_FACT_DECLARATION]: 'workbenchDocumentFactDeclarationId',\n [WorkbenchShared_ResourceType.ASPECT_AUTHORED_DOCUMENT_FACT_DECLARATION]: 'workbenchAuthoredDocumentFactDeclarationId',\n [WorkbenchShared_ResourceType.ASPECT_PROCESSOR_REGISTER_ENTRY]: 'workbenchProcessorRegisterEntryId',\n [WorkbenchShared_ResourceType.ASPECT_RELEASE_POLICY_SELECTION]: 'workbenchReleasePolicySelectionId',\n [WorkbenchShared_ResourceType.ASPECT_DOCUMENT_PUBLICATION_VARIANT]: 'workbenchDocumentPublicationVariantId',\n};\n\n/**\n * The frontend-service name the application-creation workbench identifies itself by.\n *\n * Shared because BOTH sides must agree and neither owns it alone: the workbench sends it as\n * `VITE_FRONTEND_SERVICE_NAME` on every `/application-config` and `/i18n/labels` request, and the\n * companion seeds an entry under exactly this key so the engine's `ApplicationConfigController` can\n * answer instead of refusing with `app_configuration_unknown_frontend_service`.\n *\n * Two string literals in two packages would compile perfectly and fail at runtime with an error that\n * names neither of them.\n */\nexport const WORKBENCH_FRONTEND_SERVICE_NAME = 'application-creation-workbench';\n"]}