Skip to content

Commit e919570

Browse files
committed
chore(gates): align layering, mutation, fallow and CI gates with the capture-kit relocation
Moves the executable-policy roots, presentation-owner constant, zone ranks, authority fixture, mutation sharding globs, stryker aliases, fallow baselines and the iOS workflow's android-owned paths-ignore entry onto the new packages/capture-kit paths, and extends the planted-red coverage to the new presentation-owner subpath.
1 parent cb3fcc2 commit e919570

14 files changed

Lines changed: 94 additions & 33 deletions

.github/workflows/ios.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ on:
2929
- 'packages/*/src/**/*.test.ts'
3030
- 'packages/*/src/**/__tests__/**/*.ts'
3131
- 'packages/platform-android/src/**'
32-
- 'src/snapshot/snapshot-presentation/android/**'
32+
- 'packages/capture-kit/src/snapshot/snapshot-presentation/android/**'
3333
- 'packages/platform-harmonyos/src/**'
3434
- 'packages/platform-linux/src/**'
3535
- 'packages/platform-vega/src/**'

fallow-baselines/health.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@
456456
"count": 2
457457
}
458458
},
459-
"src/snapshot/snapshot-lines.ts": {
459+
"packages/capture-kit/src/snapshot/snapshot-lines.ts": {
460460
"crap_moderate": {
461461
"count": 1
462462
}
@@ -471,12 +471,12 @@
471471
"count": 1
472472
}
473473
},
474-
"src/snapshot/scroll-edge-state.ts": {
474+
"packages/capture-kit/src/snapshot/scroll-edge-state.ts": {
475475
"crap_moderate": {
476476
"count": 1
477477
}
478478
},
479-
"src/snapshot/snapshot-presentation/text-surface.ts": {
479+
"packages/capture-kit/src/snapshot/snapshot-presentation/text-surface.ts": {
480480
"crap_high": {
481481
"count": 1
482482
}
@@ -550,7 +550,7 @@
550550
"packages/kernel/src/success-text.ts:high impact",
551551
"src/cli.ts:complexity",
552552
"src/commands/interaction/output.ts:high impact",
553-
"src/snapshot/snapshot-lines.ts:high impact",
553+
"packages/capture-kit/src/snapshot/snapshot-lines.ts:high impact",
554554
"packages/kernel/src/rect-center.ts:high impact",
555555
"packages/platform-apple/src/core/app-launch.ts:complexity",
556556
"packages/kernel/src/record.ts:high impact",
@@ -562,7 +562,7 @@
562562
"src/client/screenshot-result.ts:high impact",
563563
"packages/platform-web/src/json-utils.ts:high impact",
564564
"packages/platform-android/src/settings.ts:complexity",
565-
"src/snapshot/snapshot-presentation/text-surface.ts:high impact",
565+
"packages/capture-kit/src/snapshot/snapshot-presentation/text-surface.ts:high impact",
566566
"src/daemon/handlers/session-test-sharding.ts:high impact",
567567
"src/daemon/replay/internal/native-command.ts:complexity",
568568
"packages/platform-apple/src/core/debug-symbols/utils.ts:high impact",

scripts/depgraph/model.test.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ function authorityFixture(): Map<string, string> {
4646
"import { SessionStore } from './session-store.ts';",
4747
].join('\n'),
4848
'src/daemon/type-consumer.ts': "import type { SessionStore } from './session-store.ts';\n",
49-
'src/snapshot/policy-consumer.ts': [
50-
"import type { SessionState } from '../daemon/session-state.ts';",
51-
"import type { SessionRef } from '../daemon/session-state.ts';",
49+
'packages/capture-kit/src/snapshot/policy-consumer.ts': [
50+
"import type { SessionState } from '../../../../src/daemon/session-state.ts';",
51+
"import type { SessionRef } from '../../../../src/daemon/session-state.ts';",
5252
"import './ordinary-target.ts';",
5353
].join('\n'),
5454
'src/daemon/ordinary-consumer.ts': [
@@ -62,7 +62,7 @@ function authorityFixture(): Map<string, string> {
6262
'src/daemon/session-script-publication-capability.ts':
6363
'export function isSessionRecording() {}\n',
6464
'src/daemon/session-state-store.ts': 'export const SessionState = 1;\n',
65-
'src/snapshot/ordinary-target.ts': 'export const ordinary = 1;\n',
65+
'packages/capture-kit/src/snapshot/ordinary-target.ts': 'export const ordinary = 1;\n',
6666
'packages/contracts/src/facades/client.ts': 'export type ClientShape = string;\n',
6767
'packages/contracts/src/facades/capture.ts': 'export type CaptureShape = string;\n',
6868
'packages/contracts/src/facades/replay.ts': 'export type ReplayShape = string;\n',
@@ -108,7 +108,11 @@ test('authority overlay uses declared roots and symbols, keeps kind separate, an
108108
labels: ['live-state-authority'],
109109
});
110110
assert.deepEqual(
111-
graphEdge(graph, 'src/snapshot/policy-consumer.ts', 'src/snapshot/ordinary-target.ts'),
111+
graphEdge(
112+
graph,
113+
'packages/capture-kit/src/snapshot/policy-consumer.ts',
114+
'packages/capture-kit/src/snapshot/ordinary-target.ts',
115+
),
112116
{ kind: 'value', labels: ['executable-policy'] },
113117
);
114118
assert.deepEqual(
@@ -122,12 +126,16 @@ test('authority overlay uses declared roots and symbols, keeps kind separate, an
122126

123127
const stateEdges = resolveImportEdges(files, authorityWorkspaceTargets()).filter(
124128
(edge) =>
125-
edge.file === 'src/snapshot/policy-consumer.ts' &&
129+
edge.file === 'packages/capture-kit/src/snapshot/policy-consumer.ts' &&
126130
edge.target === 'src/daemon/session-state.ts',
127131
);
128132
assert.equal(stateEdges.length, 2, 'the fixture must exercise raw same-pair imports');
129133
assert.deepEqual(
130-
graphEdge(graph, 'src/snapshot/policy-consumer.ts', 'src/daemon/session-state.ts'),
134+
graphEdge(
135+
graph,
136+
'packages/capture-kit/src/snapshot/policy-consumer.ts',
137+
'src/daemon/session-state.ts',
138+
),
131139
{
132140
kind: 'type',
133141
labels: ['live-state-shape', 'executable-policy'],

scripts/layering/architecture-ownership.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ export const ARCHITECTURE_OWNERSHIP = {
235235
{
236236
name: 'snapshot-policy',
237237
kind: 'executable-policy',
238-
roots: ['src/snapshot/'],
238+
roots: ['packages/capture-kit/src/snapshot/'],
239239
forbiddenTargetRoots: ['src/daemon/'],
240240
},
241241
],

scripts/layering/contracts-implementation-policy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export function contractsImplementationAuthorityViolations(
5656
violation(
5757
file.path,
5858
1,
59-
'contracts may not own snapshot quality warning rendering; that presentation policy belongs in src/snapshot/snapshot-presentation',
59+
'contracts may not own snapshot quality warning rendering; that presentation policy belongs in packages/capture-kit/src/snapshot/snapshot-presentation',
6060
),
6161
);
6262
}

scripts/layering/model.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ test('classifyZone separates the ranked spine from intentionally-unranked zones'
253253
// Every satellite zone joined the spine; only the composition root stays out, because R2
254254
// forbids daemon/ from importing commands/ so the files that wire them cannot be ranked.
255255
assert.equal(classifyZone('mcp'), 'ranked');
256-
assert.equal(classifyZone('snapshot'), 'ranked');
256+
assert.equal(classifyZone('screenshot-diff'), 'ranked');
257257
// A zone that is neither ranked nor listed peripheral must be flagged, never
258258
// silently treated as back-edge-free.
259259
assert.equal(classifyZone('not-a-real-zone'), 'unclassified');

scripts/layering/model.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,11 @@ const TARGET_DAG_RANK = new Map([
4141
['command-registry', 1],
4242
['contracts', 1],
4343
['maestro', 1],
44-
['recording', 1],
4544
['replay-test', 1],
4645
['request', 1],
4746
['screenshot-diff', 1],
4847
['selectors', 1],
4948
['session-journal', 1],
50-
['snapshot', 1],
5149
['core', 2],
5250
['cli-schema', 3],
5351
['commands', 3],

scripts/layering/package-boundaries.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,11 +392,13 @@ test('the real tree parses, declares, and passes R11', () => {
392392
);
393393
assert.deepEqual([...captureKitPackage.exportTargets.keys()].sort(), [
394394
'@agent-device/capture-kit',
395+
'@agent-device/capture-kit/android-replacement-surface-occlusion',
395396
'@agent-device/capture-kit/durable-capture',
396397
'@agent-device/capture-kit/durable-json',
397398
'@agent-device/capture-kit/ios-snapshot-acquisition',
398399
'@agent-device/capture-kit/ios-snapshot-engine',
399400
'@agent-device/capture-kit/ios-snapshot-planning',
401+
'@agent-device/capture-kit/ios-snapshot-runtime',
400402
'@agent-device/capture-kit/mobile-snapshot-semantics',
401403
'@agent-device/capture-kit/png',
402404
'@agent-device/capture-kit/png-crop',
@@ -405,15 +407,36 @@ test('the real tree parses, declares, and passes R11', () => {
405407
'@agent-device/capture-kit/png-size',
406408
'@agent-device/capture-kit/png-worker-client',
407409
'@agent-device/capture-kit/post-gesture-stability',
410+
'@agent-device/capture-kit/quality-warnings',
408411
'@agent-device/capture-kit/react-native-overlay',
412+
'@agent-device/capture-kit/recording-output-path',
413+
'@agent-device/capture-kit/recording-overlay',
414+
'@agent-device/capture-kit/recording-telemetry',
415+
'@agent-device/capture-kit/recording-video',
416+
'@agent-device/capture-kit/repeated-nav-subtree',
409417
'@agent-device/capture-kit/screenshot-density',
410418
'@agent-device/capture-kit/screenshot-diff-pixels',
411419
'@agent-device/capture-kit/screenshot-overlay',
420+
'@agent-device/capture-kit/scroll-edge-state',
421+
'@agent-device/capture-kit/snapshot-chrome',
412422
'@agent-device/capture-kit/snapshot-desktop-projection',
423+
'@agent-device/capture-kit/snapshot-desktop-surface',
424+
'@agent-device/capture-kit/snapshot-diff',
425+
'@agent-device/capture-kit/snapshot-evidence',
426+
'@agent-device/capture-kit/snapshot-freshness',
427+
'@agent-device/capture-kit/snapshot-label-dedup',
428+
'@agent-device/capture-kit/snapshot-lines',
429+
'@agent-device/capture-kit/snapshot-node-lookup',
413430
'@agent-device/capture-kit/snapshot-occlusion',
431+
'@agent-device/capture-kit/snapshot-presentation-android-helper',
432+
'@agent-device/capture-kit/snapshot-presentation-ios-transitions-fixtures',
414433
'@agent-device/capture-kit/snapshot-quality-backend-capabilities',
415434
'@agent-device/capture-kit/snapshot-quality-verdict',
416435
'@agent-device/capture-kit/snapshot-rect-projection',
436+
'@agent-device/capture-kit/snapshot-state',
437+
'@agent-device/capture-kit/snapshot-timeout-policy',
438+
'@agent-device/capture-kit/snapshot-visibility',
439+
'@agent-device/capture-kit/text-surface',
417440
]);
418441

419442
const provisionKitPackage = packages.find((pkg) => pkg.name === '@agent-device/provision-kit');

scripts/layering/provider-snapshot-presentation-policy.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,26 @@ test('R73 rejects an out-of-adapter provider presentation import', () => {
5757
);
5858
});
5959

60+
test('R73 rejects a provider import of the capture-kit presentation runtime subpath', () => {
61+
const result = violations(
62+
new Map([
63+
[
64+
providerHelper,
65+
`import { presentIosSnapshot } from '@agent-device/capture-kit/ios-snapshot-runtime';\nvoid presentIosSnapshot;\n`,
66+
],
67+
]),
68+
);
69+
assert.ok(
70+
result.some(
71+
(entry) =>
72+
entry.rule === PROVIDER_SNAPSHOT_PRESENTATION_RULE &&
73+
entry.file === providerHelper &&
74+
entry.message.includes(IOS_SNAPSHOT_PRESENTATION_OWNER),
75+
),
76+
JSON.stringify(result),
77+
);
78+
});
79+
6080
for (const planted of [
6181
{
6282
name: 'a planted provider residue discard',

scripts/layering/provider-snapshot-presentation-policy.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
// Catches: a provider-* package acquiring an iOS snapshot outside the capture-kit acquisition
2-
// entrypoint, or presenting it outside src/snapshot/ios-snapshot-runtime.ts — the exact split
3-
// R72's engine convergence closed for the runner layer, mirrored here one layer up for the
4-
// provider packages that call into it.
2+
// entrypoint, or presenting it outside packages/capture-kit/src/snapshot/ios-snapshot-runtime.ts
3+
// — the exact split R72's engine convergence closed for the runner layer, mirrored here one
4+
// layer up for the provider packages that call into it.
55
// Evidence: 7ee1a5ded7 (#2233) carried provider acquisitions through this one presentation
66
// owner, the change this policy was written to hold in place.
77
// Cost: 195 LOC (111 rule + 84 test).
88
// Kill criterion: none enforced today; retire only by maintainer decision that provider-* packages
99
// reaching presentation only through @agent-device/capture-kit/ios-snapshot-acquisition, and
1010
// never constructing, discarding, or reassigning acquisition residue, no longer matter. An
1111
// exports map cannot replace it: it restricts external specifiers, not the transitive walk
12-
// into src/snapshot/ or a provider-local `residue` property or assignment.
12+
// into packages/capture-kit/src/snapshot/ or a provider-local `residue` property or assignment.
1313

1414
import { parseSync } from 'oxc-parser';
1515
import type { LayeringViolation, ResolvedImportEdge } from './model.ts';
@@ -18,7 +18,8 @@ import { memberPath, propertyName, visitAst } from './layering-ast.ts';
1818
export const PROVIDER_SNAPSHOT_PRESENTATION_RULE = 'R73 provider-snapshot-presentation-ownership';
1919
export const IOS_SNAPSHOT_ACQUISITION_ENTRYPOINT =
2020
'@agent-device/capture-kit/ios-snapshot-acquisition';
21-
export const IOS_SNAPSHOT_PRESENTATION_OWNER = 'src/snapshot/ios-snapshot-runtime.ts';
21+
export const IOS_SNAPSHOT_PRESENTATION_OWNER =
22+
'packages/capture-kit/src/snapshot/ios-snapshot-runtime.ts';
2223

2324
const PROVIDER_SOURCE = /^packages\/provider-[^/]+\/src\//;
2425
const IOS_SNAPSHOT_CAPTURE_KIT_ROOT = 'packages/capture-kit/src/ios-snapshot-';
@@ -109,7 +110,7 @@ function residueViolations(providerFile: string, source: string): LayeringViolat
109110
function isPresentationTarget(target: string): boolean {
110111
return (
111112
target === IOS_SNAPSHOT_PRESENTATION_OWNER ||
112-
target.startsWith('src/snapshot/') ||
113+
target.startsWith('packages/capture-kit/src/snapshot/') ||
113114
(target.startsWith(IOS_SNAPSHOT_CAPTURE_KIT_ROOT) &&
114115
target !== 'packages/capture-kit/src/ios-snapshot-acquisition.ts')
115116
);

0 commit comments

Comments
 (0)