@sensigo/realm-testing 0.25.0 → 0.26.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/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/store/in-memory-store.d.ts +4 -1
- package/dist/store/in-memory-store.d.ts.map +1 -1
- package/dist/store/in-memory-store.js +25 -1
- package/dist/store/in-memory-store.js.map +1 -1
- package/dist/store/run-store-fidelity-contract.d.ts +50 -0
- package/dist/store/run-store-fidelity-contract.d.ts.map +1 -0
- package/dist/store/run-store-fidelity-contract.js +136 -0
- package/dist/store/run-store-fidelity-contract.js.map +1 -0
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { InMemoryStore } from './store/in-memory-store.js';
|
|
2
2
|
export { perRunArtifactStoreContract } from './store/per-run-artifact-store-contract.js';
|
|
3
3
|
export type { ArtifactStoreLaw, ArtifactStoreContractCase, PerRunArtifactStoreContractAdapter, } from './store/per-run-artifact-store-contract.js';
|
|
4
|
+
export { runStoreFidelityContract } from './store/run-store-fidelity-contract.js';
|
|
5
|
+
export type { RunStoreFidelityLaw, RunStoreFidelityContractCase, RunStoreFidelityContractAdapter, } from './store/run-store-fidelity-contract.js';
|
|
4
6
|
export { loadFixtureFromFile, loadFixtureFromString, loadFixturesFromDir, } from './fixtures/fixture-loader.js';
|
|
5
7
|
export type { TestFixture, MockOperations } from './fixtures/fixture-loader.js';
|
|
6
8
|
export { MockServiceRecorder } from './mocks/mock-service.js';
|
|
@@ -15,5 +17,5 @@ export { runFixtureTests } from './runner/test-runner.js';
|
|
|
15
17
|
export type { TestResult, RunFixtureTestsOptions } from './runner/test-runner.js';
|
|
16
18
|
export { startGitHubMockServer } from './servers/github-mock-server.js';
|
|
17
19
|
export type { GitHubMockServerHandle } from './servers/github-mock-server.js';
|
|
18
|
-
export declare const VERSION = "0.
|
|
20
|
+
export declare const VERSION = "0.26.0";
|
|
19
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,YAAY,EACV,gBAAgB,EAChB,yBAAyB,EACzB,kCAAkC,GACnC,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,YAAY,EACV,gBAAgB,EAChB,yBAAyB,EACzB,kCAAkC,GACnC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGlF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,YAAY,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE9E,eAAO,MAAM,OAAO,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Store
|
|
3
3
|
export { InMemoryStore } from './store/in-memory-store.js';
|
|
4
4
|
export { perRunArtifactStoreContract } from './store/per-run-artifact-store-contract.js';
|
|
5
|
+
export { runStoreFidelityContract } from './store/run-store-fidelity-contract.js';
|
|
5
6
|
// Fixtures
|
|
6
7
|
export { loadFixtureFromFile, loadFixtureFromString, loadFixturesFromDir, } from './fixtures/fixture-loader.js';
|
|
7
8
|
// Mocks
|
|
@@ -18,5 +19,5 @@ export { testAdapter } from './helpers/test-adapter.js';
|
|
|
18
19
|
export { runFixtureTests } from './runner/test-runner.js';
|
|
19
20
|
// Servers
|
|
20
21
|
export { startGitHubMockServer } from './servers/github-mock-server.js';
|
|
21
|
-
export const VERSION = '0.
|
|
22
|
+
export const VERSION = '0.26.0';
|
|
22
23
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AAMzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAOlF,WAAW;AACX,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAGtC,QAAQ;AACR,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,oBAAoB;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,UAAU;AACV,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type RunStore, type RunRecord, type CreateRunOptions, type WorkflowDefinition } from '@sensigo/realm';
|
|
1
|
+
import { type RunStore, type RunRecord, type CreateRunOptions, type WorkflowDefinition, type LoadBearingRunRecordField } from '@sensigo/realm';
|
|
2
2
|
/** In-memory implementation of RunStore. Uses a Map keyed by run ID. No I/O, no locking. */
|
|
3
3
|
export declare class InMemoryStore implements RunStore {
|
|
4
4
|
private readonly runs;
|
|
@@ -6,6 +6,9 @@ export declare class InMemoryStore implements RunStore {
|
|
|
6
6
|
private readonly keyIndex;
|
|
7
7
|
/** Parity with JsonFileStore: round-trips the per-claim `claims` liveness clock (issue #101). */
|
|
8
8
|
readonly persistsClaims = true;
|
|
9
|
+
/** Parity with JsonFileStore (issue #188): every `create`/`update` stores the whole `RunRecord`
|
|
10
|
+
* object as-is (no field-by-field mapping), so nothing is ever dropped — declares the full set. */
|
|
11
|
+
readonly persistedRunRecordFields: ReadonlySet<LoadBearingRunRecordField>;
|
|
9
12
|
create(options: CreateRunOptions): Promise<{
|
|
10
13
|
run: RunRecord;
|
|
11
14
|
created: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-store.d.ts","sourceRoot":"","sources":["../../src/store/in-memory-store.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"in-memory-store.d.ts","sourceRoot":"","sources":["../../src/store/in-memory-store.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC/B,MAAM,gBAAgB,CAAC;AAExB,4FAA4F;AAC5F,qBAAa,aAAc,YAAW,QAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,sGAAsG;IACtG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,iGAAiG;IACjG,QAAQ,CAAC,cAAc,QAAQ;IAE/B;wGACoG;IACpG,QAAQ,CAAC,wBAAwB,EAAE,WAAW,CAAC,yBAAyB,CAAC,CAItE;IAEG,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IA4ChF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAatC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IA6B7C,SAAS,CACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAyDf,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAOtD"}
|
|
@@ -7,6 +7,13 @@ export class InMemoryStore {
|
|
|
7
7
|
keyIndex = new Map();
|
|
8
8
|
/** Parity with JsonFileStore: round-trips the per-claim `claims` liveness clock (issue #101). */
|
|
9
9
|
persistsClaims = true;
|
|
10
|
+
/** Parity with JsonFileStore (issue #188): every `create`/`update` stores the whole `RunRecord`
|
|
11
|
+
* object as-is (no field-by-field mapping), so nothing is ever dropped — declares the full set. */
|
|
12
|
+
persistedRunRecordFields = new Set([
|
|
13
|
+
'capability_blocks',
|
|
14
|
+
'workflow_context_snapshots',
|
|
15
|
+
'extension_identity',
|
|
16
|
+
]);
|
|
10
17
|
async create(options) {
|
|
11
18
|
// Idempotency: a key match applies the re-encounter policy, like JsonFileStore.
|
|
12
19
|
if (options.idempotencyKey !== undefined) {
|
|
@@ -90,7 +97,24 @@ export class InMemoryStore {
|
|
|
90
97
|
return updated;
|
|
91
98
|
}
|
|
92
99
|
async claimStep(runId, stepName, definition) {
|
|
93
|
-
|
|
100
|
+
// issue #188: read the record SYNCHRONOUSLY (a direct Map.get, not `await this.get(...)`) so
|
|
101
|
+
// the read → eligibility-check → write below is one indivisible synchronous stretch. This is
|
|
102
|
+
// what makes claimStep single-owner for concurrent same-process calls (the cross-cutting
|
|
103
|
+
// obligation on RunStore.claimStep; the TCK's concurrent-claimStep case exercises exactly
|
|
104
|
+
// this against this store). `await this.get(runId)` would NOT be safe here even though the
|
|
105
|
+
// lookup itself has no I/O: unwrapping an already-resolved promise still costs one microtask
|
|
106
|
+
// tick, during which a second `Promise.all`'d claimStep call's own (equally synchronous) read
|
|
107
|
+
// can run BEFORE either call has written — verified empirically: two concurrent claimStep
|
|
108
|
+
// calls for the same (runId, step) both resolved successfully before this fix.
|
|
109
|
+
const run = this.runs.get(runId);
|
|
110
|
+
if (run === undefined) {
|
|
111
|
+
throw new WorkflowError(`Run '${runId}' not found`, {
|
|
112
|
+
code: 'STATE_RUN_NOT_FOUND',
|
|
113
|
+
category: 'STATE',
|
|
114
|
+
agentAction: 'report_to_user',
|
|
115
|
+
retryable: false,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
94
118
|
const alreadyDone = [
|
|
95
119
|
...run.completed_steps,
|
|
96
120
|
...run.in_progress_steps,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-store.js","sourceRoot":"","sources":["../../src/store/in-memory-store.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"in-memory-store.js","sourceRoot":"","sources":["../../src/store/in-memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type RunStore, type WorkflowDefinition } from '@sensigo/realm';
|
|
2
|
+
/** One of the two laws every `RunStore` implementation should be run against (issue #188). */
|
|
3
|
+
export type RunStoreFidelityLaw = 'FIDELITY_HONESTY' | 'CLAIM_SINGLE_OWNER';
|
|
4
|
+
/**
|
|
5
|
+
* A single, framework-agnostic contract case. `run()` throws (rejects) on failure — any test
|
|
6
|
+
* framework's `await run()` (rejecting fails the test) or `expect(run()).resolves...` /
|
|
7
|
+
* `expect(run()).rejects...` maps directly onto this.
|
|
8
|
+
*/
|
|
9
|
+
export interface RunStoreFidelityContractCase {
|
|
10
|
+
law: RunStoreFidelityLaw;
|
|
11
|
+
name: string;
|
|
12
|
+
run: () => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** Adapter a calling test file supplies to parameterize the contract against one concrete store. */
|
|
15
|
+
export interface RunStoreFidelityContractAdapter {
|
|
16
|
+
/** The store under test. */
|
|
17
|
+
store: RunStore;
|
|
18
|
+
/**
|
|
19
|
+
* A workflow definition carrying exactly one step, named `stepName`, that is immediately
|
|
20
|
+
* eligible on a freshly-created run (no unmet `depends_on`) — used by CLAIM_SINGLE_OWNER to
|
|
21
|
+
* race two concurrent `claimStep` calls against a fresh run of this definition.
|
|
22
|
+
*/
|
|
23
|
+
definition: WorkflowDefinition;
|
|
24
|
+
stepName: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Builds the contract cases for `adapter`.
|
|
28
|
+
*
|
|
29
|
+
* **FIDELITY_HONESTY** — one case PER FIELD in `adapter.store.persistedRunRecordFields` (zero
|
|
30
|
+
* cases if the store declares nothing — a store with no declaration passes this law vacuously,
|
|
31
|
+
* by construction, and gets the conservative runtime gates instead; that combination is
|
|
32
|
+
* correct-by-design, not a TCK gap). Each case: `create` a fresh run, `update` it to carry a
|
|
33
|
+
* realistic sample value for that field, `get` it back, and byte-compare (via JSON, since every
|
|
34
|
+
* `LoadBearingRunRecordField` is plain-JSON-serializable data) what was written against what was
|
|
35
|
+
* read. A mismatch means the store's declaration is DISHONEST.
|
|
36
|
+
*
|
|
37
|
+
* **CLAIM_SINGLE_OWNER** — races two concurrent `claimStep(runId, sameStep)` calls against a
|
|
38
|
+
* fresh run; asserts exactly one resolves and the other rejects with
|
|
39
|
+
* `STATE_STEP_ALREADY_CLAIMED`. **Cross-host caveat: this only exercises and asserts the
|
|
40
|
+
* SAME-PROCESS (same-host) guarantee** — for an in-memory store this is same-process by
|
|
41
|
+
* construction; for a lock-based store like `JsonFileStore` it exercises same-host
|
|
42
|
+
* multi-process safety via the real OS-level lock the two concurrent calls contend on, but this
|
|
43
|
+
* TCK run happens within ONE test process, so it does not and cannot exercise true cross-host
|
|
44
|
+
* concurrency. The CROSS-HOST single-owner obligation (stated on `RunStore.claimStep`'s own
|
|
45
|
+
* JSDoc) can only be verified by a store's OWN conformance suite against its real concurrent
|
|
46
|
+
* backend (e.g. a Postgres store's suite exercising genuine multi-connection contention) — do
|
|
47
|
+
* NOT read a green result here as proof of cross-host safety.
|
|
48
|
+
*/
|
|
49
|
+
export declare function runStoreFidelityContract(adapter: RunStoreFidelityContractAdapter): RunStoreFidelityContractCase[];
|
|
50
|
+
//# sourceMappingURL=run-store-fidelity-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-store-fidelity-contract.d.ts","sourceRoot":"","sources":["../../src/store/run-store-fidelity-contract.ts"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,QAAQ,EAEb,KAAK,kBAAkB,EAIxB,MAAM,gBAAgB,CAAC;AAExB,8FAA8F;AAC9F,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;AAE5E;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,mBAAmB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,oGAAoG;AACpG,MAAM,WAAW,+BAA+B;IAC9C,4BAA4B;IAC5B,KAAK,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AA6CD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,4BAA4B,EAAE,CAoEhC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// run-store-fidelity-contract.ts — framework-agnostic Test Compatibility Kit (TCK) for RunStore
|
|
2
|
+
// field-fidelity honesty + claimStep single-owner conformance (issue #188, PR-2).
|
|
3
|
+
//
|
|
4
|
+
// Pure case descriptors, NOT describe/it/expect — mirrors per-run-artifact-store-contract.ts's
|
|
5
|
+
// own precedent (issue #183) and its rationale: importing vitest here would make it a runtime
|
|
6
|
+
// dependency of this published package (this module ships in @sensigo/realm-testing's dist).
|
|
7
|
+
// Each calling test file supplies an adapter and wires the returned descriptors into ITS OWN test
|
|
8
|
+
// framework.
|
|
9
|
+
//
|
|
10
|
+
// This is "the forcing part" (issue #188): FIDELITY_HONESTY does not just check that a store
|
|
11
|
+
// SAYS it persists a field — it writes a real sample value through create/update and reads it
|
|
12
|
+
// back, so a store that DECLARES `persistedRunRecordFields` dishonestly (claims a field, drops it
|
|
13
|
+
// on write) fails conformance here, before it ever ships. A store that declares NOTHING passes
|
|
14
|
+
// this law vacuously (zero cases generated) — see `runStoreFidelityContract`'s own doc.
|
|
15
|
+
import { WorkflowError, } from '@sensigo/realm';
|
|
16
|
+
/**
|
|
17
|
+
* One realistic, minimal-but-valid sample value per {@link LoadBearingRunRecordField} — used by
|
|
18
|
+
* FIDELITY_HONESTY to actually exercise a round-trip. Deliberately real shapes (not `{}` or
|
|
19
|
+
* `null`), since a store that only round-trips empty/degenerate values would not actually prove
|
|
20
|
+
* fidelity for the shapes the engine truly writes.
|
|
21
|
+
*/
|
|
22
|
+
const SAMPLE_VALUES = {
|
|
23
|
+
capability_blocks: {
|
|
24
|
+
'tck-step': {
|
|
25
|
+
requirement: { kind: 'handler', name: 'tck-handler' },
|
|
26
|
+
code: 'ENGINE_HANDLER_NOT_REGISTERED',
|
|
27
|
+
at: '2026-01-01T00:00:00.000Z',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
workflow_context_snapshots: {
|
|
31
|
+
'tck-key': {
|
|
32
|
+
source_path: '/tck/sample.md',
|
|
33
|
+
content: 'hello',
|
|
34
|
+
content_hash: 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
|
|
35
|
+
loaded_at: '2026-01-01T00:00:00.000Z',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
extension_identity: [
|
|
39
|
+
{
|
|
40
|
+
captured_at: '2026-01-01T00:00:00.000Z',
|
|
41
|
+
modules: [],
|
|
42
|
+
tree: {
|
|
43
|
+
roots: [],
|
|
44
|
+
rules: 'tck-rules',
|
|
45
|
+
file_count: 0,
|
|
46
|
+
total_bytes: 0,
|
|
47
|
+
tree_hash: 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
|
|
48
|
+
truncated: false,
|
|
49
|
+
},
|
|
50
|
+
coverage: 'dir_tree_v1',
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Builds the contract cases for `adapter`.
|
|
56
|
+
*
|
|
57
|
+
* **FIDELITY_HONESTY** — one case PER FIELD in `adapter.store.persistedRunRecordFields` (zero
|
|
58
|
+
* cases if the store declares nothing — a store with no declaration passes this law vacuously,
|
|
59
|
+
* by construction, and gets the conservative runtime gates instead; that combination is
|
|
60
|
+
* correct-by-design, not a TCK gap). Each case: `create` a fresh run, `update` it to carry a
|
|
61
|
+
* realistic sample value for that field, `get` it back, and byte-compare (via JSON, since every
|
|
62
|
+
* `LoadBearingRunRecordField` is plain-JSON-serializable data) what was written against what was
|
|
63
|
+
* read. A mismatch means the store's declaration is DISHONEST.
|
|
64
|
+
*
|
|
65
|
+
* **CLAIM_SINGLE_OWNER** — races two concurrent `claimStep(runId, sameStep)` calls against a
|
|
66
|
+
* fresh run; asserts exactly one resolves and the other rejects with
|
|
67
|
+
* `STATE_STEP_ALREADY_CLAIMED`. **Cross-host caveat: this only exercises and asserts the
|
|
68
|
+
* SAME-PROCESS (same-host) guarantee** — for an in-memory store this is same-process by
|
|
69
|
+
* construction; for a lock-based store like `JsonFileStore` it exercises same-host
|
|
70
|
+
* multi-process safety via the real OS-level lock the two concurrent calls contend on, but this
|
|
71
|
+
* TCK run happens within ONE test process, so it does not and cannot exercise true cross-host
|
|
72
|
+
* concurrency. The CROSS-HOST single-owner obligation (stated on `RunStore.claimStep`'s own
|
|
73
|
+
* JSDoc) can only be verified by a store's OWN conformance suite against its real concurrent
|
|
74
|
+
* backend (e.g. a Postgres store's suite exercising genuine multi-connection contention) — do
|
|
75
|
+
* NOT read a green result here as proof of cross-host safety.
|
|
76
|
+
*/
|
|
77
|
+
export function runStoreFidelityContract(adapter) {
|
|
78
|
+
const cases = [];
|
|
79
|
+
const declaredFields = adapter.store.persistedRunRecordFields ?? new Set();
|
|
80
|
+
for (const field of declaredFields) {
|
|
81
|
+
cases.push({
|
|
82
|
+
law: 'FIDELITY_HONESTY',
|
|
83
|
+
name: `a store declaring '${field}' actually round-trips it (create → update → get)`,
|
|
84
|
+
run: async () => {
|
|
85
|
+
const { run } = await adapter.store.create({
|
|
86
|
+
workflowId: `tck-fidelity-${field}`,
|
|
87
|
+
workflowVersion: 1,
|
|
88
|
+
params: {},
|
|
89
|
+
});
|
|
90
|
+
const sampleValue = SAMPLE_VALUES[field];
|
|
91
|
+
await adapter.store.update({ ...run, [field]: sampleValue });
|
|
92
|
+
const reread = await adapter.store.get(run.id);
|
|
93
|
+
const actual = reread[field];
|
|
94
|
+
const wroteJson = JSON.stringify(sampleValue);
|
|
95
|
+
const readJson = JSON.stringify(actual);
|
|
96
|
+
if (readJson !== wroteJson) {
|
|
97
|
+
throw new Error(`store declares persistedRunRecordFields includes '${field}' but a round-trip did ` +
|
|
98
|
+
`NOT preserve it — the declared fidelity is DISHONEST (issue #188). wrote: ` +
|
|
99
|
+
`${wroteJson}, read back: ${readJson}`);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
cases.push({
|
|
105
|
+
law: 'CLAIM_SINGLE_OWNER',
|
|
106
|
+
name: 'two concurrent claimStep calls for the same (runId, step) — exactly one succeeds',
|
|
107
|
+
run: async () => {
|
|
108
|
+
const { run } = await adapter.store.create({
|
|
109
|
+
workflowId: `tck-claim-${Math.random().toString(36).slice(2)}`,
|
|
110
|
+
workflowVersion: 1,
|
|
111
|
+
params: {},
|
|
112
|
+
});
|
|
113
|
+
const results = await Promise.allSettled([
|
|
114
|
+
adapter.store.claimStep(run.id, adapter.stepName, adapter.definition),
|
|
115
|
+
adapter.store.claimStep(run.id, adapter.stepName, adapter.definition),
|
|
116
|
+
]);
|
|
117
|
+
const fulfilled = results.filter((r) => r.status === 'fulfilled');
|
|
118
|
+
const rejected = results.filter((r) => r.status === 'rejected');
|
|
119
|
+
if (fulfilled.length !== 1) {
|
|
120
|
+
throw new Error(`expected exactly ONE of two concurrent claimStep calls for the same (runId, step) to ` +
|
|
121
|
+
`succeed, got ${fulfilled.length} — the single-owner guarantee is violated (breaks ` +
|
|
122
|
+
'the resurrect-race protection, issue #184, and the trace-buffer epoch minting, issue #185).');
|
|
123
|
+
}
|
|
124
|
+
for (const r of rejected) {
|
|
125
|
+
const err = r.reason;
|
|
126
|
+
if (!(err instanceof WorkflowError) || err.code !== 'STATE_STEP_ALREADY_CLAIMED') {
|
|
127
|
+
const described = err instanceof WorkflowError ? err.code : String(err);
|
|
128
|
+
throw new Error(`expected the losing claimStep call to reject with a WorkflowError carrying code ` +
|
|
129
|
+
`STATE_STEP_ALREADY_CLAIMED, got: ${described}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
return cases;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=run-store-fidelity-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-store-fidelity-contract.js","sourceRoot":"","sources":["../../src/store/run-store-fidelity-contract.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sensigo/realm-testing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"lint": "eslint src"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@sensigo/realm": "^0.
|
|
41
|
+
"@sensigo/realm": "^0.26.0",
|
|
42
42
|
"js-yaml": "^4.2.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|