@substrat-run/contract-tests 0.134.0 → 0.135.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capability-suite.d.ts.map +1 -1
- package/dist/capability-suite.js +265 -0
- package/dist/capability-suite.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/modules.d.ts +271 -1
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +86 -2
- package/dist/modules.js.map +1 -1
- package/dist/schedule-entitlement-suite.d.ts +23 -0
- package/dist/schedule-entitlement-suite.d.ts.map +1 -0
- package/dist/schedule-entitlement-suite.js +98 -0
- package/dist/schedule-entitlement-suite.js.map +1 -0
- package/dist/scope-host-suite.d.ts.map +1 -1
- package/dist/scope-host-suite.js +71 -0
- package/dist/scope-host-suite.js.map +1 -1
- package/dist/timeline-suite.d.ts.map +1 -1
- package/dist/timeline-suite.js +119 -1
- package/dist/timeline-suite.js.map +1 -1
- package/package.json +3 -3
package/dist/modules.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* artifacts live here.
|
|
9
9
|
*/
|
|
10
10
|
import { z } from '@substrat-run/contracts';
|
|
11
|
-
import { type ModuleRegistration, type OperationHandler } from '@substrat-run/kernel';
|
|
11
|
+
import { type ModuleRegistration, type OperationContext, type OperationHandler } from '@substrat-run/kernel';
|
|
12
12
|
export declare const testModManifest: {
|
|
13
13
|
id: string & z.$brand<"ModuleId">;
|
|
14
14
|
version: string;
|
|
@@ -2042,6 +2042,276 @@ export declare const deniedScheduleModManifest: {
|
|
|
2042
2042
|
} | undefined;
|
|
2043
2043
|
};
|
|
2044
2044
|
export declare const deniedScheduleMod: ModuleRegistration;
|
|
2045
|
+
/**
|
|
2046
|
+
* #1654's ENGINE: a module composed by call into `composerMod`, with a SKU of its own
|
|
2047
|
+
* (`composed-engine`) that the suite's tenant never holds — the shape of `engine-absence`
|
|
2048
|
+
* inside meridian, whose install grants `meridian` and `protocol` but not `absence`.
|
|
2049
|
+
*
|
|
2050
|
+
* - `composed-engine/sweep` is its one declared schedule, checking the permission the
|
|
2051
|
+
* schedule grants. Fired through the system door, it must run without the engine's SKU.
|
|
2052
|
+
* - `composed-engine/manual` checks the SAME permission but is NOT a declared schedule, so
|
|
2053
|
+
* the system principal passes its `ctx.check` and only the SKU gate can refuse it. That
|
|
2054
|
+
* is the lever proving the exception covers declared schedules and nothing else the
|
|
2055
|
+
* system door can reach.
|
|
2056
|
+
*/
|
|
2057
|
+
export declare const composedEngineModManifest: {
|
|
2058
|
+
id: string & z.$brand<"ModuleId">;
|
|
2059
|
+
version: string;
|
|
2060
|
+
kernelContract: string;
|
|
2061
|
+
permissions: {
|
|
2062
|
+
key: string & z.$brand<"PermissionKey">;
|
|
2063
|
+
description: string;
|
|
2064
|
+
}[];
|
|
2065
|
+
events: {
|
|
2066
|
+
emits: {
|
|
2067
|
+
type: string;
|
|
2068
|
+
schemaVersion: number;
|
|
2069
|
+
}[];
|
|
2070
|
+
consumes: {
|
|
2071
|
+
type: string;
|
|
2072
|
+
schemaVersion: number;
|
|
2073
|
+
from?: string | undefined;
|
|
2074
|
+
}[];
|
|
2075
|
+
exports?: {
|
|
2076
|
+
type: string;
|
|
2077
|
+
schemaVersion: number;
|
|
2078
|
+
readPermission: string & z.$brand<"PermissionKey">;
|
|
2079
|
+
}[] | undefined;
|
|
2080
|
+
};
|
|
2081
|
+
migrations: {
|
|
2082
|
+
journalDir: string;
|
|
2083
|
+
compatibleFrom: string;
|
|
2084
|
+
};
|
|
2085
|
+
attachmentTargets: {
|
|
2086
|
+
entityType: string;
|
|
2087
|
+
readPermission: string & z.$brand<"PermissionKey">;
|
|
2088
|
+
writePermission?: (string & z.$brand<"PermissionKey">) | undefined;
|
|
2089
|
+
}[];
|
|
2090
|
+
liveTargets?: {
|
|
2091
|
+
entityType: string;
|
|
2092
|
+
readPermission: string & z.$brand<"PermissionKey">;
|
|
2093
|
+
}[] | undefined;
|
|
2094
|
+
entityRelations?: {
|
|
2095
|
+
entityType: string;
|
|
2096
|
+
parentType: string;
|
|
2097
|
+
}[] | undefined;
|
|
2098
|
+
guards?: {
|
|
2099
|
+
before: string;
|
|
2100
|
+
predicate: string;
|
|
2101
|
+
config: Record<string, unknown>;
|
|
2102
|
+
}[] | undefined;
|
|
2103
|
+
schedules?: {
|
|
2104
|
+
operation: string;
|
|
2105
|
+
cadence: {
|
|
2106
|
+
everyMinutes: number;
|
|
2107
|
+
};
|
|
2108
|
+
input?: Record<string, unknown> | undefined;
|
|
2109
|
+
permissions: (string & z.$brand<"PermissionKey">)[];
|
|
2110
|
+
}[] | undefined;
|
|
2111
|
+
peers?: {
|
|
2112
|
+
vertical: string;
|
|
2113
|
+
operations: string[];
|
|
2114
|
+
permissions: (string & z.$brand<"PermissionKey">)[];
|
|
2115
|
+
}[] | undefined;
|
|
2116
|
+
freshness?: {
|
|
2117
|
+
eventType: string;
|
|
2118
|
+
within: {
|
|
2119
|
+
hours: number;
|
|
2120
|
+
};
|
|
2121
|
+
}[] | undefined;
|
|
2122
|
+
withdraws?: string[] | undefined;
|
|
2123
|
+
entitlementKey: string;
|
|
2124
|
+
envSpec?: {
|
|
2125
|
+
key: string;
|
|
2126
|
+
label?: string | undefined;
|
|
2127
|
+
description: string;
|
|
2128
|
+
placeholder?: string | undefined;
|
|
2129
|
+
required: boolean;
|
|
2130
|
+
secret: boolean;
|
|
2131
|
+
default?: string | undefined;
|
|
2132
|
+
group?: string | undefined;
|
|
2133
|
+
}[] | undefined;
|
|
2134
|
+
ownerGrants?: (string & z.$brand<"PermissionKey">)[] | undefined;
|
|
2135
|
+
entitlements?: string[] | undefined;
|
|
2136
|
+
provides?: string[] | undefined;
|
|
2137
|
+
requires?: string[] | undefined;
|
|
2138
|
+
api?: string | undefined;
|
|
2139
|
+
searchables?: {
|
|
2140
|
+
entityType: string;
|
|
2141
|
+
fields: string[];
|
|
2142
|
+
table?: string | undefined;
|
|
2143
|
+
idColumn?: string | undefined;
|
|
2144
|
+
tokenizer?: "prefix" | "substring" | undefined;
|
|
2145
|
+
}[] | undefined;
|
|
2146
|
+
lists?: {
|
|
2147
|
+
entityType: string;
|
|
2148
|
+
sortable: string[];
|
|
2149
|
+
filterable?: string[] | undefined;
|
|
2150
|
+
table?: string | undefined;
|
|
2151
|
+
idColumn?: string | undefined;
|
|
2152
|
+
}[] | undefined;
|
|
2153
|
+
ui?: {
|
|
2154
|
+
routes?: {
|
|
2155
|
+
path: string;
|
|
2156
|
+
screen: string;
|
|
2157
|
+
permission: string & z.$brand<"PermissionKey">;
|
|
2158
|
+
}[] | undefined;
|
|
2159
|
+
nav?: {
|
|
2160
|
+
label: string;
|
|
2161
|
+
icon?: string | undefined;
|
|
2162
|
+
to: string;
|
|
2163
|
+
permission: string & z.$brand<"PermissionKey">;
|
|
2164
|
+
}[] | undefined;
|
|
2165
|
+
entityViews?: {
|
|
2166
|
+
entityType: string;
|
|
2167
|
+
view: string;
|
|
2168
|
+
}[] | undefined;
|
|
2169
|
+
widgets?: {
|
|
2170
|
+
slot: string;
|
|
2171
|
+
component: string;
|
|
2172
|
+
permission: string & z.$brand<"PermissionKey">;
|
|
2173
|
+
}[] | undefined;
|
|
2174
|
+
settingsPanels?: {
|
|
2175
|
+
label: string;
|
|
2176
|
+
component: string;
|
|
2177
|
+
permission: string & z.$brand<"PermissionKey">;
|
|
2178
|
+
}[] | undefined;
|
|
2179
|
+
} | undefined;
|
|
2180
|
+
};
|
|
2181
|
+
/** The engine's in-scope export — how the composing vertical reads it, by call (decision 28). */
|
|
2182
|
+
export declare function countComposedSweeps(ctx: Pick<OperationContext, 'sql'>): number;
|
|
2183
|
+
export declare const composedEngineMod: ModuleRegistration;
|
|
2184
|
+
/**
|
|
2185
|
+
* #1654's VERTICAL: holds the key a standard install grants (`composer`), and reads the
|
|
2186
|
+
* engine's result through the engine's export inside its own operation. It declares no
|
|
2187
|
+
* schedule, so its system principal holds nothing — its door is the lever proving the
|
|
2188
|
+
* exception never lends one module's schedule to another module's system principal.
|
|
2189
|
+
*/
|
|
2190
|
+
export declare const composerModManifest: {
|
|
2191
|
+
id: string & z.$brand<"ModuleId">;
|
|
2192
|
+
version: string;
|
|
2193
|
+
kernelContract: string;
|
|
2194
|
+
permissions: {
|
|
2195
|
+
key: string & z.$brand<"PermissionKey">;
|
|
2196
|
+
description: string;
|
|
2197
|
+
}[];
|
|
2198
|
+
events: {
|
|
2199
|
+
emits: {
|
|
2200
|
+
type: string;
|
|
2201
|
+
schemaVersion: number;
|
|
2202
|
+
}[];
|
|
2203
|
+
consumes: {
|
|
2204
|
+
type: string;
|
|
2205
|
+
schemaVersion: number;
|
|
2206
|
+
from?: string | undefined;
|
|
2207
|
+
}[];
|
|
2208
|
+
exports?: {
|
|
2209
|
+
type: string;
|
|
2210
|
+
schemaVersion: number;
|
|
2211
|
+
readPermission: string & z.$brand<"PermissionKey">;
|
|
2212
|
+
}[] | undefined;
|
|
2213
|
+
};
|
|
2214
|
+
migrations: {
|
|
2215
|
+
journalDir: string;
|
|
2216
|
+
compatibleFrom: string;
|
|
2217
|
+
};
|
|
2218
|
+
attachmentTargets: {
|
|
2219
|
+
entityType: string;
|
|
2220
|
+
readPermission: string & z.$brand<"PermissionKey">;
|
|
2221
|
+
writePermission?: (string & z.$brand<"PermissionKey">) | undefined;
|
|
2222
|
+
}[];
|
|
2223
|
+
liveTargets?: {
|
|
2224
|
+
entityType: string;
|
|
2225
|
+
readPermission: string & z.$brand<"PermissionKey">;
|
|
2226
|
+
}[] | undefined;
|
|
2227
|
+
entityRelations?: {
|
|
2228
|
+
entityType: string;
|
|
2229
|
+
parentType: string;
|
|
2230
|
+
}[] | undefined;
|
|
2231
|
+
guards?: {
|
|
2232
|
+
before: string;
|
|
2233
|
+
predicate: string;
|
|
2234
|
+
config: Record<string, unknown>;
|
|
2235
|
+
}[] | undefined;
|
|
2236
|
+
schedules?: {
|
|
2237
|
+
operation: string;
|
|
2238
|
+
cadence: {
|
|
2239
|
+
everyMinutes: number;
|
|
2240
|
+
};
|
|
2241
|
+
input?: Record<string, unknown> | undefined;
|
|
2242
|
+
permissions: (string & z.$brand<"PermissionKey">)[];
|
|
2243
|
+
}[] | undefined;
|
|
2244
|
+
peers?: {
|
|
2245
|
+
vertical: string;
|
|
2246
|
+
operations: string[];
|
|
2247
|
+
permissions: (string & z.$brand<"PermissionKey">)[];
|
|
2248
|
+
}[] | undefined;
|
|
2249
|
+
freshness?: {
|
|
2250
|
+
eventType: string;
|
|
2251
|
+
within: {
|
|
2252
|
+
hours: number;
|
|
2253
|
+
};
|
|
2254
|
+
}[] | undefined;
|
|
2255
|
+
withdraws?: string[] | undefined;
|
|
2256
|
+
entitlementKey: string;
|
|
2257
|
+
envSpec?: {
|
|
2258
|
+
key: string;
|
|
2259
|
+
label?: string | undefined;
|
|
2260
|
+
description: string;
|
|
2261
|
+
placeholder?: string | undefined;
|
|
2262
|
+
required: boolean;
|
|
2263
|
+
secret: boolean;
|
|
2264
|
+
default?: string | undefined;
|
|
2265
|
+
group?: string | undefined;
|
|
2266
|
+
}[] | undefined;
|
|
2267
|
+
ownerGrants?: (string & z.$brand<"PermissionKey">)[] | undefined;
|
|
2268
|
+
entitlements?: string[] | undefined;
|
|
2269
|
+
provides?: string[] | undefined;
|
|
2270
|
+
requires?: string[] | undefined;
|
|
2271
|
+
api?: string | undefined;
|
|
2272
|
+
searchables?: {
|
|
2273
|
+
entityType: string;
|
|
2274
|
+
fields: string[];
|
|
2275
|
+
table?: string | undefined;
|
|
2276
|
+
idColumn?: string | undefined;
|
|
2277
|
+
tokenizer?: "prefix" | "substring" | undefined;
|
|
2278
|
+
}[] | undefined;
|
|
2279
|
+
lists?: {
|
|
2280
|
+
entityType: string;
|
|
2281
|
+
sortable: string[];
|
|
2282
|
+
filterable?: string[] | undefined;
|
|
2283
|
+
table?: string | undefined;
|
|
2284
|
+
idColumn?: string | undefined;
|
|
2285
|
+
}[] | undefined;
|
|
2286
|
+
ui?: {
|
|
2287
|
+
routes?: {
|
|
2288
|
+
path: string;
|
|
2289
|
+
screen: string;
|
|
2290
|
+
permission: string & z.$brand<"PermissionKey">;
|
|
2291
|
+
}[] | undefined;
|
|
2292
|
+
nav?: {
|
|
2293
|
+
label: string;
|
|
2294
|
+
icon?: string | undefined;
|
|
2295
|
+
to: string;
|
|
2296
|
+
permission: string & z.$brand<"PermissionKey">;
|
|
2297
|
+
}[] | undefined;
|
|
2298
|
+
entityViews?: {
|
|
2299
|
+
entityType: string;
|
|
2300
|
+
view: string;
|
|
2301
|
+
}[] | undefined;
|
|
2302
|
+
widgets?: {
|
|
2303
|
+
slot: string;
|
|
2304
|
+
component: string;
|
|
2305
|
+
permission: string & z.$brand<"PermissionKey">;
|
|
2306
|
+
}[] | undefined;
|
|
2307
|
+
settingsPanels?: {
|
|
2308
|
+
label: string;
|
|
2309
|
+
component: string;
|
|
2310
|
+
permission: string & z.$brand<"PermissionKey">;
|
|
2311
|
+
}[] | undefined;
|
|
2312
|
+
} | undefined;
|
|
2313
|
+
};
|
|
2314
|
+
export declare const composerMod: ModuleRegistration;
|
|
2045
2315
|
export declare const flowMod: ModuleRegistration;
|
|
2046
2316
|
export declare const guardedMod: ModuleRegistration;
|
|
2047
2317
|
export declare const gateMod: ModuleRegistration;
|
package/dist/modules.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAWL,CAAC,EAKF,MAAM,yBAAyB,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"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"}
|
package/dist/modules.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* artifacts live here.
|
|
9
9
|
*/
|
|
10
10
|
import { dataSubjectId, moduleManifest, operationInputsOf, operationConcurrencyOf, operationIdempotencyOptOutsOf, IDEMPOTENCY_RESULT_LIMIT, permissionKey, principalId, assertTransition, z, KERNEL_AUTHORED_EVENT_TYPES, } from '@substrat-run/contracts';
|
|
11
|
-
import { assertAllowed, readAttachmentText, readHistory, readTimeline, ulid, } from '@substrat-run/kernel';
|
|
11
|
+
import { assertAllowed, readAttachmentText, readHistory, readTimeline, readScopeTimeline, readScopeHistory, ulid, } from '@substrat-run/kernel';
|
|
12
12
|
/** #1745: the machine `test/refuse` asserts against — `test/move` is illegal from `done`. */
|
|
13
13
|
const REFUSE_LIFECYCLE = {
|
|
14
14
|
field: 'state',
|
|
@@ -465,11 +465,13 @@ export const contractTestBareOps = {
|
|
|
465
465
|
// Emit about a NAMED entity. `test/emit-event` is fixed to `x1`, and the suite
|
|
466
466
|
// needs two entities moving independently to prove the version is per-entity
|
|
467
467
|
// and not just "the newest event in the scope".
|
|
468
|
+
// `entityType` is optional and defaults to the one every per-entity case uses; the
|
|
469
|
+
// scope-wide walk (#1582) needs a second type to prove its filter narrows.
|
|
468
470
|
'test/emit-about': ((ctx, input) => {
|
|
469
471
|
ctx.emit({
|
|
470
472
|
type: 'test.happened',
|
|
471
473
|
schemaVersion: 1,
|
|
472
|
-
entity: { entityType: 'test-thing', entityId: input.entityId },
|
|
474
|
+
entity: { entityType: input.entityType ?? 'test-thing', entityId: input.entityId },
|
|
473
475
|
piiClass: input.subject ? 'pseudonymous' : 'none',
|
|
474
476
|
...(input.subject ? { subjectId: dataSubjectId.parse(input.subject) } : {}),
|
|
475
477
|
payload: { about: input.entityId },
|
|
@@ -514,6 +516,10 @@ export const contractTestBareOps = {
|
|
|
514
516
|
// limit, cursor and order without a variant operation per case.
|
|
515
517
|
'test/timeline': ((ctx, input) => readTimeline(ctx, { entityType: input.entityType, entityId: input.entityId }, input)),
|
|
516
518
|
'test/history': ((ctx, input) => readHistory(ctx, { entityType: input.entityType, entityId: input.entityId }, input)),
|
|
519
|
+
// #1582: the scope-wide walks. The whole `ScopeWalkPage` passes through, so the
|
|
520
|
+
// suite drives the watermark, the order and the entity-type filter directly.
|
|
521
|
+
'test/scope-timeline': ((ctx, input) => readScopeTimeline(ctx, input)),
|
|
522
|
+
'test/scope-history': ((ctx, input) => readScopeHistory(ctx, input)),
|
|
517
523
|
// An event carrying PII, so the suite can shred it and assert the history
|
|
518
524
|
// degrades to a null payload instead of vanishing or throwing.
|
|
519
525
|
//
|
|
@@ -1156,6 +1162,79 @@ export const deniedScheduleMod = {
|
|
|
1156
1162
|
}),
|
|
1157
1163
|
},
|
|
1158
1164
|
};
|
|
1165
|
+
// -- #1654: a composed engine's own schedule, on a tenant holding only the vertical's key --
|
|
1166
|
+
/**
|
|
1167
|
+
* #1654's ENGINE: a module composed by call into `composerMod`, with a SKU of its own
|
|
1168
|
+
* (`composed-engine`) that the suite's tenant never holds — the shape of `engine-absence`
|
|
1169
|
+
* inside meridian, whose install grants `meridian` and `protocol` but not `absence`.
|
|
1170
|
+
*
|
|
1171
|
+
* - `composed-engine/sweep` is its one declared schedule, checking the permission the
|
|
1172
|
+
* schedule grants. Fired through the system door, it must run without the engine's SKU.
|
|
1173
|
+
* - `composed-engine/manual` checks the SAME permission but is NOT a declared schedule, so
|
|
1174
|
+
* the system principal passes its `ctx.check` and only the SKU gate can refuse it. That
|
|
1175
|
+
* is the lever proving the exception covers declared schedules and nothing else the
|
|
1176
|
+
* system door can reach.
|
|
1177
|
+
*/
|
|
1178
|
+
export const composedEngineModManifest = moduleManifest.parse({
|
|
1179
|
+
id: '@test/composed-engine',
|
|
1180
|
+
version: '1.0.0',
|
|
1181
|
+
kernelContract: '^0.0.1',
|
|
1182
|
+
permissions: [{ key: 'composed-engine:sweep', description: 'the engine\'s scheduled sweep' }],
|
|
1183
|
+
events: { emits: [{ type: 'composed-engine.swept', schemaVersion: 1 }], consumes: [] },
|
|
1184
|
+
migrations: { journalDir: './migrations', compatibleFrom: '1.0.0' },
|
|
1185
|
+
attachmentTargets: [],
|
|
1186
|
+
entitlementKey: 'composed-engine',
|
|
1187
|
+
schedules: [
|
|
1188
|
+
{ operation: 'composed-engine/sweep', cadence: { everyMinutes: 60 }, permissions: ['composed-engine:sweep'] },
|
|
1189
|
+
],
|
|
1190
|
+
});
|
|
1191
|
+
/** The engine's in-scope export — how the composing vertical reads it, by call (decision 28). */
|
|
1192
|
+
export function countComposedSweeps(ctx) {
|
|
1193
|
+
return ctx.sql.query('SELECT COUNT(*) AS n FROM composed_engine_sweeps')[0].n;
|
|
1194
|
+
}
|
|
1195
|
+
export const composedEngineMod = {
|
|
1196
|
+
manifest: composedEngineModManifest,
|
|
1197
|
+
migrations: [{ version: '0001-init', sql: 'CREATE TABLE composed_engine_sweeps (n INTEGER NOT NULL)' }],
|
|
1198
|
+
operations: {
|
|
1199
|
+
'composed-engine/sweep': (async (ctx) => {
|
|
1200
|
+
assertAllowed(await ctx.check('composed-engine:sweep'));
|
|
1201
|
+
ctx.sql.exec('INSERT INTO composed_engine_sweeps (n) VALUES (1)');
|
|
1202
|
+
ctx.emit({
|
|
1203
|
+
type: 'composed-engine.swept',
|
|
1204
|
+
schemaVersion: 1,
|
|
1205
|
+
entity: { entityType: 'composed-engine-thing', entityId: 'sweep' },
|
|
1206
|
+
piiClass: 'none',
|
|
1207
|
+
payload: {},
|
|
1208
|
+
});
|
|
1209
|
+
}),
|
|
1210
|
+
'composed-engine/manual': (async (ctx) => {
|
|
1211
|
+
assertAllowed(await ctx.check('composed-engine:sweep'));
|
|
1212
|
+
ctx.sql.exec('INSERT INTO composed_engine_sweeps (n) VALUES (1)');
|
|
1213
|
+
}),
|
|
1214
|
+
},
|
|
1215
|
+
};
|
|
1216
|
+
/**
|
|
1217
|
+
* #1654's VERTICAL: holds the key a standard install grants (`composer`), and reads the
|
|
1218
|
+
* engine's result through the engine's export inside its own operation. It declares no
|
|
1219
|
+
* schedule, so its system principal holds nothing — its door is the lever proving the
|
|
1220
|
+
* exception never lends one module's schedule to another module's system principal.
|
|
1221
|
+
*/
|
|
1222
|
+
export const composerModManifest = moduleManifest.parse({
|
|
1223
|
+
id: '@test/composer',
|
|
1224
|
+
version: '1.0.0',
|
|
1225
|
+
kernelContract: '^0.0.1',
|
|
1226
|
+
permissions: [],
|
|
1227
|
+
events: { emits: [], consumes: [] },
|
|
1228
|
+
migrations: { journalDir: './migrations', compatibleFrom: '1.0.0' },
|
|
1229
|
+
attachmentTargets: [],
|
|
1230
|
+
entitlementKey: 'composer',
|
|
1231
|
+
});
|
|
1232
|
+
export const composerMod = {
|
|
1233
|
+
manifest: composerModManifest,
|
|
1234
|
+
operations: {
|
|
1235
|
+
'composer/sweeps': ((ctx) => countComposedSweeps(ctx)),
|
|
1236
|
+
},
|
|
1237
|
+
};
|
|
1159
1238
|
export const flowMod = {
|
|
1160
1239
|
manifest: flowModManifest,
|
|
1161
1240
|
migrations: [
|
|
@@ -2281,6 +2360,11 @@ export const contractTestModules = [
|
|
|
2281
2360
|
// `ctx.check` ever runs, which still counts as a failed schedule but records no
|
|
2282
2361
|
// denial. Inert for every other suite — nothing else invokes `sched-denied/tick`.
|
|
2283
2362
|
deniedScheduleMod,
|
|
2363
|
+
// #1654: the composed engine and the vertical composing it. Inert for every other suite —
|
|
2364
|
+
// only `scheduleEntitlementContractSuite` registers them on a host, so no other scope is
|
|
2365
|
+
// seated their system grant or reads their table.
|
|
2366
|
+
composedEngineMod,
|
|
2367
|
+
composerMod,
|
|
2284
2368
|
// #1577: the operation a resumable run's steps write through. Inert for every
|
|
2285
2369
|
// other suite — nothing else reads `job_items`.
|
|
2286
2370
|
jobsMod,
|