Skip to content

Commit fec8036

Browse files
committed
chore(gates): enforce replay port package ownership
1 parent e354a89 commit fec8036

13 files changed

Lines changed: 81 additions & 81 deletions

File tree

‎packages/ad-replay/src/internal/__tests__/step-loop.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import type { TargetAnnotationV1 } from '@agent-device/contracts/replay';
1111
* terminal-close suppression) is engine-private — never re-exported by the
1212
* façade (`packages/ad-replay/src/index.ts`) — so these tests exercise it
1313
* only through `runAdReplay` itself, the same way the daemon's own
14-
* `src/daemon/replay/internal/native-command.ts` (`runReplayCommand`) does. The equivalent
14+
* `packages/replay-port/src/daemon-port/native-command.ts` (`runReplayCommand`) does. The equivalent
1515
* daemon-level assertions (full `SessionStore`/`runReplayCommand` round
1616
* trip, including the `--keep-session` live-session postcondition) live in
17-
* `src/daemon/replay/internal/__tests__/session-replay-runtime-keep-session.test.ts`
17+
* `src/daemon/__tests__/replay-runtime/session-replay-runtime-keep-session.test.ts`
1818
* (renamed from `session-replay-terminal-lifecycle.test.ts` by the #1555
1919
* structural-quality review — see that file's own header for the rationale);
2020
* this file covers the SAME suppression decision at the cheaper,

‎packages/ad-replay/src/internal/step-loop.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import type {
1515

1616
/**
1717
* #1478 P5 stage C2b: the `.ad` step-loop ENGINE policy, split out of
18-
* `src/daemon/replay/internal/native-command.ts`'s replay orchestration /
18+
* `packages/replay-port/src/daemon-port/native-command.ts`'s replay orchestration /
1919
* `resolveReplayStepResponse` / `buildReplayActionFailure`. Everything that
2020
* touches a real device, a snapshot, `SessionStore`, or the P4b repair
2121
* coordinator is daemon authority and stays behind the narrow

‎packages/ad-replay/src/internal/target-verification.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* #1478 P5 stage C2a: the target-verification ENGINE policy — moved verbatim
3-
* out of `src/daemon/replay/internal/session-replay-target-verification.ts`, which
3+
* out of `packages/replay-port/src/daemon-port/session-replay-target-verification.ts`, which
44
* keeps the DAEMON-AUTHORITY half (capture, `SessionStore`, resume stamping,
55
* wire projection into `DaemonResponse`). This module decides, over already-
66
* available plain values, whether/how a recorded target-binding annotation

‎packages/ad-script/src/internal/target-annotation-identity.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ type IdentityTreeNode = Pick<RawSnapshotNode, 'type' | 'identifier' | 'label'>;
5050
* normalized (NFC, label whitespace collapse, `normalizeType` role) AND
5151
* 256-byte field-capped, on every path. Shared by the record-time writer
5252
* (`@agent-device/selectors/target-evidence`), replay-time verification
53-
* (`src/daemon/replay/internal/session-replay-target-verification.ts`), and the
53+
* (`packages/replay-port/src/daemon-port/session-replay-target-verification.ts`), and the
5454
* dispatch-side post-resolution guard
5555
* (`src/commands/interaction/runtime/resolution.ts`), so all three compute
5656
* a node's identity with byte-identical semantics.

‎packages/replay-port/package.json‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"@agent-device/ad-replay": "workspace:*",
1010
"@agent-device/ad-script": "workspace:*",
1111
"@agent-device/capture-kit": "workspace:*",
12+
"@agent-device/command-registry": "workspace:*",
1213
"@agent-device/contracts": "workspace:*",
1314
"@agent-device/device-selection": "workspace:*",
1415
"@agent-device/host-kit": "workspace:*",
@@ -23,6 +24,10 @@
2324
"types": "./src/daemon-port/command-types.ts",
2425
"default": "./src/daemon-port/command-types.ts"
2526
},
27+
"./native-command": {
28+
"types": "./src/daemon-port/native-command.ts",
29+
"default": "./src/daemon-port/native-command.ts"
30+
},
2631
"./repair-hint": {
2732
"types": "./src/daemon-port/repair-hint.ts",
2833
"default": "./src/daemon-port/repair-hint.ts"
@@ -43,10 +48,26 @@
4348
"types": "./src/daemon-port/script-source.ts",
4449
"default": "./src/daemon-port/script-source.ts"
4550
},
51+
"./session-replay-action-runtime": {
52+
"types": "./src/daemon-port/session-replay-action-runtime.ts",
53+
"default": "./src/daemon-port/session-replay-action-runtime.ts"
54+
},
55+
"./session-replay-divergence": {
56+
"types": "./src/daemon-port/session-replay-divergence.ts",
57+
"default": "./src/daemon-port/session-replay-divergence.ts"
58+
},
59+
"./session-replay-divergence-publication": {
60+
"types": "./src/daemon-port/session-replay-divergence-publication.ts",
61+
"default": "./src/daemon-port/session-replay-divergence-publication.ts"
62+
},
4663
"./session-replay-heal": {
4764
"types": "./src/daemon-port/session-replay-heal.ts",
4865
"default": "./src/daemon-port/session-replay-heal.ts"
4966
},
67+
"./session-replay-maestro-failure": {
68+
"types": "./src/daemon-port/session-replay-maestro-failure.ts",
69+
"default": "./src/daemon-port/session-replay-maestro-failure.ts"
70+
},
5071
"./session-replay-maestro-observer": {
5172
"types": "./src/daemon-port/session-replay-maestro-observer.ts",
5273
"default": "./src/daemon-port/session-replay-maestro-observer.ts"
@@ -55,6 +76,10 @@
5576
"types": "./src/daemon-port/session-replay-maestro-request.ts",
5677
"default": "./src/daemon-port/session-replay-maestro-request.ts"
5778
},
79+
"./session-replay-maestro-runtime": {
80+
"types": "./src/daemon-port/session-replay-maestro-runtime.ts",
81+
"default": "./src/daemon-port/session-replay-maestro-runtime.ts"
82+
},
5883
"./session-replay-report-action": {
5984
"types": "./src/daemon-port/session-replay-report-action.ts",
6085
"default": "./src/daemon-port/session-replay-report-action.ts"
@@ -103,6 +128,10 @@
103128
"types": "./src/daemon-port/session-test-shard-devices.ts",
104129
"default": "./src/daemon-port/session-test-shard-devices.ts"
105130
},
131+
"./session-test-source-discovery": {
132+
"types": "./src/daemon-port/session-test-source-discovery.ts",
133+
"default": "./src/daemon-port/session-test-source-discovery.ts"
134+
},
106135
"./target-classification": {
107136
"types": "./src/daemon-port/target-classification.ts",
108137
"default": "./src/daemon-port/target-classification.ts"
@@ -114,6 +143,10 @@
114143
"./target-token": {
115144
"types": "./src/daemon-port/target-token.ts",
116145
"default": "./src/daemon-port/target-token.ts"
146+
},
147+
"./test-command": {
148+
"types": "./src/daemon-port/test-command.ts",
149+
"default": "./src/daemon-port/test-command.ts"
117150
}
118151
}
119152
}

‎packages/replay-test/src/internal/__tests__/session-test-runtime.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { mkdtempForTestSync } from '../../tmp-dir.fixtures.ts';
1111
// What the scheduler owes its host around cancellation (#1478 P3b): cancel exactly once when
1212
// an attempt times out, and always release when it settles. How the daemon then maps that onto
1313
// its request registry is the adapter's contract, pinned in
14-
// `src/daemon/replay/internal/__tests__/session-test-suite-command-cancellation.test.ts`.
14+
// `src/daemon/__tests__/replay-suite/session-test-suite-command-cancellation.test.ts`.
1515
const cancellations: Array<{ attemptId: string; canceled: number; released: number }> = [];
1616

1717
function trackCancellation() {

‎pnpm-lock.yaml‎

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎scripts/layering/architecture-ownership.ts‎

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ export type LogicalModulePolicy = Readonly<{
1111
facade?: FacadeDeclaration;
1212
}>;
1313

14-
const DAEMON_REPLAY_FACADE = {
15-
root: 'src/daemon/replay/index.ts',
16-
exports: ['runReplayCommand', 'runReplayTestCommand'],
17-
} as const;
18-
1914
const DAEMON_SESSION_LIFECYCLE_FACADE = {
2015
root: 'src/daemon/session-lifecycle/index.ts',
2116
exports: [
@@ -106,12 +101,23 @@ export const LOGICAL_MODULE_POLICIES = [
106101
{
107102
name: 'ad-replay',
108103
roots: ['packages/ad-replay/src/'],
109-
forbiddenTargetRoots: ['src/daemon/', 'src/providers/', 'src/compat/', 'packages/maestro/'],
104+
forbiddenTargetRoots: [
105+
'src/daemon/',
106+
'src/providers/',
107+
'src/compat/',
108+
'packages/maestro/',
109+
'packages/replay-port/',
110+
],
110111
},
111112
{
112113
name: 'maestro',
113114
roots: ['packages/maestro/src/'],
114-
forbiddenTargetRoots: ['src/daemon/', 'src/providers/', 'packages/ad-replay/'],
115+
forbiddenTargetRoots: [
116+
'src/daemon/',
117+
'src/providers/',
118+
'packages/ad-replay/',
119+
'packages/replay-port/',
120+
],
115121
},
116122
{
117123
name: 'replay-test',
@@ -123,23 +129,14 @@ export const LOGICAL_MODULE_POLICIES = [
123129
'src/compat/',
124130
'packages/maestro/',
125131
'packages/ad-replay/',
132+
'packages/replay-port/',
126133
],
127134
},
128135
{
129136
name: 'replay-port',
130137
roots: ['packages/replay-port/src/'],
131138
forbiddenTargetRoots: ['src/daemon/', 'src/providers/', 'src/compat/'],
132139
},
133-
{
134-
name: 'daemon-replay',
135-
roots: ['src/daemon/replay/'],
136-
forbiddenTargetRoots: [
137-
'src/daemon/handlers/record-runtime.ts',
138-
'src/daemon/session-store.ts',
139-
'src/daemon/session-lifecycle/',
140-
],
141-
facade: DAEMON_REPLAY_FACADE,
142-
},
143140
{
144141
name: 'daemon-session-lifecycle',
145142
roots: ['src/daemon/session-lifecycle/'],

‎scripts/layering/daemon-modularity.test.ts‎

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -161,21 +161,21 @@ test('logical modules reject forbidden imports', () => {
161161
assert.match(violations[0]!.message, /replay-test must not import/);
162162
});
163163

164-
test('replay-test rejects request-global and engine-internal imports', () => {
164+
test('replay-test rejects request-global and replay-port imports', () => {
165165
const edges = resolveImportEdges(
166166
new Map([
167167
[
168168
'packages/replay-test/src/internal/scheduler.ts',
169169
[
170170
"import { emitRequestProgress } from '../../../../src/request/progress.ts';",
171-
"import { readReplayScriptMetadata } from '../../../../src/daemon/replay/internal/native-command.ts';",
171+
"import { runReplayCommand } from '../../../replay-port/src/daemon-port/native-command.ts';",
172172
"import { parseMaestroProgram } from '../../../../src/compat/maestro/program-ir-parser.ts';",
173173
].join('\n'),
174174
],
175175
['src/request/progress.ts', 'export function emitRequestProgress() {}'],
176176
[
177-
'src/daemon/replay/internal/native-command.ts',
178-
'export function readReplayScriptMetadata() {}',
177+
'packages/replay-port/src/daemon-port/native-command.ts',
178+
'export function runReplayCommand() {}',
179179
],
180180
['src/compat/maestro/program-ir-parser.ts', 'export function parseMaestroProgram() {}'],
181181
]),
@@ -190,7 +190,7 @@ test('replay-test rejects request-global and engine-internal imports', () => {
190190
violations.map(({ message }) => message.replace(/;.*/, '')),
191191
[
192192
'replay-test must not import src/request/progress.ts',
193-
"packages/replay-test/src/internal/scheduler.ts must not import daemon-replay's internal tree (src/daemon/replay/internal/native-command.ts)",
193+
'replay-test must not import packages/replay-port/src/daemon-port/native-command.ts',
194194
'replay-test must not import src/compat/maestro/program-ir-parser.ts',
195195
],
196196
);
@@ -230,33 +230,20 @@ test('internal trees reject deep imports globally, including from daemon', () =>
230230
assert.match(violations[0]!.message, /must not import maestro's internal tree/);
231231
});
232232

