@ixo/topic-protocol 0.7.0 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -2
- package/dist/schemas/action-receipt.schema.json +105 -11
- package/dist/schemas/decision-to-pay-template-v2.schema.json +301 -0
- package/dist/schemas/decision-to-pay-template.schema.json +346 -0
- package/dist/schemas/payable-obligation-v2.schema.json +319 -0
- package/dist/schemas/payable-obligation.schema.json +312 -0
- package/dist/schemas/payment-terms-v2.schema.json +238 -0
- package/dist/schemas/payment-terms.schema.json +287 -0
- package/dist/schemas/topic-action-request.schema.json +30 -0
- package/dist/schemas/topic-contract-body.schema.json +66 -0
- package/dist/schemas/topic-contract-state.schema.json +70 -276
- package/dist/schemas/topic-flow-binding.schema.json +28 -0
- package/dist/schemas/topic-kind-profile.schema.json +32 -2
- package/dist/schemas/topic-operation.schema.json +2 -2
- package/dist/schemas/topic-recipe.schema.json +19 -0
- package/dist/schemas/topic-root.schema.json +17 -1
- package/dist/schemas/topic-shape.schema.json +79 -0
- package/dist/src/action-runtime/types.d.ts +101 -0
- package/dist/src/action-runtime/types.js +12 -0
- package/dist/src/action-runtime/types.js.map +1 -0
- package/dist/src/contracts/schemas.d.ts +4706 -966
- package/dist/src/contracts/schemas.js +22 -0
- package/dist/src/contracts/schemas.js.map +1 -1
- package/dist/src/contracts/topic-contract.d.ts +38 -6
- package/dist/src/contracts/topic-contract.js +3 -1
- package/dist/src/contracts/topic-contract.js.map +1 -1
- package/dist/src/contracts/topic-kind-profile.d.ts +29 -0
- package/dist/src/contracts/topic-kind-profile.js +31 -0
- package/dist/src/contracts/topic-kind-profile.js.map +1 -1
- package/dist/src/errors.d.ts +1 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +12 -3
- package/dist/src/index.js +11 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/projector/payload.d.ts +18 -0
- package/dist/src/projector/payload.js +57 -1
- package/dist/src/projector/payload.js.map +1 -1
- package/dist/src/projector/state.js +144 -0
- package/dist/src/projector/state.js.map +1 -1
- package/dist/src/projector/types.d.ts +22 -4
- package/dist/src/projector/types.js.map +1 -1
- package/dist/src/shapes/canonical.d.ts +2 -0
- package/dist/src/shapes/canonical.js +20 -0
- package/dist/src/shapes/canonical.js.map +1 -0
- package/dist/src/shapes/claims.d.ts +12 -0
- package/dist/src/shapes/claims.js +20 -0
- package/dist/src/shapes/claims.js.map +1 -0
- package/dist/src/shapes/now.d.ts +2 -0
- package/dist/src/shapes/now.js +42 -0
- package/dist/src/shapes/now.js.map +1 -0
- package/dist/src/shapes/progress.d.ts +3 -0
- package/dist/src/shapes/progress.js +176 -0
- package/dist/src/shapes/progress.js.map +1 -0
- package/dist/src/shapes/recipes.d.ts +5 -0
- package/dist/src/shapes/recipes.js +337 -0
- package/dist/src/shapes/recipes.js.map +1 -0
- package/dist/src/shapes/resolver.d.ts +14 -0
- package/dist/src/shapes/resolver.js +111 -0
- package/dist/src/shapes/resolver.js.map +1 -0
- package/dist/src/shapes/state.d.ts +53 -0
- package/dist/src/shapes/state.js +2 -0
- package/dist/src/shapes/state.js.map +1 -0
- package/dist/src/shapes/types.d.ts +241 -0
- package/dist/src/shapes/types.js +42 -0
- package/dist/src/shapes/types.js.map +1 -0
- package/package.json +6 -2
- package/recipes/README.md +12 -0
- package/recipes/agent-delivery.json +607 -0
- package/recipes/registry.json +41 -0
- package/recipes/research-brief.json +460 -0
- package/recipes/verified-work-payment.json +663 -0
- package/templates/decision-to-pay/README.md +67 -0
- package/templates/decision-to-pay/milestone-payment-release.template.json +195 -0
- package/templates/decision-to-pay/outcome-payment-claim.template.json +198 -0
- package/templates/decision-to-pay/payment-on-delivery.template.json +198 -0
- package/templates/decision-to-pay/verified-work-payment.template.json +283 -0
- package/templates/decision-to-pay/verified-work-payment.v0.2.template.json +319 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
export declare const SHAPE_PHASES: readonly ["forming", "working", "verifying", "deciding", "effecting", "settling", "complete", "dormant"];
|
|
2
|
+
export declare const SHAPE_CONDITIONS: readonly ["on-track", "needs-input", "needs-acceptance", "waiting", "blocked", "failed", "disputed", "degraded"];
|
|
3
|
+
export declare const SHAPE_ATTENTION_STATES: readonly ["none", "viewer-action-required", "viewer-review-required", "viewer-confirmation-required"];
|
|
4
|
+
export declare const BASE_RECIPE_CODES: readonly ["project", "flow", "proposal", "evaluation", "claims", "research", "discussion", "incident"];
|
|
5
|
+
export declare const TOPIC_RECIPE_CODES: readonly ["research-brief", "agent-delivery", "verified-work-payment"];
|
|
6
|
+
export type ShapePhaseV1 = (typeof SHAPE_PHASES)[number];
|
|
7
|
+
export type ShapeConditionV1 = (typeof SHAPE_CONDITIONS)[number];
|
|
8
|
+
export type ShapeAttentionV1 = (typeof SHAPE_ATTENTION_STATES)[number];
|
|
9
|
+
export type BaseRecipeCodeV1 = (typeof BASE_RECIPE_CODES)[number];
|
|
10
|
+
export type TopicRecipeCodeV1 = (typeof TOPIC_RECIPE_CODES)[number];
|
|
11
|
+
export type ShapeConsequenceClassV1 = "none" | "shared-state" | "external-effect" | "settlement";
|
|
12
|
+
export type ShapeConfirmationPolicyV1 = "none" | "viewer" | "authority";
|
|
13
|
+
export type ShapeEvidenceRequirementV1 = {
|
|
14
|
+
readonly kind: "operation" | "record" | "receipt";
|
|
15
|
+
readonly type: string;
|
|
16
|
+
readonly finality?: "observed" | "accepted" | "verified" | "final";
|
|
17
|
+
};
|
|
18
|
+
export type ShapeGateV1 = {
|
|
19
|
+
readonly kind: "field";
|
|
20
|
+
readonly path: string;
|
|
21
|
+
readonly predicate: "present" | "accepted";
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: "field-any";
|
|
24
|
+
readonly paths: readonly string[];
|
|
25
|
+
readonly predicate: "present" | "accepted";
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "record";
|
|
28
|
+
readonly type: string;
|
|
29
|
+
readonly status?: string;
|
|
30
|
+
} | {
|
|
31
|
+
readonly kind: "receipt";
|
|
32
|
+
readonly type: string;
|
|
33
|
+
readonly status?: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly kind: "axis";
|
|
36
|
+
readonly axis: string;
|
|
37
|
+
readonly states: readonly string[];
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: "binding";
|
|
40
|
+
readonly type: "flow" | "claim" | "resource";
|
|
41
|
+
} | {
|
|
42
|
+
readonly kind: "condition";
|
|
43
|
+
readonly states: readonly ("waiting" | "blocked" | "failed" | "disputed")[];
|
|
44
|
+
};
|
|
45
|
+
export interface ShapeStateDefinitionV1 {
|
|
46
|
+
readonly code: string;
|
|
47
|
+
readonly labelKey?: string;
|
|
48
|
+
readonly terminal?: boolean;
|
|
49
|
+
readonly condition?: ShapeConditionV1;
|
|
50
|
+
}
|
|
51
|
+
export interface ShapeStateAxisV1 {
|
|
52
|
+
readonly code: string;
|
|
53
|
+
readonly phase: ShapePhaseV1;
|
|
54
|
+
readonly required: boolean;
|
|
55
|
+
readonly initialState: string;
|
|
56
|
+
readonly states: readonly ShapeStateDefinitionV1[];
|
|
57
|
+
}
|
|
58
|
+
export interface ShapeTransitionV1 {
|
|
59
|
+
readonly code: string;
|
|
60
|
+
readonly phase: ShapePhaseV1;
|
|
61
|
+
readonly predecessor: {
|
|
62
|
+
readonly axis: string;
|
|
63
|
+
readonly state: string;
|
|
64
|
+
};
|
|
65
|
+
readonly target: {
|
|
66
|
+
readonly axis: string;
|
|
67
|
+
readonly state: string;
|
|
68
|
+
};
|
|
69
|
+
readonly command: string;
|
|
70
|
+
readonly requiredAbility: string;
|
|
71
|
+
readonly assignedTo: {
|
|
72
|
+
readonly kind: "actor" | "role";
|
|
73
|
+
readonly value: string;
|
|
74
|
+
};
|
|
75
|
+
readonly gates: readonly ShapeGateV1[];
|
|
76
|
+
readonly confirmation: ShapeConfirmationPolicyV1;
|
|
77
|
+
readonly consequence: ShapeConsequenceClassV1;
|
|
78
|
+
readonly evidence: ShapeEvidenceRequirementV1;
|
|
79
|
+
readonly completesTopic?: boolean;
|
|
80
|
+
readonly handoff?: {
|
|
81
|
+
readonly kind: "flow" | "resource";
|
|
82
|
+
readonly binding: string;
|
|
83
|
+
};
|
|
84
|
+
readonly presentation?: {
|
|
85
|
+
readonly reasonCode: string;
|
|
86
|
+
readonly actionLabelKey?: string;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export interface ShapeProgressRuleV1 {
|
|
90
|
+
readonly code: string;
|
|
91
|
+
readonly condition: Exclude<ShapeConditionV1, "on-track" | "degraded">;
|
|
92
|
+
readonly priority: number;
|
|
93
|
+
readonly source: {
|
|
94
|
+
readonly kind: "axis" | "record" | "receipt" | "topic";
|
|
95
|
+
readonly value: string;
|
|
96
|
+
};
|
|
97
|
+
readonly states?: readonly string[];
|
|
98
|
+
readonly requiresTarget?: boolean;
|
|
99
|
+
}
|
|
100
|
+
export interface TopicShapeV1 {
|
|
101
|
+
readonly version: 1;
|
|
102
|
+
readonly code: string;
|
|
103
|
+
readonly axes: readonly ShapeStateAxisV1[];
|
|
104
|
+
readonly transitions: readonly ShapeTransitionV1[];
|
|
105
|
+
readonly progressRules: readonly ShapeProgressRuleV1[];
|
|
106
|
+
readonly inferredRecordPolicy: {
|
|
107
|
+
readonly autoAccept: readonly string[];
|
|
108
|
+
readonly neverAutoAccept: readonly string[];
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export type TopicShapeOverlayV1 = Omit<TopicShapeV1, "axes" | "transitions" | "progressRules"> & {
|
|
112
|
+
readonly axes?: readonly ShapeStateAxisV1[];
|
|
113
|
+
readonly transitions?: readonly ShapeTransitionV1[];
|
|
114
|
+
readonly progressRules?: readonly ShapeProgressRuleV1[];
|
|
115
|
+
};
|
|
116
|
+
export interface TopicShapeSourceRefV1 {
|
|
117
|
+
readonly kind: "base-recipe" | "topic-recipe" | "kind" | "topic";
|
|
118
|
+
readonly id: string;
|
|
119
|
+
readonly version: string;
|
|
120
|
+
readonly digest: `sha256:${string}`;
|
|
121
|
+
}
|
|
122
|
+
export interface TopicRecipeRefV1 {
|
|
123
|
+
readonly id: string;
|
|
124
|
+
readonly version: string;
|
|
125
|
+
readonly digest: `sha256:${string}`;
|
|
126
|
+
}
|
|
127
|
+
export interface TopicRecipeV1 {
|
|
128
|
+
readonly version: 1;
|
|
129
|
+
readonly code: TopicRecipeCodeV1;
|
|
130
|
+
readonly id: string;
|
|
131
|
+
readonly recipeVersion: string;
|
|
132
|
+
readonly label: string;
|
|
133
|
+
readonly description: string;
|
|
134
|
+
readonly baseRecipe: BaseRecipeCodeV1;
|
|
135
|
+
readonly creates: "draft";
|
|
136
|
+
readonly shape: TopicShapeV1;
|
|
137
|
+
}
|
|
138
|
+
export interface EffectiveTopicShapeV1 {
|
|
139
|
+
readonly version: 1;
|
|
140
|
+
readonly shape: TopicShapeV1;
|
|
141
|
+
readonly sources: readonly TopicShapeSourceRefV1[];
|
|
142
|
+
readonly digest: `sha256:${string}`;
|
|
143
|
+
}
|
|
144
|
+
export interface TopicClaimBindingV1 {
|
|
145
|
+
readonly entityDid: string;
|
|
146
|
+
readonly collectionId: string;
|
|
147
|
+
}
|
|
148
|
+
export interface ResolvedTopicClaimBindingV1 extends TopicClaimBindingV1 {
|
|
149
|
+
readonly protocolDid: string;
|
|
150
|
+
readonly rubric: {
|
|
151
|
+
readonly id: string;
|
|
152
|
+
readonly digest?: `sha256:${string}`;
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
export interface TopicProgressSourceV1 {
|
|
156
|
+
readonly kind: "operation" | "record" | "receipt";
|
|
157
|
+
readonly type: string;
|
|
158
|
+
readonly id: string;
|
|
159
|
+
readonly status?: string;
|
|
160
|
+
readonly finality?: "observed" | "accepted" | "verified" | "final";
|
|
161
|
+
}
|
|
162
|
+
export interface TopicProgressBlockV1 {
|
|
163
|
+
readonly condition: "waiting" | "blocked" | "failed" | "disputed";
|
|
164
|
+
readonly sourceId: string;
|
|
165
|
+
readonly target: {
|
|
166
|
+
readonly kind: "actor" | "flow" | "resource" | "external";
|
|
167
|
+
readonly id: string;
|
|
168
|
+
};
|
|
169
|
+
readonly reasonCode: string;
|
|
170
|
+
}
|
|
171
|
+
export interface TopicProgressInputV1 {
|
|
172
|
+
readonly topicId: string;
|
|
173
|
+
readonly topicRevision: string;
|
|
174
|
+
readonly contractRevision: string;
|
|
175
|
+
readonly status: "draft" | "active" | "resolved" | "archived" | "redirected";
|
|
176
|
+
readonly shape?: EffectiveTopicShapeV1;
|
|
177
|
+
readonly historyCompatible: boolean;
|
|
178
|
+
readonly axisStates: Readonly<Record<string, string>>;
|
|
179
|
+
readonly sources: readonly TopicProgressSourceV1[];
|
|
180
|
+
readonly presentFields?: readonly string[];
|
|
181
|
+
readonly acceptedFields?: readonly string[];
|
|
182
|
+
readonly bindings?: readonly ("flow" | "claim" | "resource")[];
|
|
183
|
+
readonly actorAssignments?: Readonly<Record<string, readonly string[]>>;
|
|
184
|
+
readonly block?: TopicProgressBlockV1;
|
|
185
|
+
}
|
|
186
|
+
export interface TopicStateTagV1 {
|
|
187
|
+
readonly code: string;
|
|
188
|
+
readonly source: {
|
|
189
|
+
readonly axis: string;
|
|
190
|
+
readonly state: string;
|
|
191
|
+
} | {
|
|
192
|
+
readonly progressRule: string;
|
|
193
|
+
};
|
|
194
|
+
readonly priority: number;
|
|
195
|
+
readonly tone: "neutral" | "info" | "attention" | "warning" | "critical" | "positive";
|
|
196
|
+
readonly provenance: readonly string[];
|
|
197
|
+
}
|
|
198
|
+
export interface TopicTransitionCandidateV1 {
|
|
199
|
+
readonly transition: ShapeTransitionV1;
|
|
200
|
+
readonly assignedActor?: string;
|
|
201
|
+
readonly gateStatus: readonly {
|
|
202
|
+
readonly gate: ShapeGateV1;
|
|
203
|
+
readonly satisfied: boolean;
|
|
204
|
+
}[];
|
|
205
|
+
}
|
|
206
|
+
export interface TopicProgressProjectionV1 {
|
|
207
|
+
readonly version: 1;
|
|
208
|
+
readonly topicId: string;
|
|
209
|
+
readonly topicRevision: string;
|
|
210
|
+
readonly contractRevision: string;
|
|
211
|
+
readonly shapeDigest: `sha256:${string}`;
|
|
212
|
+
readonly phase: ShapePhaseV1;
|
|
213
|
+
readonly condition: ShapeConditionV1;
|
|
214
|
+
readonly reasonCode: string;
|
|
215
|
+
readonly axisStates: Readonly<Record<string, string>>;
|
|
216
|
+
readonly stateTags: readonly TopicStateTagV1[];
|
|
217
|
+
readonly candidates: readonly TopicTransitionCandidateV1[];
|
|
218
|
+
readonly provenance: readonly string[];
|
|
219
|
+
readonly block?: TopicProgressBlockV1;
|
|
220
|
+
}
|
|
221
|
+
export interface TopicViewerAuthorityV1 {
|
|
222
|
+
readonly viewerId: string;
|
|
223
|
+
readonly matrixWrite: boolean;
|
|
224
|
+
readonly verifiedAbilities: readonly string[];
|
|
225
|
+
readonly roleAssignments: Readonly<Record<string, readonly string[]>>;
|
|
226
|
+
}
|
|
227
|
+
export interface TopicNowProjectionV1 {
|
|
228
|
+
readonly version: 1;
|
|
229
|
+
readonly phase: ShapePhaseV1;
|
|
230
|
+
readonly condition: ShapeConditionV1;
|
|
231
|
+
readonly attention: ShapeAttentionV1;
|
|
232
|
+
readonly reasonCode: string;
|
|
233
|
+
readonly stateTags: readonly TopicStateTagV1[];
|
|
234
|
+
readonly transitions: readonly ShapeTransitionV1[];
|
|
235
|
+
readonly cacheKey: {
|
|
236
|
+
readonly topicRevision: string;
|
|
237
|
+
readonly contractRevision: string;
|
|
238
|
+
readonly shapeDigest: `sha256:${string}`;
|
|
239
|
+
};
|
|
240
|
+
readonly blockedOn?: TopicProgressBlockV1["target"];
|
|
241
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const SHAPE_PHASES = [
|
|
2
|
+
"forming",
|
|
3
|
+
"working",
|
|
4
|
+
"verifying",
|
|
5
|
+
"deciding",
|
|
6
|
+
"effecting",
|
|
7
|
+
"settling",
|
|
8
|
+
"complete",
|
|
9
|
+
"dormant",
|
|
10
|
+
];
|
|
11
|
+
export const SHAPE_CONDITIONS = [
|
|
12
|
+
"on-track",
|
|
13
|
+
"needs-input",
|
|
14
|
+
"needs-acceptance",
|
|
15
|
+
"waiting",
|
|
16
|
+
"blocked",
|
|
17
|
+
"failed",
|
|
18
|
+
"disputed",
|
|
19
|
+
"degraded",
|
|
20
|
+
];
|
|
21
|
+
export const SHAPE_ATTENTION_STATES = [
|
|
22
|
+
"none",
|
|
23
|
+
"viewer-action-required",
|
|
24
|
+
"viewer-review-required",
|
|
25
|
+
"viewer-confirmation-required",
|
|
26
|
+
];
|
|
27
|
+
export const BASE_RECIPE_CODES = [
|
|
28
|
+
"project",
|
|
29
|
+
"flow",
|
|
30
|
+
"proposal",
|
|
31
|
+
"evaluation",
|
|
32
|
+
"claims",
|
|
33
|
+
"research",
|
|
34
|
+
"discussion",
|
|
35
|
+
"incident",
|
|
36
|
+
];
|
|
37
|
+
export const TOPIC_RECIPE_CODES = [
|
|
38
|
+
"research-brief",
|
|
39
|
+
"agent-delivery",
|
|
40
|
+
"verified-work-payment",
|
|
41
|
+
];
|
|
42
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shapes/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS;IACT,SAAS;IACT,WAAW;IACX,UAAU;IACV,WAAW;IACX,UAAU;IACV,UAAU;IACV,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,aAAa;IACb,kBAAkB;IAClB,SAAS;IACT,SAAS;IACT,QAAQ;IACR,UAAU;IACV,UAAU;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM;IACN,wBAAwB;IACxB,wBAAwB;IACxB,8BAA8B;CACtB,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,MAAM;IACN,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,UAAU;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,gBAAgB;IAChB,gBAAgB;IAChB,uBAAuB;CACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ixo/topic-protocol",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-rc.1",
|
|
4
4
|
"description": "Reference contracts and deterministic projection for IXO Topics",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
20
|
"profiles",
|
|
21
|
+
"recipes",
|
|
22
|
+
"templates",
|
|
21
23
|
"README.md"
|
|
22
24
|
],
|
|
23
25
|
"exports": {
|
|
@@ -26,7 +28,9 @@
|
|
|
26
28
|
"import": "./dist/src/index.js"
|
|
27
29
|
},
|
|
28
30
|
"./schemas/*": "./dist/schemas/*",
|
|
29
|
-
"./profiles/*": "./profiles/*"
|
|
31
|
+
"./profiles/*": "./profiles/*",
|
|
32
|
+
"./recipes/*": "./recipes/*",
|
|
33
|
+
"./templates/*": "./templates/*"
|
|
30
34
|
},
|
|
31
35
|
"scripts": {
|
|
32
36
|
"build": "tsc -p tsconfig.build.json",
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Topic Recipe registry
|
|
2
|
+
|
|
3
|
+
These digest-addressed Topic Recipes are Marketplace-ready release-candidate
|
|
4
|
+
artifacts. Every recipe creates a user-reviewable Draft; none grants authority
|
|
5
|
+
or executes its Flow bindings.
|
|
6
|
+
|
|
7
|
+
- `research-brief.json`
|
|
8
|
+
- `agent-delivery.json`
|
|
9
|
+
- `verified-work-payment.json`
|
|
10
|
+
|
|
11
|
+
`registry.json` publishes the corresponding immutable references. Consumers
|
|
12
|
+
must verify the recipe digest before resolving the Effective Topic Shape.
|