233-
test('daemon replay rejects handler, owner, session-store, and engine deep edges', () => {
233+
test('replay-port rejects daemon source imports and engine back edges', () => {
234234
const edges = resolveImportEdges(
235235
new Map([
236236
[
237-
'src/daemon/handlers/session.ts',
238-
"import { runReplayCommand } from '../replay/internal/native-command.ts';",
239-
],
240-
[
241-
'src/daemon/replay/internal/test-command.ts',
242-
"import { handleSessionCloseCommands } from '../../session-lifecycle/internal/session-close.ts';",
237+
'packages/replay-port/src/daemon-port/test-command.ts',
238+
"import { handleSessionCloseCommands } from '../../../../src/daemon/session-lifecycle/index.ts';",
243239
],
244240
[
245-
'src/daemon/replay/internal/close-command.ts',
246-
"import { handleSessionCloseCommands } from '../../session-lifecycle/index.ts';",
247-
],
248-
[
249-
'src/daemon/replay/internal/command-types.ts',
250-
"import { SessionStore } from '../../session-store.ts';",
241+
'packages/replay-port/src/daemon-port/native-command.ts',
242+
"import { SessionStore } from '../../../../src/daemon/session-store.ts';",
251243
],
252244
[
253245
'packages/ad-replay/src/internal/step-loop.ts',
254-
"import { runReplayCommand } from '../../../../src/daemon/replay/internal/native-command.ts';",
255-
],
256-
['src/daemon/replay/internal/native-command.ts', 'export function runReplayCommand() {}'],
257-
[
258-
'src/daemon/session-lifecycle/internal/session-close.ts',
259-
'export function handleSessionCloseCommands() {}',
246+
"import { runReplayCommand } from '../../../replay-port/src/daemon-port/native-command.ts';",
260247
],
261248
['src/daemon/session-lifecycle/index.ts', 'export function handleSessionCloseCommands() {}'],
262249
['src/daemon/session-store.ts', 'export class SessionStore {}'],
@@ -269,39 +256,19 @@ test('daemon replay rejects handler, owner, session-store, and engine deep edges
269256
REFERENCE,
270257
);
271258
assert.deepEqual(
272-
violations.map(({ file, line, message }) => ({
273-
file,
274-
line,
275-
message: message.replace(/;.*/, ''),
276-
})),
259+
violations.map(({ file, message }) => ({ file, message: message.replace(/;.*/, '') })),
277260
[
278261
{
279-
file: 'src/daemon/handlers/session.ts',
280-
line: 1,
281-
message:
282-
"src/daemon/handlers/session.ts must not import daemon-replay's internal tree (src/daemon/replay/internal/native-command.ts)",
262+
file: 'packages/replay-port/src/daemon-port/test-command.ts',
263+
message: 'replay-port must not import src/daemon/session-lifecycle/index.ts',
283264
},
284265
{
285-
file: 'src/daemon/replay/internal/test-command.ts',
286-
line: 1,
287-
message:
288-
"src/daemon/replay/internal/test-command.ts must not import daemon-session-lifecycle's internal tree (src/daemon/session-lifecycle/internal/session-close.ts)",
289-
},
290-
{
291-
file: 'src/daemon/replay/internal/close-command.ts',
292-
line: 1,
293-
message: 'daemon-replay must not import src/daemon/session-lifecycle/index.ts',
294-
},
295-
{
296-
file: 'src/daemon/replay/internal/command-types.ts',
297-
line: 1,
298-
message: 'daemon-replay must not import src/daemon/session-store.ts',
266+
file: 'packages/replay-port/src/daemon-port/native-command.ts',
267+
message: 'replay-port must not import src/daemon/session-store.ts',
299268
},
300269
{
301270
file: 'packages/ad-replay/src/internal/step-loop.ts',
302-
line: 1,
303-
message:
304-
"packages/ad-replay/src/internal/step-loop.ts must not import daemon-replay's internal tree (src/daemon/replay/internal/native-command.ts)",
271+
message: 'ad-replay must not import packages/replay-port/src/daemon-port/native-command.ts',
305272
},
306273
],
307274
);

‎scripts/layering/daemon-modularity.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const DAEMON_TYPE_MODULES: readonly string[] = [
3838
const ENGINE_FILE_PREFIXES = [
3939
'packages/ad-replay/src/',
4040
'packages/maestro/src/',
41-
'src/daemon/replay/internal/',
41+
'packages/replay-port/src/daemon-port/',
4242
'packages/replay-test/src/',
4343
] as const;
4444

0 commit comments

Comments
 (0)